xref: /openbmc/linux/fs/nfs/super.c (revision 643d1f7f)
1 /*
2  *  linux/fs/nfs/super.c
3  *
4  *  Copyright (C) 1992  Rick Sladkey
5  *
6  *  nfs superblock handling functions
7  *
8  *  Modularised by Alan Cox <Alan.Cox@linux.org>, while hacking some
9  *  experimental NFS changes. Modularisation taken straight from SYS5 fs.
10  *
11  *  Change to nfs_read_super() to permit NFS mounts to multi-homed hosts.
12  *  J.S.Peatfield@damtp.cam.ac.uk
13  *
14  *  Split from inode.c by David Howells <dhowells@redhat.com>
15  *
16  * - superblocks are indexed on server only - all inodes, dentries, etc. associated with a
17  *   particular server are held in the same superblock
18  * - NFS superblocks can have several effective roots to the dentry tree
19  * - directory type roots are spliced into the tree when a path from one root reaches the root
20  *   of another (see nfs_lookup())
21  */
22 
23 #include <linux/module.h>
24 #include <linux/init.h>
25 
26 #include <linux/time.h>
27 #include <linux/kernel.h>
28 #include <linux/mm.h>
29 #include <linux/string.h>
30 #include <linux/stat.h>
31 #include <linux/errno.h>
32 #include <linux/unistd.h>
33 #include <linux/sunrpc/clnt.h>
34 #include <linux/sunrpc/stats.h>
35 #include <linux/sunrpc/metrics.h>
36 #include <linux/sunrpc/xprtsock.h>
37 #include <linux/sunrpc/xprtrdma.h>
38 #include <linux/nfs_fs.h>
39 #include <linux/nfs_mount.h>
40 #include <linux/nfs4_mount.h>
41 #include <linux/lockd/bind.h>
42 #include <linux/smp_lock.h>
43 #include <linux/seq_file.h>
44 #include <linux/mount.h>
45 #include <linux/nfs_idmap.h>
46 #include <linux/vfs.h>
47 #include <linux/inet.h>
48 #include <linux/in6.h>
49 #include <net/ipv6.h>
50 #include <linux/nfs_xdr.h>
51 #include <linux/magic.h>
52 #include <linux/parser.h>
53 
54 #include <asm/system.h>
55 #include <asm/uaccess.h>
56 
57 #include "nfs4_fs.h"
58 #include "callback.h"
59 #include "delegation.h"
60 #include "iostat.h"
61 #include "internal.h"
62 
63 #define NFSDBG_FACILITY		NFSDBG_VFS
64 
65 enum {
66 	/* Mount options that take no arguments */
67 	Opt_soft, Opt_hard,
68 	Opt_intr, Opt_nointr,
69 	Opt_posix, Opt_noposix,
70 	Opt_cto, Opt_nocto,
71 	Opt_ac, Opt_noac,
72 	Opt_lock, Opt_nolock,
73 	Opt_v2, Opt_v3,
74 	Opt_udp, Opt_tcp, Opt_rdma,
75 	Opt_acl, Opt_noacl,
76 	Opt_rdirplus, Opt_nordirplus,
77 	Opt_sharecache, Opt_nosharecache,
78 
79 	/* Mount options that take integer arguments */
80 	Opt_port,
81 	Opt_rsize, Opt_wsize, Opt_bsize,
82 	Opt_timeo, Opt_retrans,
83 	Opt_acregmin, Opt_acregmax,
84 	Opt_acdirmin, Opt_acdirmax,
85 	Opt_actimeo,
86 	Opt_namelen,
87 	Opt_mountport,
88 	Opt_mountvers,
89 	Opt_nfsvers,
90 
91 	/* Mount options that take string arguments */
92 	Opt_sec, Opt_proto, Opt_mountproto, Opt_mounthost,
93 	Opt_addr, Opt_mountaddr, Opt_clientaddr,
94 
95 	/* Mount options that are ignored */
96 	Opt_userspace, Opt_deprecated,
97 
98 	Opt_err
99 };
100 
101 static match_table_t nfs_mount_option_tokens = {
102 	{ Opt_userspace, "bg" },
103 	{ Opt_userspace, "fg" },
104 	{ Opt_soft, "soft" },
105 	{ Opt_hard, "hard" },
106 	{ Opt_intr, "intr" },
107 	{ Opt_nointr, "nointr" },
108 	{ Opt_posix, "posix" },
109 	{ Opt_noposix, "noposix" },
110 	{ Opt_cto, "cto" },
111 	{ Opt_nocto, "nocto" },
112 	{ Opt_ac, "ac" },
113 	{ Opt_noac, "noac" },
114 	{ Opt_lock, "lock" },
115 	{ Opt_nolock, "nolock" },
116 	{ Opt_v2, "v2" },
117 	{ Opt_v3, "v3" },
118 	{ Opt_udp, "udp" },
119 	{ Opt_tcp, "tcp" },
120 	{ Opt_rdma, "rdma" },
121 	{ Opt_acl, "acl" },
122 	{ Opt_noacl, "noacl" },
123 	{ Opt_rdirplus, "rdirplus" },
124 	{ Opt_nordirplus, "nordirplus" },
125 	{ Opt_sharecache, "sharecache" },
126 	{ Opt_nosharecache, "nosharecache" },
127 
128 	{ Opt_port, "port=%u" },
129 	{ Opt_rsize, "rsize=%u" },
130 	{ Opt_wsize, "wsize=%u" },
131 	{ Opt_bsize, "bsize=%u" },
132 	{ Opt_timeo, "timeo=%u" },
133 	{ Opt_retrans, "retrans=%u" },
134 	{ Opt_acregmin, "acregmin=%u" },
135 	{ Opt_acregmax, "acregmax=%u" },
136 	{ Opt_acdirmin, "acdirmin=%u" },
137 	{ Opt_acdirmax, "acdirmax=%u" },
138 	{ Opt_actimeo, "actimeo=%u" },
139 	{ Opt_userspace, "retry=%u" },
140 	{ Opt_namelen, "namlen=%u" },
141 	{ Opt_mountport, "mountport=%u" },
142 	{ Opt_mountvers, "mountvers=%u" },
143 	{ Opt_nfsvers, "nfsvers=%u" },
144 	{ Opt_nfsvers, "vers=%u" },
145 
146 	{ Opt_sec, "sec=%s" },
147 	{ Opt_proto, "proto=%s" },
148 	{ Opt_mountproto, "mountproto=%s" },
149 	{ Opt_addr, "addr=%s" },
150 	{ Opt_clientaddr, "clientaddr=%s" },
151 	{ Opt_mounthost, "mounthost=%s" },
152 	{ Opt_mountaddr, "mountaddr=%s" },
153 
154 	{ Opt_err, NULL }
155 };
156 
157 enum {
158 	Opt_xprt_udp, Opt_xprt_tcp, Opt_xprt_rdma,
159 
160 	Opt_xprt_err
161 };
162 
163 static match_table_t nfs_xprt_protocol_tokens = {
164 	{ Opt_xprt_udp, "udp" },
165 	{ Opt_xprt_tcp, "tcp" },
166 	{ Opt_xprt_rdma, "rdma" },
167 
168 	{ Opt_xprt_err, NULL }
169 };
170 
171 enum {
172 	Opt_sec_none, Opt_sec_sys,
173 	Opt_sec_krb5, Opt_sec_krb5i, Opt_sec_krb5p,
174 	Opt_sec_lkey, Opt_sec_lkeyi, Opt_sec_lkeyp,
175 	Opt_sec_spkm, Opt_sec_spkmi, Opt_sec_spkmp,
176 
177 	Opt_sec_err
178 };
179 
180 static match_table_t nfs_secflavor_tokens = {
181 	{ Opt_sec_none, "none" },
182 	{ Opt_sec_none, "null" },
183 	{ Opt_sec_sys, "sys" },
184 
185 	{ Opt_sec_krb5, "krb5" },
186 	{ Opt_sec_krb5i, "krb5i" },
187 	{ Opt_sec_krb5p, "krb5p" },
188 
189 	{ Opt_sec_lkey, "lkey" },
190 	{ Opt_sec_lkeyi, "lkeyi" },
191 	{ Opt_sec_lkeyp, "lkeyp" },
192 
193 	{ Opt_sec_err, NULL }
194 };
195 
196 
197 static void nfs_umount_begin(struct vfsmount *, int);
198 static int  nfs_statfs(struct dentry *, struct kstatfs *);
199 static int  nfs_show_options(struct seq_file *, struct vfsmount *);
200 static int  nfs_show_stats(struct seq_file *, struct vfsmount *);
201 static int nfs_get_sb(struct file_system_type *, int, const char *, void *, struct vfsmount *);
202 static int nfs_xdev_get_sb(struct file_system_type *fs_type,
203 		int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt);
204 static void nfs_kill_super(struct super_block *);
205 static void nfs_put_super(struct super_block *);
206 
207 static struct file_system_type nfs_fs_type = {
208 	.owner		= THIS_MODULE,
209 	.name		= "nfs",
210 	.get_sb		= nfs_get_sb,
211 	.kill_sb	= nfs_kill_super,
212 	.fs_flags	= FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA,
213 };
214 
215 struct file_system_type nfs_xdev_fs_type = {
216 	.owner		= THIS_MODULE,
217 	.name		= "nfs",
218 	.get_sb		= nfs_xdev_get_sb,
219 	.kill_sb	= nfs_kill_super,
220 	.fs_flags	= FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA,
221 };
222 
223 static const struct super_operations nfs_sops = {
224 	.alloc_inode	= nfs_alloc_inode,
225 	.destroy_inode	= nfs_destroy_inode,
226 	.write_inode	= nfs_write_inode,
227 	.put_super	= nfs_put_super,
228 	.statfs		= nfs_statfs,
229 	.clear_inode	= nfs_clear_inode,
230 	.umount_begin	= nfs_umount_begin,
231 	.show_options	= nfs_show_options,
232 	.show_stats	= nfs_show_stats,
233 };
234 
235 #ifdef CONFIG_NFS_V4
236 static int nfs4_get_sb(struct file_system_type *fs_type,
237 	int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt);
238 static int nfs4_xdev_get_sb(struct file_system_type *fs_type,
239 	int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt);
240 static int nfs4_referral_get_sb(struct file_system_type *fs_type,
241 	int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt);
242 static void nfs4_kill_super(struct super_block *sb);
243 
244 static struct file_system_type nfs4_fs_type = {
245 	.owner		= THIS_MODULE,
246 	.name		= "nfs4",
247 	.get_sb		= nfs4_get_sb,
248 	.kill_sb	= nfs4_kill_super,
249 	.fs_flags	= FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA,
250 };
251 
252 struct file_system_type nfs4_xdev_fs_type = {
253 	.owner		= THIS_MODULE,
254 	.name		= "nfs4",
255 	.get_sb		= nfs4_xdev_get_sb,
256 	.kill_sb	= nfs4_kill_super,
257 	.fs_flags	= FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA,
258 };
259 
260 struct file_system_type nfs4_referral_fs_type = {
261 	.owner		= THIS_MODULE,
262 	.name		= "nfs4",
263 	.get_sb		= nfs4_referral_get_sb,
264 	.kill_sb	= nfs4_kill_super,
265 	.fs_flags	= FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA,
266 };
267 
268 static const struct super_operations nfs4_sops = {
269 	.alloc_inode	= nfs_alloc_inode,
270 	.destroy_inode	= nfs_destroy_inode,
271 	.write_inode	= nfs_write_inode,
272 	.statfs		= nfs_statfs,
273 	.clear_inode	= nfs4_clear_inode,
274 	.umount_begin	= nfs_umount_begin,
275 	.show_options	= nfs_show_options,
276 	.show_stats	= nfs_show_stats,
277 };
278 #endif
279 
280 static struct shrinker acl_shrinker = {
281 	.shrink		= nfs_access_cache_shrinker,
282 	.seeks		= DEFAULT_SEEKS,
283 };
284 
285 /*
286  * Register the NFS filesystems
287  */
288 int __init register_nfs_fs(void)
289 {
290 	int ret;
291 
292         ret = register_filesystem(&nfs_fs_type);
293 	if (ret < 0)
294 		goto error_0;
295 
296 	ret = nfs_register_sysctl();
297 	if (ret < 0)
298 		goto error_1;
299 #ifdef CONFIG_NFS_V4
300 	ret = register_filesystem(&nfs4_fs_type);
301 	if (ret < 0)
302 		goto error_2;
303 #endif
304 	register_shrinker(&acl_shrinker);
305 	return 0;
306 
307 #ifdef CONFIG_NFS_V4
308 error_2:
309 	nfs_unregister_sysctl();
310 #endif
311 error_1:
312 	unregister_filesystem(&nfs_fs_type);
313 error_0:
314 	return ret;
315 }
316 
317 /*
318  * Unregister the NFS filesystems
319  */
320 void __exit unregister_nfs_fs(void)
321 {
322 	unregister_shrinker(&acl_shrinker);
323 #ifdef CONFIG_NFS_V4
324 	unregister_filesystem(&nfs4_fs_type);
325 #endif
326 	nfs_unregister_sysctl();
327 	unregister_filesystem(&nfs_fs_type);
328 }
329 
330 void nfs_sb_active(struct nfs_server *server)
331 {
332 	atomic_inc(&server->active);
333 }
334 
335 void nfs_sb_deactive(struct nfs_server *server)
336 {
337 	if (atomic_dec_and_test(&server->active))
338 		wake_up(&server->active_wq);
339 }
340 
341 static void nfs_put_super(struct super_block *sb)
342 {
343 	struct nfs_server *server = NFS_SB(sb);
344 	/*
345 	 * Make sure there are no outstanding ops to this server.
346 	 * If so, wait for them to finish before allowing the
347 	 * unmount to continue.
348 	 */
349 	wait_event(server->active_wq, atomic_read(&server->active) == 0);
350 }
351 
352 /*
353  * Deliver file system statistics to userspace
354  */
355 static int nfs_statfs(struct dentry *dentry, struct kstatfs *buf)
356 {
357 	struct nfs_server *server = NFS_SB(dentry->d_sb);
358 	unsigned char blockbits;
359 	unsigned long blockres;
360 	struct nfs_fh *fh = NFS_FH(dentry->d_inode);
361 	struct nfs_fattr fattr;
362 	struct nfs_fsstat res = {
363 			.fattr = &fattr,
364 	};
365 	int error;
366 
367 	lock_kernel();
368 
369 	error = server->nfs_client->rpc_ops->statfs(server, fh, &res);
370 	if (error < 0)
371 		goto out_err;
372 	buf->f_type = NFS_SUPER_MAGIC;
373 
374 	/*
375 	 * Current versions of glibc do not correctly handle the
376 	 * case where f_frsize != f_bsize.  Eventually we want to
377 	 * report the value of wtmult in this field.
378 	 */
379 	buf->f_frsize = dentry->d_sb->s_blocksize;
380 
381 	/*
382 	 * On most *nix systems, f_blocks, f_bfree, and f_bavail
383 	 * are reported in units of f_frsize.  Linux hasn't had
384 	 * an f_frsize field in its statfs struct until recently,
385 	 * thus historically Linux's sys_statfs reports these
386 	 * fields in units of f_bsize.
387 	 */
388 	buf->f_bsize = dentry->d_sb->s_blocksize;
389 	blockbits = dentry->d_sb->s_blocksize_bits;
390 	blockres = (1 << blockbits) - 1;
391 	buf->f_blocks = (res.tbytes + blockres) >> blockbits;
392 	buf->f_bfree = (res.fbytes + blockres) >> blockbits;
393 	buf->f_bavail = (res.abytes + blockres) >> blockbits;
394 
395 	buf->f_files = res.tfiles;
396 	buf->f_ffree = res.afiles;
397 
398 	buf->f_namelen = server->namelen;
399 
400 	unlock_kernel();
401 	return 0;
402 
403  out_err:
404 	dprintk("%s: statfs error = %d\n", __FUNCTION__, -error);
405 	unlock_kernel();
406 	return error;
407 }
408 
409 /*
410  * Map the security flavour number to a name
411  */
412 static const char *nfs_pseudoflavour_to_name(rpc_authflavor_t flavour)
413 {
414 	static const struct {
415 		rpc_authflavor_t flavour;
416 		const char *str;
417 	} sec_flavours[] = {
418 		{ RPC_AUTH_NULL, "null" },
419 		{ RPC_AUTH_UNIX, "sys" },
420 		{ RPC_AUTH_GSS_KRB5, "krb5" },
421 		{ RPC_AUTH_GSS_KRB5I, "krb5i" },
422 		{ RPC_AUTH_GSS_KRB5P, "krb5p" },
423 		{ RPC_AUTH_GSS_LKEY, "lkey" },
424 		{ RPC_AUTH_GSS_LKEYI, "lkeyi" },
425 		{ RPC_AUTH_GSS_LKEYP, "lkeyp" },
426 		{ RPC_AUTH_GSS_SPKM, "spkm" },
427 		{ RPC_AUTH_GSS_SPKMI, "spkmi" },
428 		{ RPC_AUTH_GSS_SPKMP, "spkmp" },
429 		{ UINT_MAX, "unknown" }
430 	};
431 	int i;
432 
433 	for (i = 0; sec_flavours[i].flavour != UINT_MAX; i++) {
434 		if (sec_flavours[i].flavour == flavour)
435 			break;
436 	}
437 	return sec_flavours[i].str;
438 }
439 
440 /*
441  * Describe the mount options in force on this server representation
442  */
443 static void nfs_show_mount_options(struct seq_file *m, struct nfs_server *nfss, int showdefaults)
444 {
445 	static const struct proc_nfs_info {
446 		int flag;
447 		const char *str;
448 		const char *nostr;
449 	} nfs_info[] = {
450 		{ NFS_MOUNT_SOFT, ",soft", ",hard" },
451 		{ NFS_MOUNT_NOCTO, ",nocto", "" },
452 		{ NFS_MOUNT_NOAC, ",noac", "" },
453 		{ NFS_MOUNT_NONLM, ",nolock", "" },
454 		{ NFS_MOUNT_NOACL, ",noacl", "" },
455 		{ NFS_MOUNT_NORDIRPLUS, ",nordirplus", "" },
456 		{ NFS_MOUNT_UNSHARED, ",nosharecache", ""},
457 		{ 0, NULL, NULL }
458 	};
459 	const struct proc_nfs_info *nfs_infop;
460 	struct nfs_client *clp = nfss->nfs_client;
461 
462 	seq_printf(m, ",vers=%d", clp->rpc_ops->version);
463 	seq_printf(m, ",rsize=%d", nfss->rsize);
464 	seq_printf(m, ",wsize=%d", nfss->wsize);
465 	if (nfss->acregmin != 3*HZ || showdefaults)
466 		seq_printf(m, ",acregmin=%d", nfss->acregmin/HZ);
467 	if (nfss->acregmax != 60*HZ || showdefaults)
468 		seq_printf(m, ",acregmax=%d", nfss->acregmax/HZ);
469 	if (nfss->acdirmin != 30*HZ || showdefaults)
470 		seq_printf(m, ",acdirmin=%d", nfss->acdirmin/HZ);
471 	if (nfss->acdirmax != 60*HZ || showdefaults)
472 		seq_printf(m, ",acdirmax=%d", nfss->acdirmax/HZ);
473 	for (nfs_infop = nfs_info; nfs_infop->flag; nfs_infop++) {
474 		if (nfss->flags & nfs_infop->flag)
475 			seq_puts(m, nfs_infop->str);
476 		else
477 			seq_puts(m, nfs_infop->nostr);
478 	}
479 	seq_printf(m, ",proto=%s",
480 		   rpc_peeraddr2str(nfss->client, RPC_DISPLAY_PROTO));
481 	seq_printf(m, ",timeo=%lu", 10U * nfss->client->cl_timeout->to_initval / HZ);
482 	seq_printf(m, ",retrans=%u", nfss->client->cl_timeout->to_retries);
483 	seq_printf(m, ",sec=%s", nfs_pseudoflavour_to_name(nfss->client->cl_auth->au_flavor));
484 }
485 
486 /*
487  * Describe the mount options on this VFS mountpoint
488  */
489 static int nfs_show_options(struct seq_file *m, struct vfsmount *mnt)
490 {
491 	struct nfs_server *nfss = NFS_SB(mnt->mnt_sb);
492 
493 	nfs_show_mount_options(m, nfss, 0);
494 
495 	seq_printf(m, ",addr=%s",
496 			rpc_peeraddr2str(nfss->nfs_client->cl_rpcclient,
497 							RPC_DISPLAY_ADDR));
498 
499 	return 0;
500 }
501 
502 /*
503  * Present statistical information for this VFS mountpoint
504  */
505 static int nfs_show_stats(struct seq_file *m, struct vfsmount *mnt)
506 {
507 	int i, cpu;
508 	struct nfs_server *nfss = NFS_SB(mnt->mnt_sb);
509 	struct rpc_auth *auth = nfss->client->cl_auth;
510 	struct nfs_iostats totals = { };
511 
512 	seq_printf(m, "statvers=%s", NFS_IOSTAT_VERS);
513 
514 	/*
515 	 * Display all mount option settings
516 	 */
517 	seq_printf(m, "\n\topts:\t");
518 	seq_puts(m, mnt->mnt_sb->s_flags & MS_RDONLY ? "ro" : "rw");
519 	seq_puts(m, mnt->mnt_sb->s_flags & MS_SYNCHRONOUS ? ",sync" : "");
520 	seq_puts(m, mnt->mnt_sb->s_flags & MS_NOATIME ? ",noatime" : "");
521 	seq_puts(m, mnt->mnt_sb->s_flags & MS_NODIRATIME ? ",nodiratime" : "");
522 	nfs_show_mount_options(m, nfss, 1);
523 
524 	seq_printf(m, "\n\tage:\t%lu", (jiffies - nfss->mount_time) / HZ);
525 
526 	seq_printf(m, "\n\tcaps:\t");
527 	seq_printf(m, "caps=0x%x", nfss->caps);
528 	seq_printf(m, ",wtmult=%d", nfss->wtmult);
529 	seq_printf(m, ",dtsize=%d", nfss->dtsize);
530 	seq_printf(m, ",bsize=%d", nfss->bsize);
531 	seq_printf(m, ",namelen=%d", nfss->namelen);
532 
533 #ifdef CONFIG_NFS_V4
534 	if (nfss->nfs_client->rpc_ops->version == 4) {
535 		seq_printf(m, "\n\tnfsv4:\t");
536 		seq_printf(m, "bm0=0x%x", nfss->attr_bitmask[0]);
537 		seq_printf(m, ",bm1=0x%x", nfss->attr_bitmask[1]);
538 		seq_printf(m, ",acl=0x%x", nfss->acl_bitmask);
539 	}
540 #endif
541 
542 	/*
543 	 * Display security flavor in effect for this mount
544 	 */
545 	seq_printf(m, "\n\tsec:\tflavor=%d", auth->au_ops->au_flavor);
546 	if (auth->au_flavor)
547 		seq_printf(m, ",pseudoflavor=%d", auth->au_flavor);
548 
549 	/*
550 	 * Display superblock I/O counters
551 	 */
552 	for_each_possible_cpu(cpu) {
553 		struct nfs_iostats *stats;
554 
555 		preempt_disable();
556 		stats = per_cpu_ptr(nfss->io_stats, cpu);
557 
558 		for (i = 0; i < __NFSIOS_COUNTSMAX; i++)
559 			totals.events[i] += stats->events[i];
560 		for (i = 0; i < __NFSIOS_BYTESMAX; i++)
561 			totals.bytes[i] += stats->bytes[i];
562 
563 		preempt_enable();
564 	}
565 
566 	seq_printf(m, "\n\tevents:\t");
567 	for (i = 0; i < __NFSIOS_COUNTSMAX; i++)
568 		seq_printf(m, "%lu ", totals.events[i]);
569 	seq_printf(m, "\n\tbytes:\t");
570 	for (i = 0; i < __NFSIOS_BYTESMAX; i++)
571 		seq_printf(m, "%Lu ", totals.bytes[i]);
572 	seq_printf(m, "\n");
573 
574 	rpc_print_iostats(m, nfss->client);
575 
576 	return 0;
577 }
578 
579 /*
580  * Begin unmount by attempting to remove all automounted mountpoints we added
581  * in response to xdev traversals and referrals
582  */
583 static void nfs_umount_begin(struct vfsmount *vfsmnt, int flags)
584 {
585 	struct nfs_server *server = NFS_SB(vfsmnt->mnt_sb);
586 	struct rpc_clnt *rpc;
587 
588 	shrink_submounts(vfsmnt, &nfs_automount_list);
589 
590 	if (!(flags & MNT_FORCE))
591 		return;
592 	/* -EIO all pending I/O */
593 	rpc = server->client_acl;
594 	if (!IS_ERR(rpc))
595 		rpc_killall_tasks(rpc);
596 	rpc = server->client;
597 	if (!IS_ERR(rpc))
598 		rpc_killall_tasks(rpc);
599 }
600 
601 /*
602  * Set the port number in an address.  Be agnostic about the address family.
603  */
604 static void nfs_set_port(struct sockaddr *sap, unsigned short port)
605 {
606 	switch (sap->sa_family) {
607 	case AF_INET: {
608 		struct sockaddr_in *ap = (struct sockaddr_in *)sap;
609 		ap->sin_port = htons(port);
610 		break;
611 	}
612 	case AF_INET6: {
613 		struct sockaddr_in6 *ap = (struct sockaddr_in6 *)sap;
614 		ap->sin6_port = htons(port);
615 		break;
616 	}
617 	}
618 }
619 
620 /*
621  * Sanity-check a server address provided by the mount command.
622  *
623  * Address family must be initialized, and address must not be
624  * the ANY address for that family.
625  */
626 static int nfs_verify_server_address(struct sockaddr *addr)
627 {
628 	switch (addr->sa_family) {
629 	case AF_INET: {
630 		struct sockaddr_in *sa = (struct sockaddr_in *)addr;
631 		return sa->sin_addr.s_addr != INADDR_ANY;
632 	}
633 	case AF_INET6: {
634 		struct in6_addr *sa = &((struct sockaddr_in6 *)addr)->sin6_addr;
635 		return !ipv6_addr_any(sa);
636 	}
637 	}
638 
639 	return 0;
640 }
641 
642 /*
643  * Parse string addresses passed in via a mount option,
644  * and construct a sockaddr based on the result.
645  *
646  * If address parsing fails, set the sockaddr's address
647  * family to AF_UNSPEC to force nfs_verify_server_address()
648  * to punt the mount.
649  */
650 static void nfs_parse_server_address(char *value,
651 				     struct sockaddr *sap,
652 				     size_t *len)
653 {
654 	if (strchr(value, ':')) {
655 		struct sockaddr_in6 *ap = (struct sockaddr_in6 *)sap;
656 		u8 *addr = (u8 *)&ap->sin6_addr.in6_u;
657 
658 		ap->sin6_family = AF_INET6;
659 		*len = sizeof(*ap);
660 		if (in6_pton(value, -1, addr, '\0', NULL))
661 			return;
662 	} else {
663 		struct sockaddr_in *ap = (struct sockaddr_in *)sap;
664 		u8 *addr = (u8 *)&ap->sin_addr.s_addr;
665 
666 		ap->sin_family = AF_INET;
667 		*len = sizeof(*ap);
668 		if (in4_pton(value, -1, addr, '\0', NULL))
669 			return;
670 	}
671 
672 	sap->sa_family = AF_UNSPEC;
673 	*len = 0;
674 }
675 
676 /*
677  * Error-check and convert a string of mount options from user space into
678  * a data structure
679  */
680 static int nfs_parse_mount_options(char *raw,
681 				   struct nfs_parsed_mount_data *mnt)
682 {
683 	char *p, *string;
684 	unsigned short port = 0;
685 
686 	if (!raw) {
687 		dfprintk(MOUNT, "NFS: mount options string was NULL.\n");
688 		return 1;
689 	}
690 	dfprintk(MOUNT, "NFS: nfs mount opts='%s'\n", raw);
691 
692 	while ((p = strsep(&raw, ",")) != NULL) {
693 		substring_t args[MAX_OPT_ARGS];
694 		int option, token;
695 
696 		if (!*p)
697 			continue;
698 
699 		dfprintk(MOUNT, "NFS:   parsing nfs mount option '%s'\n", p);
700 
701 		token = match_token(p, nfs_mount_option_tokens, args);
702 		switch (token) {
703 		case Opt_soft:
704 			mnt->flags |= NFS_MOUNT_SOFT;
705 			break;
706 		case Opt_hard:
707 			mnt->flags &= ~NFS_MOUNT_SOFT;
708 			break;
709 		case Opt_intr:
710 		case Opt_nointr:
711 			break;
712 		case Opt_posix:
713 			mnt->flags |= NFS_MOUNT_POSIX;
714 			break;
715 		case Opt_noposix:
716 			mnt->flags &= ~NFS_MOUNT_POSIX;
717 			break;
718 		case Opt_cto:
719 			mnt->flags &= ~NFS_MOUNT_NOCTO;
720 			break;
721 		case Opt_nocto:
722 			mnt->flags |= NFS_MOUNT_NOCTO;
723 			break;
724 		case Opt_ac:
725 			mnt->flags &= ~NFS_MOUNT_NOAC;
726 			break;
727 		case Opt_noac:
728 			mnt->flags |= NFS_MOUNT_NOAC;
729 			break;
730 		case Opt_lock:
731 			mnt->flags &= ~NFS_MOUNT_NONLM;
732 			break;
733 		case Opt_nolock:
734 			mnt->flags |= NFS_MOUNT_NONLM;
735 			break;
736 		case Opt_v2:
737 			mnt->flags &= ~NFS_MOUNT_VER3;
738 			break;
739 		case Opt_v3:
740 			mnt->flags |= NFS_MOUNT_VER3;
741 			break;
742 		case Opt_udp:
743 			mnt->flags &= ~NFS_MOUNT_TCP;
744 			mnt->nfs_server.protocol = XPRT_TRANSPORT_UDP;
745 			mnt->timeo = 7;
746 			mnt->retrans = 5;
747 			break;
748 		case Opt_tcp:
749 			mnt->flags |= NFS_MOUNT_TCP;
750 			mnt->nfs_server.protocol = XPRT_TRANSPORT_TCP;
751 			mnt->timeo = 600;
752 			mnt->retrans = 2;
753 			break;
754 		case Opt_rdma:
755 			mnt->flags |= NFS_MOUNT_TCP; /* for side protocols */
756 			mnt->nfs_server.protocol = XPRT_TRANSPORT_RDMA;
757 			mnt->timeo = 600;
758 			mnt->retrans = 2;
759 			break;
760 		case Opt_acl:
761 			mnt->flags &= ~NFS_MOUNT_NOACL;
762 			break;
763 		case Opt_noacl:
764 			mnt->flags |= NFS_MOUNT_NOACL;
765 			break;
766 		case Opt_rdirplus:
767 			mnt->flags &= ~NFS_MOUNT_NORDIRPLUS;
768 			break;
769 		case Opt_nordirplus:
770 			mnt->flags |= NFS_MOUNT_NORDIRPLUS;
771 			break;
772 		case Opt_sharecache:
773 			mnt->flags &= ~NFS_MOUNT_UNSHARED;
774 			break;
775 		case Opt_nosharecache:
776 			mnt->flags |= NFS_MOUNT_UNSHARED;
777 			break;
778 
779 		case Opt_port:
780 			if (match_int(args, &option))
781 				return 0;
782 			if (option < 0 || option > 65535)
783 				return 0;
784 			port = option;
785 			break;
786 		case Opt_rsize:
787 			if (match_int(args, &mnt->rsize))
788 				return 0;
789 			break;
790 		case Opt_wsize:
791 			if (match_int(args, &mnt->wsize))
792 				return 0;
793 			break;
794 		case Opt_bsize:
795 			if (match_int(args, &option))
796 				return 0;
797 			if (option < 0)
798 				return 0;
799 			mnt->bsize = option;
800 			break;
801 		case Opt_timeo:
802 			if (match_int(args, &mnt->timeo))
803 				return 0;
804 			break;
805 		case Opt_retrans:
806 			if (match_int(args, &mnt->retrans))
807 				return 0;
808 			break;
809 		case Opt_acregmin:
810 			if (match_int(args, &mnt->acregmin))
811 				return 0;
812 			break;
813 		case Opt_acregmax:
814 			if (match_int(args, &mnt->acregmax))
815 				return 0;
816 			break;
817 		case Opt_acdirmin:
818 			if (match_int(args, &mnt->acdirmin))
819 				return 0;
820 			break;
821 		case Opt_acdirmax:
822 			if (match_int(args, &mnt->acdirmax))
823 				return 0;
824 			break;
825 		case Opt_actimeo:
826 			if (match_int(args, &option))
827 				return 0;
828 			if (option < 0)
829 				return 0;
830 			mnt->acregmin =
831 			mnt->acregmax =
832 			mnt->acdirmin =
833 			mnt->acdirmax = option;
834 			break;
835 		case Opt_namelen:
836 			if (match_int(args, &mnt->namlen))
837 				return 0;
838 			break;
839 		case Opt_mountport:
840 			if (match_int(args, &option))
841 				return 0;
842 			if (option < 0 || option > 65535)
843 				return 0;
844 			mnt->mount_server.port = option;
845 			break;
846 		case Opt_mountvers:
847 			if (match_int(args, &option))
848 				return 0;
849 			if (option < 0)
850 				return 0;
851 			mnt->mount_server.version = option;
852 			break;
853 		case Opt_nfsvers:
854 			if (match_int(args, &option))
855 				return 0;
856 			switch (option) {
857 			case 2:
858 				mnt->flags &= ~NFS_MOUNT_VER3;
859 				break;
860 			case 3:
861 				mnt->flags |= NFS_MOUNT_VER3;
862 				break;
863 			default:
864 				goto out_unrec_vers;
865 			}
866 			break;
867 
868 		case Opt_sec:
869 			string = match_strdup(args);
870 			if (string == NULL)
871 				goto out_nomem;
872 			token = match_token(string, nfs_secflavor_tokens, args);
873 			kfree(string);
874 
875 			/*
876 			 * The flags setting is for v2/v3.  The flavor_len
877 			 * setting is for v4.  v2/v3 also need to know the
878 			 * difference between NULL and UNIX.
879 			 */
880 			switch (token) {
881 			case Opt_sec_none:
882 				mnt->flags &= ~NFS_MOUNT_SECFLAVOUR;
883 				mnt->auth_flavor_len = 0;
884 				mnt->auth_flavors[0] = RPC_AUTH_NULL;
885 				break;
886 			case Opt_sec_sys:
887 				mnt->flags &= ~NFS_MOUNT_SECFLAVOUR;
888 				mnt->auth_flavor_len = 0;
889 				mnt->auth_flavors[0] = RPC_AUTH_UNIX;
890 				break;
891 			case Opt_sec_krb5:
892 				mnt->flags |= NFS_MOUNT_SECFLAVOUR;
893 				mnt->auth_flavor_len = 1;
894 				mnt->auth_flavors[0] = RPC_AUTH_GSS_KRB5;
895 				break;
896 			case Opt_sec_krb5i:
897 				mnt->flags |= NFS_MOUNT_SECFLAVOUR;
898 				mnt->auth_flavor_len = 1;
899 				mnt->auth_flavors[0] = RPC_AUTH_GSS_KRB5I;
900 				break;
901 			case Opt_sec_krb5p:
902 				mnt->flags |= NFS_MOUNT_SECFLAVOUR;
903 				mnt->auth_flavor_len = 1;
904 				mnt->auth_flavors[0] = RPC_AUTH_GSS_KRB5P;
905 				break;
906 			case Opt_sec_lkey:
907 				mnt->flags |= NFS_MOUNT_SECFLAVOUR;
908 				mnt->auth_flavor_len = 1;
909 				mnt->auth_flavors[0] = RPC_AUTH_GSS_LKEY;
910 				break;
911 			case Opt_sec_lkeyi:
912 				mnt->flags |= NFS_MOUNT_SECFLAVOUR;
913 				mnt->auth_flavor_len = 1;
914 				mnt->auth_flavors[0] = RPC_AUTH_GSS_LKEYI;
915 				break;
916 			case Opt_sec_lkeyp:
917 				mnt->flags |= NFS_MOUNT_SECFLAVOUR;
918 				mnt->auth_flavor_len = 1;
919 				mnt->auth_flavors[0] = RPC_AUTH_GSS_LKEYP;
920 				break;
921 			case Opt_sec_spkm:
922 				mnt->flags |= NFS_MOUNT_SECFLAVOUR;
923 				mnt->auth_flavor_len = 1;
924 				mnt->auth_flavors[0] = RPC_AUTH_GSS_SPKM;
925 				break;
926 			case Opt_sec_spkmi:
927 				mnt->flags |= NFS_MOUNT_SECFLAVOUR;
928 				mnt->auth_flavor_len = 1;
929 				mnt->auth_flavors[0] = RPC_AUTH_GSS_SPKMI;
930 				break;
931 			case Opt_sec_spkmp:
932 				mnt->flags |= NFS_MOUNT_SECFLAVOUR;
933 				mnt->auth_flavor_len = 1;
934 				mnt->auth_flavors[0] = RPC_AUTH_GSS_SPKMP;
935 				break;
936 			default:
937 				goto out_unrec_sec;
938 			}
939 			break;
940 		case Opt_proto:
941 			string = match_strdup(args);
942 			if (string == NULL)
943 				goto out_nomem;
944 			token = match_token(string,
945 					    nfs_xprt_protocol_tokens, args);
946 			kfree(string);
947 
948 			switch (token) {
949 			case Opt_xprt_udp:
950 				mnt->flags &= ~NFS_MOUNT_TCP;
951 				mnt->nfs_server.protocol = XPRT_TRANSPORT_UDP;
952 				mnt->timeo = 7;
953 				mnt->retrans = 5;
954 				break;
955 			case Opt_xprt_tcp:
956 				mnt->flags |= NFS_MOUNT_TCP;
957 				mnt->nfs_server.protocol = XPRT_TRANSPORT_TCP;
958 				mnt->timeo = 600;
959 				mnt->retrans = 2;
960 				break;
961 			case Opt_xprt_rdma:
962 				/* vector side protocols to TCP */
963 				mnt->flags |= NFS_MOUNT_TCP;
964 				mnt->nfs_server.protocol = XPRT_TRANSPORT_RDMA;
965 				mnt->timeo = 600;
966 				mnt->retrans = 2;
967 				break;
968 			default:
969 				goto out_unrec_xprt;
970 			}
971 			break;
972 		case Opt_mountproto:
973 			string = match_strdup(args);
974 			if (string == NULL)
975 				goto out_nomem;
976 			token = match_token(string,
977 					    nfs_xprt_protocol_tokens, args);
978 			kfree(string);
979 
980 			switch (token) {
981 			case Opt_xprt_udp:
982 				mnt->mount_server.protocol = XPRT_TRANSPORT_UDP;
983 				break;
984 			case Opt_xprt_tcp:
985 				mnt->mount_server.protocol = XPRT_TRANSPORT_TCP;
986 				break;
987 			case Opt_xprt_rdma: /* not used for side protocols */
988 			default:
989 				goto out_unrec_xprt;
990 			}
991 			break;
992 		case Opt_addr:
993 			string = match_strdup(args);
994 			if (string == NULL)
995 				goto out_nomem;
996 			nfs_parse_server_address(string, (struct sockaddr *)
997 						 &mnt->nfs_server.address,
998 						 &mnt->nfs_server.addrlen);
999 			kfree(string);
1000 			break;
1001 		case Opt_clientaddr:
1002 			string = match_strdup(args);
1003 			if (string == NULL)
1004 				goto out_nomem;
1005 			kfree(mnt->client_address);
1006 			mnt->client_address = string;
1007 			break;
1008 		case Opt_mounthost:
1009 			string = match_strdup(args);
1010 			if (string == NULL)
1011 				goto out_nomem;
1012 			kfree(mnt->mount_server.hostname);
1013 			mnt->mount_server.hostname = string;
1014 			break;
1015 		case Opt_mountaddr:
1016 			string = match_strdup(args);
1017 			if (string == NULL)
1018 				goto out_nomem;
1019 			nfs_parse_server_address(string, (struct sockaddr *)
1020 						 &mnt->mount_server.address,
1021 						 &mnt->mount_server.addrlen);
1022 			kfree(string);
1023 			break;
1024 
1025 		case Opt_userspace:
1026 		case Opt_deprecated:
1027 			break;
1028 
1029 		default:
1030 			goto out_unknown;
1031 		}
1032 	}
1033 
1034 	nfs_set_port((struct sockaddr *)&mnt->nfs_server.address, port);
1035 
1036 	return 1;
1037 
1038 out_nomem:
1039 	printk(KERN_INFO "NFS: not enough memory to parse option\n");
1040 	return 0;
1041 
1042 out_unrec_vers:
1043 	printk(KERN_INFO "NFS: unrecognized NFS version number\n");
1044 	return 0;
1045 
1046 out_unrec_xprt:
1047 	printk(KERN_INFO "NFS: unrecognized transport protocol\n");
1048 	return 0;
1049 
1050 out_unrec_sec:
1051 	printk(KERN_INFO "NFS: unrecognized security flavor\n");
1052 	return 0;
1053 
1054 out_unknown:
1055 	printk(KERN_INFO "NFS: unknown mount option: %s\n", p);
1056 	return 0;
1057 }
1058 
1059 /*
1060  * Use the remote server's MOUNT service to request the NFS file handle
1061  * corresponding to the provided path.
1062  */
1063 static int nfs_try_mount(struct nfs_parsed_mount_data *args,
1064 			 struct nfs_fh *root_fh)
1065 {
1066 	struct sockaddr *sap = (struct sockaddr *)&args->mount_server.address;
1067 	char *hostname;
1068 	int status;
1069 
1070 	if (args->mount_server.version == 0) {
1071 		if (args->flags & NFS_MOUNT_VER3)
1072 			args->mount_server.version = NFS_MNT3_VERSION;
1073 		else
1074 			args->mount_server.version = NFS_MNT_VERSION;
1075 	}
1076 
1077 	if (args->mount_server.hostname)
1078 		hostname = args->mount_server.hostname;
1079 	else
1080 		hostname = args->nfs_server.hostname;
1081 
1082 	/*
1083 	 * Construct the mount server's address.
1084 	 */
1085 	if (args->mount_server.address.ss_family == AF_UNSPEC) {
1086 		memcpy(sap, &args->nfs_server.address,
1087 		       args->nfs_server.addrlen);
1088 		args->mount_server.addrlen = args->nfs_server.addrlen;
1089 	}
1090 
1091 	/*
1092 	 * autobind will be used if mount_server.port == 0
1093 	 */
1094 	nfs_set_port(sap, args->mount_server.port);
1095 
1096 	/*
1097 	 * Now ask the mount server to map our export path
1098 	 * to a file handle.
1099 	 */
1100 	status = nfs_mount(sap,
1101 			   args->mount_server.addrlen,
1102 			   hostname,
1103 			   args->nfs_server.export_path,
1104 			   args->mount_server.version,
1105 			   args->mount_server.protocol,
1106 			   root_fh);
1107 	if (status == 0)
1108 		return 0;
1109 
1110 	dfprintk(MOUNT, "NFS: unable to mount server %s, error %d",
1111 			hostname, status);
1112 	return status;
1113 }
1114 
1115 /*
1116  * Validate the NFS2/NFS3 mount data
1117  * - fills in the mount root filehandle
1118  *
1119  * For option strings, user space handles the following behaviors:
1120  *
1121  * + DNS: mapping server host name to IP address ("addr=" option)
1122  *
1123  * + failure mode: how to behave if a mount request can't be handled
1124  *   immediately ("fg/bg" option)
1125  *
1126  * + retry: how often to retry a mount request ("retry=" option)
1127  *
1128  * + breaking back: trying proto=udp after proto=tcp, v2 after v3,
1129  *   mountproto=tcp after mountproto=udp, and so on
1130  */
1131 static int nfs_validate_mount_data(void *options,
1132 				   struct nfs_parsed_mount_data *args,
1133 				   struct nfs_fh *mntfh,
1134 				   const char *dev_name)
1135 {
1136 	struct nfs_mount_data *data = (struct nfs_mount_data *)options;
1137 
1138 	memset(args, 0, sizeof(*args));
1139 
1140 	if (data == NULL)
1141 		goto out_no_data;
1142 
1143 	args->flags		= (NFS_MOUNT_VER3 | NFS_MOUNT_TCP);
1144 	args->rsize		= NFS_MAX_FILE_IO_SIZE;
1145 	args->wsize		= NFS_MAX_FILE_IO_SIZE;
1146 	args->timeo		= 600;
1147 	args->retrans		= 2;
1148 	args->acregmin		= 3;
1149 	args->acregmax		= 60;
1150 	args->acdirmin		= 30;
1151 	args->acdirmax		= 60;
1152 	args->mount_server.protocol = XPRT_TRANSPORT_UDP;
1153 	args->nfs_server.protocol = XPRT_TRANSPORT_TCP;
1154 
1155 	switch (data->version) {
1156 	case 1:
1157 		data->namlen = 0;
1158 	case 2:
1159 		data->bsize = 0;
1160 	case 3:
1161 		if (data->flags & NFS_MOUNT_VER3)
1162 			goto out_no_v3;
1163 		data->root.size = NFS2_FHSIZE;
1164 		memcpy(data->root.data, data->old_root.data, NFS2_FHSIZE);
1165 	case 4:
1166 		if (data->flags & NFS_MOUNT_SECFLAVOUR)
1167 			goto out_no_sec;
1168 	case 5:
1169 		memset(data->context, 0, sizeof(data->context));
1170 	case 6:
1171 		if (data->flags & NFS_MOUNT_VER3)
1172 			mntfh->size = data->root.size;
1173 		else
1174 			mntfh->size = NFS2_FHSIZE;
1175 
1176 		if (mntfh->size > sizeof(mntfh->data))
1177 			goto out_invalid_fh;
1178 
1179 		memcpy(mntfh->data, data->root.data, mntfh->size);
1180 		if (mntfh->size < sizeof(mntfh->data))
1181 			memset(mntfh->data + mntfh->size, 0,
1182 			       sizeof(mntfh->data) - mntfh->size);
1183 
1184 		/*
1185 		 * Translate to nfs_parsed_mount_data, which nfs_fill_super
1186 		 * can deal with.
1187 		 */
1188 		args->flags		= data->flags;
1189 		args->rsize		= data->rsize;
1190 		args->wsize		= data->wsize;
1191 		args->flags		= data->flags;
1192 		args->timeo		= data->timeo;
1193 		args->retrans		= data->retrans;
1194 		args->acregmin		= data->acregmin;
1195 		args->acregmax		= data->acregmax;
1196 		args->acdirmin		= data->acdirmin;
1197 		args->acdirmax		= data->acdirmax;
1198 
1199 		memcpy(&args->nfs_server.address, &data->addr,
1200 		       sizeof(data->addr));
1201 		args->nfs_server.addrlen = sizeof(data->addr);
1202 		if (!nfs_verify_server_address((struct sockaddr *)
1203 						&args->nfs_server.address))
1204 			goto out_no_address;
1205 
1206 		if (!(data->flags & NFS_MOUNT_TCP))
1207 			args->nfs_server.protocol = XPRT_TRANSPORT_UDP;
1208 		/* N.B. caller will free nfs_server.hostname in all cases */
1209 		args->nfs_server.hostname = kstrdup(data->hostname, GFP_KERNEL);
1210 		args->namlen		= data->namlen;
1211 		args->bsize		= data->bsize;
1212 		args->auth_flavors[0]	= data->pseudoflavor;
1213 		break;
1214 	default: {
1215 		unsigned int len;
1216 		char *c;
1217 		int status;
1218 
1219 		if (nfs_parse_mount_options((char *)options, args) == 0)
1220 			return -EINVAL;
1221 
1222 		if (!nfs_verify_server_address((struct sockaddr *)
1223 						&args->nfs_server.address))
1224 			goto out_no_address;
1225 
1226 		c = strchr(dev_name, ':');
1227 		if (c == NULL)
1228 			return -EINVAL;
1229 		len = c - dev_name;
1230 		/* N.B. caller will free nfs_server.hostname in all cases */
1231 		args->nfs_server.hostname = kstrndup(dev_name, len, GFP_KERNEL);
1232 
1233 		c++;
1234 		if (strlen(c) > NFS_MAXPATHLEN)
1235 			return -ENAMETOOLONG;
1236 		args->nfs_server.export_path = c;
1237 
1238 		status = nfs_try_mount(args, mntfh);
1239 		if (status)
1240 			return status;
1241 
1242 		break;
1243 		}
1244 	}
1245 
1246 	if (!(args->flags & NFS_MOUNT_SECFLAVOUR))
1247 		args->auth_flavors[0] = RPC_AUTH_UNIX;
1248 
1249 #ifndef CONFIG_NFS_V3
1250 	if (args->flags & NFS_MOUNT_VER3)
1251 		goto out_v3_not_compiled;
1252 #endif /* !CONFIG_NFS_V3 */
1253 
1254 	return 0;
1255 
1256 out_no_data:
1257 	dfprintk(MOUNT, "NFS: mount program didn't pass any mount data\n");
1258 	return -EINVAL;
1259 
1260 out_no_v3:
1261 	dfprintk(MOUNT, "NFS: nfs_mount_data version %d does not support v3\n",
1262 		 data->version);
1263 	return -EINVAL;
1264 
1265 out_no_sec:
1266 	dfprintk(MOUNT, "NFS: nfs_mount_data version supports only AUTH_SYS\n");
1267 	return -EINVAL;
1268 
1269 #ifndef CONFIG_NFS_V3
1270 out_v3_not_compiled:
1271 	dfprintk(MOUNT, "NFS: NFSv3 is not compiled into kernel\n");
1272 	return -EPROTONOSUPPORT;
1273 #endif /* !CONFIG_NFS_V3 */
1274 
1275 out_no_address:
1276 	dfprintk(MOUNT, "NFS: mount program didn't pass remote address\n");
1277 	return -EINVAL;
1278 
1279 out_invalid_fh:
1280 	dfprintk(MOUNT, "NFS: invalid root filehandle\n");
1281 	return -EINVAL;
1282 }
1283 
1284 /*
1285  * Initialise the common bits of the superblock
1286  */
1287 static inline void nfs_initialise_sb(struct super_block *sb)
1288 {
1289 	struct nfs_server *server = NFS_SB(sb);
1290 
1291 	sb->s_magic = NFS_SUPER_MAGIC;
1292 
1293 	/* We probably want something more informative here */
1294 	snprintf(sb->s_id, sizeof(sb->s_id),
1295 		 "%x:%x", MAJOR(sb->s_dev), MINOR(sb->s_dev));
1296 
1297 	if (sb->s_blocksize == 0)
1298 		sb->s_blocksize = nfs_block_bits(server->wsize,
1299 						 &sb->s_blocksize_bits);
1300 
1301 	if (server->flags & NFS_MOUNT_NOAC)
1302 		sb->s_flags |= MS_SYNCHRONOUS;
1303 
1304 	nfs_super_set_maxbytes(sb, server->maxfilesize);
1305 }
1306 
1307 /*
1308  * Finish setting up an NFS2/3 superblock
1309  */
1310 static void nfs_fill_super(struct super_block *sb,
1311 			   struct nfs_parsed_mount_data *data)
1312 {
1313 	struct nfs_server *server = NFS_SB(sb);
1314 
1315 	sb->s_blocksize_bits = 0;
1316 	sb->s_blocksize = 0;
1317 	if (data->bsize)
1318 		sb->s_blocksize = nfs_block_size(data->bsize, &sb->s_blocksize_bits);
1319 
1320 	if (server->flags & NFS_MOUNT_VER3) {
1321 		/* The VFS shouldn't apply the umask to mode bits. We will do
1322 		 * so ourselves when necessary.
1323 		 */
1324 		sb->s_flags |= MS_POSIXACL;
1325 		sb->s_time_gran = 1;
1326 	}
1327 
1328 	sb->s_op = &nfs_sops;
1329  	nfs_initialise_sb(sb);
1330 }
1331 
1332 /*
1333  * Finish setting up a cloned NFS2/3 superblock
1334  */
1335 static void nfs_clone_super(struct super_block *sb,
1336 			    const struct super_block *old_sb)
1337 {
1338 	struct nfs_server *server = NFS_SB(sb);
1339 
1340 	sb->s_blocksize_bits = old_sb->s_blocksize_bits;
1341 	sb->s_blocksize = old_sb->s_blocksize;
1342 	sb->s_maxbytes = old_sb->s_maxbytes;
1343 
1344 	if (server->flags & NFS_MOUNT_VER3) {
1345 		/* The VFS shouldn't apply the umask to mode bits. We will do
1346 		 * so ourselves when necessary.
1347 		 */
1348 		sb->s_flags |= MS_POSIXACL;
1349 		sb->s_time_gran = 1;
1350 	}
1351 
1352 	sb->s_op = old_sb->s_op;
1353  	nfs_initialise_sb(sb);
1354 }
1355 
1356 #define NFS_MS_MASK (MS_RDONLY|MS_NOSUID|MS_NODEV|MS_NOEXEC|MS_SYNCHRONOUS)
1357 
1358 static int nfs_compare_mount_options(const struct super_block *s, const struct nfs_server *b, int flags)
1359 {
1360 	const struct nfs_server *a = s->s_fs_info;
1361 	const struct rpc_clnt *clnt_a = a->client;
1362 	const struct rpc_clnt *clnt_b = b->client;
1363 
1364 	if ((s->s_flags & NFS_MS_MASK) != (flags & NFS_MS_MASK))
1365 		goto Ebusy;
1366 	if (a->nfs_client != b->nfs_client)
1367 		goto Ebusy;
1368 	if (a->flags != b->flags)
1369 		goto Ebusy;
1370 	if (a->wsize != b->wsize)
1371 		goto Ebusy;
1372 	if (a->rsize != b->rsize)
1373 		goto Ebusy;
1374 	if (a->acregmin != b->acregmin)
1375 		goto Ebusy;
1376 	if (a->acregmax != b->acregmax)
1377 		goto Ebusy;
1378 	if (a->acdirmin != b->acdirmin)
1379 		goto Ebusy;
1380 	if (a->acdirmax != b->acdirmax)
1381 		goto Ebusy;
1382 	if (clnt_a->cl_auth->au_flavor != clnt_b->cl_auth->au_flavor)
1383 		goto Ebusy;
1384 	return 1;
1385 Ebusy:
1386 	return 0;
1387 }
1388 
1389 struct nfs_sb_mountdata {
1390 	struct nfs_server *server;
1391 	int mntflags;
1392 };
1393 
1394 static int nfs_set_super(struct super_block *s, void *data)
1395 {
1396 	struct nfs_sb_mountdata *sb_mntdata = data;
1397 	struct nfs_server *server = sb_mntdata->server;
1398 	int ret;
1399 
1400 	s->s_flags = sb_mntdata->mntflags;
1401 	s->s_fs_info = server;
1402 	ret = set_anon_super(s, server);
1403 	if (ret == 0)
1404 		server->s_dev = s->s_dev;
1405 	return ret;
1406 }
1407 
1408 static int nfs_compare_super_address(struct nfs_server *server1,
1409 				     struct nfs_server *server2)
1410 {
1411 	struct sockaddr *sap1, *sap2;
1412 
1413 	sap1 = (struct sockaddr *)&server1->nfs_client->cl_addr;
1414 	sap2 = (struct sockaddr *)&server2->nfs_client->cl_addr;
1415 
1416 	if (sap1->sa_family != sap2->sa_family)
1417 		return 0;
1418 
1419 	switch (sap1->sa_family) {
1420 	case AF_INET: {
1421 		struct sockaddr_in *sin1 = (struct sockaddr_in *)sap1;
1422 		struct sockaddr_in *sin2 = (struct sockaddr_in *)sap2;
1423 		if (sin1->sin_addr.s_addr != sin2->sin_addr.s_addr)
1424 			return 0;
1425 		if (sin1->sin_port != sin2->sin_port)
1426 			return 0;
1427 		break;
1428 	}
1429 	case AF_INET6: {
1430 		struct sockaddr_in6 *sin1 = (struct sockaddr_in6 *)sap1;
1431 		struct sockaddr_in6 *sin2 = (struct sockaddr_in6 *)sap2;
1432 		if (!ipv6_addr_equal(&sin1->sin6_addr, &sin2->sin6_addr))
1433 			return 0;
1434 		if (sin1->sin6_port != sin2->sin6_port)
1435 			return 0;
1436 		break;
1437 	}
1438 	default:
1439 		return 0;
1440 	}
1441 
1442 	return 1;
1443 }
1444 
1445 static int nfs_compare_super(struct super_block *sb, void *data)
1446 {
1447 	struct nfs_sb_mountdata *sb_mntdata = data;
1448 	struct nfs_server *server = sb_mntdata->server, *old = NFS_SB(sb);
1449 	int mntflags = sb_mntdata->mntflags;
1450 
1451 	if (!nfs_compare_super_address(old, server))
1452 		return 0;
1453 	/* Note: NFS_MOUNT_UNSHARED == NFS4_MOUNT_UNSHARED */
1454 	if (old->flags & NFS_MOUNT_UNSHARED)
1455 		return 0;
1456 	if (memcmp(&old->fsid, &server->fsid, sizeof(old->fsid)) != 0)
1457 		return 0;
1458 	return nfs_compare_mount_options(sb, server, mntflags);
1459 }
1460 
1461 static int nfs_get_sb(struct file_system_type *fs_type,
1462 	int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt)
1463 {
1464 	struct nfs_server *server = NULL;
1465 	struct super_block *s;
1466 	struct nfs_fh mntfh;
1467 	struct nfs_parsed_mount_data data;
1468 	struct dentry *mntroot;
1469 	int (*compare_super)(struct super_block *, void *) = nfs_compare_super;
1470 	struct nfs_sb_mountdata sb_mntdata = {
1471 		.mntflags = flags,
1472 	};
1473 	int error;
1474 
1475 	/* Validate the mount data */
1476 	error = nfs_validate_mount_data(raw_data, &data, &mntfh, dev_name);
1477 	if (error < 0)
1478 		goto out;
1479 
1480 	/* Get a volume representation */
1481 	server = nfs_create_server(&data, &mntfh);
1482 	if (IS_ERR(server)) {
1483 		error = PTR_ERR(server);
1484 		goto out;
1485 	}
1486 	sb_mntdata.server = server;
1487 
1488 	if (server->flags & NFS_MOUNT_UNSHARED)
1489 		compare_super = NULL;
1490 
1491 	/* Get a superblock - note that we may end up sharing one that already exists */
1492 	s = sget(fs_type, compare_super, nfs_set_super, &sb_mntdata);
1493 	if (IS_ERR(s)) {
1494 		error = PTR_ERR(s);
1495 		goto out_err_nosb;
1496 	}
1497 
1498 	if (s->s_fs_info != server) {
1499 		nfs_free_server(server);
1500 		server = NULL;
1501 	}
1502 
1503 	if (!s->s_root) {
1504 		/* initial superblock/root creation */
1505 		nfs_fill_super(s, &data);
1506 	}
1507 
1508 	mntroot = nfs_get_root(s, &mntfh);
1509 	if (IS_ERR(mntroot)) {
1510 		error = PTR_ERR(mntroot);
1511 		goto error_splat_super;
1512 	}
1513 
1514 	s->s_flags |= MS_ACTIVE;
1515 	mnt->mnt_sb = s;
1516 	mnt->mnt_root = mntroot;
1517 	error = 0;
1518 
1519 out:
1520 	kfree(data.nfs_server.hostname);
1521 	kfree(data.mount_server.hostname);
1522 	return error;
1523 
1524 out_err_nosb:
1525 	nfs_free_server(server);
1526 	goto out;
1527 
1528 error_splat_super:
1529 	up_write(&s->s_umount);
1530 	deactivate_super(s);
1531 	goto out;
1532 }
1533 
1534 /*
1535  * Destroy an NFS2/3 superblock
1536  */
1537 static void nfs_kill_super(struct super_block *s)
1538 {
1539 	struct nfs_server *server = NFS_SB(s);
1540 
1541 	kill_anon_super(s);
1542 	nfs_free_server(server);
1543 }
1544 
1545 /*
1546  * Clone an NFS2/3 server record on xdev traversal (FSID-change)
1547  */
1548 static int nfs_xdev_get_sb(struct file_system_type *fs_type, int flags,
1549 			   const char *dev_name, void *raw_data,
1550 			   struct vfsmount *mnt)
1551 {
1552 	struct nfs_clone_mount *data = raw_data;
1553 	struct super_block *s;
1554 	struct nfs_server *server;
1555 	struct dentry *mntroot;
1556 	int (*compare_super)(struct super_block *, void *) = nfs_compare_super;
1557 	struct nfs_sb_mountdata sb_mntdata = {
1558 		.mntflags = flags,
1559 	};
1560 	int error;
1561 
1562 	dprintk("--> nfs_xdev_get_sb()\n");
1563 
1564 	/* create a new volume representation */
1565 	server = nfs_clone_server(NFS_SB(data->sb), data->fh, data->fattr);
1566 	if (IS_ERR(server)) {
1567 		error = PTR_ERR(server);
1568 		goto out_err_noserver;
1569 	}
1570 	sb_mntdata.server = server;
1571 
1572 	if (server->flags & NFS_MOUNT_UNSHARED)
1573 		compare_super = NULL;
1574 
1575 	/* Get a superblock - note that we may end up sharing one that already exists */
1576 	s = sget(&nfs_fs_type, compare_super, nfs_set_super, &sb_mntdata);
1577 	if (IS_ERR(s)) {
1578 		error = PTR_ERR(s);
1579 		goto out_err_nosb;
1580 	}
1581 
1582 	if (s->s_fs_info != server) {
1583 		nfs_free_server(server);
1584 		server = NULL;
1585 	}
1586 
1587 	if (!s->s_root) {
1588 		/* initial superblock/root creation */
1589 		nfs_clone_super(s, data->sb);
1590 	}
1591 
1592 	mntroot = nfs_get_root(s, data->fh);
1593 	if (IS_ERR(mntroot)) {
1594 		error = PTR_ERR(mntroot);
1595 		goto error_splat_super;
1596 	}
1597 	if (mntroot->d_inode->i_op != NFS_SB(s)->nfs_client->rpc_ops->dir_inode_ops) {
1598 		dput(mntroot);
1599 		error = -ESTALE;
1600 		goto error_splat_super;
1601 	}
1602 
1603 	s->s_flags |= MS_ACTIVE;
1604 	mnt->mnt_sb = s;
1605 	mnt->mnt_root = mntroot;
1606 
1607 	dprintk("<-- nfs_xdev_get_sb() = 0\n");
1608 	return 0;
1609 
1610 out_err_nosb:
1611 	nfs_free_server(server);
1612 out_err_noserver:
1613 	dprintk("<-- nfs_xdev_get_sb() = %d [error]\n", error);
1614 	return error;
1615 
1616 error_splat_super:
1617 	up_write(&s->s_umount);
1618 	deactivate_super(s);
1619 	dprintk("<-- nfs_xdev_get_sb() = %d [splat]\n", error);
1620 	return error;
1621 }
1622 
1623 #ifdef CONFIG_NFS_V4
1624 
1625 /*
1626  * Finish setting up a cloned NFS4 superblock
1627  */
1628 static void nfs4_clone_super(struct super_block *sb,
1629 			    const struct super_block *old_sb)
1630 {
1631 	sb->s_blocksize_bits = old_sb->s_blocksize_bits;
1632 	sb->s_blocksize = old_sb->s_blocksize;
1633 	sb->s_maxbytes = old_sb->s_maxbytes;
1634 	sb->s_time_gran = 1;
1635 	sb->s_op = old_sb->s_op;
1636  	nfs_initialise_sb(sb);
1637 }
1638 
1639 /*
1640  * Set up an NFS4 superblock
1641  */
1642 static void nfs4_fill_super(struct super_block *sb)
1643 {
1644 	sb->s_time_gran = 1;
1645 	sb->s_op = &nfs4_sops;
1646 	nfs_initialise_sb(sb);
1647 }
1648 
1649 /*
1650  * If the user didn't specify a port, set the port number to
1651  * the NFS version 4 default port.
1652  */
1653 static void nfs4_default_port(struct sockaddr *sap)
1654 {
1655 	switch (sap->sa_family) {
1656 	case AF_INET: {
1657 		struct sockaddr_in *ap = (struct sockaddr_in *)sap;
1658 		if (ap->sin_port == 0)
1659 			ap->sin_port = htons(NFS_PORT);
1660 		break;
1661 	}
1662 	case AF_INET6: {
1663 		struct sockaddr_in6 *ap = (struct sockaddr_in6 *)sap;
1664 		if (ap->sin6_port == 0)
1665 			ap->sin6_port = htons(NFS_PORT);
1666 		break;
1667 	}
1668 	}
1669 }
1670 
1671 /*
1672  * Validate NFSv4 mount options
1673  */
1674 static int nfs4_validate_mount_data(void *options,
1675 				    struct nfs_parsed_mount_data *args,
1676 				    const char *dev_name)
1677 {
1678 	struct sockaddr_in *ap;
1679 	struct nfs4_mount_data *data = (struct nfs4_mount_data *)options;
1680 	char *c;
1681 
1682 	memset(args, 0, sizeof(*args));
1683 
1684 	if (data == NULL)
1685 		goto out_no_data;
1686 
1687 	args->rsize		= NFS_MAX_FILE_IO_SIZE;
1688 	args->wsize		= NFS_MAX_FILE_IO_SIZE;
1689 	args->timeo		= 600;
1690 	args->retrans		= 2;
1691 	args->acregmin		= 3;
1692 	args->acregmax		= 60;
1693 	args->acdirmin		= 30;
1694 	args->acdirmax		= 60;
1695 	args->nfs_server.protocol = XPRT_TRANSPORT_TCP;
1696 
1697 	switch (data->version) {
1698 	case 1:
1699 		ap = (struct sockaddr_in *)&args->nfs_server.address;
1700 		if (data->host_addrlen > sizeof(args->nfs_server.address))
1701 			goto out_no_address;
1702 		if (data->host_addrlen == 0)
1703 			goto out_no_address;
1704 		args->nfs_server.addrlen = data->host_addrlen;
1705 		if (copy_from_user(ap, data->host_addr, data->host_addrlen))
1706 			return -EFAULT;
1707 		if (!nfs_verify_server_address((struct sockaddr *)
1708 						&args->nfs_server.address))
1709 			goto out_no_address;
1710 
1711 		nfs4_default_port((struct sockaddr *)
1712 				  &args->nfs_server.address);
1713 
1714 		switch (data->auth_flavourlen) {
1715 		case 0:
1716 			args->auth_flavors[0] = RPC_AUTH_UNIX;
1717 			break;
1718 		case 1:
1719 			if (copy_from_user(&args->auth_flavors[0],
1720 					   data->auth_flavours,
1721 					   sizeof(args->auth_flavors[0])))
1722 				return -EFAULT;
1723 			break;
1724 		default:
1725 			goto out_inval_auth;
1726 		}
1727 
1728 		c = strndup_user(data->hostname.data, NFS4_MAXNAMLEN);
1729 		if (IS_ERR(c))
1730 			return PTR_ERR(c);
1731 		args->nfs_server.hostname = c;
1732 
1733 		c = strndup_user(data->mnt_path.data, NFS4_MAXPATHLEN);
1734 		if (IS_ERR(c))
1735 			return PTR_ERR(c);
1736 		args->nfs_server.export_path = c;
1737 		dfprintk(MOUNT, "NFS: MNTPATH: '%s'\n", c);
1738 
1739 		c = strndup_user(data->client_addr.data, 16);
1740 		if (IS_ERR(c))
1741 			return PTR_ERR(c);
1742 		args->client_address = c;
1743 
1744 		/*
1745 		 * Translate to nfs_parsed_mount_data, which nfs4_fill_super
1746 		 * can deal with.
1747 		 */
1748 
1749 		args->flags	= data->flags & NFS4_MOUNT_FLAGMASK;
1750 		args->rsize	= data->rsize;
1751 		args->wsize	= data->wsize;
1752 		args->timeo	= data->timeo;
1753 		args->retrans	= data->retrans;
1754 		args->acregmin	= data->acregmin;
1755 		args->acregmax	= data->acregmax;
1756 		args->acdirmin	= data->acdirmin;
1757 		args->acdirmax	= data->acdirmax;
1758 		args->nfs_server.protocol = data->proto;
1759 
1760 		break;
1761 	default: {
1762 		unsigned int len;
1763 
1764 		if (nfs_parse_mount_options((char *)options, args) == 0)
1765 			return -EINVAL;
1766 
1767 		if (!nfs_verify_server_address((struct sockaddr *)
1768 						&args->nfs_server.address))
1769 			return -EINVAL;
1770 
1771 		nfs4_default_port((struct sockaddr *)
1772 				  &args->nfs_server.address);
1773 
1774 		switch (args->auth_flavor_len) {
1775 		case 0:
1776 			args->auth_flavors[0] = RPC_AUTH_UNIX;
1777 			break;
1778 		case 1:
1779 			break;
1780 		default:
1781 			goto out_inval_auth;
1782 		}
1783 
1784 		/*
1785 		 * Split "dev_name" into "hostname:mntpath".
1786 		 */
1787 		c = strchr(dev_name, ':');
1788 		if (c == NULL)
1789 			return -EINVAL;
1790 		/* while calculating len, pretend ':' is '\0' */
1791 		len = c - dev_name;
1792 		if (len > NFS4_MAXNAMLEN)
1793 			return -ENAMETOOLONG;
1794 		/* N.B. caller will free nfs_server.hostname in all cases */
1795 		args->nfs_server.hostname = kstrndup(dev_name, len, GFP_KERNEL);
1796 
1797 		c++;			/* step over the ':' */
1798 		len = strlen(c);
1799 		if (len > NFS4_MAXPATHLEN)
1800 			return -ENAMETOOLONG;
1801 		args->nfs_server.export_path = kstrndup(c, len, GFP_KERNEL);
1802 
1803 		dprintk("NFS: MNTPATH: '%s'\n", args->nfs_server.export_path);
1804 
1805 		if (args->client_address == NULL)
1806 			goto out_no_client_address;
1807 
1808 		break;
1809 		}
1810 	}
1811 
1812 	return 0;
1813 
1814 out_no_data:
1815 	dfprintk(MOUNT, "NFS4: mount program didn't pass any mount data\n");
1816 	return -EINVAL;
1817 
1818 out_inval_auth:
1819 	dfprintk(MOUNT, "NFS4: Invalid number of RPC auth flavours %d\n",
1820 		 data->auth_flavourlen);
1821 	return -EINVAL;
1822 
1823 out_no_address:
1824 	dfprintk(MOUNT, "NFS4: mount program didn't pass remote address\n");
1825 	return -EINVAL;
1826 
1827 out_no_client_address:
1828 	dfprintk(MOUNT, "NFS4: mount program didn't pass callback address\n");
1829 	return -EINVAL;
1830 }
1831 
1832 /*
1833  * Get the superblock for an NFS4 mountpoint
1834  */
1835 static int nfs4_get_sb(struct file_system_type *fs_type,
1836 	int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt)
1837 {
1838 	struct nfs_parsed_mount_data data;
1839 	struct super_block *s;
1840 	struct nfs_server *server;
1841 	struct nfs_fh mntfh;
1842 	struct dentry *mntroot;
1843 	int (*compare_super)(struct super_block *, void *) = nfs_compare_super;
1844 	struct nfs_sb_mountdata sb_mntdata = {
1845 		.mntflags = flags,
1846 	};
1847 	int error;
1848 
1849 	/* Validate the mount data */
1850 	error = nfs4_validate_mount_data(raw_data, &data, dev_name);
1851 	if (error < 0)
1852 		goto out;
1853 
1854 	/* Get a volume representation */
1855 	server = nfs4_create_server(&data, &mntfh);
1856 	if (IS_ERR(server)) {
1857 		error = PTR_ERR(server);
1858 		goto out;
1859 	}
1860 	sb_mntdata.server = server;
1861 
1862 	if (server->flags & NFS4_MOUNT_UNSHARED)
1863 		compare_super = NULL;
1864 
1865 	/* Get a superblock - note that we may end up sharing one that already exists */
1866 	s = sget(fs_type, compare_super, nfs_set_super, &sb_mntdata);
1867 	if (IS_ERR(s)) {
1868 		error = PTR_ERR(s);
1869 		goto out_free;
1870 	}
1871 
1872 	if (s->s_fs_info != server) {
1873 		nfs_free_server(server);
1874 		server = NULL;
1875 	}
1876 
1877 	if (!s->s_root) {
1878 		/* initial superblock/root creation */
1879 		nfs4_fill_super(s);
1880 	}
1881 
1882 	mntroot = nfs4_get_root(s, &mntfh);
1883 	if (IS_ERR(mntroot)) {
1884 		error = PTR_ERR(mntroot);
1885 		goto error_splat_super;
1886 	}
1887 
1888 	s->s_flags |= MS_ACTIVE;
1889 	mnt->mnt_sb = s;
1890 	mnt->mnt_root = mntroot;
1891 	error = 0;
1892 
1893 out:
1894 	kfree(data.client_address);
1895 	kfree(data.nfs_server.export_path);
1896 	kfree(data.nfs_server.hostname);
1897 	return error;
1898 
1899 out_free:
1900 	nfs_free_server(server);
1901 	goto out;
1902 
1903 error_splat_super:
1904 	up_write(&s->s_umount);
1905 	deactivate_super(s);
1906 	goto out;
1907 }
1908 
1909 static void nfs4_kill_super(struct super_block *sb)
1910 {
1911 	struct nfs_server *server = NFS_SB(sb);
1912 
1913 	nfs_return_all_delegations(sb);
1914 	kill_anon_super(sb);
1915 
1916 	nfs4_renewd_prepare_shutdown(server);
1917 	nfs_free_server(server);
1918 }
1919 
1920 /*
1921  * Clone an NFS4 server record on xdev traversal (FSID-change)
1922  */
1923 static int nfs4_xdev_get_sb(struct file_system_type *fs_type, int flags,
1924 			    const char *dev_name, void *raw_data,
1925 			    struct vfsmount *mnt)
1926 {
1927 	struct nfs_clone_mount *data = raw_data;
1928 	struct super_block *s;
1929 	struct nfs_server *server;
1930 	struct dentry *mntroot;
1931 	int (*compare_super)(struct super_block *, void *) = nfs_compare_super;
1932 	struct nfs_sb_mountdata sb_mntdata = {
1933 		.mntflags = flags,
1934 	};
1935 	int error;
1936 
1937 	dprintk("--> nfs4_xdev_get_sb()\n");
1938 
1939 	/* create a new volume representation */
1940 	server = nfs_clone_server(NFS_SB(data->sb), data->fh, data->fattr);
1941 	if (IS_ERR(server)) {
1942 		error = PTR_ERR(server);
1943 		goto out_err_noserver;
1944 	}
1945 	sb_mntdata.server = server;
1946 
1947 	if (server->flags & NFS4_MOUNT_UNSHARED)
1948 		compare_super = NULL;
1949 
1950 	/* Get a superblock - note that we may end up sharing one that already exists */
1951 	s = sget(&nfs_fs_type, compare_super, nfs_set_super, &sb_mntdata);
1952 	if (IS_ERR(s)) {
1953 		error = PTR_ERR(s);
1954 		goto out_err_nosb;
1955 	}
1956 
1957 	if (s->s_fs_info != server) {
1958 		nfs_free_server(server);
1959 		server = NULL;
1960 	}
1961 
1962 	if (!s->s_root) {
1963 		/* initial superblock/root creation */
1964 		nfs4_clone_super(s, data->sb);
1965 	}
1966 
1967 	mntroot = nfs4_get_root(s, data->fh);
1968 	if (IS_ERR(mntroot)) {
1969 		error = PTR_ERR(mntroot);
1970 		goto error_splat_super;
1971 	}
1972 	if (mntroot->d_inode->i_op != NFS_SB(s)->nfs_client->rpc_ops->dir_inode_ops) {
1973 		dput(mntroot);
1974 		error = -ESTALE;
1975 		goto error_splat_super;
1976 	}
1977 
1978 	s->s_flags |= MS_ACTIVE;
1979 	mnt->mnt_sb = s;
1980 	mnt->mnt_root = mntroot;
1981 
1982 	dprintk("<-- nfs4_xdev_get_sb() = 0\n");
1983 	return 0;
1984 
1985 out_err_nosb:
1986 	nfs_free_server(server);
1987 out_err_noserver:
1988 	dprintk("<-- nfs4_xdev_get_sb() = %d [error]\n", error);
1989 	return error;
1990 
1991 error_splat_super:
1992 	up_write(&s->s_umount);
1993 	deactivate_super(s);
1994 	dprintk("<-- nfs4_xdev_get_sb() = %d [splat]\n", error);
1995 	return error;
1996 }
1997 
1998 /*
1999  * Create an NFS4 server record on referral traversal
2000  */
2001 static int nfs4_referral_get_sb(struct file_system_type *fs_type, int flags,
2002 				const char *dev_name, void *raw_data,
2003 				struct vfsmount *mnt)
2004 {
2005 	struct nfs_clone_mount *data = raw_data;
2006 	struct super_block *s;
2007 	struct nfs_server *server;
2008 	struct dentry *mntroot;
2009 	struct nfs_fh mntfh;
2010 	int (*compare_super)(struct super_block *, void *) = nfs_compare_super;
2011 	struct nfs_sb_mountdata sb_mntdata = {
2012 		.mntflags = flags,
2013 	};
2014 	int error;
2015 
2016 	dprintk("--> nfs4_referral_get_sb()\n");
2017 
2018 	/* create a new volume representation */
2019 	server = nfs4_create_referral_server(data, &mntfh);
2020 	if (IS_ERR(server)) {
2021 		error = PTR_ERR(server);
2022 		goto out_err_noserver;
2023 	}
2024 	sb_mntdata.server = server;
2025 
2026 	if (server->flags & NFS4_MOUNT_UNSHARED)
2027 		compare_super = NULL;
2028 
2029 	/* Get a superblock - note that we may end up sharing one that already exists */
2030 	s = sget(&nfs_fs_type, compare_super, nfs_set_super, &sb_mntdata);
2031 	if (IS_ERR(s)) {
2032 		error = PTR_ERR(s);
2033 		goto out_err_nosb;
2034 	}
2035 
2036 	if (s->s_fs_info != server) {
2037 		nfs_free_server(server);
2038 		server = NULL;
2039 	}
2040 
2041 	if (!s->s_root) {
2042 		/* initial superblock/root creation */
2043 		nfs4_fill_super(s);
2044 	}
2045 
2046 	mntroot = nfs4_get_root(s, &mntfh);
2047 	if (IS_ERR(mntroot)) {
2048 		error = PTR_ERR(mntroot);
2049 		goto error_splat_super;
2050 	}
2051 	if (mntroot->d_inode->i_op != NFS_SB(s)->nfs_client->rpc_ops->dir_inode_ops) {
2052 		dput(mntroot);
2053 		error = -ESTALE;
2054 		goto error_splat_super;
2055 	}
2056 
2057 	s->s_flags |= MS_ACTIVE;
2058 	mnt->mnt_sb = s;
2059 	mnt->mnt_root = mntroot;
2060 
2061 	dprintk("<-- nfs4_referral_get_sb() = 0\n");
2062 	return 0;
2063 
2064 out_err_nosb:
2065 	nfs_free_server(server);
2066 out_err_noserver:
2067 	dprintk("<-- nfs4_referral_get_sb() = %d [error]\n", error);
2068 	return error;
2069 
2070 error_splat_super:
2071 	up_write(&s->s_umount);
2072 	deactivate_super(s);
2073 	dprintk("<-- nfs4_referral_get_sb() = %d [splat]\n", error);
2074 	return error;
2075 }
2076 
2077 #endif /* CONFIG_NFS_V4 */
2078