]> git.openfabrics.org - ~emulex/infiniband.git/commitdiff
nfsd: fix inclusive vfs_fsync_range() end
authorZach Brown <zab@zabbo.net>
Mon, 6 Oct 2014 23:42:52 +0000 (16:42 -0700)
committerJ. Bruce Fields <bfields@redhat.com>
Thu, 23 Oct 2014 18:05:10 +0000 (14:05 -0400)
The vfs_fsync_range() call during write processing got the end of the
range off by one.  The range is inclusive, not exclusive.  The error has
nfsd sync more data than requested -- it's correct but unnecessary
overhead.

The call during commit processing is correct so I copied that pattern in
write processing.  Maybe a helper would be nice but I kept it trivial.

This is untested.  I found it while reviewing code for something else
entirely.

Signed-off-by: Zach Brown <zab@zabbo.net>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/vfs.c

index 989129e2d6eac69951abf3a6c1f4f9cae9fbb826..d16076bd9a7a2cb9177fd941924337f66e57be61 100644 (file)
@@ -938,6 +938,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
        int                     stable = *stablep;
        int                     use_wgather;
        loff_t                  pos = offset;
+       loff_t                  end = LLONG_MAX;
        unsigned int            pflags = current->flags;
 
        if (rqstp->rq_local)
@@ -969,10 +970,13 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
        fsnotify_modify(file);
 
        if (stable) {
-               if (use_wgather)
+               if (use_wgather) {
                        host_err = wait_for_concurrent_writes(file);
-               else
-                       host_err = vfs_fsync_range(file, offset, offset+*cnt, 0);
+               } else {
+                       if (*cnt)
+                               end = offset + *cnt - 1;
+                       host_err = vfs_fsync_range(file, offset, end, 0);
+               }
        }
 
 out_nfserr: