Message ID | 20190417144006.GH114154@magnolia (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | xfs: abort unaligned nowait directio early | expand |
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);
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>
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 --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);