2014-02-21 18:10:36

by Trond Myklebust

[permalink] [raw]
Subject: [PATCH] NFSd: NFSv4.1 OPEN must use the session-derived client id

RFC5661 states:

The client can set the clientid field to any value and the server MUST
ignore it. Instead, the server MUST derive the client ID from the
session ID of the SEQUENCE operation of the COMPOUND request

Make it so...

Signed-off-by: Trond Myklebust <[email protected]>
---
fs/nfsd/nfs4state.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)

diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 693e1458e2ca..d23f4cdbc891 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -2826,6 +2826,21 @@ static __be32 nfsd4_check_seqid(struct nfsd4_compound_state *cstate, struct nfs4
return nfserr_bad_seqid;
}

+/*
+ * RFC5661: OPEN MUST ignore the client-supplied clientid argument and
+ * substitute the session clientid
+ */
+static void nfsd41_set_open_clientid(struct nfsd4_compound_state *cstate,
+ struct nfsd4_open *open)
+{
+ struct nfs4_client *clp;
+
+ if (!nfsd4_has_session(cstate))
+ return;
+ clp = cstate->session->se_client;
+ memcpy(&open->op_clientid, &clp->cl_clientid, sizeof(open->op_clientid));
+}
+
__be32
nfsd4_process_open1(struct nfsd4_compound_state *cstate,
struct nfsd4_open *open, struct nfsd_net *nn)
@@ -2836,6 +2851,8 @@ nfsd4_process_open1(struct nfsd4_compound_state *cstate,
struct nfs4_openowner *oo = NULL;
__be32 status;

+ nfsd41_set_open_clientid(cstate, open);
+
if (STALE_CLIENTID(&open->op_clientid, nn))
return nfserr_stale_clientid;
/*
--
1.8.5.3



2014-02-21 18:23:48

by Trond Myklebust

[permalink] [raw]
Subject: Re: [PATCH] NFSd: NFSv4.1 OPEN must use the session-derived client id


On Feb 21, 2014, at 13:10, Trond Myklebust <[email protected]> wrote:

> RFC5661 states:
>
> The client can set the clientid field to any value and the server MUST
> ignore it. Instead, the server MUST derive the client ID from the
> session ID of the SEQUENCE operation of the COMPOUND request
>
> Make it so...
>
> Signed-off-by: Trond Myklebust <[email protected]>
> ---
> fs/nfsd/nfs4state.c | 17 +++++++++++++++++
> 1 file changed, 17 insertions(+)
>
> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
> index 693e1458e2ca..d23f4cdbc891 100644
> --- a/fs/nfsd/nfs4state.c
> +++ b/fs/nfsd/nfs4state.c
> @@ -2826,6 +2826,21 @@ static __be32 nfsd4_check_seqid(struct nfsd4_compound_state *cstate, struct nfs4
> return nfserr_bad_seqid;
> }
>
> +/*
> + * RFC5661: OPEN MUST ignore the client-supplied clientid argument and
> + * substitute the session clientid
> + */
> +static void nfsd41_set_open_clientid(struct nfsd4_compound_state *cstate,
> + struct nfsd4_open *open)
> +{
> + struct nfs4_client *clp;
> +
> + if (!nfsd4_has_session(cstate))
> + return;
> + clp = cstate->session->se_client;
> + memcpy(&open->op_clientid, &clp->cl_clientid, sizeof(open->op_clientid));
> +}
> +
> __be32
> nfsd4_process_open1(struct nfsd4_compound_state *cstate,
> struct nfsd4_open *open, struct nfsd_net *nn)
> @@ -2836,6 +2851,8 @@ nfsd4_process_open1(struct nfsd4_compound_state *cstate,
> struct nfs4_openowner *oo = NULL;
> __be32 status;
>
> + nfsd41_set_open_clientid(cstate, open);
> +
> if (STALE_CLIENTID(&open->op_clientid, nn))
> return nfserr_stale_clientid;

Never mind. There seems to be code to do this in nfsd4_open()...

_________________________________
Trond Myklebust
Linux NFS client maintainer, PrimaryData
[email protected]


2014-02-21 18:59:57

by J. Bruce Fields

[permalink] [raw]
Subject: Re: [PATCH] NFSd: NFSv4.1 OPEN must use the session-derived client id

On Fri, Feb 21, 2014 at 01:10:33PM -0500, Trond Myklebust wrote:
> RFC5661 states:
>
> The client can set the clientid field to any value and the server MUST
> ignore it. Instead, the server MUST derive the client ID from the
> session ID of the SEQUENCE operation of the COMPOUND request
>
> Make it so...

See fs/nfsd/nfs4proc.c:nfsd4_open():

if (nfsd4_has_session(cstate))
copy_clientid(&open->op_clientid, cstate->session);

Do you have an actual test case that's failing?

--b.


>
> Signed-off-by: Trond Myklebust <[email protected]>
> ---
> fs/nfsd/nfs4state.c | 17 +++++++++++++++++
> 1 file changed, 17 insertions(+)
>
> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
> index 693e1458e2ca..d23f4cdbc891 100644
> --- a/fs/nfsd/nfs4state.c
> +++ b/fs/nfsd/nfs4state.c
> @@ -2826,6 +2826,21 @@ static __be32 nfsd4_check_seqid(struct nfsd4_compound_state *cstate, struct nfs4
> return nfserr_bad_seqid;
> }
>
> +/*
> + * RFC5661: OPEN MUST ignore the client-supplied clientid argument and
> + * substitute the session clientid
> + */
> +static void nfsd41_set_open_clientid(struct nfsd4_compound_state *cstate,
> + struct nfsd4_open *open)
> +{
> + struct nfs4_client *clp;
> +
> + if (!nfsd4_has_session(cstate))
> + return;
> + clp = cstate->session->se_client;
> + memcpy(&open->op_clientid, &clp->cl_clientid, sizeof(open->op_clientid));
> +}
> +
> __be32
> nfsd4_process_open1(struct nfsd4_compound_state *cstate,
> struct nfsd4_open *open, struct nfsd_net *nn)
> @@ -2836,6 +2851,8 @@ nfsd4_process_open1(struct nfsd4_compound_state *cstate,
> struct nfs4_openowner *oo = NULL;
> __be32 status;
>
> + nfsd41_set_open_clientid(cstate, open);
> +
> if (STALE_CLIENTID(&open->op_clientid, nn))
> return nfserr_stale_clientid;
> /*
> --
> 1.8.5.3
>