nfs: enable localio for non-pNFS IO

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>
This commit is contained in:
Trond Myklebust 2024-09-05 15:09:54 -04:00 committed by Anna Schumaker
parent 70ba381e1a
commit fa88a7d6ae
2 changed files with 12 additions and 2 deletions

View 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); nfs_pgheader_init(desc, hdr, nfs_pgio_header_free);
ret = nfs_generic_pgio(desc, hdr); ret = nfs_generic_pgio(desc, hdr);
if (ret == 0) { 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) if (NFS_SERVER(hdr->inode)->nfs_client->cl_minorversion)
task_flags = RPC_TASK_MOVEABLE; task_flags = RPC_TASK_MOVEABLE;
ret = nfs_initiate_pgio(NFS_CLIENT(hdr->inode), 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_rpc_callops,
desc->pg_ioflags, desc->pg_ioflags,
RPC_TASK_CRED_NOREF | task_flags, RPC_TASK_CRED_NOREF | task_flags,
NULL); localio);
} }
return ret; return ret;
} }

View 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_info *cinfo)
{ {
struct nfs_commit_data *data; struct nfs_commit_data *data;
struct nfsd_file *localio;
unsigned short task_flags = 0; unsigned short task_flags = 0;
/* another commit raced with us */ /* 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); nfs_init_commit(data, head, NULL, cinfo);
if (NFS_SERVER(inode)->nfs_client->cl_minorversion) if (NFS_SERVER(inode)->nfs_client->cl_minorversion)
task_flags = RPC_TASK_MOVEABLE; 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), return nfs_initiate_commit(NFS_CLIENT(inode), data, NFS_PROTO(inode),
data->mds_ops, how, data->mds_ops, how,
RPC_TASK_CRED_NOREF | task_flags, NULL); RPC_TASK_CRED_NOREF | task_flags, localio);
} }
/* /*