xfs: fix IOCB_NOWAIT handling in xfs_file_dio_aio_read
authorChristoph Hellwig <hch@lst.de>
Wed, 15 Jan 2020 17:11:17 +0000 (09:11 -0800)
committerDarrick J. Wong <darrick.wong@oracle.com>
Thu, 16 Jan 2020 06:13:11 +0000 (22:13 -0800)
Direct I/O reads can also be used with RWF_NOWAIT & co.  Fix the inode
locking in xfs_file_dio_aio_read to take IOCB_NOWAIT into account.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
fs/xfs/xfs_file.c

index c932501089520f27f9198919d29d89ecb3a941d0..b8a4a3f29b367dd35a46351991e5dd7c010f35a9 100644 (file)
@@ -187,7 +187,12 @@ xfs_file_dio_aio_read(
 
        file_accessed(iocb->ki_filp);
 
-       xfs_ilock(ip, XFS_IOLOCK_SHARED);
+       if (iocb->ki_flags & IOCB_NOWAIT) {
+               if (!xfs_ilock_nowait(ip, XFS_IOLOCK_SHARED))
+                       return -EAGAIN;
+       } else {
+               xfs_ilock(ip, XFS_IOLOCK_SHARED);
+       }
        ret = iomap_dio_rw(iocb, to, &xfs_read_iomap_ops, NULL,
                        is_sync_kiocb(iocb));
        xfs_iunlock(ip, XFS_IOLOCK_SHARED);