nfsd: return nfserr_minor_vers_mismatch when compound minorversion != 0
authorBenny Halevy <bhalevy@panasas.com>
Wed, 2 Jul 2008 08:13:18 +0000 (11:13 +0300)
committerJ. Bruce Fields <bfields@citi.umich.edu>
Wed, 2 Jul 2008 19:58:20 +0000 (15:58 -0400)
Check minorversion once before decoding any operation and reject with
nfserr_minor_vers_mismatch if != 0 (this still happens in nfsd4_proc_compound).
In this case return a zero length resultdata array as required by RFC3530.

minorversion 1 processing will have its own vector of decoders.

Signed-off-by: Benny Halevy <bhalevy@panasas.com>
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
fs/nfsd/nfs4xdr.c

index 9547ab636274de4f65eafad777696ead86a4ed32..413a15332177aeb329d5cfcd4258698a2da2fe62 100644 (file)
@@ -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;