Commit fa88a7d6 authored by Trond Myklebust's avatar Trond Myklebust Committed by Anna Schumaker
Browse files

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: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: default avatarMike Snitzer <snitzer@kernel.org>
Reviewed-by: default avatarNeilBrown <neilb@suse.de>
Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
Signed-off-by: default avatarAnna Schumaker <anna.schumaker@oracle.com>
parent 70ba381e
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -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;
}
+5 −1
Original line number Diff line number Diff line
@@ -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);
}

/*