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;
 
         */
        ret = start_ordered_ops(inode, start, end);
        if (ret)
-               return ret;
+               goto out;
 
        inode_lock(inode);
        atomic_inc(&root->log_batch);
                 * 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;
        }
                ret = btrfs_end_transaction(trans);
        }
 out:
+       err = file_check_and_advance_wb_err(file);
+       if (!ret)
+               ret = err;
        return ret > 0 ? -EIO : ret;
 }