From: Darrick J. Wong <darrick.wong@xxxxxxxxxx> If userspace hands us a not-block-aligned directio write, we'll fall back to a buffered write for the read-modify-write operation. Unfortunately, we don't flush the page cache after a successful fallback CoW, which means we break userspace's expectation that the data has been sent to the drive. Fix that by upgrading the iocb to DSYNC so that the buffered CoW is synchronous. Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> --- fs/xfs/xfs_file.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index e47425071e65..675da7e9c001 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -692,6 +692,8 @@ xfs_file_write_iter( struct xfs_inode *ip = XFS_I(inode); ssize_t ret; size_t ocount = iov_iter_count(from); + bool was_dsync = iocb->ki_flags & IOCB_DSYNC; + int error; XFS_STATS_INC(ip->i_mount, xs_write_calls); @@ -714,9 +716,13 @@ xfs_file_write_iter( ret = xfs_file_dio_aio_write(iocb, from); if (ret != -EREMCHG) return ret; + iocb->ki_flags |= IOCB_DSYNC; } - return xfs_file_buffered_aio_write(iocb, from); + error = xfs_file_buffered_aio_write(iocb, from); + if (!was_dsync) + iocb->ki_flags &= ~IOCB_DSYNC; + return error; } static void