Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Trond Myklebust and committed by
J. Bruce Fields
40373b12 1237d354

+22 -16
+2 -2
fs/lockd/clntlock.c
··· 56 56 u32 nlm_version = (nlm_init->nfs_version == 2) ? 1 : 4; 57 57 int status; 58 58 59 - status = lockd_up(nlm_init->net); 59 + status = lockd_up(nlm_init->net, nlm_init->cred); 60 60 if (status < 0) 61 61 return ERR_PTR(status); 62 62 ··· 241 241 allow_signal(SIGKILL); 242 242 243 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 246 dprintk("lockd: reclaiming locks for host %s\n", host->h_name); 247 247
+16 -12
fs/lockd/svc.c
··· 188 188 189 189 static int create_lockd_listener(struct svc_serv *serv, const char *name, 190 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 194 struct svc_xprt *xprt; 195 195 196 196 xprt = svc_find_xprt(serv, name, net, family, 0); ··· 202 202 } 203 203 204 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 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 211 if (err < 0) 211 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 /* ··· 225 223 * Returns zero if all listeners are available; otherwise a 226 224 * negative errno value is returned. 227 225 */ 228 - static int make_socks(struct svc_serv *serv, struct net *net) 226 + static int make_socks(struct svc_serv *serv, struct net *net, 227 + const struct cred *cred) 229 228 { 230 229 static int warned; 231 230 int err; 232 231 233 - err = create_lockd_family(serv, net, PF_INET); 232 + err = create_lockd_family(serv, net, PF_INET, cred); 234 233 if (err < 0) 235 234 goto out_err; 236 235 237 - err = create_lockd_family(serv, net, PF_INET6); 236 + err = create_lockd_family(serv, net, PF_INET6, cred); 238 237 if (err < 0 && err != -EAFNOSUPPORT) 239 238 goto out_err; 240 239 ··· 250 247 return err; 251 248 } 252 249 253 - static int lockd_up_net(struct svc_serv *serv, struct net *net) 250 + static int lockd_up_net(struct svc_serv *serv, struct net *net, 251 + const struct cred *cred) 254 252 { 255 253 struct lockd_net *ln = net_generic(net, lockd_net_id); 256 254 int error; ··· 263 259 if (error) 264 260 goto err_bind; 265 261 266 - error = make_socks(serv, net); 262 + error = make_socks(serv, net, cred); 267 263 if (error < 0) 268 264 goto err_bind; 269 265 set_grace_period(net); ··· 466 462 /* 467 463 * Bring up the lockd process if it's not already up. 468 464 */ 469 - int lockd_up(struct net *net) 465 + int lockd_up(struct net *net, const struct cred *cred) 470 466 { 471 467 struct svc_serv *serv; 472 468 int error; ··· 479 475 goto err_create; 480 476 } 481 477 482 - error = lockd_up_net(serv, net); 478 + error = lockd_up_net(serv, net, cred); 483 479 if (error < 0) { 484 480 lockd_unregister_notifiers(); 485 481 goto err_put;
+1
fs/nfs/client.c
··· 552 552 1 : 0, 553 553 .net = clp->cl_net, 554 554 .nlmclnt_ops = clp->cl_nfs_mod->rpc_ops->nlmclnt_ops, 555 + .cred = current_cred(), 555 556 }; 556 557 557 558 if (nlm_init.nfs_version > 3)
+1 -1
fs/nfsd/nfssvc.c
··· 364 364 goto out_socks; 365 365 366 366 if (nfsd_needs_lockd(nn) && !nn->lockd_up) { 367 - ret = lockd_up(net); 367 + ret = lockd_up(net, cred); 368 368 if (ret) 369 369 goto out_socks; 370 370 nn->lockd_up = 1;
+2 -1
include/linux/lockd/bind.h
··· 46 46 int noresvport; 47 47 struct net *net; 48 48 const struct nlmclnt_operations *nlmclnt_ops; 49 + const struct cred *cred; 49 50 }; 50 51 51 52 /* ··· 76 75 }; 77 76 78 77 extern int nlmclnt_proc(struct nlm_host *host, int cmd, struct file_lock *fl, void *data); 79 - extern int lockd_up(struct net *net); 78 + extern int lockd_up(struct net *net, const struct cred *cred); 80 79 extern void lockd_down(struct net *net); 81 80 82 81 #endif /* LINUX_LOCKD_BIND_H */