1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* client.c: NFS client sharing and management code
3 *
4 * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved.
5 * Written by David Howells (dhowells@redhat.com)
6 */
7
8
9 #include <linux/module.h>
10 #include <linux/init.h>
11 #include <linux/sched.h>
12 #include <linux/time.h>
13 #include <linux/kernel.h>
14 #include <linux/mm.h>
15 #include <linux/string.h>
16 #include <linux/stat.h>
17 #include <linux/errno.h>
18 #include <linux/unistd.h>
19 #include <linux/sunrpc/addr.h>
20 #include <linux/sunrpc/clnt.h>
21 #include <linux/sunrpc/stats.h>
22 #include <linux/sunrpc/metrics.h>
23 #include <linux/sunrpc/xprtsock.h>
24 #include <linux/sunrpc/xprtrdma.h>
25 #include <linux/nfs_fs.h>
26 #include <linux/nfs_mount.h>
27 #include <linux/nfs4_mount.h>
28 #include <linux/lockd/bind.h>
29 #include <linux/seq_file.h>
30 #include <linux/mount.h>
31 #include <linux/vfs.h>
32 #include <linux/inet.h>
33 #include <linux/in6.h>
34 #include <linux/slab.h>
35 #include <linux/idr.h>
36 #include <net/ipv6.h>
37 #include <linux/nfs_xdr.h>
38 #include <linux/sunrpc/bc_xprt.h>
39 #include <linux/nsproxy.h>
40 #include <linux/pid_namespace.h>
41 #include <linux/nfslocalio.h>
42
43 #include "nfs4_fs.h"
44 #include "callback.h"
45 #include "delegation.h"
46 #include "iostat.h"
47 #include "internal.h"
48 #include "fscache.h"
49 #include "pnfs.h"
50 #include "nfs.h"
51 #include "netns.h"
52 #include "sysfs.h"
53 #include "nfs42.h"
54
55 #define NFSDBG_FACILITY NFSDBG_CLIENT
56
57 static DECLARE_WAIT_QUEUE_HEAD(nfs_client_active_wq);
58 static DEFINE_RWLOCK(nfs_version_lock);
59
60 static struct nfs_subversion *nfs_version_mods[5] = {
61 [2] = NULL,
62 [3] = NULL,
63 [4] = NULL,
64 };
65
66 /*
67 * RPC cruft for NFS
68 */
69 static const struct rpc_version *nfs_version[5] = {
70 [2] = NULL,
71 [3] = NULL,
72 [4] = NULL,
73 };
74
75 const struct rpc_program nfs_program = {
76 .name = "nfs",
77 .number = NFS_PROGRAM,
78 .nrvers = ARRAY_SIZE(nfs_version),
79 .version = nfs_version,
80 .pipe_dir_name = NFS_PIPE_DIRNAME,
81 };
82
__find_nfs_version(unsigned int version)83 static struct nfs_subversion *__find_nfs_version(unsigned int version)
84 {
85 struct nfs_subversion *nfs;
86
87 read_lock(&nfs_version_lock);
88 nfs = nfs_version_mods[version];
89 read_unlock(&nfs_version_lock);
90 return nfs;
91 }
92
find_nfs_version(unsigned int version)93 struct nfs_subversion *find_nfs_version(unsigned int version)
94 {
95 struct nfs_subversion *nfs = __find_nfs_version(version);
96
97 if (!nfs && request_module("nfsv%d", version) == 0)
98 nfs = __find_nfs_version(version);
99
100 if (!nfs)
101 return ERR_PTR(-EPROTONOSUPPORT);
102
103 if (!get_nfs_version(nfs))
104 return ERR_PTR(-EAGAIN);
105
106 return nfs;
107 }
108
get_nfs_version(struct nfs_subversion * nfs)109 int get_nfs_version(struct nfs_subversion *nfs)
110 {
111 return try_module_get(nfs->owner);
112 }
113 EXPORT_SYMBOL_GPL(get_nfs_version);
114
put_nfs_version(struct nfs_subversion * nfs)115 void put_nfs_version(struct nfs_subversion *nfs)
116 {
117 module_put(nfs->owner);
118 }
119
register_nfs_version(struct nfs_subversion * nfs)120 void register_nfs_version(struct nfs_subversion *nfs)
121 {
122 write_lock(&nfs_version_lock);
123
124 nfs_version_mods[nfs->rpc_ops->version] = nfs;
125 nfs_version[nfs->rpc_ops->version] = nfs->rpc_vers;
126
127 write_unlock(&nfs_version_lock);
128 }
129 EXPORT_SYMBOL_GPL(register_nfs_version);
130
unregister_nfs_version(struct nfs_subversion * nfs)131 void unregister_nfs_version(struct nfs_subversion *nfs)
132 {
133 write_lock(&nfs_version_lock);
134
135 nfs_version[nfs->rpc_ops->version] = NULL;
136 nfs_version_mods[nfs->rpc_ops->version] = NULL;
137
138 write_unlock(&nfs_version_lock);
139 }
140 EXPORT_SYMBOL_GPL(unregister_nfs_version);
141
142 /*
143 * Allocate a shared client record
144 *
145 * Since these are allocated/deallocated very rarely, we don't
146 * bother putting them in a slab cache...
147 */
nfs_alloc_client(const struct nfs_client_initdata * cl_init)148 struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_init)
149 {
150 struct nfs_client *clp;
151 int err = -ENOMEM;
152
153 if ((clp = kzalloc(sizeof(*clp), GFP_KERNEL)) == NULL)
154 goto error_0;
155
156 clp->cl_minorversion = cl_init->minorversion;
157 clp->cl_nfs_mod = cl_init->nfs_mod;
158 if (!get_nfs_version(clp->cl_nfs_mod))
159 goto error_dealloc;
160
161 clp->rpc_ops = clp->cl_nfs_mod->rpc_ops;
162
163 refcount_set(&clp->cl_count, 1);
164 clp->cl_cons_state = NFS_CS_INITING;
165
166 memcpy(&clp->cl_addr, cl_init->addr, cl_init->addrlen);
167 clp->cl_addrlen = cl_init->addrlen;
168
169 if (cl_init->hostname) {
170 err = -ENOMEM;
171 clp->cl_hostname = kstrdup(cl_init->hostname, GFP_KERNEL);
172 if (!clp->cl_hostname)
173 goto error_cleanup;
174 }
175
176 INIT_LIST_HEAD(&clp->cl_superblocks);
177 clp->cl_rpcclient = ERR_PTR(-EINVAL);
178
179 clp->cl_flags = cl_init->init_flags;
180 clp->cl_proto = cl_init->proto;
181 clp->cl_nconnect = cl_init->nconnect;
182 clp->cl_max_connect = cl_init->max_connect ? cl_init->max_connect : 1;
183 clp->cl_net = get_net_track(cl_init->net, &clp->cl_ns_tracker, GFP_KERNEL);
184
185 #if IS_ENABLED(CONFIG_NFS_LOCALIO)
186 seqlock_init(&clp->cl_boot_lock);
187 ktime_get_real_ts64(&clp->cl_nfssvc_boot);
188 nfs_uuid_init(&clp->cl_uuid);
189 INIT_WORK(&clp->cl_local_probe_work, nfs_local_probe_async_work);
190 #endif /* CONFIG_NFS_LOCALIO */
191
192 clp->cl_principal = "*";
193 clp->cl_xprtsec = cl_init->xprtsec;
194 return clp;
195
196 error_cleanup:
197 put_nfs_version(clp->cl_nfs_mod);
198 error_dealloc:
199 kfree(clp);
200 error_0:
201 return ERR_PTR(err);
202 }
203 EXPORT_SYMBOL_GPL(nfs_alloc_client);
204
205 #if IS_ENABLED(CONFIG_NFS_V4)
nfs_cleanup_cb_ident_idr(struct net * net)206 static void nfs_cleanup_cb_ident_idr(struct net *net)
207 {
208 struct nfs_net *nn = net_generic(net, nfs_net_id);
209
210 idr_destroy(&nn->cb_ident_idr);
211 }
212
213 /* nfs_client_lock held */
nfs_cb_idr_remove_locked(struct nfs_client * clp)214 static void nfs_cb_idr_remove_locked(struct nfs_client *clp)
215 {
216 struct nfs_net *nn = net_generic(clp->cl_net, nfs_net_id);
217
218 if (clp->cl_cb_ident)
219 idr_remove(&nn->cb_ident_idr, clp->cl_cb_ident);
220 }
221
pnfs_init_server(struct nfs_server * server)222 static void pnfs_init_server(struct nfs_server *server)
223 {
224 rpc_init_wait_queue(&server->roc_rpcwaitq, "pNFS ROC");
225 }
226
227 #else
nfs_cleanup_cb_ident_idr(struct net * net)228 static void nfs_cleanup_cb_ident_idr(struct net *net)
229 {
230 }
231
nfs_cb_idr_remove_locked(struct nfs_client * clp)232 static void nfs_cb_idr_remove_locked(struct nfs_client *clp)
233 {
234 }
235
pnfs_init_server(struct nfs_server * server)236 static void pnfs_init_server(struct nfs_server *server)
237 {
238 }
239
240 #endif /* CONFIG_NFS_V4 */
241
242 /*
243 * Destroy a shared client record
244 */
nfs_free_client(struct nfs_client * clp)245 void nfs_free_client(struct nfs_client *clp)
246 {
247 nfs_localio_disable_client(clp);
248
249 /* -EIO all pending I/O */
250 if (!IS_ERR(clp->cl_rpcclient))
251 rpc_shutdown_client(clp->cl_rpcclient);
252
253 put_net_track(clp->cl_net, &clp->cl_ns_tracker);
254 put_nfs_version(clp->cl_nfs_mod);
255 kfree(clp->cl_hostname);
256 kfree(clp->cl_acceptor);
257 kfree_rcu(clp, rcu);
258 }
259 EXPORT_SYMBOL_GPL(nfs_free_client);
260
261 /*
262 * Release a reference to a shared client record
263 */
nfs_put_client(struct nfs_client * clp)264 void nfs_put_client(struct nfs_client *clp)
265 {
266 struct nfs_net *nn;
267
268 if (!clp)
269 return;
270
271 nn = net_generic(clp->cl_net, nfs_net_id);
272
273 if (refcount_dec_and_lock(&clp->cl_count, &nn->nfs_client_lock)) {
274 list_del(&clp->cl_share_link);
275 nfs_cb_idr_remove_locked(clp);
276 spin_unlock(&nn->nfs_client_lock);
277
278 WARN_ON_ONCE(!list_empty(&clp->cl_superblocks));
279
280 clp->rpc_ops->free_client(clp);
281 }
282 }
283 EXPORT_SYMBOL_GPL(nfs_put_client);
284
285 /*
286 * Find an nfs_client on the list that matches the initialisation data
287 * that is supplied.
288 */
nfs_match_client(const struct nfs_client_initdata * data)289 static struct nfs_client *nfs_match_client(const struct nfs_client_initdata *data)
290 {
291 struct nfs_client *clp;
292 const struct sockaddr *sap = (struct sockaddr *)data->addr;
293 struct nfs_net *nn = net_generic(data->net, nfs_net_id);
294 int error;
295
296 again:
297 list_for_each_entry(clp, &nn->nfs_client_list, cl_share_link) {
298 const struct sockaddr *clap = (struct sockaddr *)&clp->cl_addr;
299 /* Don't match clients that failed to initialise properly */
300 if (clp->cl_cons_state < 0)
301 continue;
302
303 /* If a client is still initializing then we need to wait */
304 if (clp->cl_cons_state > NFS_CS_READY) {
305 refcount_inc(&clp->cl_count);
306 spin_unlock(&nn->nfs_client_lock);
307 error = nfs_wait_client_init_complete(clp);
308 nfs_put_client(clp);
309 spin_lock(&nn->nfs_client_lock);
310 if (error < 0)
311 return ERR_PTR(error);
312 goto again;
313 }
314
315 /* Different NFS versions cannot share the same nfs_client */
316 if (clp->rpc_ops != data->nfs_mod->rpc_ops)
317 continue;
318
319 if (clp->cl_proto != data->proto)
320 continue;
321 /* Match nfsv4 minorversion */
322 if (clp->cl_minorversion != data->minorversion)
323 continue;
324
325 /* Match request for a dedicated DS */
326 if (test_bit(NFS_CS_DS, &data->init_flags) !=
327 test_bit(NFS_CS_DS, &clp->cl_flags))
328 continue;
329
330 /* Match the full socket address */
331 if (!rpc_cmp_addr_port(sap, clap))
332 /* Match all xprt_switch full socket addresses */
333 if (IS_ERR(clp->cl_rpcclient) ||
334 !rpc_clnt_xprt_switch_has_addr(clp->cl_rpcclient,
335 sap))
336 continue;
337
338 /* Match the xprt security policy */
339 if (clp->cl_xprtsec.policy != data->xprtsec.policy)
340 continue;
341 if (clp->cl_xprtsec.policy == RPC_XPRTSEC_TLS_X509) {
342 if (clp->cl_xprtsec.cert_serial !=
343 data->xprtsec.cert_serial)
344 continue;
345 if (clp->cl_xprtsec.privkey_serial !=
346 data->xprtsec.privkey_serial)
347 continue;
348 }
349
350 refcount_inc(&clp->cl_count);
351 return clp;
352 }
353 return NULL;
354 }
355
356 /*
357 * Return true if @clp is done initializing, false if still working on it.
358 *
359 * Use nfs_client_init_status to check if it was successful.
360 */
nfs_client_init_is_complete(const struct nfs_client * clp)361 bool nfs_client_init_is_complete(const struct nfs_client *clp)
362 {
363 return clp->cl_cons_state <= NFS_CS_READY;
364 }
365 EXPORT_SYMBOL_GPL(nfs_client_init_is_complete);
366
367 /*
368 * Return 0 if @clp was successfully initialized, -errno otherwise.
369 *
370 * This must be called *after* nfs_client_init_is_complete() returns true,
371 * otherwise it will pop WARN_ON_ONCE and return -EINVAL
372 */
nfs_client_init_status(const struct nfs_client * clp)373 int nfs_client_init_status(const struct nfs_client *clp)
374 {
375 /* called without checking nfs_client_init_is_complete */
376 if (clp->cl_cons_state > NFS_CS_READY) {
377 WARN_ON_ONCE(1);
378 return -EINVAL;
379 }
380 return clp->cl_cons_state;
381 }
382 EXPORT_SYMBOL_GPL(nfs_client_init_status);
383
nfs_wait_client_init_complete(const struct nfs_client * clp)384 int nfs_wait_client_init_complete(const struct nfs_client *clp)
385 {
386 return wait_event_killable(nfs_client_active_wq,
387 nfs_client_init_is_complete(clp));
388 }
389 EXPORT_SYMBOL_GPL(nfs_wait_client_init_complete);
390
391 /*
392 * Found an existing client. Make sure it's ready before returning.
393 */
394 static struct nfs_client *
nfs_found_client(const struct nfs_client_initdata * cl_init,struct nfs_client * clp)395 nfs_found_client(const struct nfs_client_initdata *cl_init,
396 struct nfs_client *clp)
397 {
398 int error;
399
400 error = nfs_wait_client_init_complete(clp);
401 if (error < 0) {
402 nfs_put_client(clp);
403 return ERR_PTR(-ERESTARTSYS);
404 }
405
406 if (clp->cl_cons_state < NFS_CS_READY) {
407 error = clp->cl_cons_state;
408 nfs_put_client(clp);
409 return ERR_PTR(error);
410 }
411
412 smp_rmb();
413 return clp;
414 }
415
416 /*
417 * Look up a client by IP address and protocol version
418 * - creates a new record if one doesn't yet exist
419 */
nfs_get_client(const struct nfs_client_initdata * cl_init)420 struct nfs_client *nfs_get_client(const struct nfs_client_initdata *cl_init)
421 {
422 struct nfs_client *clp, *new = NULL;
423 struct nfs_net *nn = net_generic(cl_init->net, nfs_net_id);
424 const struct nfs_rpc_ops *rpc_ops = cl_init->nfs_mod->rpc_ops;
425
426 if (cl_init->hostname == NULL) {
427 WARN_ON(1);
428 return ERR_PTR(-EINVAL);
429 }
430
431 /* see if the client already exists */
432 do {
433 spin_lock(&nn->nfs_client_lock);
434
435 clp = nfs_match_client(cl_init);
436 if (clp) {
437 spin_unlock(&nn->nfs_client_lock);
438 if (new)
439 new->rpc_ops->free_client(new);
440 if (IS_ERR(clp))
441 return clp;
442 return nfs_found_client(cl_init, clp);
443 }
444 if (new) {
445 list_add_tail(&new->cl_share_link,
446 &nn->nfs_client_list);
447 spin_unlock(&nn->nfs_client_lock);
448 new = rpc_ops->init_client(new, cl_init);
449 if (!IS_ERR(new))
450 nfs_local_probe_async(new);
451 return new;
452 }
453
454 spin_unlock(&nn->nfs_client_lock);
455
456 new = rpc_ops->alloc_client(cl_init);
457 } while (!IS_ERR(new));
458
459 return new;
460 }
461 EXPORT_SYMBOL_GPL(nfs_get_client);
462
463 /*
464 * Mark a server as ready or failed
465 */
nfs_mark_client_ready(struct nfs_client * clp,int state)466 void nfs_mark_client_ready(struct nfs_client *clp, int state)
467 {
468 smp_wmb();
469 clp->cl_cons_state = state;
470 wake_up_all(&nfs_client_active_wq);
471 }
472 EXPORT_SYMBOL_GPL(nfs_mark_client_ready);
473
474 /*
475 * Initialise the timeout values for a connection
476 */
nfs_init_timeout_values(struct rpc_timeout * to,int proto,int timeo,int retrans)477 void nfs_init_timeout_values(struct rpc_timeout *to, int proto,
478 int timeo, int retrans)
479 {
480 to->to_initval = timeo * HZ / 10;
481 to->to_retries = retrans;
482
483 switch (proto) {
484 case XPRT_TRANSPORT_TCP:
485 case XPRT_TRANSPORT_TCP_TLS:
486 case XPRT_TRANSPORT_RDMA:
487 if (retrans == NFS_UNSPEC_RETRANS)
488 to->to_retries = NFS_DEF_TCP_RETRANS;
489 if (timeo == NFS_UNSPEC_TIMEO || to->to_initval == 0)
490 to->to_initval = NFS_DEF_TCP_TIMEO * HZ / 10;
491 if (to->to_initval > NFS_MAX_TCP_TIMEOUT)
492 to->to_initval = NFS_MAX_TCP_TIMEOUT;
493 to->to_increment = to->to_initval;
494 to->to_maxval = to->to_initval + (to->to_increment * to->to_retries);
495 if (to->to_maxval > NFS_MAX_TCP_TIMEOUT)
496 to->to_maxval = NFS_MAX_TCP_TIMEOUT;
497 if (to->to_maxval < to->to_initval)
498 to->to_maxval = to->to_initval;
499 to->to_exponential = 0;
500 break;
501 case XPRT_TRANSPORT_UDP:
502 if (retrans == NFS_UNSPEC_RETRANS)
503 to->to_retries = NFS_DEF_UDP_RETRANS;
504 if (timeo == NFS_UNSPEC_TIMEO || to->to_initval == 0)
505 to->to_initval = NFS_DEF_UDP_TIMEO * HZ / 10;
506 if (to->to_initval > NFS_MAX_UDP_TIMEOUT)
507 to->to_initval = NFS_MAX_UDP_TIMEOUT;
508 to->to_maxval = NFS_MAX_UDP_TIMEOUT;
509 to->to_exponential = 1;
510 break;
511 default:
512 BUG();
513 }
514 }
515 EXPORT_SYMBOL_GPL(nfs_init_timeout_values);
516
517 /*
518 * Create an RPC client handle
519 */
nfs_create_rpc_client(struct nfs_client * clp,const struct nfs_client_initdata * cl_init,rpc_authflavor_t flavor)520 int nfs_create_rpc_client(struct nfs_client *clp,
521 const struct nfs_client_initdata *cl_init,
522 rpc_authflavor_t flavor)
523 {
524 struct nfs_net *nn = net_generic(clp->cl_net, nfs_net_id);
525 struct rpc_clnt *clnt = NULL;
526 struct rpc_create_args args = {
527 .net = clp->cl_net,
528 .protocol = clp->cl_proto,
529 .nconnect = clp->cl_nconnect,
530 .address = (struct sockaddr *)&clp->cl_addr,
531 .addrsize = clp->cl_addrlen,
532 .timeout = cl_init->timeparms,
533 .servername = clp->cl_hostname,
534 .nodename = cl_init->nodename,
535 .program = &nfs_program,
536 .stats = &nn->rpcstats,
537 .version = clp->rpc_ops->version,
538 .authflavor = flavor,
539 .cred = cl_init->cred,
540 .xprtsec = cl_init->xprtsec,
541 .connect_timeout = cl_init->connect_timeout,
542 .reconnect_timeout = cl_init->reconnect_timeout,
543 };
544
545 if (test_bit(NFS_CS_DISCRTRY, &clp->cl_flags))
546 args.flags |= RPC_CLNT_CREATE_DISCRTRY;
547 if (test_bit(NFS_CS_NO_RETRANS_TIMEOUT, &clp->cl_flags))
548 args.flags |= RPC_CLNT_CREATE_NO_RETRANS_TIMEOUT;
549 if (test_bit(NFS_CS_NORESVPORT, &clp->cl_flags))
550 args.flags |= RPC_CLNT_CREATE_NONPRIVPORT;
551 if (test_bit(NFS_CS_INFINITE_SLOTS, &clp->cl_flags))
552 args.flags |= RPC_CLNT_CREATE_INFINITE_SLOTS;
553 if (test_bit(NFS_CS_NOPING, &clp->cl_flags))
554 args.flags |= RPC_CLNT_CREATE_NOPING;
555 if (test_bit(NFS_CS_REUSEPORT, &clp->cl_flags))
556 args.flags |= RPC_CLNT_CREATE_REUSEPORT;
557 if (test_bit(NFS_CS_NETUNREACH_FATAL, &clp->cl_flags))
558 args.flags |= RPC_CLNT_CREATE_NETUNREACH_FATAL;
559
560 if (!IS_ERR(clp->cl_rpcclient))
561 return 0;
562
563 clnt = rpc_create(&args);
564 if (IS_ERR(clnt)) {
565 dprintk("%s: cannot create RPC client. Error = %ld\n",
566 __func__, PTR_ERR(clnt));
567 return PTR_ERR(clnt);
568 }
569
570 clnt->cl_principal = clp->cl_principal;
571 clp->cl_rpcclient = clnt;
572 clnt->cl_max_connect = clp->cl_max_connect;
573 return 0;
574 }
575 EXPORT_SYMBOL_GPL(nfs_create_rpc_client);
576
577 /*
578 * Version 2 or 3 client destruction
579 */
nfs_destroy_server(struct nfs_server * server)580 static void nfs_destroy_server(struct nfs_server *server)
581 {
582 if (server->nlm_host)
583 nlmclnt_done(server->nlm_host);
584 }
585
586 /*
587 * Version 2 or 3 lockd setup
588 */
nfs_start_lockd(struct nfs_server * server)589 static int nfs_start_lockd(struct nfs_server *server)
590 {
591 struct nlm_host *host;
592 struct nfs_client *clp = server->nfs_client;
593 struct nlmclnt_initdata nlm_init = {
594 .hostname = clp->cl_hostname,
595 .address = (struct sockaddr *)&clp->cl_addr,
596 .addrlen = clp->cl_addrlen,
597 .nfs_version = clp->rpc_ops->version,
598 .noresvport = server->flags & NFS_MOUNT_NORESVPORT ?
599 1 : 0,
600 .net = clp->cl_net,
601 .nlmclnt_ops = clp->cl_nfs_mod->rpc_ops->nlmclnt_ops,
602 .cred = server->cred,
603 };
604
605 if (nlm_init.nfs_version > 3)
606 return 0;
607 if ((server->flags & NFS_MOUNT_LOCAL_FLOCK) &&
608 (server->flags & NFS_MOUNT_LOCAL_FCNTL))
609 return 0;
610
611 switch (clp->cl_proto) {
612 default:
613 nlm_init.protocol = IPPROTO_TCP;
614 break;
615 #ifndef CONFIG_NFS_DISABLE_UDP_SUPPORT
616 case XPRT_TRANSPORT_UDP:
617 nlm_init.protocol = IPPROTO_UDP;
618 #endif
619 }
620
621 host = nlmclnt_init(&nlm_init);
622 if (IS_ERR(host))
623 return PTR_ERR(host);
624
625 server->nlm_host = host;
626 server->destroy = nfs_destroy_server;
627 nfs_sysfs_link_rpc_client(server, nlmclnt_rpc_clnt(host), NULL);
628 return 0;
629 }
630
631 /*
632 * Create a general RPC client
633 */
nfs_init_server_rpcclient(struct nfs_server * server,const struct rpc_timeout * timeo,rpc_authflavor_t pseudoflavour)634 int nfs_init_server_rpcclient(struct nfs_server *server,
635 const struct rpc_timeout *timeo,
636 rpc_authflavor_t pseudoflavour)
637 {
638 struct nfs_client *clp = server->nfs_client;
639
640 server->client = rpc_clone_client_set_auth(clp->cl_rpcclient,
641 pseudoflavour);
642 if (IS_ERR(server->client)) {
643 dprintk("%s: couldn't create rpc_client!\n", __func__);
644 return PTR_ERR(server->client);
645 }
646
647 memcpy(&server->client->cl_timeout_default,
648 timeo,
649 sizeof(server->client->cl_timeout_default));
650 server->client->cl_timeout = &server->client->cl_timeout_default;
651 server->client->cl_softrtry = 0;
652 if (server->flags & NFS_MOUNT_SOFTERR)
653 server->client->cl_softerr = 1;
654 if (server->flags & NFS_MOUNT_SOFT)
655 server->client->cl_softrtry = 1;
656
657 nfs_sysfs_link_rpc_client(server, server->client, NULL);
658 return 0;
659 }
660 EXPORT_SYMBOL_GPL(nfs_init_server_rpcclient);
661
662 /**
663 * nfs_init_client - Initialise an NFS2 or NFS3 client
664 *
665 * @clp: nfs_client to initialise
666 * @cl_init: Initialisation parameters
667 *
668 * Returns pointer to an NFS client, or an ERR_PTR value.
669 */
nfs_init_client(struct nfs_client * clp,const struct nfs_client_initdata * cl_init)670 struct nfs_client *nfs_init_client(struct nfs_client *clp,
671 const struct nfs_client_initdata *cl_init)
672 {
673 int error;
674
675 /* the client is already initialised */
676 if (clp->cl_cons_state == NFS_CS_READY)
677 return clp;
678
679 /*
680 * Create a client RPC handle for doing FSSTAT with UNIX auth only
681 * - RFC 2623, sec 2.3.2
682 */
683 error = nfs_create_rpc_client(clp, cl_init, RPC_AUTH_UNIX);
684 nfs_mark_client_ready(clp, error == 0 ? NFS_CS_READY : error);
685 if (error < 0) {
686 nfs_put_client(clp);
687 clp = ERR_PTR(error);
688 }
689 return clp;
690 }
691 EXPORT_SYMBOL_GPL(nfs_init_client);
692
nfs4_server_set_init_caps(struct nfs_server * server)693 static void nfs4_server_set_init_caps(struct nfs_server *server)
694 {
695 #if IS_ENABLED(CONFIG_NFS_V4)
696 /* Set the basic capabilities */
697 server->caps = server->nfs_client->cl_mvops->init_caps;
698 if (server->flags & NFS_MOUNT_NORDIRPLUS)
699 server->caps &= ~NFS_CAP_READDIRPLUS;
700 if (server->nfs_client->cl_proto == XPRT_TRANSPORT_RDMA)
701 server->caps &= ~NFS_CAP_READ_PLUS;
702
703 /*
704 * Don't use NFS uid/gid mapping if we're using AUTH_SYS or lower
705 * authentication.
706 */
707 if (nfs4_disable_idmapping &&
708 server->client->cl_auth->au_flavor == RPC_AUTH_UNIX)
709 server->caps |= NFS_CAP_UIDGID_NOMAP;
710 #endif
711 }
712
nfs_server_set_init_caps(struct nfs_server * server)713 void nfs_server_set_init_caps(struct nfs_server *server)
714 {
715 switch (server->nfs_client->rpc_ops->version) {
716 case 2:
717 server->caps = NFS_CAP_HARDLINKS | NFS_CAP_SYMLINKS;
718 break;
719 case 3:
720 server->caps = NFS_CAP_HARDLINKS | NFS_CAP_SYMLINKS;
721 if (!(server->flags & NFS_MOUNT_NORDIRPLUS))
722 server->caps |= NFS_CAP_READDIRPLUS;
723 break;
724 default:
725 nfs4_server_set_init_caps(server);
726 break;
727 }
728 }
729 EXPORT_SYMBOL_GPL(nfs_server_set_init_caps);
730
731 /*
732 * Create a version 2 or 3 client
733 */
nfs_init_server(struct nfs_server * server,const struct fs_context * fc)734 static int nfs_init_server(struct nfs_server *server,
735 const struct fs_context *fc)
736 {
737 const struct nfs_fs_context *ctx = nfs_fc2context(fc);
738 struct rpc_timeout timeparms;
739 struct nfs_client_initdata cl_init = {
740 .hostname = ctx->nfs_server.hostname,
741 .addr = &ctx->nfs_server._address,
742 .addrlen = ctx->nfs_server.addrlen,
743 .nfs_mod = ctx->nfs_mod,
744 .proto = ctx->nfs_server.protocol,
745 .net = fc->net_ns,
746 .timeparms = &timeparms,
747 .cred = server->cred,
748 .nconnect = ctx->nfs_server.nconnect,
749 .init_flags = (1UL << NFS_CS_REUSEPORT),
750 .xprtsec = ctx->xprtsec,
751 };
752 struct nfs_client *clp;
753 int error;
754
755 nfs_init_timeout_values(&timeparms, ctx->nfs_server.protocol,
756 ctx->timeo, ctx->retrans);
757 if (ctx->flags & NFS_MOUNT_NORESVPORT)
758 set_bit(NFS_CS_NORESVPORT, &cl_init.init_flags);
759
760 if (ctx->flags & NFS_MOUNT_NETUNREACH_FATAL)
761 __set_bit(NFS_CS_NETUNREACH_FATAL, &cl_init.init_flags);
762
763 /* Allocate or find a client reference we can use */
764 clp = nfs_get_client(&cl_init);
765 if (IS_ERR(clp))
766 return PTR_ERR(clp);
767
768 server->nfs_client = clp;
769 nfs_sysfs_add_server(server);
770 nfs_sysfs_link_rpc_client(server, clp->cl_rpcclient, "_state");
771
772 /* Initialise the client representation from the mount data */
773 server->flags = ctx->flags;
774 server->options = ctx->options;
775
776 switch (clp->rpc_ops->version) {
777 case 2:
778 server->fattr_valid = NFS_ATTR_FATTR_V2;
779 break;
780 case 3:
781 server->fattr_valid = NFS_ATTR_FATTR_V3;
782 break;
783 default:
784 server->fattr_valid = NFS_ATTR_FATTR_V4;
785 }
786
787 if (ctx->rsize)
788 server->rsize = nfs_io_size(ctx->rsize, clp->cl_proto);
789 if (ctx->wsize)
790 server->wsize = nfs_io_size(ctx->wsize, clp->cl_proto);
791
792 server->acregmin = ctx->acregmin * HZ;
793 server->acregmax = ctx->acregmax * HZ;
794 server->acdirmin = ctx->acdirmin * HZ;
795 server->acdirmax = ctx->acdirmax * HZ;
796
797 /* Start lockd here, before we might error out */
798 error = nfs_start_lockd(server);
799 if (error < 0)
800 goto error;
801
802 server->port = ctx->nfs_server.port;
803 server->auth_info = ctx->auth_info;
804
805 error = nfs_init_server_rpcclient(server, &timeparms,
806 ctx->selected_flavor);
807 if (error < 0)
808 goto error;
809
810 nfs_server_set_init_caps(server);
811
812 /* Preserve the values of mount_server-related mount options */
813 if (ctx->mount_server.addrlen) {
814 memcpy(&server->mountd_address, &ctx->mount_server.address,
815 ctx->mount_server.addrlen);
816 server->mountd_addrlen = ctx->mount_server.addrlen;
817 }
818 server->mountd_version = ctx->mount_server.version;
819 server->mountd_port = ctx->mount_server.port;
820 server->mountd_protocol = ctx->mount_server.protocol;
821
822 server->namelen = ctx->namlen;
823 return 0;
824
825 error:
826 server->nfs_client = NULL;
827 nfs_put_client(clp);
828 return error;
829 }
830
831 /*
832 * Load up the server record from information gained in an fsinfo record
833 */
nfs_server_set_fsinfo(struct nfs_server * server,struct nfs_fsinfo * fsinfo)834 static void nfs_server_set_fsinfo(struct nfs_server *server,
835 struct nfs_fsinfo *fsinfo)
836 {
837 struct nfs_client *clp = server->nfs_client;
838 unsigned long max_rpc_payload, raw_max_rpc_payload;
839
840 /* Work out a lot of parameters */
841 if (server->rsize == 0)
842 server->rsize = nfs_io_size(fsinfo->rtpref, clp->cl_proto);
843 if (server->wsize == 0)
844 server->wsize = nfs_io_size(fsinfo->wtpref, clp->cl_proto);
845
846 if (fsinfo->rtmax >= 512 && server->rsize > fsinfo->rtmax)
847 server->rsize = nfs_io_size(fsinfo->rtmax, clp->cl_proto);
848 if (fsinfo->wtmax >= 512 && server->wsize > fsinfo->wtmax)
849 server->wsize = nfs_io_size(fsinfo->wtmax, clp->cl_proto);
850
851 raw_max_rpc_payload = rpc_max_payload(server->client);
852 max_rpc_payload = nfs_block_size(raw_max_rpc_payload, NULL);
853
854 if (server->rsize > max_rpc_payload)
855 server->rsize = max_rpc_payload;
856 if (server->rsize > NFS_MAX_FILE_IO_SIZE)
857 server->rsize = NFS_MAX_FILE_IO_SIZE;
858 server->rpages = (server->rsize + PAGE_SIZE - 1) >> PAGE_SHIFT;
859
860 if (server->wsize > max_rpc_payload)
861 server->wsize = max_rpc_payload;
862 if (server->wsize > NFS_MAX_FILE_IO_SIZE)
863 server->wsize = NFS_MAX_FILE_IO_SIZE;
864
865 server->wtmult = nfs_block_bits(fsinfo->wtmult, NULL);
866
867 server->dtsize = nfs_block_size(fsinfo->dtpref, NULL);
868 if (server->dtsize > NFS_MAX_FILE_IO_SIZE)
869 server->dtsize = NFS_MAX_FILE_IO_SIZE;
870 if (server->dtsize > server->rsize)
871 server->dtsize = server->rsize;
872
873 if (server->flags & NFS_MOUNT_NOAC) {
874 server->acregmin = server->acregmax = 0;
875 server->acdirmin = server->acdirmax = 0;
876 }
877
878 server->maxfilesize = fsinfo->maxfilesize;
879
880 server->change_attr_type = fsinfo->change_attr_type;
881
882 server->clone_blksize = fsinfo->clone_blksize;
883 /* We're airborne Set socket buffersize */
884 rpc_setbufsize(server->client, server->wsize + 100, server->rsize + 100);
885
886 #ifdef CONFIG_NFS_V4_2
887 /*
888 * Defaults until limited by the session parameters.
889 */
890 server->gxasize = min_t(unsigned int, raw_max_rpc_payload,
891 XATTR_SIZE_MAX);
892 server->sxasize = min_t(unsigned int, raw_max_rpc_payload,
893 XATTR_SIZE_MAX);
894 server->lxasize = min_t(unsigned int, raw_max_rpc_payload,
895 nfs42_listxattr_xdrsize(XATTR_LIST_MAX));
896
897 if (fsinfo->xattr_support)
898 server->caps |= NFS_CAP_XATTR;
899 else
900 server->caps &= ~NFS_CAP_XATTR;
901 #endif
902 }
903
904 /*
905 * Probe filesystem information, including the FSID on v2/v3
906 */
nfs_probe_fsinfo(struct nfs_server * server,struct nfs_fh * mntfh,struct nfs_fattr * fattr)907 static int nfs_probe_fsinfo(struct nfs_server *server, struct nfs_fh *mntfh, struct nfs_fattr *fattr)
908 {
909 struct nfs_fsinfo fsinfo;
910 struct nfs_client *clp = server->nfs_client;
911 int error;
912
913 if (clp->rpc_ops->set_capabilities != NULL) {
914 error = clp->rpc_ops->set_capabilities(server, mntfh);
915 if (error < 0)
916 return error;
917 }
918
919 fsinfo.fattr = fattr;
920 fsinfo.nlayouttypes = 0;
921 memset(fsinfo.layouttype, 0, sizeof(fsinfo.layouttype));
922 error = clp->rpc_ops->fsinfo(server, mntfh, &fsinfo);
923 if (error < 0)
924 return error;
925
926 nfs_server_set_fsinfo(server, &fsinfo);
927
928 /* Get some general file system info */
929 if (server->namelen == 0) {
930 struct nfs_pathconf pathinfo;
931
932 pathinfo.fattr = fattr;
933 nfs_fattr_init(fattr);
934
935 if (clp->rpc_ops->pathconf(server, mntfh, &pathinfo) >= 0)
936 server->namelen = pathinfo.max_namelen;
937 }
938
939 if (clp->rpc_ops->discover_trunking != NULL &&
940 (server->caps & NFS_CAP_FS_LOCATIONS &&
941 (server->flags & NFS_MOUNT_TRUNK_DISCOVERY))) {
942 error = clp->rpc_ops->discover_trunking(server, mntfh);
943 if (error < 0)
944 return error;
945 }
946
947 return 0;
948 }
949
950 /*
951 * Grab the destination's particulars, including lease expiry time.
952 *
953 * Returns zero if probe succeeded and retrieved FSID matches the FSID
954 * we have cached.
955 */
nfs_probe_server(struct nfs_server * server,struct nfs_fh * mntfh)956 int nfs_probe_server(struct nfs_server *server, struct nfs_fh *mntfh)
957 {
958 struct nfs_fattr *fattr;
959 int error;
960
961 fattr = nfs_alloc_fattr();
962 if (fattr == NULL)
963 return -ENOMEM;
964
965 /* Sanity: the probe won't work if the destination server
966 * does not recognize the migrated FH. */
967 error = nfs_probe_fsinfo(server, mntfh, fattr);
968
969 nfs_free_fattr(fattr);
970 return error;
971 }
972 EXPORT_SYMBOL_GPL(nfs_probe_server);
973
974 /*
975 * Copy useful information when duplicating a server record
976 */
nfs_server_copy_userdata(struct nfs_server * target,struct nfs_server * source)977 void nfs_server_copy_userdata(struct nfs_server *target, struct nfs_server *source)
978 {
979 target->flags = source->flags;
980 target->rsize = source->rsize;
981 target->wsize = source->wsize;
982 target->acregmin = source->acregmin;
983 target->acregmax = source->acregmax;
984 target->acdirmin = source->acdirmin;
985 target->acdirmax = source->acdirmax;
986 target->options = source->options;
987 target->auth_info = source->auth_info;
988 target->port = source->port;
989 }
990 EXPORT_SYMBOL_GPL(nfs_server_copy_userdata);
991
nfs_server_insert_lists(struct nfs_server * server)992 void nfs_server_insert_lists(struct nfs_server *server)
993 {
994 struct nfs_client *clp = server->nfs_client;
995 struct nfs_net *nn = net_generic(clp->cl_net, nfs_net_id);
996
997 spin_lock(&nn->nfs_client_lock);
998 list_add_tail_rcu(&server->client_link, &clp->cl_superblocks);
999 list_add_tail(&server->master_link, &nn->nfs_volume_list);
1000 clear_bit(NFS_CS_STOP_RENEW, &clp->cl_res_state);
1001 spin_unlock(&nn->nfs_client_lock);
1002
1003 }
1004 EXPORT_SYMBOL_GPL(nfs_server_insert_lists);
1005
nfs_server_remove_lists(struct nfs_server * server)1006 void nfs_server_remove_lists(struct nfs_server *server)
1007 {
1008 struct nfs_client *clp = server->nfs_client;
1009 struct nfs_net *nn;
1010
1011 if (clp == NULL)
1012 return;
1013 nn = net_generic(clp->cl_net, nfs_net_id);
1014 spin_lock(&nn->nfs_client_lock);
1015 list_del_rcu(&server->client_link);
1016 if (list_empty(&clp->cl_superblocks))
1017 set_bit(NFS_CS_STOP_RENEW, &clp->cl_res_state);
1018 list_del(&server->master_link);
1019 spin_unlock(&nn->nfs_client_lock);
1020
1021 synchronize_rcu();
1022 }
1023 EXPORT_SYMBOL_GPL(nfs_server_remove_lists);
1024
1025 static DEFINE_IDA(s_sysfs_ids);
1026
1027 /*
1028 * Allocate and initialise a server record
1029 */
nfs_alloc_server(void)1030 struct nfs_server *nfs_alloc_server(void)
1031 {
1032 struct nfs_server *server;
1033
1034 server = kzalloc(sizeof(struct nfs_server), GFP_KERNEL);
1035 if (!server)
1036 return NULL;
1037
1038 server->s_sysfs_id = ida_alloc(&s_sysfs_ids, GFP_KERNEL);
1039 if (server->s_sysfs_id < 0) {
1040 kfree(server);
1041 return NULL;
1042 }
1043
1044 server->client = server->client_acl = ERR_PTR(-EINVAL);
1045
1046 /* Zero out the NFS state stuff */
1047 INIT_LIST_HEAD(&server->client_link);
1048 INIT_LIST_HEAD(&server->master_link);
1049 INIT_LIST_HEAD(&server->delegations);
1050 INIT_LIST_HEAD(&server->layouts);
1051 INIT_LIST_HEAD(&server->state_owners_lru);
1052 INIT_LIST_HEAD(&server->ss_copies);
1053 INIT_LIST_HEAD(&server->ss_src_copies);
1054
1055 atomic_set(&server->active, 0);
1056 atomic_long_set(&server->nr_active_delegations, 0);
1057
1058 server->io_stats = nfs_alloc_iostats();
1059 if (!server->io_stats) {
1060 kfree(server);
1061 return NULL;
1062 }
1063
1064 server->change_attr_type = NFS4_CHANGE_TYPE_IS_UNDEFINED;
1065
1066 init_waitqueue_head(&server->write_congestion_wait);
1067 atomic_long_set(&server->writeback, 0);
1068
1069 atomic64_set(&server->owner_ctr, 0);
1070
1071 pnfs_init_server(server);
1072 rpc_init_wait_queue(&server->uoc_rpcwaitq, "NFS UOC");
1073
1074 return server;
1075 }
1076 EXPORT_SYMBOL_GPL(nfs_alloc_server);
1077
delayed_free(struct rcu_head * p)1078 static void delayed_free(struct rcu_head *p)
1079 {
1080 struct nfs_server *server = container_of(p, struct nfs_server, rcu);
1081
1082 nfs_free_iostats(server->io_stats);
1083 kfree(server);
1084 }
1085
1086 /*
1087 * Free up a server record
1088 */
nfs_free_server(struct nfs_server * server)1089 void nfs_free_server(struct nfs_server *server)
1090 {
1091 nfs_server_remove_lists(server);
1092
1093 if (server->destroy != NULL)
1094 server->destroy(server);
1095
1096 if (!IS_ERR(server->client_acl))
1097 rpc_shutdown_client(server->client_acl);
1098 if (!IS_ERR(server->client))
1099 rpc_shutdown_client(server->client);
1100
1101 nfs_put_client(server->nfs_client);
1102
1103 if (server->kobj.state_initialized) {
1104 nfs_sysfs_remove_server(server);
1105 kobject_put(&server->kobj);
1106 }
1107 ida_free(&s_sysfs_ids, server->s_sysfs_id);
1108
1109 put_cred(server->cred);
1110 nfs_release_automount_timer();
1111 call_rcu(&server->rcu, delayed_free);
1112 }
1113 EXPORT_SYMBOL_GPL(nfs_free_server);
1114
1115 /*
1116 * Create a version 2 or 3 volume record
1117 * - keyed on server and FSID
1118 */
nfs_create_server(struct fs_context * fc)1119 struct nfs_server *nfs_create_server(struct fs_context *fc)
1120 {
1121 struct nfs_fs_context *ctx = nfs_fc2context(fc);
1122 struct nfs_server *server;
1123 struct nfs_fattr *fattr;
1124 int error;
1125
1126 server = nfs_alloc_server();
1127 if (!server)
1128 return ERR_PTR(-ENOMEM);
1129
1130 server->cred = get_cred(fc->cred);
1131
1132 error = -ENOMEM;
1133 fattr = nfs_alloc_fattr();
1134 if (fattr == NULL)
1135 goto error;
1136
1137 /* Get a client representation */
1138 error = nfs_init_server(server, fc);
1139 if (error < 0)
1140 goto error;
1141
1142 /* Probe the root fh to retrieve its FSID */
1143 error = nfs_probe_fsinfo(server, ctx->mntfh, fattr);
1144 if (error < 0)
1145 goto error;
1146 if (server->nfs_client->rpc_ops->version == 3) {
1147 if (server->namelen == 0 || server->namelen > NFS3_MAXNAMLEN)
1148 server->namelen = NFS3_MAXNAMLEN;
1149 if (!(ctx->flags & NFS_MOUNT_NORDIRPLUS))
1150 server->caps |= NFS_CAP_READDIRPLUS;
1151 } else {
1152 if (server->namelen == 0 || server->namelen > NFS2_MAXNAMLEN)
1153 server->namelen = NFS2_MAXNAMLEN;
1154 }
1155 /* Linux 'subtree_check' borkenness mandates this setting */
1156 server->fh_expire_type = NFS_FH_VOL_RENAME;
1157
1158 if (!(fattr->valid & NFS_ATTR_FATTR)) {
1159 error = ctx->nfs_mod->rpc_ops->getattr(server, ctx->mntfh,
1160 fattr, NULL);
1161 if (error < 0) {
1162 dprintk("nfs_create_server: getattr error = %d\n", -error);
1163 goto error;
1164 }
1165 }
1166 memcpy(&server->fsid, &fattr->fsid, sizeof(server->fsid));
1167
1168 dprintk("Server FSID: %llx:%llx\n",
1169 (unsigned long long) server->fsid.major,
1170 (unsigned long long) server->fsid.minor);
1171
1172 nfs_server_insert_lists(server);
1173 server->mount_time = jiffies;
1174 nfs_free_fattr(fattr);
1175 return server;
1176
1177 error:
1178 nfs_free_fattr(fattr);
1179 nfs_free_server(server);
1180 return ERR_PTR(error);
1181 }
1182 EXPORT_SYMBOL_GPL(nfs_create_server);
1183
1184 /*
1185 * Clone an NFS2, NFS3 or NFS4 server record
1186 */
nfs_clone_server(struct nfs_server * source,struct nfs_fh * fh,struct nfs_fattr * fattr,rpc_authflavor_t flavor)1187 struct nfs_server *nfs_clone_server(struct nfs_server *source,
1188 struct nfs_fh *fh,
1189 struct nfs_fattr *fattr,
1190 rpc_authflavor_t flavor)
1191 {
1192 struct nfs_server *server;
1193 int error;
1194
1195 server = nfs_alloc_server();
1196 if (!server)
1197 return ERR_PTR(-ENOMEM);
1198
1199 server->cred = get_cred(source->cred);
1200
1201 /* Copy data from the source */
1202 server->nfs_client = source->nfs_client;
1203 server->destroy = source->destroy;
1204 refcount_inc(&server->nfs_client->cl_count);
1205 nfs_server_copy_userdata(server, source);
1206
1207 server->fsid = fattr->fsid;
1208
1209 nfs_sysfs_add_server(server);
1210
1211 nfs_sysfs_link_rpc_client(server,
1212 server->nfs_client->cl_rpcclient, "_state");
1213
1214 error = nfs_init_server_rpcclient(server,
1215 source->client->cl_timeout,
1216 flavor);
1217 if (error < 0)
1218 goto out_free_server;
1219
1220 nfs_server_set_init_caps(server);
1221
1222 /* probe the filesystem info for this server filesystem */
1223 error = nfs_probe_server(server, fh);
1224 if (error < 0)
1225 goto out_free_server;
1226
1227 if (server->namelen == 0 || server->namelen > NFS4_MAXNAMLEN)
1228 server->namelen = NFS4_MAXNAMLEN;
1229
1230 error = nfs_start_lockd(server);
1231 if (error < 0)
1232 goto out_free_server;
1233
1234 nfs_server_insert_lists(server);
1235 server->mount_time = jiffies;
1236
1237 return server;
1238
1239 out_free_server:
1240 nfs_free_server(server);
1241 return ERR_PTR(error);
1242 }
1243 EXPORT_SYMBOL_GPL(nfs_clone_server);
1244
nfs_clients_init(struct net * net)1245 void nfs_clients_init(struct net *net)
1246 {
1247 struct nfs_net *nn = net_generic(net, nfs_net_id);
1248
1249 INIT_LIST_HEAD(&nn->nfs_client_list);
1250 INIT_LIST_HEAD(&nn->nfs_volume_list);
1251 #if IS_ENABLED(CONFIG_NFS_V4)
1252 idr_init(&nn->cb_ident_idr);
1253 #endif
1254 #if IS_ENABLED(CONFIG_NFS_V4_1)
1255 INIT_LIST_HEAD(&nn->nfs4_data_server_cache);
1256 spin_lock_init(&nn->nfs4_data_server_lock);
1257 #endif
1258 spin_lock_init(&nn->nfs_client_lock);
1259 nn->boot_time = ktime_get_real();
1260 memset(&nn->rpcstats, 0, sizeof(nn->rpcstats));
1261 nn->rpcstats.program = &nfs_program;
1262
1263 nfs_netns_sysfs_setup(nn, net);
1264 }
1265
nfs_clients_exit(struct net * net)1266 void nfs_clients_exit(struct net *net)
1267 {
1268 struct nfs_net *nn = net_generic(net, nfs_net_id);
1269
1270 nfs_netns_sysfs_destroy(nn);
1271 nfs_cleanup_cb_ident_idr(net);
1272 WARN_ON_ONCE(!list_empty(&nn->nfs_client_list));
1273 WARN_ON_ONCE(!list_empty(&nn->nfs_volume_list));
1274 #if IS_ENABLED(CONFIG_NFS_V4_1)
1275 WARN_ON_ONCE(!list_empty(&nn->nfs4_data_server_cache));
1276 #endif
1277 }
1278
1279 #ifdef CONFIG_PROC_FS
1280 static void *nfs_server_list_start(struct seq_file *p, loff_t *pos);
1281 static void *nfs_server_list_next(struct seq_file *p, void *v, loff_t *pos);
1282 static void nfs_server_list_stop(struct seq_file *p, void *v);
1283 static int nfs_server_list_show(struct seq_file *m, void *v);
1284
1285 static const struct seq_operations nfs_server_list_ops = {
1286 .start = nfs_server_list_start,
1287 .next = nfs_server_list_next,
1288 .stop = nfs_server_list_stop,
1289 .show = nfs_server_list_show,
1290 };
1291
1292 static void *nfs_volume_list_start(struct seq_file *p, loff_t *pos);
1293 static void *nfs_volume_list_next(struct seq_file *p, void *v, loff_t *pos);
1294 static void nfs_volume_list_stop(struct seq_file *p, void *v);
1295 static int nfs_volume_list_show(struct seq_file *m, void *v);
1296
1297 static const struct seq_operations nfs_volume_list_ops = {
1298 .start = nfs_volume_list_start,
1299 .next = nfs_volume_list_next,
1300 .stop = nfs_volume_list_stop,
1301 .show = nfs_volume_list_show,
1302 };
1303
1304 /*
1305 * set up the iterator to start reading from the server list and return the first item
1306 */
nfs_server_list_start(struct seq_file * m,loff_t * _pos)1307 static void *nfs_server_list_start(struct seq_file *m, loff_t *_pos)
1308 __acquires(&nn->nfs_client_lock)
1309 {
1310 struct nfs_net *nn = net_generic(seq_file_net(m), nfs_net_id);
1311
1312 /* lock the list against modification */
1313 spin_lock(&nn->nfs_client_lock);
1314 return seq_list_start_head(&nn->nfs_client_list, *_pos);
1315 }
1316
1317 /*
1318 * move to next server
1319 */
nfs_server_list_next(struct seq_file * p,void * v,loff_t * pos)1320 static void *nfs_server_list_next(struct seq_file *p, void *v, loff_t *pos)
1321 {
1322 struct nfs_net *nn = net_generic(seq_file_net(p), nfs_net_id);
1323
1324 return seq_list_next(v, &nn->nfs_client_list, pos);
1325 }
1326
1327 /*
1328 * clean up after reading from the transports list
1329 */
nfs_server_list_stop(struct seq_file * p,void * v)1330 static void nfs_server_list_stop(struct seq_file *p, void *v)
1331 __releases(&nn->nfs_client_lock)
1332 {
1333 struct nfs_net *nn = net_generic(seq_file_net(p), nfs_net_id);
1334
1335 spin_unlock(&nn->nfs_client_lock);
1336 }
1337
1338 /*
1339 * display a header line followed by a load of call lines
1340 */
nfs_server_list_show(struct seq_file * m,void * v)1341 static int nfs_server_list_show(struct seq_file *m, void *v)
1342 {
1343 struct nfs_client *clp;
1344 struct nfs_net *nn = net_generic(seq_file_net(m), nfs_net_id);
1345
1346 /* display header on line 1 */
1347 if (v == &nn->nfs_client_list) {
1348 seq_puts(m, "NV SERVER PORT USE HOSTNAME\n");
1349 return 0;
1350 }
1351
1352 /* display one transport per line on subsequent lines */
1353 clp = list_entry(v, struct nfs_client, cl_share_link);
1354
1355 /* Check if the client is initialized */
1356 if (clp->cl_cons_state != NFS_CS_READY)
1357 return 0;
1358
1359 rcu_read_lock();
1360 seq_printf(m, "v%u %s %s %3d %s\n",
1361 clp->rpc_ops->version,
1362 rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_HEX_ADDR),
1363 rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_HEX_PORT),
1364 refcount_read(&clp->cl_count),
1365 clp->cl_hostname);
1366 rcu_read_unlock();
1367
1368 return 0;
1369 }
1370
1371 /*
1372 * set up the iterator to start reading from the volume list and return the first item
1373 */
nfs_volume_list_start(struct seq_file * m,loff_t * _pos)1374 static void *nfs_volume_list_start(struct seq_file *m, loff_t *_pos)
1375 __acquires(&nn->nfs_client_lock)
1376 {
1377 struct nfs_net *nn = net_generic(seq_file_net(m), nfs_net_id);
1378
1379 /* lock the list against modification */
1380 spin_lock(&nn->nfs_client_lock);
1381 return seq_list_start_head(&nn->nfs_volume_list, *_pos);
1382 }
1383
1384 /*
1385 * move to next volume
1386 */
nfs_volume_list_next(struct seq_file * p,void * v,loff_t * pos)1387 static void *nfs_volume_list_next(struct seq_file *p, void *v, loff_t *pos)
1388 {
1389 struct nfs_net *nn = net_generic(seq_file_net(p), nfs_net_id);
1390
1391 return seq_list_next(v, &nn->nfs_volume_list, pos);
1392 }
1393
1394 /*
1395 * clean up after reading from the transports list
1396 */
nfs_volume_list_stop(struct seq_file * p,void * v)1397 static void nfs_volume_list_stop(struct seq_file *p, void *v)
1398 __releases(&nn->nfs_client_lock)
1399 {
1400 struct nfs_net *nn = net_generic(seq_file_net(p), nfs_net_id);
1401
1402 spin_unlock(&nn->nfs_client_lock);
1403 }
1404
1405 /*
1406 * display a header line followed by a load of call lines
1407 */
nfs_volume_list_show(struct seq_file * m,void * v)1408 static int nfs_volume_list_show(struct seq_file *m, void *v)
1409 {
1410 struct nfs_server *server;
1411 struct nfs_client *clp;
1412 char dev[13]; // 8 for 2^24, 1 for ':', 3 for 2^8, 1 for '\0'
1413 char fsid[34]; // 2 * 16 for %llx, 1 for ':', 1 for '\0'
1414 struct nfs_net *nn = net_generic(seq_file_net(m), nfs_net_id);
1415
1416 /* display header on line 1 */
1417 if (v == &nn->nfs_volume_list) {
1418 seq_puts(m, "NV SERVER PORT DEV FSID"
1419 " FSC\n");
1420 return 0;
1421 }
1422 /* display one transport per line on subsequent lines */
1423 server = list_entry(v, struct nfs_server, master_link);
1424 clp = server->nfs_client;
1425
1426 snprintf(dev, sizeof(dev), "%u:%u",
1427 MAJOR(server->s_dev), MINOR(server->s_dev));
1428
1429 snprintf(fsid, sizeof(fsid), "%llx:%llx",
1430 (unsigned long long) server->fsid.major,
1431 (unsigned long long) server->fsid.minor);
1432
1433 rcu_read_lock();
1434 seq_printf(m, "v%u %s %s %-12s %-33s %s\n",
1435 clp->rpc_ops->version,
1436 rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_HEX_ADDR),
1437 rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_HEX_PORT),
1438 dev,
1439 fsid,
1440 nfs_server_fscache_state(server));
1441 rcu_read_unlock();
1442
1443 return 0;
1444 }
1445
nfs_fs_proc_net_init(struct net * net)1446 int nfs_fs_proc_net_init(struct net *net)
1447 {
1448 struct nfs_net *nn = net_generic(net, nfs_net_id);
1449 struct proc_dir_entry *p;
1450
1451 nn->proc_nfsfs = proc_net_mkdir(net, "nfsfs", net->proc_net);
1452 if (!nn->proc_nfsfs)
1453 goto error_0;
1454
1455 /* a file of servers with which we're dealing */
1456 p = proc_create_net("servers", S_IFREG|S_IRUGO, nn->proc_nfsfs,
1457 &nfs_server_list_ops, sizeof(struct seq_net_private));
1458 if (!p)
1459 goto error_1;
1460
1461 /* a file of volumes that we have mounted */
1462 p = proc_create_net("volumes", S_IFREG|S_IRUGO, nn->proc_nfsfs,
1463 &nfs_volume_list_ops, sizeof(struct seq_net_private));
1464 if (!p)
1465 goto error_1;
1466 return 0;
1467
1468 error_1:
1469 remove_proc_subtree("nfsfs", net->proc_net);
1470 error_0:
1471 return -ENOMEM;
1472 }
1473
nfs_fs_proc_net_exit(struct net * net)1474 void nfs_fs_proc_net_exit(struct net *net)
1475 {
1476 remove_proc_subtree("nfsfs", net->proc_net);
1477 }
1478
1479 /*
1480 * initialise the /proc/fs/nfsfs/ directory
1481 */
nfs_fs_proc_init(void)1482 int __init nfs_fs_proc_init(void)
1483 {
1484 if (!proc_mkdir("fs/nfsfs", NULL))
1485 goto error_0;
1486
1487 /* a file of servers with which we're dealing */
1488 if (!proc_symlink("fs/nfsfs/servers", NULL, "../../net/nfsfs/servers"))
1489 goto error_1;
1490
1491 /* a file of volumes that we have mounted */
1492 if (!proc_symlink("fs/nfsfs/volumes", NULL, "../../net/nfsfs/volumes"))
1493 goto error_1;
1494
1495 return 0;
1496 error_1:
1497 remove_proc_subtree("fs/nfsfs", NULL);
1498 error_0:
1499 return -ENOMEM;
1500 }
1501
1502 /*
1503 * clean up the /proc/fs/nfsfs/ directory
1504 */
nfs_fs_proc_exit(void)1505 void nfs_fs_proc_exit(void)
1506 {
1507 remove_proc_subtree("fs/nfsfs", NULL);
1508 ida_destroy(&s_sysfs_ids);
1509 }
1510
1511 #endif /* CONFIG_PROC_FS */
1512