Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9289e7f9 authored by Chuck Lever's avatar Chuck Lever Committed by Trond Myklebust
Browse files

NFS: Invoke nlmclnt_init during NFS mount processing



Cache an appropriate nlm_host structure in the NFS client's mount point
metadata for later use.

Note that there is no need to set NFS_MOUNT_NONLM in the error case -- if
nfs_start_lockd() returns a non-zero value, its callers ensure that the
mount request fails outright.

Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 52c4044d
Loading
Loading
Loading
Loading
+19 −13
Original line number Diff line number Diff line
@@ -458,7 +458,7 @@ static int nfs_create_rpc_client(struct nfs_client *clp,
static void nfs_destroy_server(struct nfs_server *server)
{
	if (!(server->flags & NFS_MOUNT_NONLM))
		lockd_down();	/* release rpc.lockd */
		nlmclnt_done(server->nlm_host);
}

/*
@@ -466,20 +466,26 @@ static void nfs_destroy_server(struct nfs_server *server)
 */
static int nfs_start_lockd(struct nfs_server *server)
{
	int error = 0;
	struct nlm_host *host;
	struct nfs_client *clp = server->nfs_client;
	u32 nfs_version = clp->rpc_ops->version;
	unsigned short protocol = server->flags & NFS_MOUNT_TCP ?
						IPPROTO_TCP : IPPROTO_UDP;

	if (server->nfs_client->rpc_ops->version > 3)
		goto out;
	if (nfs_version > 3)
		return 0;
	if (server->flags & NFS_MOUNT_NONLM)
		goto out;
	error = lockd_up((server->flags & NFS_MOUNT_TCP) ?
			IPPROTO_TCP : IPPROTO_UDP);
	if (error < 0)
		server->flags |= NFS_MOUNT_NONLM;
	else
		return 0;

	host = nlmclnt_init(clp->cl_hostname,
			    (struct sockaddr *)&clp->cl_addr,
			    clp->cl_addrlen, protocol, nfs_version);
	if (IS_ERR(host))
		return PTR_ERR(host);

	server->nlm_host = host;
	server->destroy = nfs_destroy_server;
out:
	return error;
	return 0;
}

/*
+2 −0
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@
#include <asm/atomic.h>

struct nfs_iostats;
struct nlm_host;

/*
 * The nfs_client identifies our client state to the server.
@@ -80,6 +81,7 @@ struct nfs_server {
	struct list_head	master_link;	/* link in master servers list */
	struct rpc_clnt *	client;		/* RPC client handle */
	struct rpc_clnt *	client_acl;	/* ACL RPC client handle */
	struct nlm_host		*nlm_host;	/* NLM client handle */
	struct nfs_iostats *	io_stats;	/* I/O statistics */
	struct backing_dev_info	backing_dev_info;
	atomic_long_t		writeback;	/* number of writeback pages */