btrfs: minimal conversion to errseq_t writeback error reporting on fsync
authorJeff Layton <jlayton@redhat.com>
Thu, 6 Jul 2017 11:02:31 +0000 (07:02 -0400)
committerJeff Layton <jlayton@redhat.com>
Thu, 6 Jul 2017 11:02:31 +0000 (07:02 -0400)
Just check and advance the errseq_t in the file before returning, and
use an errseq_t based check for writeback errors.

Other internal callers of filemap_* functions are left as-is.

Signed-off-by: Jeff Layton <jlayton@redhat.com>
fs/btrfs/file.c

index da1096eb1a406f648b1bb0c7f3ee1da0e3013646..deeb4799da5c96bc860aa182a3ac0b0e2e502588 100644 (file)
@@ -2011,7 +2011,7 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
        struct btrfs_root *root = BTRFS_I(inode)->root;
        struct btrfs_trans_handle *trans;
        struct btrfs_log_ctx ctx;
-       int ret = 0;
+       int ret = 0, err;
        bool full_sync = 0;
        u64 len;
 
@@ -2030,7 +2030,7 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
         */
        ret = start_ordered_ops(inode, start, end);
        if (ret)
-               return ret;
+               goto out;
 
        inode_lock(inode);
        atomic_inc(&root->log_batch);
@@ -2135,10 +2135,10 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
                 * An ordered extent might have started before and completed
                 * already with io errors, in which case the inode was not
                 * updated and we end up here. So check the inode's mapping
-                * flags for any errors that might have happened while doing
-                * writeback of file data.
+                * for any errors that might have happened since we last
+                * checked called fsync.
                 */
-               ret = filemap_check_errors(inode->i_mapping);
+               ret = filemap_check_wb_err(inode->i_mapping, file->f_wb_err);
                inode_unlock(inode);
                goto out;
        }
@@ -2227,6 +2227,9 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
                ret = btrfs_end_transaction(trans);
        }
 out:
+       err = file_check_and_advance_wb_err(file);
+       if (!ret)
+               ret = err;
        return ret > 0 ? -EIO : ret;
 }