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;
+                       }
+               }
        }
 }
 
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to