nfs: enable localio for non-pNFS IO
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Thu, 5 Sep 2024 19:09:54 +0000 (15:09 -0400)
committerAnna Schumaker <anna.schumaker@oracle.com>
Mon, 23 Sep 2024 19:03:30 +0000 (15:03 -0400)
Try a local open of the file being written to, and if it succeeds,
then use localio to issue IO.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Mike Snitzer <snitzer@kernel.org>
Reviewed-by: NeilBrown <neilb@suse.de>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>
fs/nfs/pagelist.c
fs/nfs/write.c

index 97d5524..e27c07b 100644 (file)
@@ -958,6 +958,12 @@ static int nfs_generic_pg_pgios(struct nfs_pageio_descriptor *desc)
        nfs_pgheader_init(desc, hdr, nfs_pgio_header_free);
        ret = nfs_generic_pgio(desc, hdr);
        if (ret == 0) {
+               struct nfs_client *clp = NFS_SERVER(hdr->inode)->nfs_client;
+
+               struct nfsd_file *localio =
+                       nfs_local_open_fh(clp, hdr->cred,
+                                         hdr->args.fh, hdr->args.context->mode);
+
                if (NFS_SERVER(hdr->inode)->nfs_client->cl_minorversion)
                        task_flags = RPC_TASK_MOVEABLE;
                ret = nfs_initiate_pgio(NFS_CLIENT(hdr->inode),
@@ -967,7 +973,7 @@ static int nfs_generic_pg_pgios(struct nfs_pageio_descriptor *desc)
                                        desc->pg_rpc_callops,
                                        desc->pg_ioflags,
                                        RPC_TASK_CRED_NOREF | task_flags,
-                                       NULL);
+                                       localio);
        }
        return ret;
 }
index 508e279..ead2dc5 100644 (file)
@@ -1796,6 +1796,7 @@ nfs_commit_list(struct inode *inode, struct list_head *head, int how,
                struct nfs_commit_info *cinfo)
 {
        struct nfs_commit_data  *data;
+       struct nfsd_file *localio;
        unsigned short task_flags = 0;
 
        /* another commit raced with us */
@@ -1812,9 +1813,12 @@ nfs_commit_list(struct inode *inode, struct list_head *head, int how,
        nfs_init_commit(data, head, NULL, cinfo);
        if (NFS_SERVER(inode)->nfs_client->cl_minorversion)
                task_flags = RPC_TASK_MOVEABLE;
+
+       localio = nfs_local_open_fh(NFS_SERVER(inode)->nfs_client, data->cred,
+                                   data->args.fh, data->context->mode);
        return nfs_initiate_commit(NFS_CLIENT(inode), data, NFS_PROTO(inode),
                                   data->mds_ops, how,
-                                  RPC_TASK_CRED_NOREF | task_flags, NULL);
+                                  RPC_TASK_CRED_NOREF | task_flags, localio);
 }
 
 /*