From owner-svn-src-all@FreeBSD.ORG Mon Dec 23 15:16:53 2013 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id D55E8A59; Mon, 23 Dec 2013 15:16:53 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id B5A9E1499; Mon, 23 Dec 2013 15:16:53 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id rBNFGrVa016865; Mon, 23 Dec 2013 15:16:53 GMT (envelope-from rmacklem@svn.freebsd.org) Received: (from rmacklem@localhost) by svn.freebsd.org (8.14.7/8.14.7/Submit) id rBNFGr9o016864; Mon, 23 Dec 2013 15:16:53 GMT (envelope-from rmacklem@svn.freebsd.org) Message-Id: <201312231516.rBNFGr9o016864@svn.freebsd.org> From: Rick Macklem Date: Mon, 23 Dec 2013 15:16:53 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r259771 - head/sys/fs/nfsclient X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 23 Dec 2013 15:16:54 -0000 Author: rmacklem Date: Mon Dec 23 15:16:53 2013 New Revision: 259771 URL: http://svnweb.freebsd.org/changeset/base/259771 Log: The NFSv4.1 client didn't return NFSv4.1 specific error codes for the Getattr and Recall callbacks. This patch fixes it. Since the NFSv4.1 specific error codes would only happen for abnormal circumstances, this patch has little effect, in practice. MFC after: 1 week Modified: head/sys/fs/nfsclient/nfs_clstate.c Modified: head/sys/fs/nfsclient/nfs_clstate.c ============================================================================== --- head/sys/fs/nfsclient/nfs_clstate.c Mon Dec 23 15:00:15 2013 (r259770) +++ head/sys/fs/nfsclient/nfs_clstate.c Mon Dec 23 15:16:53 2013 (r259771) @@ -146,7 +146,7 @@ static int nfscl_trylock(struct nfsmount static int nfsrpc_reopen(struct nfsmount *, u_int8_t *, int, u_int32_t, struct nfsclopen *, struct nfscldeleg **, struct ucred *, NFSPROC_T *); static void nfscl_freedeleg(struct nfscldeleghead *, struct nfscldeleg *); -static int nfscl_errmap(struct nfsrv_descript *); +static int nfscl_errmap(struct nfsrv_descript *, u_int32_t); static void nfscl_cleanup_common(struct nfsclclient *, u_int8_t *); static int nfscl_recalldeleg(struct nfsclclient *, struct nfsmount *, struct nfscldeleg *, vnode_t, struct ucred *, NFSPROC_T *, int); @@ -3146,7 +3146,7 @@ nfscl_docb(struct nfsrv_descript *nd, NF struct nfsclclient *clp; struct nfscldeleg *dp = NULL; int numops, taglen = -1, error = 0, trunc; - u_int32_t minorvers, retops = 0, *retopsp = NULL, *repp, cbident; + u_int32_t minorvers = 0, retops = 0, *retopsp = NULL, *repp, cbident; u_char tag[NFSV4_SMALLSTR + 1], *tagstr; vnode_t vp = NULL; struct nfsnode *np; @@ -3210,7 +3210,7 @@ nfscl_docb(struct nfsrv_descript *nd, NF (op > NFSV4OP_CBNOTIFYDEVID && minorvers == NFSV41_MINORVERSION)) { nd->nd_repstat = NFSERR_OPILLEGAL; - *repp = nfscl_errmap(nd); + *repp = nfscl_errmap(nd, minorvers); retops++; break; } @@ -3518,7 +3518,7 @@ nfscl_docb(struct nfsrv_descript *nd, NF } retops++; if (nd->nd_repstat) { - *repp = nfscl_errmap(nd); + *repp = nfscl_errmap(nd, minorvers); break; } else *repp = 0; /* NFS4_OK */ @@ -3539,7 +3539,7 @@ nfsmout: } else { *retopsp = txdr_unsigned(retops); } - *nd->nd_errp = nfscl_errmap(nd); + *nd->nd_errp = nfscl_errmap(nd, minorvers); out: if (gotseq_ok != 0) { rep = m_copym(nd->nd_mreq, 0, M_COPYALL, M_WAITOK); @@ -4645,7 +4645,7 @@ nfscl_deleggetmodtime(vnode_t vp, struct } static int -nfscl_errmap(struct nfsrv_descript *nd) +nfscl_errmap(struct nfsrv_descript *nd, u_int32_t minorvers) { short *defaulterrp, *errp; @@ -4658,6 +4658,11 @@ nfscl_errmap(struct nfsrv_descript *nd) if (nd->nd_repstat == NFSERR_MINORVERMISMATCH || nd->nd_repstat == NFSERR_OPILLEGAL) return (txdr_unsigned(nd->nd_repstat)); + if (nd->nd_repstat >= NFSERR_BADIOMODE && nd->nd_repstat < 20000 && + minorvers > NFSV4_MINORVERSION) { + /* NFSv4.n error. */ + return (txdr_unsigned(nd->nd_repstat)); + } if (nd->nd_procnum < NFSV4OP_CBNOPS) errp = defaulterrp = nfscl_cberrmap[nd->nd_procnum]; else