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