.. | .. |
---|
| 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 | }; |
---|