diff mbox series

xfs: abort unaligned nowait directio early

Message ID 20190417144006.GH114154@magnolia (mailing list archive)
State Accepted
Headers show
Series xfs: abort unaligned nowait directio early | expand

Commit Message

Darrick J. Wong April 17, 2019, 2:40 p.m. UTC
From: Darrick J. Wong <darrick.wong@oracle.com>

Dave Chinner noticed that xfs_file_dio_aio_write returns EAGAIN without
dropping the IOLOCK when its deciding not to wait, which means that we
leak the IOLOCK there.  Since we now make unaligned directio always
wait, we have the opportunity to bail out before trying to take the
lock, which should reduce the overhead of this never-gonna-work case
considerably while also solving the dropped lock problem.

Reported-by: Dave Chinner <david@fromorbit.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 fs/xfs/xfs_file.c |    6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

Comments

Brian Foster April 17, 2019, 3:35 p.m. UTC | #1
On Wed, Apr 17, 2019 at 07:40:06AM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> Dave Chinner noticed that xfs_file_dio_aio_write returns EAGAIN without
> dropping the IOLOCK when its deciding not to wait, which means that we
> leak the IOLOCK there.  Since we now make unaligned directio always
> wait, we have the opportunity to bail out before trying to take the
> lock, which should reduce the overhead of this never-gonna-work case
> considerably while also solving the dropped lock problem.
> 
> Reported-by: Dave Chinner <david@fromorbit.com>
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---

Reviewed-by: Brian Foster <bfoster@redhat.com>

>  fs/xfs/xfs_file.c |    6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
> index cdcc75735521..3a45e3b0efa7 100644
> --- a/fs/xfs/xfs_file.c
> +++ b/fs/xfs/xfs_file.c
> @@ -517,6 +517,9 @@ xfs_file_dio_aio_write(
>  	}
>  
>  	if (iocb->ki_flags & IOCB_NOWAIT) {
> +		/* unaligned dio always waits, bail */
> +		if (unaligned_io)
> +			return -EAGAIN;
>  		if (!xfs_ilock_nowait(ip, iolock))
>  			return -EAGAIN;
>  	} else {
> @@ -536,9 +539,6 @@ xfs_file_dio_aio_write(
>  	 * xfs_file_aio_write_checks() for other reasons.
>  	 */
>  	if (unaligned_io) {
> -		/* unaligned dio always waits, bail */
> -		if (iocb->ki_flags & IOCB_NOWAIT)
> -			return -EAGAIN;
>  		inode_dio_wait(inode);
>  	} else if (iolock == XFS_IOLOCK_EXCL) {
>  		xfs_ilock_demote(ip, XFS_IOLOCK_EXCL);
Dave Chinner April 17, 2019, 9:53 p.m. UTC | #2
On Wed, Apr 17, 2019 at 07:40:06AM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> Dave Chinner noticed that xfs_file_dio_aio_write returns EAGAIN without
> dropping the IOLOCK when its deciding not to wait, which means that we
> leak the IOLOCK there.  Since we now make unaligned directio always
> wait, we have the opportunity to bail out before trying to take the
> lock, which should reduce the overhead of this never-gonna-work case
> considerably while also solving the dropped lock problem.
> 
> Reported-by: Dave Chinner <david@fromorbit.com>
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>

Looks good.

Reviewed-by: Dave Chinner <dchinner@redhat.com>
Christoph Hellwig April 23, 2019, 6:22 a.m. UTC | #3
On Wed, Apr 17, 2019 at 07:40:06AM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> Dave Chinner noticed that xfs_file_dio_aio_write returns EAGAIN without
> dropping the IOLOCK when its deciding not to wait, which means that we
> leak the IOLOCK there.  Since we now make unaligned directio always
> wait, we have the opportunity to bail out before trying to take the
> lock, which should reduce the overhead of this never-gonna-work case
> considerably while also solving the dropped lock problem.
> 
> Reported-by: Dave Chinner <david@fromorbit.com>
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>

Looks good,

Reviewed-by: Christoph Hellwig <hch@lst.de>
diff mbox series

Patch

diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index cdcc75735521..3a45e3b0efa7 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -517,6 +517,9 @@  xfs_file_dio_aio_write(
 	}
 
 	if (iocb->ki_flags & IOCB_NOWAIT) {
+		/* unaligned dio always waits, bail */
+		if (unaligned_io)
+			return -EAGAIN;
 		if (!xfs_ilock_nowait(ip, iolock))
 			return -EAGAIN;
 	} else {
@@ -536,9 +539,6 @@  xfs_file_dio_aio_write(
 	 * xfs_file_aio_write_checks() for other reasons.
 	 */
 	if (unaligned_io) {
-		/* unaligned dio always waits, bail */
-		if (iocb->ki_flags & IOCB_NOWAIT)
-			return -EAGAIN;
 		inode_dio_wait(inode);
 	} else if (iolock == XFS_IOLOCK_EXCL) {
 		xfs_ilock_demote(ip, XFS_IOLOCK_EXCL);