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