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