From: NeilBrown <neilb@cse.unsw.edu.au>



---

 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.

_