1
0
Fork 0

xfs: flush for older, xfs specific ioctls

837a6e7f5c ("fs: add generic UNRESVSP and ZERO_RANGE ioctl handlers") changed
ioctls XFS_IOC_UNRESVSP XFS_IOC_UNRESVSP64 and XFS_IOC_ZERO_RANGE to be generic
instead of xfs specific.

Because of this change, 36f11775da ("xfs: properly serialise fallocate against
AIO+DIO") needed adaptation, as 5.4 still uses the xfs specific ioctls.

Without this, xfstests xfs/242 and xfs/290 fail. Both of these tests test
XFS_IOC_ZERO_RANGE.

Fixes: 36f11775da ("xfs: properly serialise fallocate against AIO+DIO")
Tested-by: Andy Strohman <astroh@amazon.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
5.4-rM2-2.2.x-imx-squashed
Andy Strohman 2020-11-05 20:28:50 +00:00 committed by Greg Kroah-Hartman
parent 258d01b157
commit 21ab13af8c
1 changed files with 25 additions and 1 deletions

View File

@ -622,7 +622,6 @@ xfs_ioc_space(
error = xfs_break_layouts(inode, &iolock, BREAK_UNMAP);
if (error)
goto out_unlock;
inode_dio_wait(inode);
switch (bf->l_whence) {
case 0: /*SEEK_SET*/
@ -668,6 +667,31 @@ xfs_ioc_space(
goto out_unlock;
}
/*
* Must wait for all AIO to complete before we continue as AIO can
* change the file size on completion without holding any locks we
* currently hold. We must do this first because AIO can update both
* the on disk and in memory inode sizes, and the operations that follow
* require the in-memory size to be fully up-to-date.
*/
inode_dio_wait(inode);
/*
* Now that AIO and DIO has drained we can flush and (if necessary)
* invalidate the cached range over the first operation we are about to
* run. We include zero range here because it starts with a hole punch
* over the target range.
*/
switch (cmd) {
case XFS_IOC_ZERO_RANGE:
case XFS_IOC_UNRESVSP:
case XFS_IOC_UNRESVSP64:
error = xfs_flush_unmap_range(ip, bf->l_start, bf->l_len);
if (error)
goto out_unlock;
break;
}
switch (cmd) {
case XFS_IOC_ZERO_RANGE:
flags |= XFS_PREALLOC_SET;