2009-12-12 03:11:09

by Labiaga, Ricardo

[permalink] [raw]
Subject: [PATCH] nfsd41: Create the recovery entry for the NFSv4.1 client

Signed-off-by: Ricardo Labiaga <[email protected]>
---
fs/nfsd/nfs4state.c | 4 +++-
1 files changed, 3 insertions(+), 1 deletions(-)

diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 2153f9b..32aa837 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -2487,8 +2487,10 @@ nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nf
}
memcpy(&open->op_stateid, &stp->st_stateid, sizeof(stateid_t));

- if (nfsd4_has_session(&resp->cstate))
+ if (nfsd4_has_session(&resp->cstate)) {
open->op_stateowner->so_confirmed = 1;
+ nfsd4_create_clid_dir(open->op_stateowner->so_client);
+ }

/*
* Attempt to hand out a delegation. No error return, because the
--
1.5.4.3



2009-12-17 15:53:58

by J. Bruce Fields

[permalink] [raw]
Subject: Re: [PATCH] nfsd41: nfsd4_decode_compound() does not recognize all ops

On Fri, Dec 11, 2009 at 07:10:49PM -0800, Ricardo Labiaga wrote:
> The server incorrectly assumes that the operations in the
> array start with value 0. The first operation (OP_ACCESS)
> has a value of 3, causing the check in nfsd4_decode_compound
> to be off.
>
> Instead of comparing that the operation number is less than
> the number of elements in the array, the server should verify
> that it is less than the maximum valid operation number
> defined by LAST_NFS4_OP.

Thanks. So the effect of this was to return an OP_ILLEGAL in some cases
where we should have been returning a NOTSUPP error?

--b.

>
> Signed-off-by: Ricardo Labiaga <[email protected]>
> ---
> fs/nfsd/nfs4xdr.c | 2 +-
> 1 files changed, 1 insertions(+), 1 deletions(-)
>
> diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
> index 0fbd50c..b83a24c 100644
> --- a/fs/nfsd/nfs4xdr.c
> +++ b/fs/nfsd/nfs4xdr.c
> @@ -1442,7 +1442,7 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp)
> }
> op->opnum = ntohl(*argp->p++);
>
> - if (op->opnum >= OP_ACCESS && op->opnum < ops->nops)
> + if (op->opnum >= OP_ACCESS && op->opnum <= LAST_NFS4_OP)
> op->status = ops->decoders[op->opnum](argp, &op->u);
> else {
> op->opnum = OP_ILLEGAL;
> --
> 1.5.4.3
>

2009-12-17 16:39:54

by Labiaga, Ricardo

[permalink] [raw]
Subject: Re: [PATCH] nfsd41: nfsd4_decode_compound() does not recognize allops

That's right.

- ricardo

On Dec 17, 2009, at 7:53 AM, "J. Bruce Fields" <[email protected]>
wrote:

> On Fri, Dec 11, 2009 at 07:10:49PM -0800, Ricardo Labiaga wrote:
>> The server incorrectly assumes that the operations in the
>> array start with value 0. The first operation (OP_ACCESS)
>> has a value of 3, causing the check in nfsd4_decode_compound
>> to be off.
>>
>> Instead of comparing that the operation number is less than
>> the number of elements in the array, the server should verify
>> that it is less than the maximum valid operation number
>> defined by LAST_NFS4_OP.
>
> Thanks. So the effect of this was to return an OP_ILLEGAL in some
> cases
> where we should have been returning a NOTSUPP error?
>
> --b.
>
>>
>> Signed-off-by: Ricardo Labiaga <[email protected]>
>> ---
>> fs/nfsd/nfs4xdr.c | 2 +-
>> 1 files changed, 1 insertions(+), 1 deletions(-)
>>
>> diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
>> index 0fbd50c..b83a24c 100644
>> --- a/fs/nfsd/nfs4xdr.c
>> +++ b/fs/nfsd/nfs4xdr.c
>> @@ -1442,7 +1442,7 @@ nfsd4_decode_compound(struct
>> nfsd4_compoundargs *argp)
>> }
>> op->opnum = ntohl(*argp->p++);
>>
>> - if (op->opnum >= OP_ACCESS && op->opnum < ops->nops)
>> + if (op->opnum >= OP_ACCESS && op->opnum <= LAST_NFS4_OP)
>> op->status = ops->decoders[op->opnum](argp, &op->u);
>> else {
>> op->opnum = OP_ILLEGAL;
>> --
>> 1.5.4.3
>>

2009-12-12 03:11:09

by Labiaga, Ricardo

[permalink] [raw]
Subject: [PATCH] nfsd41: nfsd4_decode_compound() does not recognize all ops

The server incorrectly assumes that the operations in the
array start with value 0. The first operation (OP_ACCESS)
has a value of 3, causing the check in nfsd4_decode_compound
to be off.

Instead of comparing that the operation number is less than
the number of elements in the array, the server should verify
that it is less than the maximum valid operation number
defined by LAST_NFS4_OP.

Signed-off-by: Ricardo Labiaga <[email protected]>
---
fs/nfsd/nfs4xdr.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
index 0fbd50c..b83a24c 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -1442,7 +1442,7 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp)
}
op->opnum = ntohl(*argp->p++);

- if (op->opnum >= OP_ACCESS && op->opnum < ops->nops)
+ if (op->opnum >= OP_ACCESS && op->opnum <= LAST_NFS4_OP)
op->status = ops->decoders[op->opnum](argp, &op->u);
else {
op->opnum = OP_ILLEGAL;
--
1.5.4.3


2010-01-14 17:25:07

by J. Bruce Fields

[permalink] [raw]
Subject: Re: [PATCH] nfsd41: Create the recovery entry for the NFSv4.1 client

On Fri, Dec 11, 2009 at 07:10:48PM -0800, Ricardo Labiaga wrote:
> Signed-off-by: Ricardo Labiaga <[email protected]>

Thanks, looks right--applied.

--b.

> ---
> fs/nfsd/nfs4state.c | 4 +++-
> 1 files changed, 3 insertions(+), 1 deletions(-)
>
> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
> index 2153f9b..32aa837 100644
> --- a/fs/nfsd/nfs4state.c
> +++ b/fs/nfsd/nfs4state.c
> @@ -2487,8 +2487,10 @@ nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nf
> }
> memcpy(&open->op_stateid, &stp->st_stateid, sizeof(stateid_t));
>
> - if (nfsd4_has_session(&resp->cstate))
> + if (nfsd4_has_session(&resp->cstate)) {
> open->op_stateowner->so_confirmed = 1;
> + nfsd4_create_clid_dir(open->op_stateowner->so_client);
> + }
>
> /*
> * Attempt to hand out a delegation. No error return, because the
> --
> 1.5.4.3
>