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