fs: push i_mutex and filemap_write_and_wait down into ->fsync() handlers
[linux-flexiantxendom0-3.2.10.git] / fs / xfs / linux-2.6 / xfs_file.c
index 7f782af..fbbf657 100644 (file)
@@ -127,6 +127,8 @@ xfs_iozero(
 STATIC int
 xfs_file_fsync(
        struct file             *file,
+       loff_t                  start,
+       loff_t                  end,
        int                     datasync)
 {
        struct inode            *inode = file->f_mapping->host;
@@ -138,6 +140,10 @@ xfs_file_fsync(
 
        trace_xfs_file_fsync(ip);
 
+       error = filemap_write_and_wait_range(inode->i_mapping, start, end);
+       if (error)
+               return error;
+
        if (XFS_FORCED_SHUTDOWN(mp))
                return -XFS_ERROR(EIO);
 
@@ -875,18 +881,11 @@ xfs_file_aio_write(
        /* Handle various SYNC-type writes */
        if ((file->f_flags & O_DSYNC) || IS_SYNC(inode)) {
                loff_t end = pos + ret - 1;
-               int error, error2;
 
                xfs_rw_iunlock(ip, iolock);
-               error = filemap_write_and_wait_range(mapping, pos, end);
+               ret = -xfs_file_fsync(file, pos, end,
+                                     (file->f_flags & __O_SYNC) ? 0 : 1);
                xfs_rw_ilock(ip, iolock);
-
-               error2 = -xfs_file_fsync(file,
-                                        (file->f_flags & __O_SYNC) ? 0 : 1);
-               if (error)
-                       ret = error;
-               else if (error2)
-                       ret = error2;
        }
 
 out_unlock: