|
@@ -237,7 +237,11 @@ xfs_file_dax_read(
|
|
if (!count)
|
|
if (!count)
|
|
return 0; /* skip atime */
|
|
return 0; /* skip atime */
|
|
|
|
|
|
- xfs_ilock(ip, XFS_IOLOCK_SHARED);
|
|
|
|
|
|
+ if (!xfs_ilock_nowait(ip, XFS_IOLOCK_SHARED)) {
|
|
|
|
+ if (iocb->ki_flags & IOCB_NOWAIT)
|
|
|
|
+ return -EAGAIN;
|
|
|
|
+ xfs_ilock(ip, XFS_IOLOCK_SHARED);
|
|
|
|
+ }
|
|
ret = dax_iomap_rw(iocb, to, &xfs_iomap_ops);
|
|
ret = dax_iomap_rw(iocb, to, &xfs_iomap_ops);
|
|
xfs_iunlock(ip, XFS_IOLOCK_SHARED);
|
|
xfs_iunlock(ip, XFS_IOLOCK_SHARED);
|
|
|
|
|
|
@@ -541,7 +545,11 @@ xfs_file_dio_aio_write(
|
|
iolock = XFS_IOLOCK_SHARED;
|
|
iolock = XFS_IOLOCK_SHARED;
|
|
}
|
|
}
|
|
|
|
|
|
- xfs_ilock(ip, iolock);
|
|
|
|
|
|
+ if (!xfs_ilock_nowait(ip, iolock)) {
|
|
|
|
+ if (iocb->ki_flags & IOCB_NOWAIT)
|
|
|
|
+ return -EAGAIN;
|
|
|
|
+ xfs_ilock(ip, iolock);
|
|
|
|
+ }
|
|
|
|
|
|
ret = xfs_file_aio_write_checks(iocb, from, &iolock);
|
|
ret = xfs_file_aio_write_checks(iocb, from, &iolock);
|
|
if (ret)
|
|
if (ret)
|
|
@@ -553,9 +561,15 @@ xfs_file_dio_aio_write(
|
|
* otherwise demote the lock if we had to take the exclusive lock
|
|
* otherwise demote the lock if we had to take the exclusive lock
|
|
* for other reasons in xfs_file_aio_write_checks.
|
|
* for other reasons in xfs_file_aio_write_checks.
|
|
*/
|
|
*/
|
|
- if (unaligned_io)
|
|
|
|
- inode_dio_wait(inode);
|
|
|
|
- else if (iolock == XFS_IOLOCK_EXCL) {
|
|
|
|
|
|
+ if (unaligned_io) {
|
|
|
|
+ /* If we are going to wait for other DIO to finish, bail */
|
|
|
|
+ if (iocb->ki_flags & IOCB_NOWAIT) {
|
|
|
|
+ if (atomic_read(&inode->i_dio_count))
|
|
|
|
+ return -EAGAIN;
|
|
|
|
+ } else {
|
|
|
|
+ inode_dio_wait(inode);
|
|
|
|
+ }
|
|
|
|
+ } else if (iolock == XFS_IOLOCK_EXCL) {
|
|
xfs_ilock_demote(ip, XFS_IOLOCK_EXCL);
|
|
xfs_ilock_demote(ip, XFS_IOLOCK_EXCL);
|
|
iolock = XFS_IOLOCK_SHARED;
|
|
iolock = XFS_IOLOCK_SHARED;
|
|
}
|
|
}
|
|
@@ -585,7 +599,12 @@ xfs_file_dax_write(
|
|
size_t count;
|
|
size_t count;
|
|
loff_t pos;
|
|
loff_t pos;
|
|
|
|
|
|
- xfs_ilock(ip, iolock);
|
|
|
|
|
|
+ if (!xfs_ilock_nowait(ip, iolock)) {
|
|
|
|
+ if (iocb->ki_flags & IOCB_NOWAIT)
|
|
|
|
+ return -EAGAIN;
|
|
|
|
+ xfs_ilock(ip, iolock);
|
|
|
|
+ }
|
|
|
|
+
|
|
ret = xfs_file_aio_write_checks(iocb, from, &iolock);
|
|
ret = xfs_file_aio_write_checks(iocb, from, &iolock);
|
|
if (ret)
|
|
if (ret)
|
|
goto out;
|
|
goto out;
|
|
@@ -892,6 +911,7 @@ xfs_file_open(
|
|
return -EFBIG;
|
|
return -EFBIG;
|
|
if (XFS_FORCED_SHUTDOWN(XFS_M(inode->i_sb)))
|
|
if (XFS_FORCED_SHUTDOWN(XFS_M(inode->i_sb)))
|
|
return -EIO;
|
|
return -EIO;
|
|
|
|
+ file->f_mode |= FMODE_AIO_NOWAIT;
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|