summaryrefslogtreecommitdiff
path: root/fs/nfs/direct.c
diff options
context:
space:
mode:
authorDylan Yudaken <dyudaken@gmail.com>2026-06-07 08:31:55 +0100
committerAnna Schumaker <anna.schumaker@hammerspace.com>2026-06-08 12:07:16 -0400
commitef74e4453856716dbdaba06eaee5251e37e6882e (patch)
tree5dac876ba70cac4ac4bc6820b0a238715327174c /fs/nfs/direct.c
parente3a78029444777b7bb75693cfa8090b189e47cdc (diff)
downloadlinux-next-ef74e4453856716dbdaba06eaee5251e37e6882e.tar.gz
linux-next-ef74e4453856716dbdaba06eaee5251e37e6882e.zip
nfs: expose FMODE_NOWAIT for read-only files
NFS O_DIRECT reads already (mostly) handle async requests, with the exception of locking the inode for direct. Handle async requests properly by using nfs_start_io_direct_nowait, and then expose FMODE_NOWAIT since it's now supported for direct reads. Signed-off-by: Dylan Yudaken <dyudaken@gmail.com> Signed-off-by: Anna Schumaker <anna.schumaker@hammerspace.com>
Diffstat (limited to 'fs/nfs/direct.c')
-rw-r--r--fs/nfs/direct.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
index 48d89716193a..e626c72495e6 100644
--- a/fs/nfs/direct.c
+++ b/fs/nfs/direct.c
@@ -466,14 +466,22 @@ ssize_t nfs_file_direct_read(struct kiocb *iocb, struct iov_iter *iter,
goto out_release;
}
dreq->l_ctx = l_ctx;
- if (!is_sync_kiocb(iocb))
+ if (!is_sync_kiocb(iocb)) {
dreq->iocb = iocb;
+ } else if (iocb->ki_flags & IOCB_NOWAIT) {
+ result = -EAGAIN;
+ nfs_direct_req_release(dreq);
+ goto out_release;
+ }
if (user_backed_iter(iter))
dreq->flags = NFS_ODIRECT_SHOULD_DIRTY;
if (!swap) {
- result = nfs_start_io_direct(inode);
+ if (iocb->ki_flags & IOCB_NOWAIT)
+ result = nfs_start_io_direct_nowait(inode);
+ else
+ result = nfs_start_io_direct(inode);
if (result) {
/* release the reference that would usually be
* consumed by nfs_direct_read_schedule_iovec()