From: NeilBrown --- 25-akpm/fs/nfsd/nfs4xdr.c | 16 +++++++++------- 25-akpm/include/linux/nfs4.h | 1 + 25-akpm/include/linux/nfsd/nfsd.h | 1 + 3 files changed, 11 insertions(+), 7 deletions(-) diff -puN fs/nfsd/nfs4xdr.c~knfsd-add-OP_ILLEGAL fs/nfsd/nfs4xdr.c --- 25/fs/nfsd/nfs4xdr.c~knfsd-add-OP_ILLEGAL Mon Feb 23 16:33:52 2004 +++ 25-akpm/fs/nfsd/nfs4xdr.c Mon Feb 23 16:33:52 2004 @@ -1078,6 +1078,13 @@ nfsd4_decode_compound(struct nfsd4_compo 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; @@ -1175,13 +1182,8 @@ nfsd4_decode_compound(struct nfsd4_compo op->status = nfsd4_decode_release_lockowner(argp, &op->u.release_lockowner); break; default: - /* - * According to spec, anything greater than OP_WRITE - * is treated as OP_WRITE+1 in the response. - */ - if (op->opnum > OP_WRITE) - op->opnum = OP_WRITE + 1; - op->status = nfserr_notsupp; + op->opnum = OP_ILLEGAL; + op->status = nfserr_op_illegal; break; } diff -puN include/linux/nfs4.h~knfsd-add-OP_ILLEGAL include/linux/nfs4.h --- 25/include/linux/nfs4.h~knfsd-add-OP_ILLEGAL Mon Feb 23 16:33:52 2004 +++ 25-akpm/include/linux/nfs4.h Mon Feb 23 16:33:52 2004 @@ -87,6 +87,7 @@ enum nfs_opnum4 { OP_VERIFY = 37, OP_WRITE = 38, OP_RELEASE_LOCKOWNER = 39, + OP_ILLEGAL = 10044, }; enum nfsstat4 { diff -puN include/linux/nfsd/nfsd.h~knfsd-add-OP_ILLEGAL include/linux/nfsd/nfsd.h --- 25/include/linux/nfsd/nfsd.h~knfsd-add-OP_ILLEGAL Mon Feb 23 16:33:52 2004 +++ 25-akpm/include/linux/nfsd/nfsd.h Mon Feb 23 16:33:52 2004 @@ -195,6 +195,7 @@ void nfsd_lockd_shutdown(void); #define nfserr_bad_xdr __constant_htonl(NFSERR_BAD_XDR) #define nfserr_openmode __constant_htonl(NFSERR_OPENMODE) #define nfserr_locks_held __constant_htonl(NFSERR_LOCKS_HELD) +#define nfserr_op_illegal __constant_htonl(NFSERR_OP_ILLEGAL) /* error codes for internal use */ /* if a request fails due to kmalloc failure, it gets dropped. _