| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * linux/fs/lockd/svc.c |
|---|
| 3 | 4 | * |
|---|
| .. | .. |
|---|
| 188 | 189 | |
|---|
| 189 | 190 | static int create_lockd_listener(struct svc_serv *serv, const char *name, |
|---|
| 190 | 191 | struct net *net, const int family, |
|---|
| 191 | | - const unsigned short port) |
|---|
| 192 | + const unsigned short port, |
|---|
| 193 | + const struct cred *cred) |
|---|
| 192 | 194 | { |
|---|
| 193 | 195 | struct svc_xprt *xprt; |
|---|
| 194 | 196 | |
|---|
| 195 | 197 | xprt = svc_find_xprt(serv, name, net, family, 0); |
|---|
| 196 | 198 | if (xprt == NULL) |
|---|
| 197 | 199 | return svc_create_xprt(serv, name, net, family, port, |
|---|
| 198 | | - SVC_SOCK_DEFAULTS); |
|---|
| 200 | + SVC_SOCK_DEFAULTS, cred); |
|---|
| 199 | 201 | svc_xprt_put(xprt); |
|---|
| 200 | 202 | return 0; |
|---|
| 201 | 203 | } |
|---|
| 202 | 204 | |
|---|
| 203 | 205 | static int create_lockd_family(struct svc_serv *serv, struct net *net, |
|---|
| 204 | | - const int family) |
|---|
| 206 | + const int family, const struct cred *cred) |
|---|
| 205 | 207 | { |
|---|
| 206 | 208 | int err; |
|---|
| 207 | 209 | |
|---|
| 208 | | - err = create_lockd_listener(serv, "udp", net, family, nlm_udpport); |
|---|
| 210 | + err = create_lockd_listener(serv, "udp", net, family, nlm_udpport, |
|---|
| 211 | + cred); |
|---|
| 209 | 212 | if (err < 0) |
|---|
| 210 | 213 | return err; |
|---|
| 211 | 214 | |
|---|
| 212 | | - return create_lockd_listener(serv, "tcp", net, family, nlm_tcpport); |
|---|
| 215 | + return create_lockd_listener(serv, "tcp", net, family, nlm_tcpport, |
|---|
| 216 | + cred); |
|---|
| 213 | 217 | } |
|---|
| 214 | 218 | |
|---|
| 215 | 219 | /* |
|---|
| .. | .. |
|---|
| 222 | 226 | * Returns zero if all listeners are available; otherwise a |
|---|
| 223 | 227 | * negative errno value is returned. |
|---|
| 224 | 228 | */ |
|---|
| 225 | | -static int make_socks(struct svc_serv *serv, struct net *net) |
|---|
| 229 | +static int make_socks(struct svc_serv *serv, struct net *net, |
|---|
| 230 | + const struct cred *cred) |
|---|
| 226 | 231 | { |
|---|
| 227 | 232 | static int warned; |
|---|
| 228 | 233 | int err; |
|---|
| 229 | 234 | |
|---|
| 230 | | - err = create_lockd_family(serv, net, PF_INET); |
|---|
| 235 | + err = create_lockd_family(serv, net, PF_INET, cred); |
|---|
| 231 | 236 | if (err < 0) |
|---|
| 232 | 237 | goto out_err; |
|---|
| 233 | 238 | |
|---|
| 234 | | - err = create_lockd_family(serv, net, PF_INET6); |
|---|
| 239 | + err = create_lockd_family(serv, net, PF_INET6, cred); |
|---|
| 235 | 240 | if (err < 0 && err != -EAFNOSUPPORT) |
|---|
| 236 | 241 | goto out_err; |
|---|
| 237 | 242 | |
|---|
| .. | .. |
|---|
| 246 | 251 | return err; |
|---|
| 247 | 252 | } |
|---|
| 248 | 253 | |
|---|
| 249 | | -static int lockd_up_net(struct svc_serv *serv, struct net *net) |
|---|
| 254 | +static int lockd_up_net(struct svc_serv *serv, struct net *net, |
|---|
| 255 | + const struct cred *cred) |
|---|
| 250 | 256 | { |
|---|
| 251 | 257 | struct lockd_net *ln = net_generic(net, lockd_net_id); |
|---|
| 252 | 258 | int error; |
|---|
| .. | .. |
|---|
| 258 | 264 | if (error) |
|---|
| 259 | 265 | goto err_bind; |
|---|
| 260 | 266 | |
|---|
| 261 | | - error = make_socks(serv, net); |
|---|
| 267 | + error = make_socks(serv, net, cred); |
|---|
| 262 | 268 | if (error < 0) |
|---|
| 263 | 269 | goto err_bind; |
|---|
| 264 | 270 | set_grace_period(net); |
|---|
| .. | .. |
|---|
| 461 | 467 | /* |
|---|
| 462 | 468 | * Bring up the lockd process if it's not already up. |
|---|
| 463 | 469 | */ |
|---|
| 464 | | -int lockd_up(struct net *net) |
|---|
| 470 | +int lockd_up(struct net *net, const struct cred *cred) |
|---|
| 465 | 471 | { |
|---|
| 466 | 472 | struct svc_serv *serv; |
|---|
| 467 | 473 | int error; |
|---|
| .. | .. |
|---|
| 474 | 480 | goto err_create; |
|---|
| 475 | 481 | } |
|---|
| 476 | 482 | |
|---|
| 477 | | - error = lockd_up_net(serv, net); |
|---|
| 483 | + error = lockd_up_net(serv, net, cred); |
|---|
| 478 | 484 | if (error < 0) { |
|---|
| 479 | 485 | lockd_unregister_notifiers(); |
|---|
| 480 | 486 | goto err_put; |
|---|
| .. | .. |
|---|
| 807 | 813 | .pg_name = "lockd", /* service name */ |
|---|
| 808 | 814 | .pg_class = "nfsd", /* share authentication with nfsd */ |
|---|
| 809 | 815 | .pg_stats = &nlmsvc_stats, /* stats table */ |
|---|
| 810 | | - .pg_authenticate = &lockd_authenticate /* export authentication */ |
|---|
| 816 | + .pg_authenticate = &lockd_authenticate, /* export authentication */ |
|---|
| 817 | + .pg_init_request = svc_generic_init_request, |
|---|
| 818 | + .pg_rpcbind_set = svc_generic_rpcbind_set, |
|---|
| 811 | 819 | }; |
|---|