Skip to content

Commit

Permalink
xfs: move generic_write_sync calls inwards
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Dave Chinner authored and Darrick J. Wong committed May 9, 2018
1 parent b027d4c commit ed5c3e6
Showing 1 changed file with 33 additions and 15 deletions.
48 changes: 33 additions & 15 deletions fs/xfs/xfs_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;
}

Expand All @@ -693,29 +719,21 @@ 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
* CoW. In all other directio scenarios we do not
* 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 \
Expand Down

0 comments on commit ed5c3e6

Please sign in to comment.