nfs41: use nfs4_pathconf_res
[linux-2.6] / fs / nfs / super.c
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@lxorguk.ukuu.org.uk>, 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/netdevice.h>
51 #include <linux/nfs_xdr.h>
52 #include <linux/magic.h>
53 #include <linux/parser.h>
54
55 #include <asm/system.h>
56 #include <asm/uaccess.h>
57
58 #include "nfs4_fs.h"
59 #include "callback.h"
60 #include "delegation.h"
61 #include "iostat.h"
62 #include "internal.h"
63 #include "fscache.h"
64
65 #define NFSDBG_FACILITY         NFSDBG_VFS
66
67 enum {
68         /* Mount options that take no arguments */
69         Opt_soft, Opt_hard,
70         Opt_posix, Opt_noposix,
71         Opt_cto, Opt_nocto,
72         Opt_ac, Opt_noac,
73         Opt_lock, Opt_nolock,
74         Opt_v2, Opt_v3,
75         Opt_udp, Opt_tcp, Opt_rdma,
76         Opt_acl, Opt_noacl,
77         Opt_rdirplus, Opt_nordirplus,
78         Opt_sharecache, Opt_nosharecache,
79         Opt_resvport, Opt_noresvport,
80         Opt_fscache, Opt_nofscache,
81
82         /* Mount options that take integer arguments */
83         Opt_port,
84         Opt_rsize, Opt_wsize, Opt_bsize,
85         Opt_timeo, Opt_retrans,
86         Opt_acregmin, Opt_acregmax,
87         Opt_acdirmin, Opt_acdirmax,
88         Opt_actimeo,
89         Opt_namelen,
90         Opt_mountport,
91         Opt_mountvers,
92         Opt_nfsvers,
93         Opt_minorversion,
94
95         /* Mount options that take string arguments */
96         Opt_sec, Opt_proto, Opt_mountproto, Opt_mounthost,
97         Opt_addr, Opt_mountaddr, Opt_clientaddr,
98         Opt_lookupcache,
99         Opt_fscache_uniq,
100
101         /* Special mount options */
102         Opt_userspace, Opt_deprecated, Opt_sloppy,
103
104         Opt_err
105 };
106
107 static const match_table_t nfs_mount_option_tokens = {
108         { Opt_userspace, "bg" },
109         { Opt_userspace, "fg" },
110         { Opt_userspace, "retry=%s" },
111
112         { Opt_sloppy, "sloppy" },
113
114         { Opt_soft, "soft" },
115         { Opt_hard, "hard" },
116         { Opt_deprecated, "intr" },
117         { Opt_deprecated, "nointr" },
118         { Opt_posix, "posix" },
119         { Opt_noposix, "noposix" },
120         { Opt_cto, "cto" },
121         { Opt_nocto, "nocto" },
122         { Opt_ac, "ac" },
123         { Opt_noac, "noac" },
124         { Opt_lock, "lock" },
125         { Opt_nolock, "nolock" },
126         { Opt_v2, "v2" },
127         { Opt_v3, "v3" },
128         { Opt_udp, "udp" },
129         { Opt_tcp, "tcp" },
130         { Opt_rdma, "rdma" },
131         { Opt_acl, "acl" },
132         { Opt_noacl, "noacl" },
133         { Opt_rdirplus, "rdirplus" },
134         { Opt_nordirplus, "nordirplus" },
135         { Opt_sharecache, "sharecache" },
136         { Opt_nosharecache, "nosharecache" },
137         { Opt_resvport, "resvport" },
138         { Opt_noresvport, "noresvport" },
139         { Opt_fscache, "fsc" },
140         { Opt_fscache_uniq, "fsc=%s" },
141         { Opt_nofscache, "nofsc" },
142
143         { Opt_port, "port=%u" },
144         { Opt_rsize, "rsize=%u" },
145         { Opt_wsize, "wsize=%u" },
146         { Opt_bsize, "bsize=%u" },
147         { Opt_timeo, "timeo=%u" },
148         { Opt_retrans, "retrans=%u" },
149         { Opt_acregmin, "acregmin=%u" },
150         { Opt_acregmax, "acregmax=%u" },
151         { Opt_acdirmin, "acdirmin=%u" },
152         { Opt_acdirmax, "acdirmax=%u" },
153         { Opt_actimeo, "actimeo=%u" },
154         { Opt_namelen, "namlen=%u" },
155         { Opt_mountport, "mountport=%u" },
156         { Opt_mountvers, "mountvers=%u" },
157         { Opt_nfsvers, "nfsvers=%u" },
158         { Opt_nfsvers, "vers=%u" },
159         { Opt_minorversion, "minorversion=%u" },
160
161         { Opt_sec, "sec=%s" },
162         { Opt_proto, "proto=%s" },
163         { Opt_mountproto, "mountproto=%s" },
164         { Opt_addr, "addr=%s" },
165         { Opt_clientaddr, "clientaddr=%s" },
166         { Opt_mounthost, "mounthost=%s" },
167         { Opt_mountaddr, "mountaddr=%s" },
168
169         { Opt_lookupcache, "lookupcache=%s" },
170
171         { Opt_err, NULL }
172 };
173
174 enum {
175         Opt_xprt_udp, Opt_xprt_tcp, Opt_xprt_rdma,
176
177         Opt_xprt_err
178 };
179
180 static const match_table_t nfs_xprt_protocol_tokens = {
181         { Opt_xprt_udp, "udp" },
182         { Opt_xprt_tcp, "tcp" },
183         { Opt_xprt_rdma, "rdma" },
184
185         { Opt_xprt_err, NULL }
186 };
187
188 enum {
189         Opt_sec_none, Opt_sec_sys,
190         Opt_sec_krb5, Opt_sec_krb5i, Opt_sec_krb5p,
191         Opt_sec_lkey, Opt_sec_lkeyi, Opt_sec_lkeyp,
192         Opt_sec_spkm, Opt_sec_spkmi, Opt_sec_spkmp,
193
194         Opt_sec_err
195 };
196
197 static const match_table_t nfs_secflavor_tokens = {
198         { Opt_sec_none, "none" },
199         { Opt_sec_none, "null" },
200         { Opt_sec_sys, "sys" },
201
202         { Opt_sec_krb5, "krb5" },
203         { Opt_sec_krb5i, "krb5i" },
204         { Opt_sec_krb5p, "krb5p" },
205
206         { Opt_sec_lkey, "lkey" },
207         { Opt_sec_lkeyi, "lkeyi" },
208         { Opt_sec_lkeyp, "lkeyp" },
209
210         { Opt_sec_spkm, "spkm3" },
211         { Opt_sec_spkmi, "spkm3i" },
212         { Opt_sec_spkmp, "spkm3p" },
213
214         { Opt_sec_err, NULL }
215 };
216
217 enum {
218         Opt_lookupcache_all, Opt_lookupcache_positive,
219         Opt_lookupcache_none,
220
221         Opt_lookupcache_err
222 };
223
224 static match_table_t nfs_lookupcache_tokens = {
225         { Opt_lookupcache_all, "all" },
226         { Opt_lookupcache_positive, "pos" },
227         { Opt_lookupcache_positive, "positive" },
228         { Opt_lookupcache_none, "none" },
229
230         { Opt_lookupcache_err, NULL }
231 };
232
233
234 static void nfs_umount_begin(struct super_block *);
235 static int  nfs_statfs(struct dentry *, struct kstatfs *);
236 static int  nfs_show_options(struct seq_file *, struct vfsmount *);
237 static int  nfs_show_stats(struct seq_file *, struct vfsmount *);
238 static int nfs_get_sb(struct file_system_type *, int, const char *, void *, struct vfsmount *);
239 static int nfs_xdev_get_sb(struct file_system_type *fs_type,
240                 int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt);
241 static void nfs_kill_super(struct super_block *);
242 static int nfs_remount(struct super_block *sb, int *flags, char *raw_data);
243
244 static struct file_system_type nfs_fs_type = {
245         .owner          = THIS_MODULE,
246         .name           = "nfs",
247         .get_sb         = nfs_get_sb,
248         .kill_sb        = nfs_kill_super,
249         .fs_flags       = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA,
250 };
251
252 struct file_system_type nfs_xdev_fs_type = {
253         .owner          = THIS_MODULE,
254         .name           = "nfs",
255         .get_sb         = nfs_xdev_get_sb,
256         .kill_sb        = nfs_kill_super,
257         .fs_flags       = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA,
258 };
259
260 static const struct super_operations nfs_sops = {
261         .alloc_inode    = nfs_alloc_inode,
262         .destroy_inode  = nfs_destroy_inode,
263         .write_inode    = nfs_write_inode,
264         .statfs         = nfs_statfs,
265         .clear_inode    = nfs_clear_inode,
266         .umount_begin   = nfs_umount_begin,
267         .show_options   = nfs_show_options,
268         .show_stats     = nfs_show_stats,
269         .remount_fs     = nfs_remount,
270 };
271
272 #ifdef CONFIG_NFS_V4
273 static int nfs4_get_sb(struct file_system_type *fs_type,
274         int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt);
275 static int nfs4_xdev_get_sb(struct file_system_type *fs_type,
276         int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt);
277 static int nfs4_referral_get_sb(struct file_system_type *fs_type,
278         int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt);
279 static void nfs4_kill_super(struct super_block *sb);
280
281 static struct file_system_type nfs4_fs_type = {
282         .owner          = THIS_MODULE,
283         .name           = "nfs4",
284         .get_sb         = nfs4_get_sb,
285         .kill_sb        = nfs4_kill_super,
286         .fs_flags       = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA,
287 };
288
289 struct file_system_type nfs4_xdev_fs_type = {
290         .owner          = THIS_MODULE,
291         .name           = "nfs4",
292         .get_sb         = nfs4_xdev_get_sb,
293         .kill_sb        = nfs4_kill_super,
294         .fs_flags       = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA,
295 };
296
297 struct file_system_type nfs4_referral_fs_type = {
298         .owner          = THIS_MODULE,
299         .name           = "nfs4",
300         .get_sb         = nfs4_referral_get_sb,
301         .kill_sb        = nfs4_kill_super,
302         .fs_flags       = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA,
303 };
304
305 static const struct super_operations nfs4_sops = {
306         .alloc_inode    = nfs_alloc_inode,
307         .destroy_inode  = nfs_destroy_inode,
308         .write_inode    = nfs_write_inode,
309         .statfs         = nfs_statfs,
310         .clear_inode    = nfs4_clear_inode,
311         .umount_begin   = nfs_umount_begin,
312         .show_options   = nfs_show_options,
313         .show_stats     = nfs_show_stats,
314         .remount_fs     = nfs_remount,
315 };
316 #endif
317
318 static struct shrinker acl_shrinker = {
319         .shrink         = nfs_access_cache_shrinker,
320         .seeks          = DEFAULT_SEEKS,
321 };
322
323 /*
324  * Register the NFS filesystems
325  */
326 int __init register_nfs_fs(void)
327 {
328         int ret;
329
330         ret = register_filesystem(&nfs_fs_type);
331         if (ret < 0)
332                 goto error_0;
333
334         ret = nfs_register_sysctl();
335         if (ret < 0)
336                 goto error_1;
337 #ifdef CONFIG_NFS_V4
338         ret = register_filesystem(&nfs4_fs_type);
339         if (ret < 0)
340                 goto error_2;
341 #endif
342         register_shrinker(&acl_shrinker);
343         return 0;
344
345 #ifdef CONFIG_NFS_V4
346 error_2:
347         nfs_unregister_sysctl();
348 #endif
349 error_1:
350         unregister_filesystem(&nfs_fs_type);
351 error_0:
352         return ret;
353 }
354
355 /*
356  * Unregister the NFS filesystems
357  */
358 void __exit unregister_nfs_fs(void)
359 {
360         unregister_shrinker(&acl_shrinker);
361 #ifdef CONFIG_NFS_V4
362         unregister_filesystem(&nfs4_fs_type);
363 #endif
364         nfs_unregister_sysctl();
365         unregister_filesystem(&nfs_fs_type);
366 }
367
368 void nfs_sb_active(struct super_block *sb)
369 {
370         struct nfs_server *server = NFS_SB(sb);
371
372         if (atomic_inc_return(&server->active) == 1)
373                 atomic_inc(&sb->s_active);
374 }
375
376 void nfs_sb_deactive(struct super_block *sb)
377 {
378         struct nfs_server *server = NFS_SB(sb);
379
380         if (atomic_dec_and_test(&server->active))
381                 deactivate_super(sb);
382 }
383
384 /*
385  * Deliver file system statistics to userspace
386  */
387 static int nfs_statfs(struct dentry *dentry, struct kstatfs *buf)
388 {
389         struct nfs_server *server = NFS_SB(dentry->d_sb);
390         unsigned char blockbits;
391         unsigned long blockres;
392         struct nfs_fh *fh = NFS_FH(dentry->d_inode);
393         struct nfs_fattr fattr;
394         struct nfs_fsstat res = {
395                         .fattr = &fattr,
396         };
397         int error;
398
399         error = server->nfs_client->rpc_ops->statfs(server, fh, &res);
400         if (error < 0)
401                 goto out_err;
402         buf->f_type = NFS_SUPER_MAGIC;
403
404         /*
405          * Current versions of glibc do not correctly handle the
406          * case where f_frsize != f_bsize.  Eventually we want to
407          * report the value of wtmult in this field.
408          */
409         buf->f_frsize = dentry->d_sb->s_blocksize;
410
411         /*
412          * On most *nix systems, f_blocks, f_bfree, and f_bavail
413          * are reported in units of f_frsize.  Linux hasn't had
414          * an f_frsize field in its statfs struct until recently,
415          * thus historically Linux's sys_statfs reports these
416          * fields in units of f_bsize.
417          */
418         buf->f_bsize = dentry->d_sb->s_blocksize;
419         blockbits = dentry->d_sb->s_blocksize_bits;
420         blockres = (1 << blockbits) - 1;
421         buf->f_blocks = (res.tbytes + blockres) >> blockbits;
422         buf->f_bfree = (res.fbytes + blockres) >> blockbits;
423         buf->f_bavail = (res.abytes + blockres) >> blockbits;
424
425         buf->f_files = res.tfiles;
426         buf->f_ffree = res.afiles;
427
428         buf->f_namelen = server->namelen;
429
430         return 0;
431
432  out_err:
433         dprintk("%s: statfs error = %d\n", __func__, -error);
434         return error;
435 }
436
437 /*
438  * Map the security flavour number to a name
439  */
440 static const char *nfs_pseudoflavour_to_name(rpc_authflavor_t flavour)
441 {
442         static const struct {
443                 rpc_authflavor_t flavour;
444                 const char *str;
445         } sec_flavours[] = {
446                 { RPC_AUTH_NULL, "null" },
447                 { RPC_AUTH_UNIX, "sys" },
448                 { RPC_AUTH_GSS_KRB5, "krb5" },
449                 { RPC_AUTH_GSS_KRB5I, "krb5i" },
450                 { RPC_AUTH_GSS_KRB5P, "krb5p" },
451                 { RPC_AUTH_GSS_LKEY, "lkey" },
452                 { RPC_AUTH_GSS_LKEYI, "lkeyi" },
453                 { RPC_AUTH_GSS_LKEYP, "lkeyp" },
454                 { RPC_AUTH_GSS_SPKM, "spkm" },
455                 { RPC_AUTH_GSS_SPKMI, "spkmi" },
456                 { RPC_AUTH_GSS_SPKMP, "spkmp" },
457                 { UINT_MAX, "unknown" }
458         };
459         int i;
460
461         for (i = 0; sec_flavours[i].flavour != UINT_MAX; i++) {
462                 if (sec_flavours[i].flavour == flavour)
463                         break;
464         }
465         return sec_flavours[i].str;
466 }
467
468 static void nfs_show_mountd_options(struct seq_file *m, struct nfs_server *nfss,
469                                     int showdefaults)
470 {
471         struct sockaddr *sap = (struct sockaddr *)&nfss->mountd_address;
472
473         switch (sap->sa_family) {
474         case AF_INET: {
475                 struct sockaddr_in *sin = (struct sockaddr_in *)sap;
476                 seq_printf(m, ",mountaddr=%pI4", &sin->sin_addr.s_addr);
477                 break;
478         }
479         case AF_INET6: {
480                 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sap;
481                 seq_printf(m, ",mountaddr=%pI6", &sin6->sin6_addr);
482                 break;
483         }
484         default:
485                 if (showdefaults)
486                         seq_printf(m, ",mountaddr=unspecified");
487         }
488
489         if (nfss->mountd_version || showdefaults)
490                 seq_printf(m, ",mountvers=%u", nfss->mountd_version);
491         if (nfss->mountd_port || showdefaults)
492                 seq_printf(m, ",mountport=%u", nfss->mountd_port);
493
494         switch (nfss->mountd_protocol) {
495         case IPPROTO_UDP:
496                 seq_printf(m, ",mountproto=udp");
497                 break;
498         case IPPROTO_TCP:
499                 seq_printf(m, ",mountproto=tcp");
500                 break;
501         default:
502                 if (showdefaults)
503                         seq_printf(m, ",mountproto=auto");
504         }
505 }
506
507 /*
508  * Describe the mount options in force on this server representation
509  */
510 static void nfs_show_mount_options(struct seq_file *m, struct nfs_server *nfss,
511                                    int showdefaults)
512 {
513         static const struct proc_nfs_info {
514                 int flag;
515                 const char *str;
516                 const char *nostr;
517         } nfs_info[] = {
518                 { NFS_MOUNT_SOFT, ",soft", ",hard" },
519                 { NFS_MOUNT_INTR, ",intr", ",nointr" },
520                 { NFS_MOUNT_POSIX, ",posix", "" },
521                 { NFS_MOUNT_NOCTO, ",nocto", "" },
522                 { NFS_MOUNT_NOAC, ",noac", "" },
523                 { NFS_MOUNT_NONLM, ",nolock", "" },
524                 { NFS_MOUNT_NOACL, ",noacl", "" },
525                 { NFS_MOUNT_NORDIRPLUS, ",nordirplus", "" },
526                 { NFS_MOUNT_UNSHARED, ",nosharecache", "" },
527                 { NFS_MOUNT_NORESVPORT, ",noresvport", "" },
528                 { 0, NULL, NULL }
529         };
530         const struct proc_nfs_info *nfs_infop;
531         struct nfs_client *clp = nfss->nfs_client;
532         u32 version = clp->rpc_ops->version;
533
534         seq_printf(m, ",vers=%u", version);
535         seq_printf(m, ",rsize=%u", nfss->rsize);
536         seq_printf(m, ",wsize=%u", nfss->wsize);
537         if (nfss->bsize != 0)
538                 seq_printf(m, ",bsize=%u", nfss->bsize);
539         seq_printf(m, ",namlen=%u", nfss->namelen);
540         if (nfss->acregmin != NFS_DEF_ACREGMIN*HZ || showdefaults)
541                 seq_printf(m, ",acregmin=%u", nfss->acregmin/HZ);
542         if (nfss->acregmax != NFS_DEF_ACREGMAX*HZ || showdefaults)
543                 seq_printf(m, ",acregmax=%u", nfss->acregmax/HZ);
544         if (nfss->acdirmin != NFS_DEF_ACDIRMIN*HZ || showdefaults)
545                 seq_printf(m, ",acdirmin=%u", nfss->acdirmin/HZ);
546         if (nfss->acdirmax != NFS_DEF_ACDIRMAX*HZ || showdefaults)
547                 seq_printf(m, ",acdirmax=%u", nfss->acdirmax/HZ);
548         for (nfs_infop = nfs_info; nfs_infop->flag; nfs_infop++) {
549                 if (nfss->flags & nfs_infop->flag)
550                         seq_puts(m, nfs_infop->str);
551                 else
552                         seq_puts(m, nfs_infop->nostr);
553         }
554         seq_printf(m, ",proto=%s",
555                    rpc_peeraddr2str(nfss->client, RPC_DISPLAY_PROTO));
556         if (version == 4) {
557                 if (nfss->port != NFS_PORT)
558                         seq_printf(m, ",port=%u", nfss->port);
559         } else
560                 if (nfss->port)
561                         seq_printf(m, ",port=%u", nfss->port);
562
563         seq_printf(m, ",timeo=%lu", 10U * nfss->client->cl_timeout->to_initval / HZ);
564         seq_printf(m, ",retrans=%u", nfss->client->cl_timeout->to_retries);
565         seq_printf(m, ",sec=%s", nfs_pseudoflavour_to_name(nfss->client->cl_auth->au_flavor));
566
567         if (version != 4)
568                 nfs_show_mountd_options(m, nfss, showdefaults);
569
570 #ifdef CONFIG_NFS_V4
571         if (clp->rpc_ops->version == 4)
572                 seq_printf(m, ",clientaddr=%s", clp->cl_ipaddr);
573 #endif
574         if (nfss->options & NFS_OPTION_FSCACHE)
575                 seq_printf(m, ",fsc");
576 }
577
578 /*
579  * Describe the mount options on this VFS mountpoint
580  */
581 static int nfs_show_options(struct seq_file *m, struct vfsmount *mnt)
582 {
583         struct nfs_server *nfss = NFS_SB(mnt->mnt_sb);
584
585         nfs_show_mount_options(m, nfss, 0);
586
587         seq_printf(m, ",addr=%s",
588                         rpc_peeraddr2str(nfss->nfs_client->cl_rpcclient,
589                                                         RPC_DISPLAY_ADDR));
590
591         return 0;
592 }
593
594 /*
595  * Present statistical information for this VFS mountpoint
596  */
597 static int nfs_show_stats(struct seq_file *m, struct vfsmount *mnt)
598 {
599         int i, cpu;
600         struct nfs_server *nfss = NFS_SB(mnt->mnt_sb);
601         struct rpc_auth *auth = nfss->client->cl_auth;
602         struct nfs_iostats totals = { };
603
604         seq_printf(m, "statvers=%s", NFS_IOSTAT_VERS);
605
606         /*
607          * Display all mount option settings
608          */
609         seq_printf(m, "\n\topts:\t");
610         seq_puts(m, mnt->mnt_sb->s_flags & MS_RDONLY ? "ro" : "rw");
611         seq_puts(m, mnt->mnt_sb->s_flags & MS_SYNCHRONOUS ? ",sync" : "");
612         seq_puts(m, mnt->mnt_sb->s_flags & MS_NOATIME ? ",noatime" : "");
613         seq_puts(m, mnt->mnt_sb->s_flags & MS_NODIRATIME ? ",nodiratime" : "");
614         nfs_show_mount_options(m, nfss, 1);
615
616         seq_printf(m, "\n\tage:\t%lu", (jiffies - nfss->mount_time) / HZ);
617
618         seq_printf(m, "\n\tcaps:\t");
619         seq_printf(m, "caps=0x%x", nfss->caps);
620         seq_printf(m, ",wtmult=%u", nfss->wtmult);
621         seq_printf(m, ",dtsize=%u", nfss->dtsize);
622         seq_printf(m, ",bsize=%u", nfss->bsize);
623         seq_printf(m, ",namlen=%u", nfss->namelen);
624
625 #ifdef CONFIG_NFS_V4
626         if (nfss->nfs_client->rpc_ops->version == 4) {
627                 seq_printf(m, "\n\tnfsv4:\t");
628                 seq_printf(m, "bm0=0x%x", nfss->attr_bitmask[0]);
629                 seq_printf(m, ",bm1=0x%x", nfss->attr_bitmask[1]);
630                 seq_printf(m, ",acl=0x%x", nfss->acl_bitmask);
631         }
632 #endif
633
634         /*
635          * Display security flavor in effect for this mount
636          */
637         seq_printf(m, "\n\tsec:\tflavor=%u", auth->au_ops->au_flavor);
638         if (auth->au_flavor)
639                 seq_printf(m, ",pseudoflavor=%u", auth->au_flavor);
640
641         /*
642          * Display superblock I/O counters
643          */
644         for_each_possible_cpu(cpu) {
645                 struct nfs_iostats *stats;
646
647                 preempt_disable();
648                 stats = per_cpu_ptr(nfss->io_stats, cpu);
649
650                 for (i = 0; i < __NFSIOS_COUNTSMAX; i++)
651                         totals.events[i] += stats->events[i];
652                 for (i = 0; i < __NFSIOS_BYTESMAX; i++)
653                         totals.bytes[i] += stats->bytes[i];
654 #ifdef CONFIG_NFS_FSCACHE
655                 for (i = 0; i < __NFSIOS_FSCACHEMAX; i++)
656                         totals.fscache[i] += stats->fscache[i];
657 #endif
658
659                 preempt_enable();
660         }
661
662         seq_printf(m, "\n\tevents:\t");
663         for (i = 0; i < __NFSIOS_COUNTSMAX; i++)
664                 seq_printf(m, "%lu ", totals.events[i]);
665         seq_printf(m, "\n\tbytes:\t");
666         for (i = 0; i < __NFSIOS_BYTESMAX; i++)
667                 seq_printf(m, "%Lu ", totals.bytes[i]);
668 #ifdef CONFIG_NFS_FSCACHE
669         if (nfss->options & NFS_OPTION_FSCACHE) {
670                 seq_printf(m, "\n\tfsc:\t");
671                 for (i = 0; i < __NFSIOS_FSCACHEMAX; i++)
672                         seq_printf(m, "%Lu ", totals.bytes[i]);
673         }
674 #endif
675         seq_printf(m, "\n");
676
677         rpc_print_iostats(m, nfss->client);
678
679         return 0;
680 }
681
682 /*
683  * Begin unmount by attempting to remove all automounted mountpoints we added
684  * in response to xdev traversals and referrals
685  */
686 static void nfs_umount_begin(struct super_block *sb)
687 {
688         struct nfs_server *server;
689         struct rpc_clnt *rpc;
690
691         lock_kernel();
692
693         server = NFS_SB(sb);
694         /* -EIO all pending I/O */
695         rpc = server->client_acl;
696         if (!IS_ERR(rpc))
697                 rpc_killall_tasks(rpc);
698         rpc = server->client;
699         if (!IS_ERR(rpc))
700                 rpc_killall_tasks(rpc);
701
702         unlock_kernel();
703 }
704
705 /*
706  * Sanity-check a server address provided by the mount command.
707  *
708  * Address family must be initialized, and address must not be
709  * the ANY address for that family.
710  */
711 static int nfs_verify_server_address(struct sockaddr *addr)
712 {
713         switch (addr->sa_family) {
714         case AF_INET: {
715                 struct sockaddr_in *sa = (struct sockaddr_in *)addr;
716                 return sa->sin_addr.s_addr != htonl(INADDR_ANY);
717         }
718         case AF_INET6: {
719                 struct in6_addr *sa = &((struct sockaddr_in6 *)addr)->sin6_addr;
720                 return !ipv6_addr_any(sa);
721         }
722         }
723
724         return 0;
725 }
726
727 static void nfs_parse_ipv4_address(char *string, size_t str_len,
728                                    struct sockaddr *sap, size_t *addr_len)
729 {
730         struct sockaddr_in *sin = (struct sockaddr_in *)sap;
731         u8 *addr = (u8 *)&sin->sin_addr.s_addr;
732
733         if (str_len <= INET_ADDRSTRLEN) {
734                 dfprintk(MOUNT, "NFS: parsing IPv4 address %*s\n",
735                                 (int)str_len, string);
736
737                 sin->sin_family = AF_INET;
738                 *addr_len = sizeof(*sin);
739                 if (in4_pton(string, str_len, addr, '\0', NULL))
740                         return;
741         }
742
743         sap->sa_family = AF_UNSPEC;
744         *addr_len = 0;
745 }
746
747 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
748 static int nfs_parse_ipv6_scope_id(const char *string, const size_t str_len,
749                                    const char *delim,
750                                    struct sockaddr_in6 *sin6)
751 {
752         char *p;
753         size_t len;
754
755         if ((string + str_len) == delim)
756                 return 1;
757
758         if (*delim != IPV6_SCOPE_DELIMITER)
759                 return 0;
760
761         if (!(ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_LINKLOCAL))
762                 return 0;
763
764         len = (string + str_len) - delim - 1;
765         p = kstrndup(delim + 1, len, GFP_KERNEL);
766         if (p) {
767                 unsigned long scope_id = 0;
768                 struct net_device *dev;
769
770                 dev = dev_get_by_name(&init_net, p);
771                 if (dev != NULL) {
772                         scope_id = dev->ifindex;
773                         dev_put(dev);
774                 } else {
775                         if (strict_strtoul(p, 10, &scope_id) == 0) {
776                                 kfree(p);
777                                 return 0;
778                         }
779                 }
780
781                 kfree(p);
782
783                 sin6->sin6_scope_id = scope_id;
784                 dfprintk(MOUNT, "NFS: IPv6 scope ID = %lu\n", scope_id);
785                 return 1;
786         }
787
788         return 0;
789 }
790
791 static void nfs_parse_ipv6_address(char *string, size_t str_len,
792                                    struct sockaddr *sap, size_t *addr_len)
793 {
794         struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sap;
795         u8 *addr = (u8 *)&sin6->sin6_addr.in6_u;
796         const char *delim;
797
798         if (str_len <= INET6_ADDRSTRLEN) {
799                 dfprintk(MOUNT, "NFS: parsing IPv6 address %*s\n",
800                                 (int)str_len, string);
801
802                 sin6->sin6_family = AF_INET6;
803                 *addr_len = sizeof(*sin6);
804                 if (in6_pton(string, str_len, addr,
805                                         IPV6_SCOPE_DELIMITER, &delim) != 0) {
806                         if (nfs_parse_ipv6_scope_id(string, str_len,
807                                                         delim, sin6) != 0)
808                                 return;
809                 }
810         }
811
812         sap->sa_family = AF_UNSPEC;
813         *addr_len = 0;
814 }
815 #else
816 static void nfs_parse_ipv6_address(char *string, size_t str_len,
817                                    struct sockaddr *sap, size_t *addr_len)
818 {
819         sap->sa_family = AF_UNSPEC;
820         *addr_len = 0;
821 }
822 #endif
823
824 /*
825  * Construct a sockaddr based on the contents of a string that contains
826  * an IP address in presentation format.
827  *
828  * If there is a problem constructing the new sockaddr, set the address
829  * family to AF_UNSPEC.
830  */
831 void nfs_parse_ip_address(char *string, size_t str_len,
832                                  struct sockaddr *sap, size_t *addr_len)
833 {
834         unsigned int i, colons;
835
836         colons = 0;
837         for (i = 0; i < str_len; i++)
838                 if (string[i] == ':')
839                         colons++;
840
841         if (colons >= 2)
842                 nfs_parse_ipv6_address(string, str_len, sap, addr_len);
843         else
844                 nfs_parse_ipv4_address(string, str_len, sap, addr_len);
845 }
846
847 /*
848  * Sanity check the NFS transport protocol.
849  *
850  */
851 static void nfs_validate_transport_protocol(struct nfs_parsed_mount_data *mnt)
852 {
853         switch (mnt->nfs_server.protocol) {
854         case XPRT_TRANSPORT_UDP:
855         case XPRT_TRANSPORT_TCP:
856         case XPRT_TRANSPORT_RDMA:
857                 break;
858         default:
859                 mnt->nfs_server.protocol = XPRT_TRANSPORT_TCP;
860         }
861 }
862
863 /*
864  * For text based NFSv2/v3 mounts, the mount protocol transport default
865  * settings should depend upon the specified NFS transport.
866  */
867 static void nfs_set_mount_transport_protocol(struct nfs_parsed_mount_data *mnt)
868 {
869         nfs_validate_transport_protocol(mnt);
870
871         if (mnt->mount_server.protocol == XPRT_TRANSPORT_UDP ||
872             mnt->mount_server.protocol == XPRT_TRANSPORT_TCP)
873                         return;
874         switch (mnt->nfs_server.protocol) {
875         case XPRT_TRANSPORT_UDP:
876                 mnt->mount_server.protocol = XPRT_TRANSPORT_UDP;
877                 break;
878         case XPRT_TRANSPORT_TCP:
879         case XPRT_TRANSPORT_RDMA:
880                 mnt->mount_server.protocol = XPRT_TRANSPORT_TCP;
881         }
882 }
883
884 /*
885  * Parse the value of the 'sec=' option.
886  *
887  * The flavor_len setting is for v4 mounts.
888  */
889 static int nfs_parse_security_flavors(char *value,
890                                       struct nfs_parsed_mount_data *mnt)
891 {
892         substring_t args[MAX_OPT_ARGS];
893
894         dfprintk(MOUNT, "NFS: parsing sec=%s option\n", value);
895
896         switch (match_token(value, nfs_secflavor_tokens, args)) {
897         case Opt_sec_none:
898                 mnt->auth_flavor_len = 0;
899                 mnt->auth_flavors[0] = RPC_AUTH_NULL;
900                 break;
901         case Opt_sec_sys:
902                 mnt->auth_flavor_len = 0;
903                 mnt->auth_flavors[0] = RPC_AUTH_UNIX;
904                 break;
905         case Opt_sec_krb5:
906                 mnt->auth_flavor_len = 1;
907                 mnt->auth_flavors[0] = RPC_AUTH_GSS_KRB5;
908                 break;
909         case Opt_sec_krb5i:
910                 mnt->auth_flavor_len = 1;
911                 mnt->auth_flavors[0] = RPC_AUTH_GSS_KRB5I;
912                 break;
913         case Opt_sec_krb5p:
914                 mnt->auth_flavor_len = 1;
915                 mnt->auth_flavors[0] = RPC_AUTH_GSS_KRB5P;
916                 break;
917         case Opt_sec_lkey:
918                 mnt->auth_flavor_len = 1;
919                 mnt->auth_flavors[0] = RPC_AUTH_GSS_LKEY;
920                 break;
921         case Opt_sec_lkeyi:
922                 mnt->auth_flavor_len = 1;
923                 mnt->auth_flavors[0] = RPC_AUTH_GSS_LKEYI;
924                 break;
925         case Opt_sec_lkeyp:
926                 mnt->auth_flavor_len = 1;
927                 mnt->auth_flavors[0] = RPC_AUTH_GSS_LKEYP;
928                 break;
929         case Opt_sec_spkm:
930                 mnt->auth_flavor_len = 1;
931                 mnt->auth_flavors[0] = RPC_AUTH_GSS_SPKM;
932                 break;
933         case Opt_sec_spkmi:
934                 mnt->auth_flavor_len = 1;
935                 mnt->auth_flavors[0] = RPC_AUTH_GSS_SPKMI;
936                 break;
937         case Opt_sec_spkmp:
938                 mnt->auth_flavor_len = 1;
939                 mnt->auth_flavors[0] = RPC_AUTH_GSS_SPKMP;
940                 break;
941         default:
942                 return 0;
943         }
944
945         return 1;
946 }
947
948 static void nfs_parse_invalid_value(const char *option)
949 {
950         dfprintk(MOUNT, "NFS:   bad value specified for %s option\n", option);
951 }
952
953 /*
954  * Error-check and convert a string of mount options from user space into
955  * a data structure.  The whole mount string is processed; bad options are
956  * skipped as they are encountered.  If there were no errors, return 1;
957  * otherwise return 0 (zero).
958  */
959 static int nfs_parse_mount_options(char *raw,
960                                    struct nfs_parsed_mount_data *mnt)
961 {
962         char *p, *string, *secdata;
963         int rc, sloppy = 0, errors = 0;
964
965         if (!raw) {
966                 dfprintk(MOUNT, "NFS: mount options string was NULL.\n");
967                 return 1;
968         }
969         dfprintk(MOUNT, "NFS: nfs mount opts='%s'\n", raw);
970
971         secdata = alloc_secdata();
972         if (!secdata)
973                 goto out_nomem;
974
975         rc = security_sb_copy_data(raw, secdata);
976         if (rc)
977                 goto out_security_failure;
978
979         rc = security_sb_parse_opts_str(secdata, &mnt->lsm_opts);
980         if (rc)
981                 goto out_security_failure;
982
983         free_secdata(secdata);
984
985         while ((p = strsep(&raw, ",")) != NULL) {
986                 substring_t args[MAX_OPT_ARGS];
987                 int option, token;
988
989                 if (!*p)
990                         continue;
991
992                 dfprintk(MOUNT, "NFS:   parsing nfs mount option '%s'\n", p);
993
994                 token = match_token(p, nfs_mount_option_tokens, args);
995                 switch (token) {
996
997                 /*
998                  * boolean options:  foo/nofoo
999                  */
1000                 case Opt_soft:
1001                         mnt->flags |= NFS_MOUNT_SOFT;
1002                         break;
1003                 case Opt_hard:
1004                         mnt->flags &= ~NFS_MOUNT_SOFT;
1005                         break;
1006                 case Opt_posix:
1007                         mnt->flags |= NFS_MOUNT_POSIX;
1008                         break;
1009                 case Opt_noposix:
1010                         mnt->flags &= ~NFS_MOUNT_POSIX;
1011                         break;
1012                 case Opt_cto:
1013                         mnt->flags &= ~NFS_MOUNT_NOCTO;
1014                         break;
1015                 case Opt_nocto:
1016                         mnt->flags |= NFS_MOUNT_NOCTO;
1017                         break;
1018                 case Opt_ac:
1019                         mnt->flags &= ~NFS_MOUNT_NOAC;
1020                         break;
1021                 case Opt_noac:
1022                         mnt->flags |= NFS_MOUNT_NOAC;
1023                         break;
1024                 case Opt_lock:
1025                         mnt->flags &= ~NFS_MOUNT_NONLM;
1026                         break;
1027                 case Opt_nolock:
1028                         mnt->flags |= NFS_MOUNT_NONLM;
1029                         break;
1030                 case Opt_v2:
1031                         mnt->flags &= ~NFS_MOUNT_VER3;
1032                         break;
1033                 case Opt_v3:
1034                         mnt->flags |= NFS_MOUNT_VER3;
1035                         break;
1036                 case Opt_udp:
1037                         mnt->flags &= ~NFS_MOUNT_TCP;
1038                         mnt->nfs_server.protocol = XPRT_TRANSPORT_UDP;
1039                         break;
1040                 case Opt_tcp:
1041                         mnt->flags |= NFS_MOUNT_TCP;
1042                         mnt->nfs_server.protocol = XPRT_TRANSPORT_TCP;
1043                         break;
1044                 case Opt_rdma:
1045                         mnt->flags |= NFS_MOUNT_TCP; /* for side protocols */
1046                         mnt->nfs_server.protocol = XPRT_TRANSPORT_RDMA;
1047                         xprt_load_transport(p);
1048                         break;
1049                 case Opt_acl:
1050                         mnt->flags &= ~NFS_MOUNT_NOACL;
1051                         break;
1052                 case Opt_noacl:
1053                         mnt->flags |= NFS_MOUNT_NOACL;
1054                         break;
1055                 case Opt_rdirplus:
1056                         mnt->flags &= ~NFS_MOUNT_NORDIRPLUS;
1057                         break;
1058                 case Opt_nordirplus:
1059                         mnt->flags |= NFS_MOUNT_NORDIRPLUS;
1060                         break;
1061                 case Opt_sharecache:
1062                         mnt->flags &= ~NFS_MOUNT_UNSHARED;
1063                         break;
1064                 case Opt_nosharecache:
1065                         mnt->flags |= NFS_MOUNT_UNSHARED;
1066                         break;
1067                 case Opt_resvport:
1068                         mnt->flags &= ~NFS_MOUNT_NORESVPORT;
1069                         break;
1070                 case Opt_noresvport:
1071                         mnt->flags |= NFS_MOUNT_NORESVPORT;
1072                         break;
1073                 case Opt_fscache:
1074                         mnt->options |= NFS_OPTION_FSCACHE;
1075                         kfree(mnt->fscache_uniq);
1076                         mnt->fscache_uniq = NULL;
1077                         break;
1078                 case Opt_nofscache:
1079                         mnt->options &= ~NFS_OPTION_FSCACHE;
1080                         kfree(mnt->fscache_uniq);
1081                         mnt->fscache_uniq = NULL;
1082                         break;
1083                 case Opt_fscache_uniq:
1084                         string = match_strdup(args);
1085                         if (!string)
1086                                 goto out_nomem;
1087                         kfree(mnt->fscache_uniq);
1088                         mnt->fscache_uniq = string;
1089                         mnt->options |= NFS_OPTION_FSCACHE;
1090                         break;
1091
1092                 /*
1093                  * options that take numeric values
1094                  */
1095                 case Opt_port:
1096                         if (match_int(args, &option) ||
1097                             option < 0 || option > USHORT_MAX) {
1098                                 errors++;
1099                                 nfs_parse_invalid_value("port");
1100                         } else
1101                                 mnt->nfs_server.port = option;
1102                         break;
1103                 case Opt_rsize:
1104                         if (match_int(args, &option) || option < 0) {
1105                                 errors++;
1106                                 nfs_parse_invalid_value("rsize");
1107                         } else
1108                                 mnt->rsize = option;
1109                         break;
1110                 case Opt_wsize:
1111                         if (match_int(args, &option) || option < 0) {
1112                                 errors++;
1113                                 nfs_parse_invalid_value("wsize");
1114                         } else
1115                                 mnt->wsize = option;
1116                         break;
1117                 case Opt_bsize:
1118                         if (match_int(args, &option) || option < 0) {
1119                                 errors++;
1120                                 nfs_parse_invalid_value("bsize");
1121                         } else
1122                                 mnt->bsize = option;
1123                         break;
1124                 case Opt_timeo:
1125                         if (match_int(args, &option) || option <= 0) {
1126                                 errors++;
1127                                 nfs_parse_invalid_value("timeo");
1128                         } else
1129                                 mnt->timeo = option;
1130                         break;
1131                 case Opt_retrans:
1132                         if (match_int(args, &option) || option <= 0) {
1133                                 errors++;
1134                                 nfs_parse_invalid_value("retrans");
1135                         } else
1136                                 mnt->retrans = option;
1137                         break;
1138                 case Opt_acregmin:
1139                         if (match_int(args, &option) || option < 0) {
1140                                 errors++;
1141                                 nfs_parse_invalid_value("acregmin");
1142                         } else
1143                                 mnt->acregmin = option;
1144                         break;
1145                 case Opt_acregmax:
1146                         if (match_int(args, &option) || option < 0) {
1147                                 errors++;
1148                                 nfs_parse_invalid_value("acregmax");
1149                         } else
1150                                 mnt->acregmax = option;
1151                         break;
1152                 case Opt_acdirmin:
1153                         if (match_int(args, &option) || option < 0) {
1154                                 errors++;
1155                                 nfs_parse_invalid_value("acdirmin");
1156                         } else
1157                                 mnt->acdirmin = option;
1158                         break;
1159                 case Opt_acdirmax:
1160                         if (match_int(args, &option) || option < 0) {
1161                                 errors++;
1162                                 nfs_parse_invalid_value("acdirmax");
1163                         } else
1164                                 mnt->acdirmax = option;
1165                         break;
1166                 case Opt_actimeo:
1167                         if (match_int(args, &option) || option < 0) {
1168                                 errors++;
1169                                 nfs_parse_invalid_value("actimeo");
1170                         } else
1171                                 mnt->acregmin = mnt->acregmax =
1172                                 mnt->acdirmin = mnt->acdirmax = option;
1173                         break;
1174                 case Opt_namelen:
1175                         if (match_int(args, &option) || option < 0) {
1176                                 errors++;
1177                                 nfs_parse_invalid_value("namlen");
1178                         } else
1179                                 mnt->namlen = option;
1180                         break;
1181                 case Opt_mountport:
1182                         if (match_int(args, &option) ||
1183                             option < 0 || option > USHORT_MAX) {
1184                                 errors++;
1185                                 nfs_parse_invalid_value("mountport");
1186                         } else
1187                                 mnt->mount_server.port = option;
1188                         break;
1189                 case Opt_mountvers:
1190                         if (match_int(args, &option) ||
1191                             option < NFS_MNT_VERSION ||
1192                             option > NFS_MNT3_VERSION) {
1193                                 errors++;
1194                                 nfs_parse_invalid_value("mountvers");
1195                         } else
1196                                 mnt->mount_server.version = option;
1197                         break;
1198                 case Opt_nfsvers:
1199                         if (match_int(args, &option)) {
1200                                 errors++;
1201                                 nfs_parse_invalid_value("nfsvers");
1202                                 break;
1203                         }
1204                         switch (option) {
1205                         case NFS2_VERSION:
1206                                 mnt->flags &= ~NFS_MOUNT_VER3;
1207                                 break;
1208                         case NFS3_VERSION:
1209                                 mnt->flags |= NFS_MOUNT_VER3;
1210                                 break;
1211                         default:
1212                                 errors++;
1213                                 nfs_parse_invalid_value("nfsvers");
1214                         }
1215                         break;
1216                 case Opt_minorversion:
1217                         if (match_int(args, &option))
1218                                 return 0;
1219                         if (option < 0 || option > NFS4_MAX_MINOR_VERSION)
1220                                 return 0;
1221                         mnt->minorversion = option;
1222                         break;
1223
1224                 /*
1225                  * options that take text values
1226                  */
1227                 case Opt_sec:
1228                         string = match_strdup(args);
1229                         if (string == NULL)
1230                                 goto out_nomem;
1231                         rc = nfs_parse_security_flavors(string, mnt);
1232                         kfree(string);
1233                         if (!rc) {
1234                                 errors++;
1235                                 dfprintk(MOUNT, "NFS:   unrecognized "
1236                                                 "security flavor\n");
1237                         }
1238                         break;
1239                 case Opt_proto:
1240                         string = match_strdup(args);
1241                         if (string == NULL)
1242                                 goto out_nomem;
1243                         token = match_token(string,
1244                                             nfs_xprt_protocol_tokens, args);
1245
1246                         switch (token) {
1247                         case Opt_xprt_udp:
1248                                 mnt->flags &= ~NFS_MOUNT_TCP;
1249                                 mnt->nfs_server.protocol = XPRT_TRANSPORT_UDP;
1250                                 break;
1251                         case Opt_xprt_tcp:
1252                                 mnt->flags |= NFS_MOUNT_TCP;
1253                                 mnt->nfs_server.protocol = XPRT_TRANSPORT_TCP;
1254                                 break;
1255                         case Opt_xprt_rdma:
1256                                 /* vector side protocols to TCP */
1257                                 mnt->flags |= NFS_MOUNT_TCP;
1258                                 mnt->nfs_server.protocol = XPRT_TRANSPORT_RDMA;
1259                                 xprt_load_transport(string);
1260                                 break;
1261                         default:
1262                                 errors++;
1263                                 dfprintk(MOUNT, "NFS:   unrecognized "
1264                                                 "transport protocol\n");
1265                         }
1266                         kfree(string);
1267                         break;
1268                 case Opt_mountproto:
1269                         string = match_strdup(args);
1270                         if (string == NULL)
1271                                 goto out_nomem;
1272                         token = match_token(string,
1273                                             nfs_xprt_protocol_tokens, args);
1274                         kfree(string);
1275
1276                         switch (token) {
1277                         case Opt_xprt_udp:
1278                                 mnt->mount_server.protocol = XPRT_TRANSPORT_UDP;
1279                                 break;
1280                         case Opt_xprt_tcp:
1281                                 mnt->mount_server.protocol = XPRT_TRANSPORT_TCP;
1282                                 break;
1283                         case Opt_xprt_rdma: /* not used for side protocols */
1284                         default:
1285                                 errors++;
1286                                 dfprintk(MOUNT, "NFS:   unrecognized "
1287                                                 "transport protocol\n");
1288                         }
1289                         break;
1290                 case Opt_addr:
1291                         string = match_strdup(args);
1292                         if (string == NULL)
1293                                 goto out_nomem;
1294                         nfs_parse_ip_address(string, strlen(string),
1295                                              (struct sockaddr *)
1296                                                 &mnt->nfs_server.address,
1297                                              &mnt->nfs_server.addrlen);
1298                         kfree(string);
1299                         break;
1300                 case Opt_clientaddr:
1301                         string = match_strdup(args);
1302                         if (string == NULL)
1303                                 goto out_nomem;
1304                         kfree(mnt->client_address);
1305                         mnt->client_address = string;
1306                         break;
1307                 case Opt_mounthost:
1308                         string = match_strdup(args);
1309                         if (string == NULL)
1310                                 goto out_nomem;
1311                         kfree(mnt->mount_server.hostname);
1312                         mnt->mount_server.hostname = string;
1313                         break;
1314                 case Opt_mountaddr:
1315                         string = match_strdup(args);
1316                         if (string == NULL)
1317                                 goto out_nomem;
1318                         nfs_parse_ip_address(string, strlen(string),
1319                                              (struct sockaddr *)
1320                                                 &mnt->mount_server.address,
1321                                              &mnt->mount_server.addrlen);
1322                         kfree(string);
1323                         break;
1324                 case Opt_lookupcache:
1325                         string = match_strdup(args);
1326                         if (string == NULL)
1327                                 goto out_nomem;
1328                         token = match_token(string,
1329                                         nfs_lookupcache_tokens, args);
1330                         kfree(string);
1331                         switch (token) {
1332                                 case Opt_lookupcache_all:
1333                                         mnt->flags &= ~(NFS_MOUNT_LOOKUP_CACHE_NONEG|NFS_MOUNT_LOOKUP_CACHE_NONE);
1334                                         break;
1335                                 case Opt_lookupcache_positive:
1336                                         mnt->flags &= ~NFS_MOUNT_LOOKUP_CACHE_NONE;
1337                                         mnt->flags |= NFS_MOUNT_LOOKUP_CACHE_NONEG;
1338                                         break;
1339                                 case Opt_lookupcache_none:
1340                                         mnt->flags |= NFS_MOUNT_LOOKUP_CACHE_NONEG|NFS_MOUNT_LOOKUP_CACHE_NONE;
1341                                         break;
1342                                 default:
1343                                         errors++;
1344                                         dfprintk(MOUNT, "NFS:   invalid "
1345                                                         "lookupcache argument\n");
1346                         };
1347                         break;
1348
1349                 /*
1350                  * Special options
1351                  */
1352                 case Opt_sloppy:
1353                         sloppy = 1;
1354                         dfprintk(MOUNT, "NFS:   relaxing parsing rules\n");
1355                         break;
1356                 case Opt_userspace:
1357                 case Opt_deprecated:
1358                         dfprintk(MOUNT, "NFS:   ignoring mount option "
1359                                         "'%s'\n", p);
1360                         break;
1361
1362                 default:
1363                         errors++;
1364                         dfprintk(MOUNT, "NFS:   unrecognized mount option "
1365                                         "'%s'\n", p);
1366                 }
1367         }
1368
1369         if (errors > 0) {
1370                 dfprintk(MOUNT, "NFS: parsing encountered %d error%s\n",
1371                                 errors, (errors == 1 ? "" : "s"));
1372                 if (!sloppy)
1373                         return 0;
1374         }
1375         return 1;
1376
1377 out_nomem:
1378         printk(KERN_INFO "NFS: not enough memory to parse option\n");
1379         return 0;
1380 out_security_failure:
1381         free_secdata(secdata);
1382         printk(KERN_INFO "NFS: security options invalid: %d\n", rc);
1383         return 0;
1384 }
1385
1386 /*
1387  * Use the remote server's MOUNT service to request the NFS file handle
1388  * corresponding to the provided path.
1389  */
1390 static int nfs_try_mount(struct nfs_parsed_mount_data *args,
1391                          struct nfs_fh *root_fh)
1392 {
1393         struct nfs_mount_request request = {
1394                 .sap            = (struct sockaddr *)
1395                                                 &args->mount_server.address,
1396                 .dirpath        = args->nfs_server.export_path,
1397                 .protocol       = args->mount_server.protocol,
1398                 .fh             = root_fh,
1399                 .noresvport     = args->flags & NFS_MOUNT_NORESVPORT,
1400         };
1401         int status;
1402
1403         if (args->mount_server.version == 0) {
1404                 if (args->flags & NFS_MOUNT_VER3)
1405                         args->mount_server.version = NFS_MNT3_VERSION;
1406                 else
1407                         args->mount_server.version = NFS_MNT_VERSION;
1408         }
1409         request.version = args->mount_server.version;
1410
1411         if (args->mount_server.hostname)
1412                 request.hostname = args->mount_server.hostname;
1413         else
1414                 request.hostname = args->nfs_server.hostname;
1415
1416         /*
1417          * Construct the mount server's address.
1418          */
1419         if (args->mount_server.address.ss_family == AF_UNSPEC) {
1420                 memcpy(request.sap, &args->nfs_server.address,
1421                        args->nfs_server.addrlen);
1422                 args->mount_server.addrlen = args->nfs_server.addrlen;
1423         }
1424         request.salen = args->mount_server.addrlen;
1425
1426         /*
1427          * autobind will be used if mount_server.port == 0
1428          */
1429         nfs_set_port(request.sap, args->mount_server.port);
1430
1431         /*
1432          * Now ask the mount server to map our export path
1433          * to a file handle.
1434          */
1435         status = nfs_mount(&request);
1436         if (status == 0)
1437                 return 0;
1438
1439         dfprintk(MOUNT, "NFS: unable to mount server %s, error %d\n",
1440                         request.hostname, status);
1441         return status;
1442 }
1443
1444 static int nfs_parse_simple_hostname(const char *dev_name,
1445                                      char **hostname, size_t maxnamlen,
1446                                      char **export_path, size_t maxpathlen)
1447 {
1448         size_t len;
1449         char *colon, *comma;
1450
1451         colon = strchr(dev_name, ':');
1452         if (colon == NULL)
1453                 goto out_bad_devname;
1454
1455         len = colon - dev_name;
1456         if (len > maxnamlen)
1457                 goto out_hostname;
1458
1459         /* N.B. caller will free nfs_server.hostname in all cases */
1460         *hostname = kstrndup(dev_name, len, GFP_KERNEL);
1461         if (!*hostname)
1462                 goto out_nomem;
1463
1464         /* kill possible hostname list: not supported */
1465         comma = strchr(*hostname, ',');
1466         if (comma != NULL) {
1467                 if (comma == *hostname)
1468                         goto out_bad_devname;
1469                 *comma = '\0';
1470         }
1471
1472         colon++;
1473         len = strlen(colon);
1474         if (len > maxpathlen)
1475                 goto out_path;
1476         *export_path = kstrndup(colon, len, GFP_KERNEL);
1477         if (!*export_path)
1478                 goto out_nomem;
1479
1480         dfprintk(MOUNT, "NFS: MNTPATH: '%s'\n", *export_path);
1481         return 0;
1482
1483 out_bad_devname:
1484         dfprintk(MOUNT, "NFS: device name not in host:path format\n");
1485         return -EINVAL;
1486
1487 out_nomem:
1488         dfprintk(MOUNT, "NFS: not enough memory to parse device name\n");
1489         return -ENOMEM;
1490
1491 out_hostname:
1492         dfprintk(MOUNT, "NFS: server hostname too long\n");
1493         return -ENAMETOOLONG;
1494
1495 out_path:
1496         dfprintk(MOUNT, "NFS: export pathname too long\n");
1497         return -ENAMETOOLONG;
1498 }
1499
1500 /*
1501  * Hostname has square brackets around it because it contains one or
1502  * more colons.  We look for the first closing square bracket, and a
1503  * colon must follow it.
1504  */
1505 static int nfs_parse_protected_hostname(const char *dev_name,
1506                                         char **hostname, size_t maxnamlen,
1507                                         char **export_path, size_t maxpathlen)
1508 {
1509         size_t len;
1510         char *start, *end;
1511
1512         start = (char *)(dev_name + 1);
1513
1514         end = strchr(start, ']');
1515         if (end == NULL)
1516                 goto out_bad_devname;
1517         if (*(end + 1) != ':')
1518                 goto out_bad_devname;
1519
1520         len = end - start;
1521         if (len > maxnamlen)
1522                 goto out_hostname;
1523
1524         /* N.B. caller will free nfs_server.hostname in all cases */
1525         *hostname = kstrndup(start, len, GFP_KERNEL);
1526         if (*hostname == NULL)
1527                 goto out_nomem;
1528
1529         end += 2;
1530         len = strlen(end);
1531         if (len > maxpathlen)
1532                 goto out_path;
1533         *export_path = kstrndup(end, len, GFP_KERNEL);
1534         if (!*export_path)
1535                 goto out_nomem;
1536
1537         return 0;
1538
1539 out_bad_devname:
1540         dfprintk(MOUNT, "NFS: device name not in host:path format\n");
1541         return -EINVAL;
1542
1543 out_nomem:
1544         dfprintk(MOUNT, "NFS: not enough memory to parse device name\n");
1545         return -ENOMEM;
1546
1547 out_hostname:
1548         dfprintk(MOUNT, "NFS: server hostname too long\n");
1549         return -ENAMETOOLONG;
1550
1551 out_path:
1552         dfprintk(MOUNT, "NFS: export pathname too long\n");
1553         return -ENAMETOOLONG;
1554 }
1555
1556 /*
1557  * Split "dev_name" into "hostname:export_path".
1558  *
1559  * The leftmost colon demarks the split between the server's hostname
1560  * and the export path.  If the hostname starts with a left square
1561  * bracket, then it may contain colons.
1562  *
1563  * Note: caller frees hostname and export path, even on error.
1564  */
1565 static int nfs_parse_devname(const char *dev_name,
1566                              char **hostname, size_t maxnamlen,
1567                              char **export_path, size_t maxpathlen)
1568 {
1569         if (*dev_name == '[')
1570                 return nfs_parse_protected_hostname(dev_name,
1571                                                     hostname, maxnamlen,
1572                                                     export_path, maxpathlen);
1573
1574         return nfs_parse_simple_hostname(dev_name,
1575                                          hostname, maxnamlen,
1576                                          export_path, maxpathlen);
1577 }
1578
1579 /*
1580  * Validate the NFS2/NFS3 mount data
1581  * - fills in the mount root filehandle
1582  *
1583  * For option strings, user space handles the following behaviors:
1584  *
1585  * + DNS: mapping server host name to IP address ("addr=" option)
1586  *
1587  * + failure mode: how to behave if a mount request can't be handled
1588  *   immediately ("fg/bg" option)
1589  *
1590  * + retry: how often to retry a mount request ("retry=" option)
1591  *
1592  * + breaking back: trying proto=udp after proto=tcp, v2 after v3,
1593  *   mountproto=tcp after mountproto=udp, and so on
1594  */
1595 static int nfs_validate_mount_data(void *options,
1596                                    struct nfs_parsed_mount_data *args,
1597                                    struct nfs_fh *mntfh,
1598                                    const char *dev_name)
1599 {
1600         struct nfs_mount_data *data = (struct nfs_mount_data *)options;
1601
1602         if (data == NULL)
1603                 goto out_no_data;
1604
1605         args->flags             = (NFS_MOUNT_VER3 | NFS_MOUNT_TCP);
1606         args->rsize             = NFS_MAX_FILE_IO_SIZE;
1607         args->wsize             = NFS_MAX_FILE_IO_SIZE;
1608         args->acregmin          = NFS_DEF_ACREGMIN;
1609         args->acregmax          = NFS_DEF_ACREGMAX;
1610         args->acdirmin          = NFS_DEF_ACDIRMIN;
1611         args->acdirmax          = NFS_DEF_ACDIRMAX;
1612         args->mount_server.port = 0;    /* autobind unless user sets port */
1613         args->nfs_server.port   = 0;    /* autobind unless user sets port */
1614         args->nfs_server.protocol = XPRT_TRANSPORT_TCP;
1615         args->auth_flavors[0]   = RPC_AUTH_UNIX;
1616
1617         switch (data->version) {
1618         case 1:
1619                 data->namlen = 0;
1620         case 2:
1621                 data->bsize = 0;
1622         case 3:
1623                 if (data->flags & NFS_MOUNT_VER3)
1624                         goto out_no_v3;
1625                 data->root.size = NFS2_FHSIZE;
1626                 memcpy(data->root.data, data->old_root.data, NFS2_FHSIZE);
1627         case 4:
1628                 if (data->flags & NFS_MOUNT_SECFLAVOUR)
1629                         goto out_no_sec;
1630         case 5:
1631                 memset(data->context, 0, sizeof(data->context));
1632         case 6:
1633                 if (data->flags & NFS_MOUNT_VER3) {
1634                         if (data->root.size > NFS3_FHSIZE || data->root.size == 0)
1635                                 goto out_invalid_fh;
1636                         mntfh->size = data->root.size;
1637                 } else
1638                         mntfh->size = NFS2_FHSIZE;
1639
1640
1641                 memcpy(mntfh->data, data->root.data, mntfh->size);
1642                 if (mntfh->size < sizeof(mntfh->data))
1643                         memset(mntfh->data + mntfh->size, 0,
1644                                sizeof(mntfh->data) - mntfh->size);
1645
1646                 /*
1647                  * Translate to nfs_parsed_mount_data, which nfs_fill_super
1648                  * can deal with.
1649                  */
1650                 args->flags             = data->flags & NFS_MOUNT_FLAGMASK;
1651                 args->rsize             = data->rsize;
1652                 args->wsize             = data->wsize;
1653                 args->timeo             = data->timeo;
1654                 args->retrans           = data->retrans;
1655                 args->acregmin          = data->acregmin;
1656                 args->acregmax          = data->acregmax;
1657                 args->acdirmin          = data->acdirmin;
1658                 args->acdirmax          = data->acdirmax;
1659
1660                 memcpy(&args->nfs_server.address, &data->addr,
1661                        sizeof(data->addr));
1662                 args->nfs_server.addrlen = sizeof(data->addr);
1663                 if (!nfs_verify_server_address((struct sockaddr *)
1664                                                 &args->nfs_server.address))
1665                         goto out_no_address;
1666
1667                 if (!(data->flags & NFS_MOUNT_TCP))
1668                         args->nfs_server.protocol = XPRT_TRANSPORT_UDP;
1669                 /* N.B. caller will free nfs_server.hostname in all cases */
1670                 args->nfs_server.hostname = kstrdup(data->hostname, GFP_KERNEL);
1671                 args->namlen            = data->namlen;
1672                 args->bsize             = data->bsize;
1673
1674                 if (data->flags & NFS_MOUNT_SECFLAVOUR)
1675                         args->auth_flavors[0] = data->pseudoflavor;
1676                 if (!args->nfs_server.hostname)
1677                         goto out_nomem;
1678
1679                 /*
1680                  * The legacy version 6 binary mount data from userspace has a
1681                  * field used only to transport selinux information into the
1682                  * the kernel.  To continue to support that functionality we
1683                  * have a touch of selinux knowledge here in the NFS code. The
1684                  * userspace code converted context=blah to just blah so we are
1685                  * converting back to the full string selinux understands.
1686                  */
1687                 if (data->context[0]){
1688 #ifdef CONFIG_SECURITY_SELINUX
1689                         int rc;
1690                         char *opts_str = kmalloc(sizeof(data->context) + 8, GFP_KERNEL);
1691                         if (!opts_str)
1692                                 return -ENOMEM;
1693                         strcpy(opts_str, "context=");
1694                         data->context[NFS_MAX_CONTEXT_LEN] = '\0';
1695                         strcat(opts_str, &data->context[0]);
1696                         rc = security_sb_parse_opts_str(opts_str, &args->lsm_opts);
1697                         kfree(opts_str);
1698                         if (rc)
1699                                 return rc;
1700 #else
1701                         return -EINVAL;
1702 #endif
1703                 }
1704
1705                 break;
1706         default: {
1707                 int status;
1708
1709                 if (nfs_parse_mount_options((char *)options, args) == 0)
1710                         return -EINVAL;
1711
1712                 if (!nfs_verify_server_address((struct sockaddr *)
1713                                                 &args->nfs_server.address))
1714                         goto out_no_address;
1715
1716                 nfs_set_port((struct sockaddr *)&args->nfs_server.address,
1717                                 args->nfs_server.port);
1718
1719                 nfs_set_mount_transport_protocol(args);
1720
1721                 status = nfs_parse_devname(dev_name,
1722                                            &args->nfs_server.hostname,
1723                                            PAGE_SIZE,
1724                                            &args->nfs_server.export_path,
1725                                            NFS_MAXPATHLEN);
1726                 if (!status)
1727                         status = nfs_try_mount(args, mntfh);
1728
1729                 kfree(args->nfs_server.export_path);
1730                 args->nfs_server.export_path = NULL;
1731
1732                 if (status)
1733                         return status;
1734
1735                 break;
1736                 }
1737         }
1738
1739 #ifndef CONFIG_NFS_V3
1740         if (args->flags & NFS_MOUNT_VER3)
1741                 goto out_v3_not_compiled;
1742 #endif /* !CONFIG_NFS_V3 */
1743
1744         return 0;
1745
1746 out_no_data:
1747         dfprintk(MOUNT, "NFS: mount program didn't pass any mount data\n");
1748         return -EINVAL;
1749
1750 out_no_v3:
1751         dfprintk(MOUNT, "NFS: nfs_mount_data version %d does not support v3\n",
1752                  data->version);
1753         return -EINVAL;
1754
1755 out_no_sec:
1756         dfprintk(MOUNT, "NFS: nfs_mount_data version supports only AUTH_SYS\n");
1757         return -EINVAL;
1758
1759 #ifndef CONFIG_NFS_V3
1760 out_v3_not_compiled:
1761         dfprintk(MOUNT, "NFS: NFSv3 is not compiled into kernel\n");
1762         return -EPROTONOSUPPORT;
1763 #endif /* !CONFIG_NFS_V3 */
1764
1765 out_nomem:
1766         dfprintk(MOUNT, "NFS: not enough memory to handle mount options\n");
1767         return -ENOMEM;
1768
1769 out_no_address:
1770         dfprintk(MOUNT, "NFS: mount program didn't pass remote address\n");
1771         return -EINVAL;
1772
1773 out_invalid_fh:
1774         dfprintk(MOUNT, "NFS: invalid root filehandle\n");
1775         return -EINVAL;
1776 }
1777
1778 static int
1779 nfs_compare_remount_data(struct nfs_server *nfss,
1780                          struct nfs_parsed_mount_data *data)
1781 {
1782         if (data->flags != nfss->flags ||
1783             data->rsize != nfss->rsize ||
1784             data->wsize != nfss->wsize ||
1785             data->retrans != nfss->client->cl_timeout->to_retries ||
1786             data->auth_flavors[0] != nfss->client->cl_auth->au_flavor ||
1787             data->acregmin != nfss->acregmin / HZ ||
1788             data->acregmax != nfss->acregmax / HZ ||
1789             data->acdirmin != nfss->acdirmin / HZ ||
1790             data->acdirmax != nfss->acdirmax / HZ ||
1791             data->timeo != (10U * nfss->client->cl_timeout->to_initval / HZ) ||
1792             data->nfs_server.addrlen != nfss->nfs_client->cl_addrlen ||
1793             memcmp(&data->nfs_server.address, &nfss->nfs_client->cl_addr,
1794                    data->nfs_server.addrlen) != 0)
1795                 return -EINVAL;
1796
1797         return 0;
1798 }
1799
1800 static int
1801 nfs_remount(struct super_block *sb, int *flags, char *raw_data)
1802 {
1803         int error;
1804         struct nfs_server *nfss = sb->s_fs_info;
1805         struct nfs_parsed_mount_data *data;
1806         struct nfs_mount_data *options = (struct nfs_mount_data *)raw_data;
1807         struct nfs4_mount_data *options4 = (struct nfs4_mount_data *)raw_data;
1808         u32 nfsvers = nfss->nfs_client->rpc_ops->version;
1809
1810         /*
1811          * Userspace mount programs that send binary options generally send
1812          * them populated with default values. We have no way to know which
1813          * ones were explicitly specified. Fall back to legacy behavior and
1814          * just return success.
1815          */
1816         if ((nfsvers == 4 && (!options4 || options4->version == 1)) ||
1817             (nfsvers <= 3 && (!options || (options->version >= 1 &&
1818                                            options->version <= 6))))
1819                 return 0;
1820
1821         data = kzalloc(sizeof(*data), GFP_KERNEL);
1822         if (data == NULL)
1823                 return -ENOMEM;
1824
1825         /* fill out struct with values from existing mount */
1826         data->flags = nfss->flags;
1827         data->rsize = nfss->rsize;
1828         data->wsize = nfss->wsize;
1829         data->retrans = nfss->client->cl_timeout->to_retries;
1830         data->auth_flavors[0] = nfss->client->cl_auth->au_flavor;
1831         data->acregmin = nfss->acregmin / HZ;
1832         data->acregmax = nfss->acregmax / HZ;
1833         data->acdirmin = nfss->acdirmin / HZ;
1834         data->acdirmax = nfss->acdirmax / HZ;
1835         data->timeo = 10U * nfss->client->cl_timeout->to_initval / HZ;
1836         data->nfs_server.addrlen = nfss->nfs_client->cl_addrlen;
1837         memcpy(&data->nfs_server.address, &nfss->nfs_client->cl_addr,
1838                 data->nfs_server.addrlen);
1839
1840         /* overwrite those values with any that were specified */
1841         error = nfs_parse_mount_options((char *)options, data);
1842         if (error < 0)
1843                 goto out;
1844
1845         /* compare new mount options with old ones */
1846         error = nfs_compare_remount_data(nfss, data);
1847 out:
1848         kfree(data);
1849         return error;
1850 }
1851
1852 /*
1853  * Initialise the common bits of the superblock
1854  */
1855 static inline void nfs_initialise_sb(struct super_block *sb)
1856 {
1857         struct nfs_server *server = NFS_SB(sb);
1858
1859         sb->s_magic = NFS_SUPER_MAGIC;
1860
1861         /* We probably want something more informative here */
1862         snprintf(sb->s_id, sizeof(sb->s_id),
1863                  "%x:%x", MAJOR(sb->s_dev), MINOR(sb->s_dev));
1864
1865         if (sb->s_blocksize == 0)
1866                 sb->s_blocksize = nfs_block_bits(server->wsize,
1867                                                  &sb->s_blocksize_bits);
1868
1869         if (server->flags & NFS_MOUNT_NOAC)
1870                 sb->s_flags |= MS_SYNCHRONOUS;
1871
1872         nfs_super_set_maxbytes(sb, server->maxfilesize);
1873 }
1874
1875 /*
1876  * Finish setting up an NFS2/3 superblock
1877  */
1878 static void nfs_fill_super(struct super_block *sb,
1879                            struct nfs_parsed_mount_data *data)
1880 {
1881         struct nfs_server *server = NFS_SB(sb);
1882
1883         sb->s_blocksize_bits = 0;
1884         sb->s_blocksize = 0;
1885         if (data->bsize)
1886                 sb->s_blocksize = nfs_block_size(data->bsize, &sb->s_blocksize_bits);
1887
1888         if (server->flags & NFS_MOUNT_VER3) {
1889                 /* The VFS shouldn't apply the umask to mode bits. We will do
1890                  * so ourselves when necessary.
1891                  */
1892                 sb->s_flags |= MS_POSIXACL;
1893                 sb->s_time_gran = 1;
1894         }
1895
1896         sb->s_op = &nfs_sops;
1897         nfs_initialise_sb(sb);
1898 }
1899
1900 /*
1901  * Finish setting up a cloned NFS2/3 superblock
1902  */
1903 static void nfs_clone_super(struct super_block *sb,
1904                             const struct super_block *old_sb)
1905 {
1906         struct nfs_server *server = NFS_SB(sb);
1907
1908         sb->s_blocksize_bits = old_sb->s_blocksize_bits;
1909         sb->s_blocksize = old_sb->s_blocksize;
1910         sb->s_maxbytes = old_sb->s_maxbytes;
1911
1912         if (server->flags & NFS_MOUNT_VER3) {
1913                 /* The VFS shouldn't apply the umask to mode bits. We will do
1914                  * so ourselves when necessary.
1915                  */
1916                 sb->s_flags |= MS_POSIXACL;
1917                 sb->s_time_gran = 1;
1918         }
1919
1920         sb->s_op = old_sb->s_op;
1921         nfs_initialise_sb(sb);
1922 }
1923
1924 static int nfs_compare_mount_options(const struct super_block *s, const struct nfs_server *b, int flags)
1925 {
1926         const struct nfs_server *a = s->s_fs_info;
1927         const struct rpc_clnt *clnt_a = a->client;
1928         const struct rpc_clnt *clnt_b = b->client;
1929
1930         if ((s->s_flags & NFS_MS_MASK) != (flags & NFS_MS_MASK))
1931                 goto Ebusy;
1932         if (a->nfs_client != b->nfs_client)
1933                 goto Ebusy;
1934         if (a->flags != b->flags)
1935                 goto Ebusy;
1936         if (a->wsize != b->wsize)
1937                 goto Ebusy;
1938         if (a->rsize != b->rsize)
1939                 goto Ebusy;
1940         if (a->acregmin != b->acregmin)
1941                 goto Ebusy;
1942         if (a->acregmax != b->acregmax)
1943                 goto Ebusy;
1944         if (a->acdirmin != b->acdirmin)
1945                 goto Ebusy;
1946         if (a->acdirmax != b->acdirmax)
1947                 goto Ebusy;
1948         if (clnt_a->cl_auth->au_flavor != clnt_b->cl_auth->au_flavor)
1949                 goto Ebusy;
1950         return 1;
1951 Ebusy:
1952         return 0;
1953 }
1954
1955 struct nfs_sb_mountdata {
1956         struct nfs_server *server;
1957         int mntflags;
1958 };
1959
1960 static int nfs_set_super(struct super_block *s, void *data)
1961 {
1962         struct nfs_sb_mountdata *sb_mntdata = data;
1963         struct nfs_server *server = sb_mntdata->server;
1964         int ret;
1965
1966         s->s_flags = sb_mntdata->mntflags;
1967         s->s_fs_info = server;
1968         ret = set_anon_super(s, server);
1969         if (ret == 0)
1970                 server->s_dev = s->s_dev;
1971         return ret;
1972 }
1973
1974 static int nfs_compare_super_address(struct nfs_server *server1,
1975                                      struct nfs_server *server2)
1976 {
1977         struct sockaddr *sap1, *sap2;
1978
1979         sap1 = (struct sockaddr *)&server1->nfs_client->cl_addr;
1980         sap2 = (struct sockaddr *)&server2->nfs_client->cl_addr;
1981
1982         if (sap1->sa_family != sap2->sa_family)
1983                 return 0;
1984
1985         switch (sap1->sa_family) {
1986         case AF_INET: {
1987                 struct sockaddr_in *sin1 = (struct sockaddr_in *)sap1;
1988                 struct sockaddr_in *sin2 = (struct sockaddr_in *)sap2;
1989                 if (sin1->sin_addr.s_addr != sin2->sin_addr.s_addr)
1990                         return 0;
1991                 if (sin1->sin_port != sin2->sin_port)
1992                         return 0;
1993                 break;
1994         }
1995         case AF_INET6: {
1996                 struct sockaddr_in6 *sin1 = (struct sockaddr_in6 *)sap1;
1997                 struct sockaddr_in6 *sin2 = (struct sockaddr_in6 *)sap2;
1998                 if (!ipv6_addr_equal(&sin1->sin6_addr, &sin2->sin6_addr))
1999                         return 0;
2000                 if (sin1->sin6_port != sin2->sin6_port)
2001                         return 0;
2002                 break;
2003         }
2004         default:
2005                 return 0;
2006         }
2007
2008         return 1;
2009 }
2010
2011 static int nfs_compare_super(struct super_block *sb, void *data)
2012 {
2013         struct nfs_sb_mountdata *sb_mntdata = data;
2014         struct nfs_server *server = sb_mntdata->server, *old = NFS_SB(sb);
2015         int mntflags = sb_mntdata->mntflags;
2016
2017         if (!nfs_compare_super_address(old, server))
2018                 return 0;
2019         /* Note: NFS_MOUNT_UNSHARED == NFS4_MOUNT_UNSHARED */
2020         if (old->flags & NFS_MOUNT_UNSHARED)
2021                 return 0;
2022         if (memcmp(&old->fsid, &server->fsid, sizeof(old->fsid)) != 0)
2023                 return 0;
2024         return nfs_compare_mount_options(sb, server, mntflags);
2025 }
2026
2027 static int nfs_bdi_register(struct nfs_server *server)
2028 {
2029         return bdi_register_dev(&server->backing_dev_info, server->s_dev);
2030 }
2031
2032 static int nfs_get_sb(struct file_system_type *fs_type,
2033         int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt)
2034 {
2035         struct nfs_server *server = NULL;
2036         struct super_block *s;
2037         struct nfs_parsed_mount_data *data;
2038         struct nfs_fh *mntfh;
2039         struct dentry *mntroot;
2040         int (*compare_super)(struct super_block *, void *) = nfs_compare_super;
2041         struct nfs_sb_mountdata sb_mntdata = {
2042                 .mntflags = flags,
2043         };
2044         int error = -ENOMEM;
2045
2046         data = kzalloc(sizeof(*data), GFP_KERNEL);
2047         mntfh = kzalloc(sizeof(*mntfh), GFP_KERNEL);
2048         if (data == NULL || mntfh == NULL)
2049                 goto out_free_fh;
2050
2051         security_init_mnt_opts(&data->lsm_opts);
2052
2053         /* Validate the mount data */
2054         error = nfs_validate_mount_data(raw_data, data, mntfh, dev_name);
2055         if (error < 0)
2056                 goto out;
2057
2058         /* Get a volume representation */
2059         server = nfs_create_server(data, mntfh);
2060         if (IS_ERR(server)) {
2061                 error = PTR_ERR(server);
2062                 goto out;
2063         }
2064         sb_mntdata.server = server;
2065
2066         if (server->flags & NFS_MOUNT_UNSHARED)
2067                 compare_super = NULL;
2068
2069         /* Get a superblock - note that we may end up sharing one that already exists */
2070         s = sget(fs_type, compare_super, nfs_set_super, &sb_mntdata);
2071         if (IS_ERR(s)) {
2072                 error = PTR_ERR(s);
2073                 goto out_err_nosb;
2074         }
2075
2076         if (s->s_fs_info != server) {
2077                 nfs_free_server(server);
2078                 server = NULL;
2079         } else {
2080                 error = nfs_bdi_register(server);
2081                 if (error)
2082                         goto error_splat_super;
2083         }
2084
2085         if (!s->s_root) {
2086                 /* initial superblock/root creation */
2087                 nfs_fill_super(s, data);
2088                 nfs_fscache_get_super_cookie(s, data);
2089         }
2090
2091         mntroot = nfs_get_root(s, mntfh);
2092         if (IS_ERR(mntroot)) {
2093                 error = PTR_ERR(mntroot);
2094                 goto error_splat_super;
2095         }
2096
2097         error = security_sb_set_mnt_opts(s, &data->lsm_opts);
2098         if (error)
2099                 goto error_splat_root;
2100
2101         s->s_flags |= MS_ACTIVE;
2102         mnt->mnt_sb = s;
2103         mnt->mnt_root = mntroot;
2104         error = 0;
2105
2106 out:
2107         kfree(data->nfs_server.hostname);
2108         kfree(data->mount_server.hostname);
2109         kfree(data->fscache_uniq);
2110         security_free_mnt_opts(&data->lsm_opts);
2111 out_free_fh:
2112         kfree(mntfh);
2113         kfree(data);
2114         return error;
2115
2116 out_err_nosb:
2117         nfs_free_server(server);
2118         goto out;
2119
2120 error_splat_root:
2121         dput(mntroot);
2122 error_splat_super:
2123         deactivate_locked_super(s);
2124         goto out;
2125 }
2126
2127 /*
2128  * Destroy an NFS2/3 superblock
2129  */
2130 static void nfs_kill_super(struct super_block *s)
2131 {
2132         struct nfs_server *server = NFS_SB(s);
2133
2134         bdi_unregister(&server->backing_dev_info);
2135         kill_anon_super(s);
2136         nfs_fscache_release_super_cookie(s);
2137         nfs_free_server(server);
2138 }
2139
2140 /*
2141  * Clone an NFS2/3 server record on xdev traversal (FSID-change)
2142  */
2143 static int nfs_xdev_get_sb(struct file_system_type *fs_type, int flags,
2144                            const char *dev_name, void *raw_data,
2145                            struct vfsmount *mnt)
2146 {
2147         struct nfs_clone_mount *data = raw_data;
2148         struct super_block *s;
2149         struct nfs_server *server;
2150         struct dentry *mntroot;
2151         int (*compare_super)(struct super_block *, void *) = nfs_compare_super;
2152         struct nfs_sb_mountdata sb_mntdata = {
2153                 .mntflags = flags,
2154         };
2155         int error;
2156
2157         dprintk("--> nfs_xdev_get_sb()\n");
2158
2159         /* create a new volume representation */
2160         server = nfs_clone_server(NFS_SB(data->sb), data->fh, data->fattr);
2161         if (IS_ERR(server)) {
2162                 error = PTR_ERR(server);
2163                 goto out_err_noserver;
2164         }
2165         sb_mntdata.server = server;
2166
2167         if (server->flags & NFS_MOUNT_UNSHARED)
2168                 compare_super = NULL;
2169
2170         /* Get a superblock - note that we may end up sharing one that already exists */
2171         s = sget(&nfs_fs_type, compare_super, nfs_set_super, &sb_mntdata);
2172         if (IS_ERR(s)) {
2173                 error = PTR_ERR(s);
2174                 goto out_err_nosb;
2175         }
2176
2177         if (s->s_fs_info != server) {
2178                 nfs_free_server(server);
2179                 server = NULL;
2180         } else {
2181                 error = nfs_bdi_register(server);
2182                 if (error)
2183                         goto error_splat_super;
2184         }
2185
2186         if (!s->s_root) {
2187                 /* initial superblock/root creation */
2188                 nfs_clone_super(s, data->sb);
2189         }
2190
2191         mntroot = nfs_get_root(s, data->fh);
2192         if (IS_ERR(mntroot)) {
2193                 error = PTR_ERR(mntroot);
2194                 goto error_splat_super;
2195         }
2196         if (mntroot->d_inode->i_op != NFS_SB(s)->nfs_client->rpc_ops->dir_inode_ops) {
2197                 dput(mntroot);
2198                 error = -ESTALE;
2199                 goto error_splat_super;
2200         }
2201
2202         s->s_flags |= MS_ACTIVE;
2203         mnt->mnt_sb = s;
2204         mnt->mnt_root = mntroot;
2205
2206         /* clone any lsm security options from the parent to the new sb */
2207         security_sb_clone_mnt_opts(data->sb, s);
2208
2209         dprintk("<-- nfs_xdev_get_sb() = 0\n");
2210         return 0;
2211
2212 out_err_nosb:
2213         nfs_free_server(server);
2214 out_err_noserver:
2215         dprintk("<-- nfs_xdev_get_sb() = %d [error]\n", error);
2216         return error;
2217
2218 error_splat_super:
2219         deactivate_locked_super(s);
2220         dprintk("<-- nfs_xdev_get_sb() = %d [splat]\n", error);
2221         return error;
2222 }
2223
2224 #ifdef CONFIG_NFS_V4
2225
2226 /*
2227  * Finish setting up a cloned NFS4 superblock
2228  */
2229 static void nfs4_clone_super(struct super_block *sb,
2230                             const struct super_block *old_sb)
2231 {
2232         sb->s_blocksize_bits = old_sb->s_blocksize_bits;
2233         sb->s_blocksize = old_sb->s_blocksize;
2234         sb->s_maxbytes = old_sb->s_maxbytes;
2235         sb->s_time_gran = 1;
2236         sb->s_op = old_sb->s_op;
2237         nfs_initialise_sb(sb);
2238 }
2239
2240 /*
2241  * Set up an NFS4 superblock
2242  */
2243 static void nfs4_fill_super(struct super_block *sb)
2244 {
2245         sb->s_time_gran = 1;
2246         sb->s_op = &nfs4_sops;
2247         nfs_initialise_sb(sb);
2248 }
2249
2250 /*
2251  * Validate NFSv4 mount options
2252  */
2253 static int nfs4_validate_mount_data(void *options,
2254                                     struct nfs_parsed_mount_data *args,
2255                                     const char *dev_name)
2256 {
2257         struct sockaddr_in *ap;
2258         struct nfs4_mount_data *data = (struct nfs4_mount_data *)options;
2259         char *c;
2260
2261         if (data == NULL)
2262                 goto out_no_data;
2263
2264         args->rsize             = NFS_MAX_FILE_IO_SIZE;
2265         args->wsize             = NFS_MAX_FILE_IO_SIZE;
2266         args->acregmin          = NFS_DEF_ACREGMIN;
2267         args->acregmax          = NFS_DEF_ACREGMAX;
2268         args->acdirmin          = NFS_DEF_ACDIRMIN;
2269         args->acdirmax          = NFS_DEF_ACDIRMAX;
2270         args->nfs_server.port   = NFS_PORT; /* 2049 unless user set port= */
2271         args->auth_flavors[0]   = RPC_AUTH_UNIX;
2272         args->auth_flavor_len   = 0;
2273         args->minorversion      = 0;
2274
2275         switch (data->version) {
2276         case 1:
2277                 ap = (struct sockaddr_in *)&args->nfs_server.address;
2278                 if (data->host_addrlen > sizeof(args->nfs_server.address))
2279                         goto out_no_address;
2280                 if (data->host_addrlen == 0)
2281                         goto out_no_address;
2282                 args->nfs_server.addrlen = data->host_addrlen;
2283                 if (copy_from_user(ap, data->host_addr, data->host_addrlen))
2284                         return -EFAULT;
2285                 if (!nfs_verify_server_address((struct sockaddr *)
2286                                                 &args->nfs_server.address))
2287                         goto out_no_address;
2288
2289                 if (data->auth_flavourlen) {
2290                         if (data->auth_flavourlen > 1)
2291                                 goto out_inval_auth;
2292                         if (copy_from_user(&args->auth_flavors[0],
2293                                            data->auth_flavours,
2294                                            sizeof(args->auth_flavors[0])))
2295                                 return -EFAULT;
2296                 }
2297
2298                 c = strndup_user(data->hostname.data, NFS4_MAXNAMLEN);
2299                 if (IS_ERR(c))
2300                         return PTR_ERR(c);
2301                 args->nfs_server.hostname = c;
2302
2303                 c = strndup_user(data->mnt_path.data, NFS4_MAXPATHLEN);
2304                 if (IS_ERR(c))
2305                         return PTR_ERR(c);
2306                 args->nfs_server.export_path = c;
2307                 dfprintk(MOUNT, "NFS: MNTPATH: '%s'\n", c);
2308
2309                 c = strndup_user(data->client_addr.data, 16);
2310                 if (IS_ERR(c))
2311                         return PTR_ERR(c);
2312                 args->client_address = c;
2313
2314                 /*
2315                  * Translate to nfs_parsed_mount_data, which nfs4_fill_super
2316                  * can deal with.
2317                  */
2318
2319                 args->flags     = data->flags & NFS4_MOUNT_FLAGMASK;
2320                 args->rsize     = data->rsize;
2321                 args->wsize     = data->wsize;
2322                 args->timeo     = data->timeo;
2323                 args->retrans   = data->retrans;
2324                 args->acregmin  = data->acregmin;
2325                 args->acregmax  = data->acregmax;
2326                 args->acdirmin  = data->acdirmin;
2327                 args->acdirmax  = data->acdirmax;
2328                 args->nfs_server.protocol = data->proto;
2329                 nfs_validate_transport_protocol(args);
2330
2331                 break;
2332         default: {
2333                 int status;
2334
2335                 if (nfs_parse_mount_options((char *)options, args) == 0)
2336                         return -EINVAL;
2337
2338                 if (!nfs_verify_server_address((struct sockaddr *)
2339                                                 &args->nfs_server.address))
2340                         return -EINVAL;
2341
2342                 nfs_set_port((struct sockaddr *)&args->nfs_server.address,
2343                                 args->nfs_server.port);
2344
2345                 nfs_validate_transport_protocol(args);
2346
2347                 if (args->auth_flavor_len > 1)
2348                         goto out_inval_auth;
2349
2350                 if (args->client_address == NULL)
2351                         goto out_no_client_address;
2352
2353                 status = nfs_parse_devname(dev_name,
2354                                            &args->nfs_server.hostname,
2355                                            NFS4_MAXNAMLEN,
2356                                            &args->nfs_server.export_path,
2357                                            NFS4_MAXPATHLEN);
2358                 if (status < 0)
2359                         return status;
2360
2361                 break;
2362                 }
2363         }
2364
2365         return 0;
2366
2367 out_no_data:
2368         dfprintk(MOUNT, "NFS4: mount program didn't pass any mount data\n");
2369         return -EINVAL;
2370
2371 out_inval_auth:
2372         dfprintk(MOUNT, "NFS4: Invalid number of RPC auth flavours %d\n",
2373                  data->auth_flavourlen);
2374         return -EINVAL;
2375
2376 out_no_address:
2377         dfprintk(MOUNT, "NFS4: mount program didn't pass remote address\n");
2378         return -EINVAL;
2379
2380 out_no_client_address:
2381         dfprintk(MOUNT, "NFS4: mount program didn't pass callback address\n");
2382         return -EINVAL;
2383 }
2384
2385 /*
2386  * Get the superblock for an NFS4 mountpoint
2387  */
2388 static int nfs4_get_sb(struct file_system_type *fs_type,
2389         int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt)
2390 {
2391         struct nfs_parsed_mount_data *data;
2392         struct super_block *s;
2393         struct nfs_server *server;
2394         struct nfs_fh *mntfh;
2395         struct dentry *mntroot;
2396         int (*compare_super)(struct super_block *, void *) = nfs_compare_super;
2397         struct nfs_sb_mountdata sb_mntdata = {
2398                 .mntflags = flags,
2399         };
2400         int error = -ENOMEM;
2401
2402         data = kzalloc(sizeof(*data), GFP_KERNEL);
2403         mntfh = kzalloc(sizeof(*mntfh), GFP_KERNEL);
2404         if (data == NULL || mntfh == NULL)
2405                 goto out_free_fh;
2406
2407         security_init_mnt_opts(&data->lsm_opts);
2408
2409         /* Validate the mount data */
2410         error = nfs4_validate_mount_data(raw_data, data, dev_name);
2411         if (error < 0)
2412                 goto out;
2413
2414         /* Get a volume representation */
2415         server = nfs4_create_server(data, mntfh);
2416         if (IS_ERR(server)) {
2417                 error = PTR_ERR(server);
2418                 goto out;
2419         }
2420         sb_mntdata.server = server;
2421
2422         if (server->flags & NFS4_MOUNT_UNSHARED)
2423                 compare_super = NULL;
2424
2425         /* Get a superblock - note that we may end up sharing one that already exists */
2426         s = sget(fs_type, compare_super, nfs_set_super, &sb_mntdata);
2427         if (IS_ERR(s)) {
2428                 error = PTR_ERR(s);
2429                 goto out_free;
2430         }
2431
2432         if (s->s_fs_info != server) {
2433                 nfs_free_server(server);
2434                 server = NULL;
2435         } else {
2436                 error = nfs_bdi_register(server);
2437                 if (error)
2438                         goto error_splat_super;
2439         }
2440
2441         if (!s->s_root) {
2442                 /* initial superblock/root creation */
2443                 nfs4_fill_super(s);
2444                 nfs_fscache_get_super_cookie(s, data);
2445         }
2446
2447         mntroot = nfs4_get_root(s, mntfh);
2448         if (IS_ERR(mntroot)) {
2449                 error = PTR_ERR(mntroot);
2450                 goto error_splat_super;
2451         }
2452
2453         error = security_sb_set_mnt_opts(s, &data->lsm_opts);
2454         if (error)
2455                 goto error_splat_root;
2456
2457         s->s_flags |= MS_ACTIVE;
2458         mnt->mnt_sb = s;
2459         mnt->mnt_root = mntroot;
2460         error = 0;
2461
2462 out:
2463         kfree(data->client_address);
2464         kfree(data->nfs_server.export_path);
2465         kfree(data->nfs_server.hostname);
2466         kfree(data->fscache_uniq);
2467         security_free_mnt_opts(&data->lsm_opts);
2468 out_free_fh:
2469         kfree(mntfh);
2470         kfree(data);
2471         return error;
2472
2473 out_free:
2474         nfs_free_server(server);
2475         goto out;
2476
2477 error_splat_root:
2478         dput(mntroot);
2479 error_splat_super:
2480         deactivate_locked_super(s);
2481         goto out;
2482 }
2483
2484 static void nfs4_kill_super(struct super_block *sb)
2485 {
2486         struct nfs_server *server = NFS_SB(sb);
2487
2488         nfs_super_return_all_delegations(sb);
2489         kill_anon_super(sb);
2490
2491         nfs4_renewd_prepare_shutdown(server);
2492         nfs_fscache_release_super_cookie(sb);
2493         nfs_free_server(server);
2494 }
2495
2496 /*
2497  * Clone an NFS4 server record on xdev traversal (FSID-change)
2498  */
2499 static int nfs4_xdev_get_sb(struct file_system_type *fs_type, int flags,
2500                             const char *dev_name, void *raw_data,
2501                             struct vfsmount *mnt)
2502 {
2503         struct nfs_clone_mount *data = raw_data;
2504         struct super_block *s;
2505         struct nfs_server *server;
2506         struct dentry *mntroot;
2507         int (*compare_super)(struct super_block *, void *) = nfs_compare_super;
2508         struct nfs_sb_mountdata sb_mntdata = {
2509                 .mntflags = flags,
2510         };
2511         int error;
2512
2513         dprintk("--> nfs4_xdev_get_sb()\n");
2514
2515         /* create a new volume representation */
2516         server = nfs_clone_server(NFS_SB(data->sb), data->fh, data->fattr);
2517         if (IS_ERR(server)) {
2518                 error = PTR_ERR(server);
2519                 goto out_err_noserver;
2520         }
2521         sb_mntdata.server = server;
2522
2523         if (server->flags & NFS4_MOUNT_UNSHARED)
2524                 compare_super = NULL;
2525
2526         /* Get a superblock - note that we may end up sharing one that already exists */
2527         s = sget(&nfs4_fs_type, compare_super, nfs_set_super, &sb_mntdata);
2528         if (IS_ERR(s)) {
2529                 error = PTR_ERR(s);
2530                 goto out_err_nosb;
2531         }
2532
2533         if (s->s_fs_info != server) {
2534                 nfs_free_server(server);
2535                 server = NULL;
2536         } else {
2537                 error = nfs_bdi_register(server);
2538                 if (error)
2539                         goto error_splat_super;
2540         }
2541
2542         if (!s->s_root) {
2543                 /* initial superblock/root creation */
2544                 nfs4_clone_super(s, data->sb);
2545         }
2546
2547         mntroot = nfs4_get_root(s, data->fh);
2548         if (IS_ERR(mntroot)) {
2549                 error = PTR_ERR(mntroot);
2550                 goto error_splat_super;
2551         }
2552         if (mntroot->d_inode->i_op != NFS_SB(s)->nfs_client->rpc_ops->dir_inode_ops) {
2553                 dput(mntroot);
2554                 error = -ESTALE;
2555                 goto error_splat_super;
2556         }
2557
2558         s->s_flags |= MS_ACTIVE;
2559         mnt->mnt_sb = s;
2560         mnt->mnt_root = mntroot;
2561
2562         security_sb_clone_mnt_opts(data->sb, s);
2563
2564         dprintk("<-- nfs4_xdev_get_sb() = 0\n");
2565         return 0;
2566
2567 out_err_nosb:
2568         nfs_free_server(server);
2569 out_err_noserver:
2570         dprintk("<-- nfs4_xdev_get_sb() = %d [error]\n", error);
2571         return error;
2572
2573 error_splat_super:
2574         deactivate_locked_super(s);
2575         dprintk("<-- nfs4_xdev_get_sb() = %d [splat]\n", error);
2576         return error;
2577 }
2578
2579 /*
2580  * Create an NFS4 server record on referral traversal
2581  */
2582 static int nfs4_referral_get_sb(struct file_system_type *fs_type, int flags,
2583                                 const char *dev_name, void *raw_data,
2584                                 struct vfsmount *mnt)
2585 {
2586         struct nfs_clone_mount *data = raw_data;
2587         struct super_block *s;
2588         struct nfs_server *server;
2589         struct dentry *mntroot;
2590         struct nfs_fh mntfh;
2591         int (*compare_super)(struct super_block *, void *) = nfs_compare_super;
2592         struct nfs_sb_mountdata sb_mntdata = {
2593                 .mntflags = flags,
2594         };
2595         int error;
2596
2597         dprintk("--> nfs4_referral_get_sb()\n");
2598
2599         /* create a new volume representation */
2600         server = nfs4_create_referral_server(data, &mntfh);
2601         if (IS_ERR(server)) {
2602                 error = PTR_ERR(server);
2603                 goto out_err_noserver;
2604         }
2605         sb_mntdata.server = server;
2606
2607         if (server->flags & NFS4_MOUNT_UNSHARED)
2608                 compare_super = NULL;
2609
2610         /* Get a superblock - note that we may end up sharing one that already exists */
2611         s = sget(&nfs4_fs_type, compare_super, nfs_set_super, &sb_mntdata);
2612         if (IS_ERR(s)) {
2613                 error = PTR_ERR(s);
2614                 goto out_err_nosb;
2615         }
2616
2617         if (s->s_fs_info != server) {
2618                 nfs_free_server(server);
2619                 server = NULL;
2620         } else {
2621                 error = nfs_bdi_register(server);
2622                 if (error)
2623                         goto error_splat_super;
2624         }
2625
2626         if (!s->s_root) {
2627                 /* initial superblock/root creation */
2628                 nfs4_fill_super(s);
2629         }
2630
2631         mntroot = nfs4_get_root(s, &mntfh);
2632         if (IS_ERR(mntroot)) {
2633                 error = PTR_ERR(mntroot);
2634                 goto error_splat_super;
2635         }
2636         if (mntroot->d_inode->i_op != NFS_SB(s)->nfs_client->rpc_ops->dir_inode_ops) {
2637                 dput(mntroot);
2638                 error = -ESTALE;
2639                 goto error_splat_super;
2640         }
2641
2642         s->s_flags |= MS_ACTIVE;
2643         mnt->mnt_sb = s;
2644         mnt->mnt_root = mntroot;
2645
2646         security_sb_clone_mnt_opts(data->sb, s);
2647
2648         dprintk("<-- nfs4_referral_get_sb() = 0\n");
2649         return 0;
2650
2651 out_err_nosb:
2652         nfs_free_server(server);
2653 out_err_noserver:
2654         dprintk("<-- nfs4_referral_get_sb() = %d [error]\n", error);
2655         return error;
2656
2657 error_splat_super:
2658         deactivate_locked_super(s);
2659         dprintk("<-- nfs4_referral_get_sb() = %d [splat]\n", error);
2660         return error;
2661 }
2662
2663 #endif /* CONFIG_NFS_V4 */