[pnfs] [PATCH 1/8] nfsd: return nfserr_minor_vers_mismatch when compound minorversion != 0
Benny Halevy
bhalevy at panasas.com
Tue Jul 1 09:44:42 EDT 2008
On Jun. 30, 2008, 23:06 +0300, Benny Halevy <bhalevy at panasas.com> wrote:
> J. Bruce Fields wrote:
>> On Mon, Jun 30, 2008 at 09:03:59PM +0300, Benny Halevy wrote:
>>> Check minorversion once before decoding any operation and reject with
>>> nfserr_minor_vers_mismatch if != 0. In this case return a zero length
>>> resultdata array as required by RFC3530.
>> I think there's no actual change in behavior here, right? On a quick
>> skim, it looks to me like the check in nfsd4_proc_compound() does the
>> right thing.
>
> Right.
>
>> That's nothing against this patch, though maybe it'd make sense to
>> delete the minorversion check from nfsd4_proc_compound().
>
> Agreed.
I tried that and unfortunately, I have to take my words back.
We still need to go through nfsd4_proc_compound to encode the
reply (containing the header only and no ops)
Here's the updated patch:
(no need to set up anything for the first op since it's
not processed)
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
index 9547ab6..413a153 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -1019,6 +1019,9 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp)
}
}
+ if (argp->minorversion != 0)
+ argp->opcnt = 0;
+
for (i = 0; i < argp->opcnt; i++) {
op = &argp->ops[i];
op->replay = NULL;
@@ -1057,13 +1060,6 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp)
op->opnum = ntohl(*argp->p++);
switch (op->opnum) {
- case 2: /* Reserved operation */
- op->opnum = OP_ILLEGAL;
- if (argp->minorversion == 0)
- op->status = nfserr_op_illegal;
- else
- op->status = nfserr_minor_vers_mismatch;
- break;
case OP_ACCESS:
op->status = nfsd4_decode_access(argp, &op->u.access);
break;
>
> Benny
>
>> --b.
>>
>>> minorversion 1 processing will have its own vector of decoders.
>>>
>>> Signed-off-by: Benny Halevy <bhalevy at panasas.com>
>>> ---
>>> fs/nfsd/nfs4xdr.c | 15 ++++++++-------
>>> 1 files changed, 8 insertions(+), 7 deletions(-)
>>>
>>> diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
>>> index 9547ab6..491a697 100644
>>> --- a/fs/nfsd/nfs4xdr.c
>>> +++ b/fs/nfsd/nfs4xdr.c
>>> @@ -1019,6 +1019,14 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp)
>>> }
>>> }
>>>
>>> + if (argp->minorversion != 0) {
>>> + op = &argp->ops[0];
>>> + op->replay = NULL;
>>> + op->opnum = OP_ILLEGAL;
>>> + op->status = nfserr_minor_vers_mismatch;
>>> + argp->opcnt = 0;
>>> + }
>>> +
>>> for (i = 0; i < argp->opcnt; i++) {
>>> op = &argp->ops[i];
>>> op->replay = NULL;
>>> @@ -1057,13 +1065,6 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp)
>>> op->opnum = ntohl(*argp->p++);
>>>
>>> switch (op->opnum) {
>>> - case 2: /* Reserved operation */
>>> - op->opnum = OP_ILLEGAL;
>>> - if (argp->minorversion == 0)
>>> - op->status = nfserr_op_illegal;
>>> - else
>>> - op->status = nfserr_minor_vers_mismatch;
>>> - break;
>>> case OP_ACCESS:
>>> op->status = nfsd4_decode_access(argp, &op->u.access);
>>> break;
>>> --
>>> 1.5.6.GIT
>>>
>
> _______________________________________________
> pNFS mailing list
> pNFS at linux-nfs.org
> http://linux-nfs.org/cgi-bin/mailman/listinfo/pnfs
More information about the pNFS
mailing list