diff options
author | Dave Chinner <david@fromorbit.com> | 2015-10-12 18:38:11 +1100 |
---|---|---|
committer | Dave Chinner <david@fromorbit.com> | 2015-10-12 18:38:11 +1100 |
commit | 8a56d7c305b9613dfe416fd1af06871ec34bb103 (patch) | |
tree | 9ba7d6d2d8cca70739194131adde29d2c2398333 /fs/xfs/xfs_file.c | |
parent | 316433beda9433697109eb1cd256666f163c7c1f (diff) | |
parent | 0a50f162af6ddc2db02c9edc5bbb823c336100a4 (diff) | |
download | linux-8a56d7c305b9613dfe416fd1af06871ec34bb103.tar.bz2 |
Merge branch 'xfs-io-fixes' into for-next
Diffstat (limited to 'fs/xfs/xfs_file.c')
-rw-r--r-- | fs/xfs/xfs_file.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 088e50923830..2f7b6bd39f61 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -482,6 +482,8 @@ xfs_zero_eof( ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); ASSERT(offset > isize); + trace_xfs_zero_eof(ip, isize, offset - isize); + /* * First handle zeroing the block on which isize resides. * @@ -574,6 +576,7 @@ xfs_file_aio_write_checks( struct xfs_inode *ip = XFS_I(inode); ssize_t error = 0; size_t count = iov_iter_count(from); + bool drained_dio = false; restart: error = generic_write_checks(iocb, from); @@ -611,12 +614,13 @@ restart: bool zero = false; spin_unlock(&ip->i_flags_lock); - if (*iolock == XFS_IOLOCK_SHARED) { - xfs_rw_iunlock(ip, *iolock); - *iolock = XFS_IOLOCK_EXCL; - xfs_rw_ilock(ip, *iolock); - iov_iter_reexpand(from, count); - + if (!drained_dio) { + if (*iolock == XFS_IOLOCK_SHARED) { + xfs_rw_iunlock(ip, *iolock); + *iolock = XFS_IOLOCK_EXCL; + xfs_rw_ilock(ip, *iolock); + iov_iter_reexpand(from, count); + } /* * We now have an IO submission barrier in place, but * AIO can do EOF updates during IO completion and hence @@ -626,6 +630,7 @@ restart: * no-op. */ inode_dio_wait(inode); + drained_dio = true; goto restart; } error = xfs_zero_eof(ip, iocb->ki_pos, i_size_read(inode), &zero); |