diff options
author | Trond Myklebust <trondmy@gmail.com> | 2019-04-09 12:13:39 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2019-04-24 09:46:35 -0400 |
commit | 40373b125de6bab186e71d5ea5498bb2b845398b (patch) | |
tree | 729dd4fc2bf1ae22ed7ac579799b8e4165ba60da | |
parent | 1237d3545c6715edfd09b94d27585069cd68274c (diff) |
lockd: Pass the user cred from knfsd when starting the lockd server
When starting up a new knfsd server, pass the user cred to the
supporting lockd server.
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
-rw-r--r-- | fs/lockd/clntlock.c | 4 | ||||
-rw-r--r-- | fs/lockd/svc.c | 28 | ||||
-rw-r--r-- | fs/nfs/client.c | 1 | ||||
-rw-r--r-- | fs/nfsd/nfssvc.c | 2 | ||||
-rw-r--r-- | include/linux/lockd/bind.h | 3 |
5 files changed, 22 insertions, 16 deletions
diff --git a/fs/lockd/clntlock.c b/fs/lockd/clntlock.c index c2a128678e6e..d61b72b693cf 100644 --- a/fs/lockd/clntlock.c +++ b/fs/lockd/clntlock.c | |||
@@ -56,7 +56,7 @@ struct nlm_host *nlmclnt_init(const struct nlmclnt_initdata *nlm_init) | |||
56 | u32 nlm_version = (nlm_init->nfs_version == 2) ? 1 : 4; | 56 | u32 nlm_version = (nlm_init->nfs_version == 2) ? 1 : 4; |
57 | int status; | 57 | int status; |
58 | 58 | ||
59 | status = lockd_up(nlm_init->net); | 59 | status = lockd_up(nlm_init->net, nlm_init->cred); |
60 | if (status < 0) | 60 | if (status < 0) |
61 | return ERR_PTR(status); | 61 | return ERR_PTR(status); |
62 | 62 | ||
@@ -241,7 +241,7 @@ reclaimer(void *ptr) | |||
241 | allow_signal(SIGKILL); | 241 | allow_signal(SIGKILL); |
242 | 242 | ||
243 | down_write(&host->h_rwsem); | 243 | down_write(&host->h_rwsem); |
244 | lockd_up(net); /* note: this cannot fail as lockd is already running */ | 244 | lockd_up(net, NULL); /* note: this cannot fail as lockd is already running */ |
245 | 245 | ||
246 | dprintk("lockd: reclaiming locks for host %s\n", host->h_name); | 246 | dprintk("lockd: reclaiming locks for host %s\n", host->h_name); |
247 | 247 | ||
diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c index 82aa0f35e43d..3056f3a0c270 100644 --- a/fs/lockd/svc.c +++ b/fs/lockd/svc.c | |||
@@ -188,9 +188,9 @@ lockd(void *vrqstp) | |||
188 | 188 | ||
189 | static int create_lockd_listener(struct svc_serv *serv, const char *name, | 189 | static int create_lockd_listener(struct svc_serv *serv, const char *name, |
190 | struct net *net, const int family, | 190 | struct net *net, const int family, |
191 | const unsigned short port) | 191 | const unsigned short port, |
192 | const struct cred *cred) | ||
192 | { | 193 | { |
193 | const struct cred *cred = current_cred(); | ||
194 | struct svc_xprt *xprt; | 194 | struct svc_xprt *xprt; |
195 | 195 | ||
196 | xprt = svc_find_xprt(serv, name, net, family, 0); | 196 | xprt = svc_find_xprt(serv, name, net, family, 0); |
@@ -202,15 +202,17 @@ static int create_lockd_listener(struct svc_serv *serv, const char *name, | |||
202 | } | 202 | } |
203 | 203 | ||
204 | static int create_lockd_family(struct svc_serv *serv, struct net *net, | 204 | static int create_lockd_family(struct svc_serv *serv, struct net *net, |
205 | const int family) | 205 | const int family, const struct cred *cred) |
206 | { | 206 | { |
207 | int err; | 207 | int err; |
208 | 208 | ||
209 | err = create_lockd_listener(serv, "udp", net, family, nlm_udpport); | 209 | err = create_lockd_listener(serv, "udp", net, family, nlm_udpport, |
210 | cred); | ||
210 | if (err < 0) | 211 | if (err < 0) |
211 | return err; | 212 | return err; |
212 | 213 | ||
213 | return create_lockd_listener(serv, "tcp", net, family, nlm_tcpport); | 214 | return create_lockd_listener(serv, "tcp", net, family, nlm_tcpport, |
215 | cred); | ||
214 | } | 216 | } |
215 | 217 | ||
216 | /* | 218 | /* |
@@ -223,16 +225,17 @@ static int create_lockd_family(struct svc_serv *serv, struct net *net, | |||
223 | * Returns zero if all listeners are available; otherwise a | 225 | * Returns zero if all listeners are available; otherwise a |
224 | * negative errno value is returned. | 226 | * negative errno value is returned. |
225 | */ | 227 | */ |
226 | static int make_socks(struct svc_serv *serv, struct net *net) | 228 | static int make_socks(struct svc_serv *serv, struct net *net, |
229 | const struct cred *cred) | ||
227 | { | 230 | { |
228 | static int warned; | 231 | static int warned; |
229 | int err; | 232 | int err; |
230 | 233 | ||
231 | err = create_lockd_family(serv, net, PF_INET); | 234 | err = create_lockd_family(serv, net, PF_INET, cred); |
232 | if (err < 0) | 235 | if (err < 0) |
233 | goto out_err; | 236 | goto out_err; |
234 | 237 | ||
235 | err = create_lockd_family(serv, net, PF_INET6); | 238 | err = create_lockd_family(serv, net, PF_INET6, cred); |
236 | if (err < 0 && err != -EAFNOSUPPORT) | 239 | if (err < 0 && err != -EAFNOSUPPORT) |
237 | goto out_err; | 240 | goto out_err; |
238 | 241 | ||
@@ -247,7 +250,8 @@ out_err: | |||
247 | return err; | 250 | return err; |
248 | } | 251 | } |
249 | 252 | ||
250 | static int lockd_up_net(struct svc_serv *serv, struct net *net) | 253 | static int lockd_up_net(struct svc_serv *serv, struct net *net, |
254 | const struct cred *cred) | ||
251 | { | 255 | { |
252 | struct lockd_net *ln = net_generic(net, lockd_net_id); | 256 | struct lockd_net *ln = net_generic(net, lockd_net_id); |
253 | int error; | 257 | int error; |
@@ -259,7 +263,7 @@ static int lockd_up_net(struct svc_serv *serv, struct net *net) | |||
259 | if (error) | 263 | if (error) |
260 | goto err_bind; | 264 | goto err_bind; |
261 | 265 | ||
262 | error = make_socks(serv, net); | 266 | error = make_socks(serv, net, cred); |
263 | if (error < 0) | 267 | if (error < 0) |
264 | goto err_bind; | 268 | goto err_bind; |
265 | set_grace_period(net); | 269 | set_grace_period(net); |
@@ -462,7 +466,7 @@ static struct svc_serv *lockd_create_svc(void) | |||
462 | /* | 466 | /* |
463 | * Bring up the lockd process if it's not already up. | 467 | * Bring up the lockd process if it's not already up. |
464 | */ | 468 | */ |
465 | int lockd_up(struct net *net) | 469 | int lockd_up(struct net *net, const struct cred *cred) |
466 | { | 470 | { |
467 | struct svc_serv *serv; | 471 | struct svc_serv *serv; |
468 | int error; | 472 | int error; |
@@ -475,7 +479,7 @@ int lockd_up(struct net *net) | |||
475 | goto err_create; | 479 | goto err_create; |
476 | } | 480 | } |
477 | 481 | ||
478 | error = lockd_up_net(serv, net); | 482 | error = lockd_up_net(serv, net, cred); |
479 | if (error < 0) { | 483 | if (error < 0) { |
480 | lockd_unregister_notifiers(); | 484 | lockd_unregister_notifiers(); |
481 | goto err_put; | 485 | goto err_put; |
diff --git a/fs/nfs/client.c b/fs/nfs/client.c index 90d71fda65ce..92d07d99829d 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c | |||
@@ -552,6 +552,7 @@ static int nfs_start_lockd(struct nfs_server *server) | |||
552 | 1 : 0, | 552 | 1 : 0, |
553 | .net = clp->cl_net, | 553 | .net = clp->cl_net, |
554 | .nlmclnt_ops = clp->cl_nfs_mod->rpc_ops->nlmclnt_ops, | 554 | .nlmclnt_ops = clp->cl_nfs_mod->rpc_ops->nlmclnt_ops, |
555 | .cred = current_cred(), | ||
555 | }; | 556 | }; |
556 | 557 | ||
557 | if (nlm_init.nfs_version > 3) | 558 | if (nlm_init.nfs_version > 3) |
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c index 32e4d8a334e3..18d94ea984ba 100644 --- a/fs/nfsd/nfssvc.c +++ b/fs/nfsd/nfssvc.c | |||
@@ -364,7 +364,7 @@ static int nfsd_startup_net(int nrservs, struct net *net, const struct cred *cre | |||
364 | goto out_socks; | 364 | goto out_socks; |
365 | 365 | ||
366 | if (nfsd_needs_lockd(nn) && !nn->lockd_up) { | 366 | if (nfsd_needs_lockd(nn) && !nn->lockd_up) { |
367 | ret = lockd_up(net); | 367 | ret = lockd_up(net, cred); |
368 | if (ret) | 368 | if (ret) |
369 | goto out_socks; | 369 | goto out_socks; |
370 | nn->lockd_up = 1; | 370 | nn->lockd_up = 1; |
diff --git a/include/linux/lockd/bind.h b/include/linux/lockd/bind.h index 053a4ef3d431..0520c0cd73f4 100644 --- a/include/linux/lockd/bind.h +++ b/include/linux/lockd/bind.h | |||
@@ -46,6 +46,7 @@ struct nlmclnt_initdata { | |||
46 | int noresvport; | 46 | int noresvport; |
47 | struct net *net; | 47 | struct net *net; |
48 | const struct nlmclnt_operations *nlmclnt_ops; | 48 | const struct nlmclnt_operations *nlmclnt_ops; |
49 | const struct cred *cred; | ||
49 | }; | 50 | }; |
50 | 51 | ||
51 | /* | 52 | /* |
@@ -75,7 +76,7 @@ struct nlmclnt_operations { | |||
75 | }; | 76 | }; |
76 | 77 | ||
77 | extern int nlmclnt_proc(struct nlm_host *host, int cmd, struct file_lock *fl, void *data); | 78 | extern int nlmclnt_proc(struct nlm_host *host, int cmd, struct file_lock *fl, void *data); |
78 | extern int lockd_up(struct net *net); | 79 | extern int lockd_up(struct net *net, const struct cred *cred); |
79 | extern void lockd_down(struct net *net); | 80 | extern void lockd_down(struct net *net); |
80 | 81 | ||
81 | #endif /* LINUX_LOCKD_BIND_H */ | 82 | #endif /* LINUX_LOCKD_BIND_H */ |