NFS: Don't inadvertently clear writeback errors
authorTrond Myklebust <trondmy@gmail.com>
Sun, 7 Apr 2019 17:59:04 +0000 (13:59 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Thu, 25 Apr 2019 18:18:14 +0000 (14:18 -0400)
vfs_fsync() has the side effect of clearing unreported writeback errors,
so we need to make sure that we do not abuse it in situations where
applications might not normally expect us to report those errors.

The solution is to replace calls to vfs_fsync() with calls to nfs_wb_all().

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/file.c
fs/nfs/nfs4file.c

index 4899b85f9b3c2cf30de9486b4279de01999f07d2..f807e8643ae6b03b352997faca0137b912d97518 100644 (file)
@@ -147,7 +147,7 @@ nfs_file_flush(struct file *file, fl_owner_t id)
                return 0;
 
        /* Flush writes to the server and return any errors */
-       return vfs_fsync(file, 0);
+       return nfs_wb_all(inode);
 }
 
 ssize_t
@@ -655,7 +655,7 @@ ssize_t nfs_file_write(struct kiocb *iocb, struct iov_iter *from)
 
        /* Return error values */
        if (nfs_need_check_write(file, inode)) {
-               int err = vfs_fsync(file, 0);
+               int err = nfs_wb_all(inode);
                if (err < 0)
                        result = err;
        }
@@ -709,7 +709,7 @@ do_unlk(struct file *filp, int cmd, struct file_lock *fl, int is_local)
         * Flush all pending writes before doing anything
         * with locks..
         */
-       vfs_fsync(filp, 0);
+       nfs_wb_all(inode);
 
        l_ctx = nfs_get_lock_context(nfs_file_open_context(filp));
        if (!IS_ERR(l_ctx)) {
index 00d17198ee12aa7f6177bd3c1c5830fa655d1033..d2846f164997cd5127a711b1c6b7274ae4d6812f 100644 (file)
@@ -125,7 +125,7 @@ nfs4_file_flush(struct file *file, fl_owner_t id)
                return filemap_fdatawrite(file->f_mapping);
 
        /* Flush writes to the server and return any errors */
-       return vfs_fsync(file, 0);
+       return nfs_wb_all(inode);
 }
 
 #ifdef CONFIG_NFS_V4_2