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