]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
xfs: move generic_write_sync calls inwards
authorDave Chinner <dchinner@redhat.com>
Wed, 2 May 2018 19:54:52 +0000 (12:54 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Wed, 9 May 2018 17:04:00 +0000 (10:04 -0700)
To prepare for iomap iinfrastructure based DSYNC optimisations.

While moving the code araound, move the XFS write bytes metric
update for direct IO into xfs_dio_write_end_io callback so that we
always capture the amount of data written via AIO+DIO. This fixes
the problem where queued AIO+DIO writes are not accounted to this
metric.

Signed-Off-By: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
fs/xfs/xfs_file.c

index e70fb8cceceaa5d2333573e49460beba75629815..e03e084b68190b11a6f4f3f051bf405e5ce67d05 100644 (file)
@@ -414,6 +414,12 @@ xfs_dio_write_end_io(
        if (size <= 0)
                return size;
 
+       /*
+        * Capture amount written on completion as we can't reliably account
+        * for it on submission.
+        */
+       XFS_STATS_ADD(ip->i_mount, xs_write_bytes, size);
+
        if (flags & IOMAP_DIO_COW) {
                error = xfs_reflink_end_cow(ip, offset, size);
                if (error)
@@ -562,6 +568,11 @@ xfs_file_dio_aio_write(
         * complete fully or fail.
         */
        ASSERT(ret < 0 || ret == count);
+
+       if (ret > 0) {
+               /* Handle various SYNC-type writes */
+               ret = generic_write_sync(iocb, ret);
+       }
        return ret;
 }
 
@@ -599,7 +610,16 @@ xfs_file_dax_write(
        }
 out:
        xfs_iunlock(ip, iolock);
-       return error ? error : ret;
+       if (error)
+               return error;
+
+       if (ret > 0) {
+               XFS_STATS_ADD(ip->i_mount, xs_write_bytes, ret);
+
+               /* Handle various SYNC-type writes */
+               ret = generic_write_sync(iocb, ret);
+       }
+       return ret;
 }
 
 STATIC ssize_t
@@ -669,6 +689,12 @@ xfs_file_buffered_aio_write(
 out:
        if (iolock)
                xfs_iunlock(ip, iolock);
+
+       if (ret > 0) {
+               XFS_STATS_ADD(ip->i_mount, xs_write_bytes, ret);
+               /* Handle various SYNC-type writes */
+               ret = generic_write_sync(iocb, ret);
+       }
        return ret;
 }
 
@@ -693,8 +719,9 @@ xfs_file_write_iter(
                return -EIO;
 
        if (IS_DAX(inode))
-               ret = xfs_file_dax_write(iocb, from);
-       else if (iocb->ki_flags & IOCB_DIRECT) {
+               return xfs_file_dax_write(iocb, from);
+
+       if (iocb->ki_flags & IOCB_DIRECT) {
                /*
                 * Allow a directio write to fall back to a buffered
                 * write *only* in the case that we're doing a reflink
@@ -702,20 +729,11 @@ xfs_file_write_iter(
                 * allow an operation to fall back to buffered mode.
                 */
                ret = xfs_file_dio_aio_write(iocb, from);
-               if (ret == -EREMCHG)
-                       goto buffered;
-       } else {
-buffered:
-               ret = xfs_file_buffered_aio_write(iocb, from);
+               if (ret != -EREMCHG)
+                       return ret;
        }
 
-       if (ret > 0) {
-               XFS_STATS_ADD(ip->i_mount, xs_write_bytes, ret);
-
-               /* Handle various SYNC-type writes */
-               ret = generic_write_sync(iocb, ret);
-       }
-       return ret;
+       return xfs_file_buffered_aio_write(iocb, from);
 }
 
 #define        XFS_FALLOC_FL_SUPPORTED                                         \