2
0
mirror of https://github.com/edk2-porting/linux-next.git synced 2024-12-15 16:53:54 +08:00

lockd: Store the lockd client credential in struct nlm_host

When we create a new lockd client, we want to be able to pass the
correct credential of the process that created the struct nlm_host.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
Trond Myklebust 2019-04-24 17:46:50 -04:00 committed by Anna Schumaker
parent 3b7eb5e35d
commit b422df915c
4 changed files with 14 additions and 4 deletions

View File

@ -63,7 +63,7 @@ struct nlm_host *nlmclnt_init(const struct nlmclnt_initdata *nlm_init)
host = nlmclnt_lookup_host(nlm_init->address, nlm_init->addrlen, host = nlmclnt_lookup_host(nlm_init->address, nlm_init->addrlen,
nlm_init->protocol, nlm_version, nlm_init->protocol, nlm_version,
nlm_init->hostname, nlm_init->noresvport, nlm_init->hostname, nlm_init->noresvport,
nlm_init->net); nlm_init->net, nlm_init->cred);
if (host == NULL) if (host == NULL)
goto out_nohost; goto out_nohost;
if (host->h_rpcclnt == NULL && nlm_bind_host(host) == NULL) if (host->h_rpcclnt == NULL && nlm_bind_host(host) == NULL)

View File

@ -60,6 +60,7 @@ struct nlm_lookup_host_info {
const size_t hostname_len; /* it's length */ const size_t hostname_len; /* it's length */
const int noresvport; /* use non-priv port */ const int noresvport; /* use non-priv port */
struct net *net; /* network namespace to bind */ struct net *net; /* network namespace to bind */
const struct cred *cred;
}; };
/* /*
@ -162,6 +163,7 @@ static struct nlm_host *nlm_alloc_host(struct nlm_lookup_host_info *ni,
host->h_nsmhandle = nsm; host->h_nsmhandle = nsm;
host->h_addrbuf = nsm->sm_addrbuf; host->h_addrbuf = nsm->sm_addrbuf;
host->net = ni->net; host->net = ni->net;
host->h_cred = get_cred(ni->cred),
strlcpy(host->nodename, utsname()->nodename, sizeof(host->nodename)); strlcpy(host->nodename, utsname()->nodename, sizeof(host->nodename));
out: out:
@ -188,6 +190,7 @@ static void nlm_destroy_host_locked(struct nlm_host *host)
clnt = host->h_rpcclnt; clnt = host->h_rpcclnt;
if (clnt != NULL) if (clnt != NULL)
rpc_shutdown_client(clnt); rpc_shutdown_client(clnt);
put_cred(host->h_cred);
kfree(host); kfree(host);
ln->nrhosts--; ln->nrhosts--;
@ -202,6 +205,8 @@ static void nlm_destroy_host_locked(struct nlm_host *host)
* @version: NLM protocol version * @version: NLM protocol version
* @hostname: '\0'-terminated hostname of server * @hostname: '\0'-terminated hostname of server
* @noresvport: 1 if non-privileged port should be used * @noresvport: 1 if non-privileged port should be used
* @net: pointer to net namespace
* @cred: pointer to cred
* *
* Returns an nlm_host structure that matches the passed-in * Returns an nlm_host structure that matches the passed-in
* [server address, transport protocol, NLM version, server hostname]. * [server address, transport protocol, NLM version, server hostname].
@ -214,7 +219,8 @@ struct nlm_host *nlmclnt_lookup_host(const struct sockaddr *sap,
const u32 version, const u32 version,
const char *hostname, const char *hostname,
int noresvport, int noresvport,
struct net *net) struct net *net,
const struct cred *cred)
{ {
struct nlm_lookup_host_info ni = { struct nlm_lookup_host_info ni = {
.server = 0, .server = 0,
@ -226,6 +232,7 @@ struct nlm_host *nlmclnt_lookup_host(const struct sockaddr *sap,
.hostname_len = strlen(hostname), .hostname_len = strlen(hostname),
.noresvport = noresvport, .noresvport = noresvport,
.net = net, .net = net,
.cred = cred,
}; };
struct hlist_head *chain; struct hlist_head *chain;
struct nlm_host *host; struct nlm_host *host;
@ -458,7 +465,7 @@ nlm_bind_host(struct nlm_host *host)
.authflavor = RPC_AUTH_UNIX, .authflavor = RPC_AUTH_UNIX,
.flags = (RPC_CLNT_CREATE_NOPING | .flags = (RPC_CLNT_CREATE_NOPING |
RPC_CLNT_CREATE_AUTOBIND), RPC_CLNT_CREATE_AUTOBIND),
.cred = current_cred(), .cred = host->h_cred,
}; };
/* /*

View File

@ -46,6 +46,7 @@ struct nlmclnt_initdata {
int noresvport; int noresvport;
struct net *net; struct net *net;
const struct nlmclnt_operations *nlmclnt_ops; const struct nlmclnt_operations *nlmclnt_ops;
const struct cred *cred;
}; };
/* /*

View File

@ -70,6 +70,7 @@ struct nlm_host {
struct nsm_handle *h_nsmhandle; /* NSM status handle */ struct nsm_handle *h_nsmhandle; /* NSM status handle */
char *h_addrbuf; /* address eyecatcher */ char *h_addrbuf; /* address eyecatcher */
struct net *net; /* host net */ struct net *net; /* host net */
const struct cred *h_cred;
char nodename[UNX_MAXNODENAME + 1]; char nodename[UNX_MAXNODENAME + 1];
const struct nlmclnt_operations *h_nlmclnt_ops; /* Callback ops for NLM users */ const struct nlmclnt_operations *h_nlmclnt_ops; /* Callback ops for NLM users */
}; };
@ -229,7 +230,8 @@ struct nlm_host *nlmclnt_lookup_host(const struct sockaddr *sap,
const u32 version, const u32 version,
const char *hostname, const char *hostname,
int noresvport, int noresvport,
struct net *net); struct net *net,
const struct cred *cred);
void nlmclnt_release_host(struct nlm_host *); void nlmclnt_release_host(struct nlm_host *);
struct nlm_host *nlmsvc_lookup_host(const struct svc_rqst *rqstp, struct nlm_host *nlmsvc_lookup_host(const struct svc_rqst *rqstp,
const char *hostname, const char *hostname,