Date: Fri, 21 Jun 2013 22:46:17 +0000 (UTC) From: Rick Macklem <rmacklem@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r252074 - head/sys/fs/nfsclient Message-ID: <201306212246.r5LMkHBY070137@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: rmacklem Date: Fri Jun 21 22:46:16 2013 New Revision: 252074 URL: http://svnweb.freebsd.org/changeset/base/252074 Log: The NFSv4.1 LayoutCommit operation requires a valid offset and length. (0, 0 is not sufficient) This patch a loop for each file layout, using the offset, length of each file layout in a separate LayoutCommit. Modified: head/sys/fs/nfsclient/nfs_clstate.c Modified: head/sys/fs/nfsclient/nfs_clstate.c ============================================================================== --- head/sys/fs/nfsclient/nfs_clstate.c Fri Jun 21 22:45:03 2013 (r252073) +++ head/sys/fs/nfsclient/nfs_clstate.c Fri Jun 21 22:46:16 2013 (r252074) @@ -5145,16 +5145,28 @@ static void nfscl_dolayoutcommit(struct nfsmount *nmp, struct nfscllayout *lyp, struct ucred *cred, NFSPROC_T *p) { + struct nfsclflayout *flp; + uint64_t len; int error; - error = nfsrpc_layoutcommit(nmp, lyp->nfsly_fh, lyp->nfsly_fhlen, - 0, 0, 0, lyp->nfsly_lastbyte, &lyp->nfsly_stateid, - NFSLAYOUT_NFSV4_1_FILES, 0, NULL, cred, p, NULL); - if (error == NFSERR_NOTSUPP) { - /* If the server doesn't want it, don't bother doing it. */ - NFSLOCKMNT(nmp); - nmp->nm_state |= NFSSTA_NOLAYOUTCOMMIT; - NFSUNLOCKMNT(nmp); + LIST_FOREACH(flp, &lyp->nfsly_flayrw, nfsfl_list) { + if (flp->nfsfl_off <= lyp->nfsly_lastbyte) { + len = flp->nfsfl_end - flp->nfsfl_off; + error = nfsrpc_layoutcommit(nmp, lyp->nfsly_fh, + lyp->nfsly_fhlen, 0, flp->nfsfl_off, len, + lyp->nfsly_lastbyte, &lyp->nfsly_stateid, + NFSLAYOUT_NFSV4_1_FILES, 0, NULL, cred, p, NULL); + NFSCL_DEBUG(4, "layoutcommit err=%d off=%qd len=%qd " + "lastbyte=%qd\n", error, flp->nfsfl_off, len, + lyp->nfsly_lastbyte); + if (error == NFSERR_NOTSUPP) { + /* If not supported, don't bother doing it. */ + NFSLOCKMNT(nmp); + nmp->nm_state |= NFSSTA_NOLAYOUTCOMMIT; + NFSUNLOCKMNT(nmp); + break; + } + } } }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201306212246.r5LMkHBY070137>