Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

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