|
@@ -574,6 +574,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 +612,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 +628,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);
|