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