[RFC PATCH v1 8/8] nfs: allow P2PDMA pages for O_DIRECT on RDMA mounts

From: Pranjal Shrivastava

Date: Tue Oct 06 2026 - 19:33:58 EST


Pass ITER_ALLOW_P2PDMA when extracting O_DIRECT pages on mounts that
use the RDMA transport and not pNFS. The RDMA transport moves such pages
only by DMA, and fails the RPC with -EREMOTEIO if the device cannot
reach them.

On other mounts, extracting P2PDMA pages still fails with -EREMOTEIO.

Signed-off-by: Pranjal Shrivastava <praan@xxxxxxxxxx>
---
fs/nfs/direct.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
index a3c6e8f4ea06..dbeb4f8274e3 100644
--- a/fs/nfs/direct.c
+++ b/fs/nfs/direct.c
@@ -157,14 +157,22 @@ static ssize_t nfs_direct_extract_pages(struct nfs_direct_req *dreq,
size_t size, loff_t *pos,
struct list_head *list)
{
+ struct nfs_server *server = NFS_SERVER(dreq->inode);
bool pinned = iov_iter_extract_will_pin(iter);
+ iov_iter_extraction_t flags = 0;
struct page **pagevec = NULL;
ssize_t result, bytes = 0;
int err = 0;
unsigned int npages, i;
size_t pgbase;

- result = iov_iter_extract_pages(iter, &pagevec, size, ~0U, 0, &pgbase);
+ /* Allow P2PDMA pages only on RDMA mounts that do not use pNFS */
+ if (server->nfs_client->cl_proto == XPRT_TRANSPORT_RDMA &&
+ !pnfs_enabled_sb(server))
+ flags = ITER_ALLOW_P2PDMA;
+
+ result = iov_iter_extract_pages(iter, &pagevec, size, ~0U, flags,
+ &pgbase);
if (result <= 0)
return result;

--
2.56.0.rc1.315.gc6ed9934b7-goog