aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTrond Myklebust <trondmy@gmail.com>2019-04-09 12:13:39 -0400
committerJ. Bruce Fields <bfields@redhat.com>2019-04-24 09:46:35 -0400
commit40373b125de6bab186e71d5ea5498bb2b845398b (patch)
tree729dd4fc2bf1ae22ed7ac579799b8e4165ba60da
parent1237d3545c6715edfd09b94d27585069cd68274c (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.c4
-rw-r--r--fs/lockd/svc.c28
-rw-r--r--fs/nfs/client.c1
-rw-r--r--fs/nfsd/nfssvc.c2
-rw-r--r--include/linux/lockd/bind.h3
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
189static int create_lockd_listener(struct svc_serv *serv, const char *name, 189static 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
204static int create_lockd_family(struct svc_serv *serv, struct net *net, 204static 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 */
226static int make_socks(struct svc_serv *serv, struct net *net) 228static 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
250static int lockd_up_net(struct svc_serv *serv, struct net *net) 253static 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 */
465int lockd_up(struct net *net) 469int 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
77extern int nlmclnt_proc(struct nlm_host *host, int cmd, struct file_lock *fl, void *data); 78extern int nlmclnt_proc(struct nlm_host *host, int cmd, struct file_lock *fl, void *data);
78extern int lockd_up(struct net *net); 79extern int lockd_up(struct net *net, const struct cred *cred);
79extern void lockd_down(struct net *net); 80extern void lockd_down(struct net *net);
80 81
81#endif /* LINUX_LOCKD_BIND_H */ 82#endif /* LINUX_LOCKD_BIND_H */