1 /* client.c: NFS client sharing and management code
3 * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved.
4 * Written by David Howells (dhowells@redhat.com)
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
13 #include <linux/module.h>
14 #include <linux/init.h>
15 #include <linux/sched.h>
16 #include <linux/time.h>
17 #include <linux/kernel.h>
19 #include <linux/string.h>
20 #include <linux/stat.h>
21 #include <linux/errno.h>
22 #include <linux/unistd.h>
23 #include <linux/sunrpc/addr.h>
24 #include <linux/sunrpc/clnt.h>
25 #include <linux/sunrpc/stats.h>
26 #include <linux/sunrpc/metrics.h>
27 #include <linux/sunrpc/xprtsock.h>
28 #include <linux/sunrpc/xprtrdma.h>
29 #include <linux/nfs_fs.h>
30 #include <linux/nfs_mount.h>
31 #include <linux/nfs4_mount.h>
32 #include <linux/lockd/bind.h>
33 #include <linux/seq_file.h>
34 #include <linux/mount.h>
35 #include <linux/vfs.h>
36 #include <linux/inet.h>
37 #include <linux/in6.h>
38 #include <linux/slab.h>
39 #include <linux/idr.h>
41 #include <linux/nfs_xdr.h>
42 #include <linux/sunrpc/bc_xprt.h>
43 #include <linux/nsproxy.h>
44 #include <linux/pid_namespace.h>
49 #include "delegation.h"
57 #define NFSDBG_FACILITY NFSDBG_CLIENT
59 static DECLARE_WAIT_QUEUE_HEAD(nfs_client_active_wq
);
60 static DEFINE_SPINLOCK(nfs_version_lock
);
61 static DEFINE_MUTEX(nfs_version_mutex
);
62 static LIST_HEAD(nfs_versions
);
67 static const struct rpc_version
*nfs_version
[5] = {
73 const struct rpc_program nfs_program
= {
75 .number
= NFS_PROGRAM
,
76 .nrvers
= ARRAY_SIZE(nfs_version
),
77 .version
= nfs_version
,
78 .stats
= &nfs_rpcstat
,
79 .pipe_dir_name
= NFS_PIPE_DIRNAME
,
82 struct rpc_stat nfs_rpcstat
= {
83 .program
= &nfs_program
86 static struct nfs_subversion
*find_nfs_version(unsigned int version
)
88 struct nfs_subversion
*nfs
;
89 spin_lock(&nfs_version_lock
);
91 list_for_each_entry(nfs
, &nfs_versions
, list
) {
92 if (nfs
->rpc_ops
->version
== version
) {
93 spin_unlock(&nfs_version_lock
);
98 spin_unlock(&nfs_version_lock
);
99 return ERR_PTR(-EPROTONOSUPPORT
);
102 struct nfs_subversion
*get_nfs_version(unsigned int version
)
104 struct nfs_subversion
*nfs
= find_nfs_version(version
);
107 mutex_lock(&nfs_version_mutex
);
108 request_module("nfsv%d", version
);
109 nfs
= find_nfs_version(version
);
110 mutex_unlock(&nfs_version_mutex
);
113 if (!IS_ERR(nfs
) && !try_module_get(nfs
->owner
))
114 return ERR_PTR(-EAGAIN
);
118 void put_nfs_version(struct nfs_subversion
*nfs
)
120 module_put(nfs
->owner
);
123 void register_nfs_version(struct nfs_subversion
*nfs
)
125 spin_lock(&nfs_version_lock
);
127 list_add(&nfs
->list
, &nfs_versions
);
128 nfs_version
[nfs
->rpc_ops
->version
] = nfs
->rpc_vers
;
130 spin_unlock(&nfs_version_lock
);
132 EXPORT_SYMBOL_GPL(register_nfs_version
);
134 void unregister_nfs_version(struct nfs_subversion
*nfs
)
136 spin_lock(&nfs_version_lock
);
138 nfs_version
[nfs
->rpc_ops
->version
] = NULL
;
139 list_del(&nfs
->list
);
141 spin_unlock(&nfs_version_lock
);
143 EXPORT_SYMBOL_GPL(unregister_nfs_version
);
146 * Allocate a shared client record
148 * Since these are allocated/deallocated very rarely, we don't
149 * bother putting them in a slab cache...
151 struct nfs_client
*nfs_alloc_client(const struct nfs_client_initdata
*cl_init
)
153 struct nfs_client
*clp
;
154 struct rpc_cred
*cred
;
157 if ((clp
= kzalloc(sizeof(*clp
), GFP_KERNEL
)) == NULL
)
160 clp
->cl_nfs_mod
= cl_init
->nfs_mod
;
161 if (!try_module_get(clp
->cl_nfs_mod
->owner
))
164 clp
->rpc_ops
= clp
->cl_nfs_mod
->rpc_ops
;
166 refcount_set(&clp
->cl_count
, 1);
167 clp
->cl_cons_state
= NFS_CS_INITING
;
169 memcpy(&clp
->cl_addr
, cl_init
->addr
, cl_init
->addrlen
);
170 clp
->cl_addrlen
= cl_init
->addrlen
;
172 if (cl_init
->hostname
) {
174 clp
->cl_hostname
= kstrdup(cl_init
->hostname
, GFP_KERNEL
);
175 if (!clp
->cl_hostname
)
179 INIT_LIST_HEAD(&clp
->cl_superblocks
);
180 clp
->cl_rpcclient
= ERR_PTR(-EINVAL
);
182 clp
->cl_proto
= cl_init
->proto
;
183 clp
->cl_net
= get_net(cl_init
->net
);
185 cred
= rpc_lookup_machine_cred("*");
187 clp
->cl_machine_cred
= cred
;
188 nfs_fscache_get_client_cookie(clp
);
193 put_nfs_version(clp
->cl_nfs_mod
);
199 EXPORT_SYMBOL_GPL(nfs_alloc_client
);
201 #if IS_ENABLED(CONFIG_NFS_V4)
202 void nfs_cleanup_cb_ident_idr(struct net
*net
)
204 struct nfs_net
*nn
= net_generic(net
, nfs_net_id
);
206 idr_destroy(&nn
->cb_ident_idr
);
209 /* nfs_client_lock held */
210 static void nfs_cb_idr_remove_locked(struct nfs_client
*clp
)
212 struct nfs_net
*nn
= net_generic(clp
->cl_net
, nfs_net_id
);
214 if (clp
->cl_cb_ident
)
215 idr_remove(&nn
->cb_ident_idr
, clp
->cl_cb_ident
);
218 static void pnfs_init_server(struct nfs_server
*server
)
220 rpc_init_wait_queue(&server
->roc_rpcwaitq
, "pNFS ROC");
224 void nfs_cleanup_cb_ident_idr(struct net
*net
)
228 static void nfs_cb_idr_remove_locked(struct nfs_client
*clp
)
232 static void pnfs_init_server(struct nfs_server
*server
)
236 #endif /* CONFIG_NFS_V4 */
239 * Destroy a shared client record
241 void nfs_free_client(struct nfs_client
*clp
)
243 nfs_fscache_release_client_cookie(clp
);
245 /* -EIO all pending I/O */
246 if (!IS_ERR(clp
->cl_rpcclient
))
247 rpc_shutdown_client(clp
->cl_rpcclient
);
249 if (clp
->cl_machine_cred
!= NULL
)
250 put_rpccred(clp
->cl_machine_cred
);
252 put_net(clp
->cl_net
);
253 put_nfs_version(clp
->cl_nfs_mod
);
254 kfree(clp
->cl_hostname
);
255 kfree(clp
->cl_acceptor
);
258 EXPORT_SYMBOL_GPL(nfs_free_client
);
261 * Release a reference to a shared client record
263 void nfs_put_client(struct nfs_client
*clp
)
270 nn
= net_generic(clp
->cl_net
, nfs_net_id
);
272 if (refcount_dec_and_lock(&clp
->cl_count
, &nn
->nfs_client_lock
)) {
273 list_del(&clp
->cl_share_link
);
274 nfs_cb_idr_remove_locked(clp
);
275 spin_unlock(&nn
->nfs_client_lock
);
277 WARN_ON_ONCE(!list_empty(&clp
->cl_superblocks
));
279 clp
->rpc_ops
->free_client(clp
);
282 EXPORT_SYMBOL_GPL(nfs_put_client
);
285 * Find an nfs_client on the list that matches the initialisation data
288 static struct nfs_client
*nfs_match_client(const struct nfs_client_initdata
*data
)
290 struct nfs_client
*clp
;
291 const struct sockaddr
*sap
= data
->addr
;
292 struct nfs_net
*nn
= net_generic(data
->net
, nfs_net_id
);
295 list_for_each_entry(clp
, &nn
->nfs_client_list
, cl_share_link
) {
296 const struct sockaddr
*clap
= (struct sockaddr
*)&clp
->cl_addr
;
297 /* Don't match clients that failed to initialise properly */
298 if (clp
->cl_cons_state
< 0)
301 /* If a client is still initializing then we need to wait */
302 if (clp
->cl_cons_state
> NFS_CS_READY
) {
303 refcount_inc(&clp
->cl_count
);
304 spin_unlock(&nn
->nfs_client_lock
);
305 nfs_wait_client_init_complete(clp
);
307 spin_lock(&nn
->nfs_client_lock
);
311 /* Different NFS versions cannot share the same nfs_client */
312 if (clp
->rpc_ops
!= data
->nfs_mod
->rpc_ops
)
315 if (clp
->cl_proto
!= data
->proto
)
317 /* Match nfsv4 minorversion */
318 if (clp
->cl_minorversion
!= data
->minorversion
)
320 /* Match the full socket address */
321 if (!rpc_cmp_addr_port(sap
, clap
))
322 /* Match all xprt_switch full socket addresses */
323 if (IS_ERR(clp
->cl_rpcclient
) ||
324 !rpc_clnt_xprt_switch_has_addr(clp
->cl_rpcclient
,
328 refcount_inc(&clp
->cl_count
);
335 * Return true if @clp is done initializing, false if still working on it.
337 * Use nfs_client_init_status to check if it was successful.
339 bool nfs_client_init_is_complete(const struct nfs_client
*clp
)
341 return clp
->cl_cons_state
<= NFS_CS_READY
;
343 EXPORT_SYMBOL_GPL(nfs_client_init_is_complete
);
346 * Return 0 if @clp was successfully initialized, -errno otherwise.
348 * This must be called *after* nfs_client_init_is_complete() returns true,
349 * otherwise it will pop WARN_ON_ONCE and return -EINVAL
351 int nfs_client_init_status(const struct nfs_client
*clp
)
353 /* called without checking nfs_client_init_is_complete */
354 if (clp
->cl_cons_state
> NFS_CS_READY
) {
358 return clp
->cl_cons_state
;
360 EXPORT_SYMBOL_GPL(nfs_client_init_status
);
362 int nfs_wait_client_init_complete(const struct nfs_client
*clp
)
364 return wait_event_killable(nfs_client_active_wq
,
365 nfs_client_init_is_complete(clp
));
367 EXPORT_SYMBOL_GPL(nfs_wait_client_init_complete
);
370 * Found an existing client. Make sure it's ready before returning.
372 static struct nfs_client
*
373 nfs_found_client(const struct nfs_client_initdata
*cl_init
,
374 struct nfs_client
*clp
)
378 error
= nfs_wait_client_init_complete(clp
);
381 return ERR_PTR(-ERESTARTSYS
);
384 if (clp
->cl_cons_state
< NFS_CS_READY
) {
385 error
= clp
->cl_cons_state
;
387 return ERR_PTR(error
);
395 * Look up a client by IP address and protocol version
396 * - creates a new record if one doesn't yet exist
398 struct nfs_client
*nfs_get_client(const struct nfs_client_initdata
*cl_init
)
400 struct nfs_client
*clp
, *new = NULL
;
401 struct nfs_net
*nn
= net_generic(cl_init
->net
, nfs_net_id
);
402 const struct nfs_rpc_ops
*rpc_ops
= cl_init
->nfs_mod
->rpc_ops
;
404 if (cl_init
->hostname
== NULL
) {
409 /* see if the client already exists */
411 spin_lock(&nn
->nfs_client_lock
);
413 clp
= nfs_match_client(cl_init
);
415 spin_unlock(&nn
->nfs_client_lock
);
417 new->rpc_ops
->free_client(new);
418 return nfs_found_client(cl_init
, clp
);
421 list_add_tail(&new->cl_share_link
,
422 &nn
->nfs_client_list
);
423 spin_unlock(&nn
->nfs_client_lock
);
424 new->cl_flags
= cl_init
->init_flags
;
425 return rpc_ops
->init_client(new, cl_init
);
428 spin_unlock(&nn
->nfs_client_lock
);
430 new = rpc_ops
->alloc_client(cl_init
);
431 } while (!IS_ERR(new));
435 EXPORT_SYMBOL_GPL(nfs_get_client
);
438 * Mark a server as ready or failed
440 void nfs_mark_client_ready(struct nfs_client
*clp
, int state
)
443 clp
->cl_cons_state
= state
;
444 wake_up_all(&nfs_client_active_wq
);
446 EXPORT_SYMBOL_GPL(nfs_mark_client_ready
);
449 * Initialise the timeout values for a connection
451 void nfs_init_timeout_values(struct rpc_timeout
*to
, int proto
,
452 int timeo
, int retrans
)
454 to
->to_initval
= timeo
* HZ
/ 10;
455 to
->to_retries
= retrans
;
458 case XPRT_TRANSPORT_TCP
:
459 case XPRT_TRANSPORT_RDMA
:
460 if (retrans
== NFS_UNSPEC_RETRANS
)
461 to
->to_retries
= NFS_DEF_TCP_RETRANS
;
462 if (timeo
== NFS_UNSPEC_TIMEO
|| to
->to_retries
== 0)
463 to
->to_initval
= NFS_DEF_TCP_TIMEO
* HZ
/ 10;
464 if (to
->to_initval
> NFS_MAX_TCP_TIMEOUT
)
465 to
->to_initval
= NFS_MAX_TCP_TIMEOUT
;
466 to
->to_increment
= to
->to_initval
;
467 to
->to_maxval
= to
->to_initval
+ (to
->to_increment
* to
->to_retries
);
468 if (to
->to_maxval
> NFS_MAX_TCP_TIMEOUT
)
469 to
->to_maxval
= NFS_MAX_TCP_TIMEOUT
;
470 if (to
->to_maxval
< to
->to_initval
)
471 to
->to_maxval
= to
->to_initval
;
472 to
->to_exponential
= 0;
474 case XPRT_TRANSPORT_UDP
:
475 if (retrans
== NFS_UNSPEC_RETRANS
)
476 to
->to_retries
= NFS_DEF_UDP_RETRANS
;
477 if (timeo
== NFS_UNSPEC_TIMEO
|| to
->to_initval
== 0)
478 to
->to_initval
= NFS_DEF_UDP_TIMEO
* HZ
/ 10;
479 if (to
->to_initval
> NFS_MAX_UDP_TIMEOUT
)
480 to
->to_initval
= NFS_MAX_UDP_TIMEOUT
;
481 to
->to_maxval
= NFS_MAX_UDP_TIMEOUT
;
482 to
->to_exponential
= 1;
488 EXPORT_SYMBOL_GPL(nfs_init_timeout_values
);
491 * Create an RPC client handle
493 int nfs_create_rpc_client(struct nfs_client
*clp
,
494 const struct nfs_client_initdata
*cl_init
,
495 rpc_authflavor_t flavor
)
497 struct rpc_clnt
*clnt
= NULL
;
498 struct rpc_create_args args
= {
500 .protocol
= clp
->cl_proto
,
501 .address
= (struct sockaddr
*)&clp
->cl_addr
,
502 .addrsize
= clp
->cl_addrlen
,
503 .timeout
= cl_init
->timeparms
,
504 .servername
= clp
->cl_hostname
,
505 .nodename
= cl_init
->nodename
,
506 .program
= &nfs_program
,
507 .version
= clp
->rpc_ops
->version
,
508 .authflavor
= flavor
,
511 if (test_bit(NFS_CS_DISCRTRY
, &clp
->cl_flags
))
512 args
.flags
|= RPC_CLNT_CREATE_DISCRTRY
;
513 if (test_bit(NFS_CS_NO_RETRANS_TIMEOUT
, &clp
->cl_flags
))
514 args
.flags
|= RPC_CLNT_CREATE_NO_RETRANS_TIMEOUT
;
515 if (test_bit(NFS_CS_NORESVPORT
, &clp
->cl_flags
))
516 args
.flags
|= RPC_CLNT_CREATE_NONPRIVPORT
;
517 if (test_bit(NFS_CS_INFINITE_SLOTS
, &clp
->cl_flags
))
518 args
.flags
|= RPC_CLNT_CREATE_INFINITE_SLOTS
;
520 if (!IS_ERR(clp
->cl_rpcclient
))
523 clnt
= rpc_create(&args
);
525 dprintk("%s: cannot create RPC client. Error = %ld\n",
526 __func__
, PTR_ERR(clnt
));
527 return PTR_ERR(clnt
);
530 clp
->cl_rpcclient
= clnt
;
533 EXPORT_SYMBOL_GPL(nfs_create_rpc_client
);
536 * Version 2 or 3 client destruction
538 static void nfs_destroy_server(struct nfs_server
*server
)
540 if (server
->nlm_host
)
541 nlmclnt_done(server
->nlm_host
);
545 * Version 2 or 3 lockd setup
547 static int nfs_start_lockd(struct nfs_server
*server
)
549 struct nlm_host
*host
;
550 struct nfs_client
*clp
= server
->nfs_client
;
551 struct nlmclnt_initdata nlm_init
= {
552 .hostname
= clp
->cl_hostname
,
553 .address
= (struct sockaddr
*)&clp
->cl_addr
,
554 .addrlen
= clp
->cl_addrlen
,
555 .nfs_version
= clp
->rpc_ops
->version
,
556 .noresvport
= server
->flags
& NFS_MOUNT_NORESVPORT
?
559 .nlmclnt_ops
= clp
->cl_nfs_mod
->rpc_ops
->nlmclnt_ops
,
562 if (nlm_init
.nfs_version
> 3)
564 if ((server
->flags
& NFS_MOUNT_LOCAL_FLOCK
) &&
565 (server
->flags
& NFS_MOUNT_LOCAL_FCNTL
))
568 switch (clp
->cl_proto
) {
570 nlm_init
.protocol
= IPPROTO_TCP
;
572 case XPRT_TRANSPORT_UDP
:
573 nlm_init
.protocol
= IPPROTO_UDP
;
576 host
= nlmclnt_init(&nlm_init
);
578 return PTR_ERR(host
);
580 server
->nlm_host
= host
;
581 server
->destroy
= nfs_destroy_server
;
586 * Create a general RPC client
588 int nfs_init_server_rpcclient(struct nfs_server
*server
,
589 const struct rpc_timeout
*timeo
,
590 rpc_authflavor_t pseudoflavour
)
592 struct nfs_client
*clp
= server
->nfs_client
;
594 server
->client
= rpc_clone_client_set_auth(clp
->cl_rpcclient
,
596 if (IS_ERR(server
->client
)) {
597 dprintk("%s: couldn't create rpc_client!\n", __func__
);
598 return PTR_ERR(server
->client
);
601 memcpy(&server
->client
->cl_timeout_default
,
603 sizeof(server
->client
->cl_timeout_default
));
604 server
->client
->cl_timeout
= &server
->client
->cl_timeout_default
;
605 server
->client
->cl_softrtry
= 0;
606 if (server
->flags
& NFS_MOUNT_SOFT
)
607 server
->client
->cl_softrtry
= 1;
611 EXPORT_SYMBOL_GPL(nfs_init_server_rpcclient
);
614 * nfs_init_client - Initialise an NFS2 or NFS3 client
616 * @clp: nfs_client to initialise
617 * @cl_init: Initialisation parameters
619 * Returns pointer to an NFS client, or an ERR_PTR value.
621 struct nfs_client
*nfs_init_client(struct nfs_client
*clp
,
622 const struct nfs_client_initdata
*cl_init
)
626 /* the client is already initialised */
627 if (clp
->cl_cons_state
== NFS_CS_READY
)
631 * Create a client RPC handle for doing FSSTAT with UNIX auth only
632 * - RFC 2623, sec 2.3.2
634 error
= nfs_create_rpc_client(clp
, cl_init
, RPC_AUTH_UNIX
);
635 nfs_mark_client_ready(clp
, error
== 0 ? NFS_CS_READY
: error
);
638 clp
= ERR_PTR(error
);
642 EXPORT_SYMBOL_GPL(nfs_init_client
);
645 * Create a version 2 or 3 client
647 static int nfs_init_server(struct nfs_server
*server
,
648 const struct nfs_parsed_mount_data
*data
,
649 struct nfs_subversion
*nfs_mod
)
651 struct rpc_timeout timeparms
;
652 struct nfs_client_initdata cl_init
= {
653 .hostname
= data
->nfs_server
.hostname
,
654 .addr
= (const struct sockaddr
*)&data
->nfs_server
.address
,
655 .addrlen
= data
->nfs_server
.addrlen
,
657 .proto
= data
->nfs_server
.protocol
,
659 .timeparms
= &timeparms
,
661 struct nfs_client
*clp
;
664 nfs_init_timeout_values(&timeparms
, data
->nfs_server
.protocol
,
665 data
->timeo
, data
->retrans
);
666 if (data
->flags
& NFS_MOUNT_NORESVPORT
)
667 set_bit(NFS_CS_NORESVPORT
, &cl_init
.init_flags
);
669 /* Allocate or find a client reference we can use */
670 clp
= nfs_get_client(&cl_init
);
674 server
->nfs_client
= clp
;
676 /* Initialise the client representation from the mount data */
677 server
->flags
= data
->flags
;
678 server
->options
= data
->options
;
679 server
->caps
|= NFS_CAP_HARDLINKS
|NFS_CAP_SYMLINKS
|NFS_CAP_FILEID
|
680 NFS_CAP_MODE
|NFS_CAP_NLINK
|NFS_CAP_OWNER
|NFS_CAP_OWNER_GROUP
|
681 NFS_CAP_ATIME
|NFS_CAP_CTIME
|NFS_CAP_MTIME
;
684 server
->rsize
= nfs_block_size(data
->rsize
, NULL
);
686 server
->wsize
= nfs_block_size(data
->wsize
, NULL
);
688 server
->acregmin
= data
->acregmin
* HZ
;
689 server
->acregmax
= data
->acregmax
* HZ
;
690 server
->acdirmin
= data
->acdirmin
* HZ
;
691 server
->acdirmax
= data
->acdirmax
* HZ
;
693 /* Start lockd here, before we might error out */
694 error
= nfs_start_lockd(server
);
698 server
->port
= data
->nfs_server
.port
;
699 server
->auth_info
= data
->auth_info
;
701 error
= nfs_init_server_rpcclient(server
, &timeparms
,
702 data
->selected_flavor
);
706 /* Preserve the values of mount_server-related mount options */
707 if (data
->mount_server
.addrlen
) {
708 memcpy(&server
->mountd_address
, &data
->mount_server
.address
,
709 data
->mount_server
.addrlen
);
710 server
->mountd_addrlen
= data
->mount_server
.addrlen
;
712 server
->mountd_version
= data
->mount_server
.version
;
713 server
->mountd_port
= data
->mount_server
.port
;
714 server
->mountd_protocol
= data
->mount_server
.protocol
;
716 server
->namelen
= data
->namlen
;
720 server
->nfs_client
= NULL
;
726 * Load up the server record from information gained in an fsinfo record
728 static void nfs_server_set_fsinfo(struct nfs_server
*server
,
729 struct nfs_fsinfo
*fsinfo
)
731 unsigned long max_rpc_payload
;
733 /* Work out a lot of parameters */
734 if (server
->rsize
== 0)
735 server
->rsize
= nfs_block_size(fsinfo
->rtpref
, NULL
);
736 if (server
->wsize
== 0)
737 server
->wsize
= nfs_block_size(fsinfo
->wtpref
, NULL
);
739 if (fsinfo
->rtmax
>= 512 && server
->rsize
> fsinfo
->rtmax
)
740 server
->rsize
= nfs_block_size(fsinfo
->rtmax
, NULL
);
741 if (fsinfo
->wtmax
>= 512 && server
->wsize
> fsinfo
->wtmax
)
742 server
->wsize
= nfs_block_size(fsinfo
->wtmax
, NULL
);
744 max_rpc_payload
= nfs_block_size(rpc_max_payload(server
->client
), NULL
);
745 if (server
->rsize
> max_rpc_payload
)
746 server
->rsize
= max_rpc_payload
;
747 if (server
->rsize
> NFS_MAX_FILE_IO_SIZE
)
748 server
->rsize
= NFS_MAX_FILE_IO_SIZE
;
749 server
->rpages
= (server
->rsize
+ PAGE_SIZE
- 1) >> PAGE_SHIFT
;
751 if (server
->wsize
> max_rpc_payload
)
752 server
->wsize
= max_rpc_payload
;
753 if (server
->wsize
> NFS_MAX_FILE_IO_SIZE
)
754 server
->wsize
= NFS_MAX_FILE_IO_SIZE
;
755 server
->wpages
= (server
->wsize
+ PAGE_SIZE
- 1) >> PAGE_SHIFT
;
757 server
->wtmult
= nfs_block_bits(fsinfo
->wtmult
, NULL
);
759 server
->dtsize
= nfs_block_size(fsinfo
->dtpref
, NULL
);
760 if (server
->dtsize
> PAGE_SIZE
* NFS_MAX_READDIR_PAGES
)
761 server
->dtsize
= PAGE_SIZE
* NFS_MAX_READDIR_PAGES
;
762 if (server
->dtsize
> server
->rsize
)
763 server
->dtsize
= server
->rsize
;
765 if (server
->flags
& NFS_MOUNT_NOAC
) {
766 server
->acregmin
= server
->acregmax
= 0;
767 server
->acdirmin
= server
->acdirmax
= 0;
770 server
->maxfilesize
= fsinfo
->maxfilesize
;
772 server
->time_delta
= fsinfo
->time_delta
;
774 server
->clone_blksize
= fsinfo
->clone_blksize
;
775 /* We're airborne Set socket buffersize */
776 rpc_setbufsize(server
->client
, server
->wsize
+ 100, server
->rsize
+ 100);
780 * Probe filesystem information, including the FSID on v2/v3
782 int nfs_probe_fsinfo(struct nfs_server
*server
, struct nfs_fh
*mntfh
, struct nfs_fattr
*fattr
)
784 struct nfs_fsinfo fsinfo
;
785 struct nfs_client
*clp
= server
->nfs_client
;
788 if (clp
->rpc_ops
->set_capabilities
!= NULL
) {
789 error
= clp
->rpc_ops
->set_capabilities(server
, mntfh
);
794 fsinfo
.fattr
= fattr
;
795 fsinfo
.nlayouttypes
= 0;
796 memset(fsinfo
.layouttype
, 0, sizeof(fsinfo
.layouttype
));
797 error
= clp
->rpc_ops
->fsinfo(server
, mntfh
, &fsinfo
);
801 nfs_server_set_fsinfo(server
, &fsinfo
);
803 /* Get some general file system info */
804 if (server
->namelen
== 0) {
805 struct nfs_pathconf pathinfo
;
807 pathinfo
.fattr
= fattr
;
808 nfs_fattr_init(fattr
);
810 if (clp
->rpc_ops
->pathconf(server
, mntfh
, &pathinfo
) >= 0)
811 server
->namelen
= pathinfo
.max_namelen
;
816 EXPORT_SYMBOL_GPL(nfs_probe_fsinfo
);
819 * Copy useful information when duplicating a server record
821 void nfs_server_copy_userdata(struct nfs_server
*target
, struct nfs_server
*source
)
823 target
->flags
= source
->flags
;
824 target
->rsize
= source
->rsize
;
825 target
->wsize
= source
->wsize
;
826 target
->acregmin
= source
->acregmin
;
827 target
->acregmax
= source
->acregmax
;
828 target
->acdirmin
= source
->acdirmin
;
829 target
->acdirmax
= source
->acdirmax
;
830 target
->caps
= source
->caps
;
831 target
->options
= source
->options
;
832 target
->auth_info
= source
->auth_info
;
833 target
->port
= source
->port
;
835 EXPORT_SYMBOL_GPL(nfs_server_copy_userdata
);
837 void nfs_server_insert_lists(struct nfs_server
*server
)
839 struct nfs_client
*clp
= server
->nfs_client
;
840 struct nfs_net
*nn
= net_generic(clp
->cl_net
, nfs_net_id
);
842 spin_lock(&nn
->nfs_client_lock
);
843 list_add_tail_rcu(&server
->client_link
, &clp
->cl_superblocks
);
844 list_add_tail(&server
->master_link
, &nn
->nfs_volume_list
);
845 clear_bit(NFS_CS_STOP_RENEW
, &clp
->cl_res_state
);
846 spin_unlock(&nn
->nfs_client_lock
);
849 EXPORT_SYMBOL_GPL(nfs_server_insert_lists
);
851 void nfs_server_remove_lists(struct nfs_server
*server
)
853 struct nfs_client
*clp
= server
->nfs_client
;
858 nn
= net_generic(clp
->cl_net
, nfs_net_id
);
859 spin_lock(&nn
->nfs_client_lock
);
860 list_del_rcu(&server
->client_link
);
861 if (list_empty(&clp
->cl_superblocks
))
862 set_bit(NFS_CS_STOP_RENEW
, &clp
->cl_res_state
);
863 list_del(&server
->master_link
);
864 spin_unlock(&nn
->nfs_client_lock
);
868 EXPORT_SYMBOL_GPL(nfs_server_remove_lists
);
871 * Allocate and initialise a server record
873 struct nfs_server
*nfs_alloc_server(void)
875 struct nfs_server
*server
;
877 server
= kzalloc(sizeof(struct nfs_server
), GFP_KERNEL
);
881 server
->client
= server
->client_acl
= ERR_PTR(-EINVAL
);
883 /* Zero out the NFS state stuff */
884 INIT_LIST_HEAD(&server
->client_link
);
885 INIT_LIST_HEAD(&server
->master_link
);
886 INIT_LIST_HEAD(&server
->delegations
);
887 INIT_LIST_HEAD(&server
->layouts
);
888 INIT_LIST_HEAD(&server
->state_owners_lru
);
889 INIT_LIST_HEAD(&server
->ss_copies
);
891 atomic_set(&server
->active
, 0);
893 server
->io_stats
= nfs_alloc_iostats();
894 if (!server
->io_stats
) {
899 ida_init(&server
->openowner_id
);
900 ida_init(&server
->lockowner_id
);
901 pnfs_init_server(server
);
902 rpc_init_wait_queue(&server
->uoc_rpcwaitq
, "NFS UOC");
906 EXPORT_SYMBOL_GPL(nfs_alloc_server
);
909 * Free up a server record
911 void nfs_free_server(struct nfs_server
*server
)
913 nfs_server_remove_lists(server
);
915 if (server
->destroy
!= NULL
)
916 server
->destroy(server
);
918 if (!IS_ERR(server
->client_acl
))
919 rpc_shutdown_client(server
->client_acl
);
920 if (!IS_ERR(server
->client
))
921 rpc_shutdown_client(server
->client
);
923 nfs_put_client(server
->nfs_client
);
925 ida_destroy(&server
->lockowner_id
);
926 ida_destroy(&server
->openowner_id
);
927 nfs_free_iostats(server
->io_stats
);
929 nfs_release_automount_timer();
931 EXPORT_SYMBOL_GPL(nfs_free_server
);
934 * Create a version 2 or 3 volume record
935 * - keyed on server and FSID
937 struct nfs_server
*nfs_create_server(struct nfs_mount_info
*mount_info
,
938 struct nfs_subversion
*nfs_mod
)
940 struct nfs_server
*server
;
941 struct nfs_fattr
*fattr
;
944 server
= nfs_alloc_server();
946 return ERR_PTR(-ENOMEM
);
949 fattr
= nfs_alloc_fattr();
953 /* Get a client representation */
954 error
= nfs_init_server(server
, mount_info
->parsed
, nfs_mod
);
958 /* Probe the root fh to retrieve its FSID */
959 error
= nfs_probe_fsinfo(server
, mount_info
->mntfh
, fattr
);
962 if (server
->nfs_client
->rpc_ops
->version
== 3) {
963 if (server
->namelen
== 0 || server
->namelen
> NFS3_MAXNAMLEN
)
964 server
->namelen
= NFS3_MAXNAMLEN
;
965 if (!(mount_info
->parsed
->flags
& NFS_MOUNT_NORDIRPLUS
))
966 server
->caps
|= NFS_CAP_READDIRPLUS
;
968 if (server
->namelen
== 0 || server
->namelen
> NFS2_MAXNAMLEN
)
969 server
->namelen
= NFS2_MAXNAMLEN
;
972 if (!(fattr
->valid
& NFS_ATTR_FATTR
)) {
973 error
= nfs_mod
->rpc_ops
->getattr(server
, mount_info
->mntfh
,
976 dprintk("nfs_create_server: getattr error = %d\n", -error
);
980 memcpy(&server
->fsid
, &fattr
->fsid
, sizeof(server
->fsid
));
982 dprintk("Server FSID: %llx:%llx\n",
983 (unsigned long long) server
->fsid
.major
,
984 (unsigned long long) server
->fsid
.minor
);
986 nfs_server_insert_lists(server
);
987 server
->mount_time
= jiffies
;
988 nfs_free_fattr(fattr
);
992 nfs_free_fattr(fattr
);
993 nfs_free_server(server
);
994 return ERR_PTR(error
);
996 EXPORT_SYMBOL_GPL(nfs_create_server
);
999 * Clone an NFS2, NFS3 or NFS4 server record
1001 struct nfs_server
*nfs_clone_server(struct nfs_server
*source
,
1003 struct nfs_fattr
*fattr
,
1004 rpc_authflavor_t flavor
)
1006 struct nfs_server
*server
;
1007 struct nfs_fattr
*fattr_fsinfo
;
1010 server
= nfs_alloc_server();
1012 return ERR_PTR(-ENOMEM
);
1015 fattr_fsinfo
= nfs_alloc_fattr();
1016 if (fattr_fsinfo
== NULL
)
1017 goto out_free_server
;
1019 /* Copy data from the source */
1020 server
->nfs_client
= source
->nfs_client
;
1021 server
->destroy
= source
->destroy
;
1022 refcount_inc(&server
->nfs_client
->cl_count
);
1023 nfs_server_copy_userdata(server
, source
);
1025 server
->fsid
= fattr
->fsid
;
1027 error
= nfs_init_server_rpcclient(server
,
1028 source
->client
->cl_timeout
,
1031 goto out_free_server
;
1033 /* probe the filesystem info for this server filesystem */
1034 error
= nfs_probe_fsinfo(server
, fh
, fattr_fsinfo
);
1036 goto out_free_server
;
1038 if (server
->namelen
== 0 || server
->namelen
> NFS4_MAXNAMLEN
)
1039 server
->namelen
= NFS4_MAXNAMLEN
;
1041 error
= nfs_start_lockd(server
);
1043 goto out_free_server
;
1045 nfs_server_insert_lists(server
);
1046 server
->mount_time
= jiffies
;
1048 nfs_free_fattr(fattr_fsinfo
);
1052 nfs_free_fattr(fattr_fsinfo
);
1053 nfs_free_server(server
);
1054 return ERR_PTR(error
);
1056 EXPORT_SYMBOL_GPL(nfs_clone_server
);
1058 void nfs_clients_init(struct net
*net
)
1060 struct nfs_net
*nn
= net_generic(net
, nfs_net_id
);
1062 INIT_LIST_HEAD(&nn
->nfs_client_list
);
1063 INIT_LIST_HEAD(&nn
->nfs_volume_list
);
1064 #if IS_ENABLED(CONFIG_NFS_V4)
1065 idr_init(&nn
->cb_ident_idr
);
1067 spin_lock_init(&nn
->nfs_client_lock
);
1068 nn
->boot_time
= ktime_get_real();
1071 #ifdef CONFIG_PROC_FS
1072 static void *nfs_server_list_start(struct seq_file
*p
, loff_t
*pos
);
1073 static void *nfs_server_list_next(struct seq_file
*p
, void *v
, loff_t
*pos
);
1074 static void nfs_server_list_stop(struct seq_file
*p
, void *v
);
1075 static int nfs_server_list_show(struct seq_file
*m
, void *v
);
1077 static const struct seq_operations nfs_server_list_ops
= {
1078 .start
= nfs_server_list_start
,
1079 .next
= nfs_server_list_next
,
1080 .stop
= nfs_server_list_stop
,
1081 .show
= nfs_server_list_show
,
1084 static void *nfs_volume_list_start(struct seq_file
*p
, loff_t
*pos
);
1085 static void *nfs_volume_list_next(struct seq_file
*p
, void *v
, loff_t
*pos
);
1086 static void nfs_volume_list_stop(struct seq_file
*p
, void *v
);
1087 static int nfs_volume_list_show(struct seq_file
*m
, void *v
);
1089 static const struct seq_operations nfs_volume_list_ops
= {
1090 .start
= nfs_volume_list_start
,
1091 .next
= nfs_volume_list_next
,
1092 .stop
= nfs_volume_list_stop
,
1093 .show
= nfs_volume_list_show
,
1097 * set up the iterator to start reading from the server list and return the first item
1099 static void *nfs_server_list_start(struct seq_file
*m
, loff_t
*_pos
)
1100 __acquires(&nn
->nfs_client_lock
)
1102 struct nfs_net
*nn
= net_generic(seq_file_net(m
), nfs_net_id
);
1104 /* lock the list against modification */
1105 spin_lock(&nn
->nfs_client_lock
);
1106 return seq_list_start_head(&nn
->nfs_client_list
, *_pos
);
1110 * move to next server
1112 static void *nfs_server_list_next(struct seq_file
*p
, void *v
, loff_t
*pos
)
1114 struct nfs_net
*nn
= net_generic(seq_file_net(p
), nfs_net_id
);
1116 return seq_list_next(v
, &nn
->nfs_client_list
, pos
);
1120 * clean up after reading from the transports list
1122 static void nfs_server_list_stop(struct seq_file
*p
, void *v
)
1123 __releases(&nn
->nfs_client_lock
)
1125 struct nfs_net
*nn
= net_generic(seq_file_net(p
), nfs_net_id
);
1127 spin_unlock(&nn
->nfs_client_lock
);
1131 * display a header line followed by a load of call lines
1133 static int nfs_server_list_show(struct seq_file
*m
, void *v
)
1135 struct nfs_client
*clp
;
1136 struct nfs_net
*nn
= net_generic(seq_file_net(m
), nfs_net_id
);
1138 /* display header on line 1 */
1139 if (v
== &nn
->nfs_client_list
) {
1140 seq_puts(m
, "NV SERVER PORT USE HOSTNAME\n");
1144 /* display one transport per line on subsequent lines */
1145 clp
= list_entry(v
, struct nfs_client
, cl_share_link
);
1147 /* Check if the client is initialized */
1148 if (clp
->cl_cons_state
!= NFS_CS_READY
)
1152 seq_printf(m
, "v%u %s %s %3d %s\n",
1153 clp
->rpc_ops
->version
,
1154 rpc_peeraddr2str(clp
->cl_rpcclient
, RPC_DISPLAY_HEX_ADDR
),
1155 rpc_peeraddr2str(clp
->cl_rpcclient
, RPC_DISPLAY_HEX_PORT
),
1156 refcount_read(&clp
->cl_count
),
1164 * set up the iterator to start reading from the volume list and return the first item
1166 static void *nfs_volume_list_start(struct seq_file
*m
, loff_t
*_pos
)
1167 __acquires(&nn
->nfs_client_lock
)
1169 struct nfs_net
*nn
= net_generic(seq_file_net(m
), nfs_net_id
);
1171 /* lock the list against modification */
1172 spin_lock(&nn
->nfs_client_lock
);
1173 return seq_list_start_head(&nn
->nfs_volume_list
, *_pos
);
1177 * move to next volume
1179 static void *nfs_volume_list_next(struct seq_file
*p
, void *v
, loff_t
*pos
)
1181 struct nfs_net
*nn
= net_generic(seq_file_net(p
), nfs_net_id
);
1183 return seq_list_next(v
, &nn
->nfs_volume_list
, pos
);
1187 * clean up after reading from the transports list
1189 static void nfs_volume_list_stop(struct seq_file
*p
, void *v
)
1190 __releases(&nn
->nfs_client_lock
)
1192 struct nfs_net
*nn
= net_generic(seq_file_net(p
), nfs_net_id
);
1194 spin_unlock(&nn
->nfs_client_lock
);
1198 * display a header line followed by a load of call lines
1200 static int nfs_volume_list_show(struct seq_file
*m
, void *v
)
1202 struct nfs_server
*server
;
1203 struct nfs_client
*clp
;
1204 char dev
[13]; // 8 for 2^24, 1 for ':', 3 for 2^8, 1 for '\0'
1205 char fsid
[34]; // 2 * 16 for %llx, 1 for ':', 1 for '\0'
1206 struct nfs_net
*nn
= net_generic(seq_file_net(m
), nfs_net_id
);
1208 /* display header on line 1 */
1209 if (v
== &nn
->nfs_volume_list
) {
1210 seq_puts(m
, "NV SERVER PORT DEV FSID"
1214 /* display one transport per line on subsequent lines */
1215 server
= list_entry(v
, struct nfs_server
, master_link
);
1216 clp
= server
->nfs_client
;
1218 snprintf(dev
, sizeof(dev
), "%u:%u",
1219 MAJOR(server
->s_dev
), MINOR(server
->s_dev
));
1221 snprintf(fsid
, sizeof(fsid
), "%llx:%llx",
1222 (unsigned long long) server
->fsid
.major
,
1223 (unsigned long long) server
->fsid
.minor
);
1226 seq_printf(m
, "v%u %s %s %-12s %-33s %s\n",
1227 clp
->rpc_ops
->version
,
1228 rpc_peeraddr2str(clp
->cl_rpcclient
, RPC_DISPLAY_HEX_ADDR
),
1229 rpc_peeraddr2str(clp
->cl_rpcclient
, RPC_DISPLAY_HEX_PORT
),
1232 nfs_server_fscache_state(server
));
1238 int nfs_fs_proc_net_init(struct net
*net
)
1240 struct nfs_net
*nn
= net_generic(net
, nfs_net_id
);
1241 struct proc_dir_entry
*p
;
1243 nn
->proc_nfsfs
= proc_net_mkdir(net
, "nfsfs", net
->proc_net
);
1244 if (!nn
->proc_nfsfs
)
1247 /* a file of servers with which we're dealing */
1248 p
= proc_create_net("servers", S_IFREG
|S_IRUGO
, nn
->proc_nfsfs
,
1249 &nfs_server_list_ops
, sizeof(struct seq_net_private
));
1253 /* a file of volumes that we have mounted */
1254 p
= proc_create_net("volumes", S_IFREG
|S_IRUGO
, nn
->proc_nfsfs
,
1255 &nfs_volume_list_ops
, sizeof(struct seq_net_private
));
1261 remove_proc_subtree("nfsfs", net
->proc_net
);
1266 void nfs_fs_proc_net_exit(struct net
*net
)
1268 remove_proc_subtree("nfsfs", net
->proc_net
);
1272 * initialise the /proc/fs/nfsfs/ directory
1274 int __init
nfs_fs_proc_init(void)
1276 if (!proc_mkdir("fs/nfsfs", NULL
))
1279 /* a file of servers with which we're dealing */
1280 if (!proc_symlink("fs/nfsfs/servers", NULL
, "../../net/nfsfs/servers"))
1283 /* a file of volumes that we have mounted */
1284 if (!proc_symlink("fs/nfsfs/volumes", NULL
, "../../net/nfsfs/volumes"))
1289 remove_proc_subtree("fs/nfsfs", NULL
);
1295 * clean up the /proc/fs/nfsfs/ directory
1297 void nfs_fs_proc_exit(void)
1299 remove_proc_subtree("fs/nfsfs", NULL
);
1302 #endif /* CONFIG_PROC_FS */