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

Commit ceb3a16c authored by Trond Myklebust's avatar Trond Myklebust
Browse files

NFSv4: Cache the NFSv4/v4.1 client owner_id in the struct nfs_client



Ensure that we cache the NFSv4/v4.1 client owner_id so that we can
verify it when we're doing trunking detection.

Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
parent 1fc0703a
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -228,6 +228,7 @@ static void nfs4_shutdown_client(struct nfs_client *clp)
	kfree(clp->cl_serverowner);
	kfree(clp->cl_serverscope);
	kfree(clp->cl_implid);
	kfree(clp->cl_owner_id);
}

void nfs4_free_client(struct nfs_client *clp)
+15 −4
Original line number Diff line number Diff line
@@ -4917,11 +4917,14 @@ static void nfs4_init_boot_verifier(const struct nfs_client *clp,
}

static unsigned int
nfs4_init_nonuniform_client_string(const struct nfs_client *clp,
nfs4_init_nonuniform_client_string(struct nfs_client *clp,
				   char *buf, size_t len)
{
	unsigned int result;

	if (clp->cl_owner_id != NULL)
		return strlcpy(buf, clp->cl_owner_id, len);

	rcu_read_lock();
	result = scnprintf(buf, len, "Linux NFSv4.0 %s/%s %s",
				clp->cl_ipaddr,
@@ -4930,24 +4933,32 @@ nfs4_init_nonuniform_client_string(const struct nfs_client *clp,
				rpc_peeraddr2str(clp->cl_rpcclient,
							RPC_DISPLAY_PROTO));
	rcu_read_unlock();
	clp->cl_owner_id = kstrdup(buf, GFP_KERNEL);
	return result;
}

static unsigned int
nfs4_init_uniform_client_string(const struct nfs_client *clp,
nfs4_init_uniform_client_string(struct nfs_client *clp,
				char *buf, size_t len)
{
	const char *nodename = clp->cl_rpcclient->cl_nodename;
	unsigned int result;

	if (clp->cl_owner_id != NULL)
		return strlcpy(buf, clp->cl_owner_id, len);

	if (nfs4_client_id_uniquifier[0] != '\0')
		return scnprintf(buf, len, "Linux NFSv%u.%u %s/%s",
		result = scnprintf(buf, len, "Linux NFSv%u.%u %s/%s",
				clp->rpc_ops->version,
				clp->cl_minorversion,
				nfs4_client_id_uniquifier,
				nodename);
	return scnprintf(buf, len, "Linux NFSv%u.%u %s",
	else
		result = scnprintf(buf, len, "Linux NFSv%u.%u %s",
				clp->rpc_ops->version, clp->cl_minorversion,
				nodename);
	clp->cl_owner_id = kstrdup(buf, GFP_KERNEL);
	return result;
}

/*
+3 −0
Original line number Diff line number Diff line
@@ -74,6 +74,9 @@ struct nfs_client {
	/* idmapper */
	struct idmap *		cl_idmap;

	/* Client owner identifier */
	const char *		cl_owner_id;

	/* Our own IP address, as a null-terminated string.
	 * This is used to generate the mv0 callback address.
	 */