Skip site navigation (1)Skip section navigation (2)
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>