linux/fs/nfsd/nfssvc.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Central processing for nfsd.
   4 *
   5 * Authors:     Olaf Kirch (okir@monad.swb.de)
   6 *
   7 * Copyright (C) 1995, 1996, 1997 Olaf Kirch <okir@monad.swb.de>
   8 */
   9
  10#include <linux/sched/signal.h>
  11#include <linux/freezer.h>
  12#include <linux/module.h>
  13#include <linux/fs_struct.h>
  14#include <linux/swap.h>
  15#include <linux/siphash.h>
  16
  17#include <linux/sunrpc/stats.h>
  18#include <linux/sunrpc/svcsock.h>
  19#include <linux/sunrpc/svc_xprt.h>
  20#include <linux/lockd/bind.h>
  21#include <linux/nfsacl.h>
  22#include <linux/seq_file.h>
  23#include <linux/inetdevice.h>
  24#include <net/addrconf.h>
  25#include <net/ipv6.h>
  26#include <net/net_namespace.h>
  27#include "nfsd.h"
  28#include "cache.h"
  29#include "vfs.h"
  30#include "netns.h"
  31#include "filecache.h"
  32
  33#include "trace.h"
  34
  35#define NFSDDBG_FACILITY        NFSDDBG_SVC
  36
  37extern struct svc_program       nfsd_program;
  38static int                      nfsd(void *vrqstp);
  39#if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
  40static int                      nfsd_acl_rpcbind_set(struct net *,
  41                                                     const struct svc_program *,
  42                                                     u32, int,
  43                                                     unsigned short,
  44                                                     unsigned short);
  45static __be32                   nfsd_acl_init_request(struct svc_rqst *,
  46                                                const struct svc_program *,
  47                                                struct svc_process_info *);
  48#endif
  49static int                      nfsd_rpcbind_set(struct net *,
  50                                                 const struct svc_program *,
  51                                                 u32, int,
  52                                                 unsigned short,
  53                                                 unsigned short);
  54static __be32                   nfsd_init_request(struct svc_rqst *,
  55                                                const struct svc_program *,
  56                                                struct svc_process_info *);
  57
  58/*
  59 * nfsd_mutex protects nn->nfsd_serv -- both the pointer itself and some members
  60 * of the svc_serv struct such as ->sv_temp_socks and ->sv_permsocks.
  61 *
  62 * If (out side the lock) nn->nfsd_serv is non-NULL, then it must point to a
  63 * properly initialised 'struct svc_serv' with ->sv_nrthreads > 0 (unless
  64 * nn->keep_active is set).  That number of nfsd threads must
  65 * exist and each must be listed in ->sp_all_threads in some entry of
  66 * ->sv_pools[].
  67 *
  68 * Each active thread holds a counted reference on nn->nfsd_serv, as does
  69 * the nn->keep_active flag and various transient calls to svc_get().
  70 *
  71 * Finally, the nfsd_mutex also protects some of the global variables that are
  72 * accessed when nfsd starts and that are settable via the write_* routines in
  73 * nfsctl.c. In particular:
  74 *
  75 *      user_recovery_dirname
  76 *      user_lease_time
  77 *      nfsd_versions
  78 */
  79DEFINE_MUTEX(nfsd_mutex);
  80
  81/*
  82 * nfsd_drc_lock protects nfsd_drc_max_pages and nfsd_drc_pages_used.
  83 * nfsd_drc_max_pages limits the total amount of memory available for
  84 * version 4.1 DRC caches.
  85 * nfsd_drc_pages_used tracks the current version 4.1 DRC memory usage.
  86 */
  87DEFINE_SPINLOCK(nfsd_drc_lock);
  88unsigned long   nfsd_drc_max_mem;
  89unsigned long   nfsd_drc_mem_used;
  90
  91#if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
  92static struct svc_stat  nfsd_acl_svcstats;
  93static const struct svc_version *nfsd_acl_version[] = {
  94        [2] = &nfsd_acl_version2,
  95        [3] = &nfsd_acl_version3,
  96};
  97
  98#define NFSD_ACL_MINVERS            2
  99#define NFSD_ACL_NRVERS         ARRAY_SIZE(nfsd_acl_version)
 100
 101static struct svc_program       nfsd_acl_program = {
 102        .pg_prog                = NFS_ACL_PROGRAM,
 103        .pg_nvers               = NFSD_ACL_NRVERS,
 104        .pg_vers                = nfsd_acl_version,
 105        .pg_name                = "nfsacl",
 106        .pg_class               = "nfsd",
 107        .pg_stats               = &nfsd_acl_svcstats,
 108        .pg_authenticate        = &svc_set_client,
 109        .pg_init_request        = nfsd_acl_init_request,
 110        .pg_rpcbind_set         = nfsd_acl_rpcbind_set,
 111};
 112
 113static struct svc_stat  nfsd_acl_svcstats = {
 114        .program        = &nfsd_acl_program,
 115};
 116#endif /* defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL) */
 117
 118static const struct svc_version *nfsd_version[] = {
 119        [2] = &nfsd_version2,
 120        [3] = &nfsd_version3,
 121#if defined(CONFIG_NFSD_V4)
 122        [4] = &nfsd_version4,
 123#endif
 124};
 125
 126#define NFSD_MINVERS            2
 127#define NFSD_NRVERS             ARRAY_SIZE(nfsd_version)
 128
 129struct svc_program              nfsd_program = {
 130#if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
 131        .pg_next                = &nfsd_acl_program,
 132#endif
 133        .pg_prog                = NFS_PROGRAM,          /* program number */
 134        .pg_nvers               = NFSD_NRVERS,          /* nr of entries in nfsd_version */
 135        .pg_vers                = nfsd_version,         /* version table */
 136        .pg_name                = "nfsd",               /* program name */
 137        .pg_class               = "nfsd",               /* authentication class */
 138        .pg_stats               = &nfsd_svcstats,       /* version table */
 139        .pg_authenticate        = &svc_set_client,      /* export authentication */
 140        .pg_init_request        = nfsd_init_request,
 141        .pg_rpcbind_set         = nfsd_rpcbind_set,
 142};
 143
 144static bool
 145nfsd_support_version(int vers)
 146{
 147        if (vers >= NFSD_MINVERS && vers < NFSD_NRVERS)
 148                return nfsd_version[vers] != NULL;
 149        return false;
 150}
 151
 152static bool *
 153nfsd_alloc_versions(void)
 154{
 155        bool *vers = kmalloc_array(NFSD_NRVERS, sizeof(bool), GFP_KERNEL);
 156        unsigned i;
 157
 158        if (vers) {
 159                /* All compiled versions are enabled by default */
 160                for (i = 0; i < NFSD_NRVERS; i++)
 161                        vers[i] = nfsd_support_version(i);
 162        }
 163        return vers;
 164}
 165
 166static bool *
 167nfsd_alloc_minorversions(void)
 168{
 169        bool *vers = kmalloc_array(NFSD_SUPPORTED_MINOR_VERSION + 1,
 170                        sizeof(bool), GFP_KERNEL);
 171        unsigned i;
 172
 173        if (vers) {
 174                /* All minor versions are enabled by default */
 175                for (i = 0; i <= NFSD_SUPPORTED_MINOR_VERSION; i++)
 176                        vers[i] = nfsd_support_version(4);
 177        }
 178        return vers;
 179}
 180
 181void
 182nfsd_netns_free_versions(struct nfsd_net *nn)
 183{
 184        kfree(nn->nfsd_versions);
 185        kfree(nn->nfsd4_minorversions);
 186        nn->nfsd_versions = NULL;
 187        nn->nfsd4_minorversions = NULL;
 188}
 189
 190static void
 191nfsd_netns_init_versions(struct nfsd_net *nn)
 192{
 193        if (!nn->nfsd_versions) {
 194                nn->nfsd_versions = nfsd_alloc_versions();
 195                nn->nfsd4_minorversions = nfsd_alloc_minorversions();
 196                if (!nn->nfsd_versions || !nn->nfsd4_minorversions)
 197                        nfsd_netns_free_versions(nn);
 198        }
 199}
 200
 201int nfsd_vers(struct nfsd_net *nn, int vers, enum vers_op change)
 202{
 203        if (vers < NFSD_MINVERS || vers >= NFSD_NRVERS)
 204                return 0;
 205        switch(change) {
 206        case NFSD_SET:
 207                if (nn->nfsd_versions)
 208                        nn->nfsd_versions[vers] = nfsd_support_version(vers);
 209                break;
 210        case NFSD_CLEAR:
 211                nfsd_netns_init_versions(nn);
 212                if (nn->nfsd_versions)
 213                        nn->nfsd_versions[vers] = false;
 214                break;
 215        case NFSD_TEST:
 216                if (nn->nfsd_versions)
 217                        return nn->nfsd_versions[vers];
 218                fallthrough;
 219        case NFSD_AVAIL:
 220                return nfsd_support_version(vers);
 221        }
 222        return 0;
 223}
 224
 225static void
 226nfsd_adjust_nfsd_versions4(struct nfsd_net *nn)
 227{
 228        unsigned i;
 229
 230        for (i = 0; i <= NFSD_SUPPORTED_MINOR_VERSION; i++) {
 231                if (nn->nfsd4_minorversions[i])
 232                        return;
 233        }
 234        nfsd_vers(nn, 4, NFSD_CLEAR);
 235}
 236
 237int nfsd_minorversion(struct nfsd_net *nn, u32 minorversion, enum vers_op change)
 238{
 239        if (minorversion > NFSD_SUPPORTED_MINOR_VERSION &&
 240            change != NFSD_AVAIL)
 241                return -1;
 242
 243        switch(change) {
 244        case NFSD_SET:
 245                if (nn->nfsd4_minorversions) {
 246                        nfsd_vers(nn, 4, NFSD_SET);
 247                        nn->nfsd4_minorversions[minorversion] =
 248                                nfsd_vers(nn, 4, NFSD_TEST);
 249                }
 250                break;
 251        case NFSD_CLEAR:
 252                nfsd_netns_init_versions(nn);
 253                if (nn->nfsd4_minorversions) {
 254                        nn->nfsd4_minorversions[minorversion] = false;
 255                        nfsd_adjust_nfsd_versions4(nn);
 256                }
 257                break;
 258        case NFSD_TEST:
 259                if (nn->nfsd4_minorversions)
 260                        return nn->nfsd4_minorversions[minorversion];
 261                return nfsd_vers(nn, 4, NFSD_TEST);
 262        case NFSD_AVAIL:
 263                return minorversion <= NFSD_SUPPORTED_MINOR_VERSION &&
 264                        nfsd_vers(nn, 4, NFSD_AVAIL);
 265        }
 266        return 0;
 267}
 268
 269/*
 270 * Maximum number of nfsd processes
 271 */
 272#define NFSD_MAXSERVS           8192
 273
 274int nfsd_nrthreads(struct net *net)
 275{
 276        int rv = 0;
 277        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 278
 279        mutex_lock(&nfsd_mutex);
 280        if (nn->nfsd_serv)
 281                rv = nn->nfsd_serv->sv_nrthreads;
 282        mutex_unlock(&nfsd_mutex);
 283        return rv;
 284}
 285
 286static int nfsd_init_socks(struct net *net, const struct cred *cred)
 287{
 288        int error;
 289        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 290
 291        if (!list_empty(&nn->nfsd_serv->sv_permsocks))
 292                return 0;
 293
 294        error = svc_xprt_create(nn->nfsd_serv, "udp", net, PF_INET, NFS_PORT,
 295                                SVC_SOCK_DEFAULTS, cred);
 296        if (error < 0)
 297                return error;
 298
 299        error = svc_xprt_create(nn->nfsd_serv, "tcp", net, PF_INET, NFS_PORT,
 300                                SVC_SOCK_DEFAULTS, cred);
 301        if (error < 0)
 302                return error;
 303
 304        return 0;
 305}
 306
 307static int nfsd_users = 0;
 308
 309static int nfsd_startup_generic(void)
 310{
 311        int ret;
 312
 313        if (nfsd_users++)
 314                return 0;
 315
 316        ret = nfsd_file_cache_init();
 317        if (ret)
 318                goto dec_users;
 319
 320        ret = nfs4_state_start();
 321        if (ret)
 322                goto out_file_cache;
 323        return 0;
 324
 325out_file_cache:
 326        nfsd_file_cache_shutdown();
 327dec_users:
 328        nfsd_users--;
 329        return ret;
 330}
 331
 332static void nfsd_shutdown_generic(void)
 333{
 334        if (--nfsd_users)
 335                return;
 336
 337        nfs4_state_shutdown();
 338        nfsd_file_cache_shutdown();
 339}
 340
 341static bool nfsd_needs_lockd(struct nfsd_net *nn)
 342{
 343        return nfsd_vers(nn, 2, NFSD_TEST) || nfsd_vers(nn, 3, NFSD_TEST);
 344}
 345
 346/**
 347 * nfsd_copy_write_verifier - Atomically copy a write verifier
 348 * @verf: buffer in which to receive the verifier cookie
 349 * @nn: NFS net namespace
 350 *
 351 * This function provides a wait-free mechanism for copying the
 352 * namespace's write verifier without tearing it.
 353 */
 354void nfsd_copy_write_verifier(__be32 verf[2], struct nfsd_net *nn)
 355{
 356        int seq = 0;
 357
 358        do {
 359                read_seqbegin_or_lock(&nn->writeverf_lock, &seq);
 360                memcpy(verf, nn->writeverf, sizeof(*verf));
 361        } while (need_seqretry(&nn->writeverf_lock, seq));
 362        done_seqretry(&nn->writeverf_lock, seq);
 363}
 364
 365static void nfsd_reset_write_verifier_locked(struct nfsd_net *nn)
 366{
 367        struct timespec64 now;
 368        u64 verf;
 369
 370        /*
 371         * Because the time value is hashed, y2038 time_t overflow
 372         * is irrelevant in this usage.
 373         */
 374        ktime_get_raw_ts64(&now);
 375        verf = siphash_2u64(now.tv_sec, now.tv_nsec, &nn->siphash_key);
 376        memcpy(nn->writeverf, &verf, sizeof(nn->writeverf));
 377}
 378
 379/**
 380 * nfsd_reset_write_verifier - Generate a new write verifier
 381 * @nn: NFS net namespace
 382 *
 383 * This function updates the ->writeverf field of @nn. This field
 384 * contains an opaque cookie that, according to Section 18.32.3 of
 385 * RFC 8881, "the client can use to determine whether a server has
 386 * changed instance state (e.g., server restart) between a call to
 387 * WRITE and a subsequent call to either WRITE or COMMIT.  This
 388 * cookie MUST be unchanged during a single instance of the NFSv4.1
 389 * server and MUST be unique between instances of the NFSv4.1
 390 * server."
 391 */
 392void nfsd_reset_write_verifier(struct nfsd_net *nn)
 393{
 394        write_seqlock(&nn->writeverf_lock);
 395        nfsd_reset_write_verifier_locked(nn);
 396        write_sequnlock(&nn->writeverf_lock);
 397}
 398
 399static int nfsd_startup_net(struct net *net, const struct cred *cred)
 400{
 401        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 402        int ret;
 403
 404        if (nn->nfsd_net_up)
 405                return 0;
 406
 407        ret = nfsd_startup_generic();
 408        if (ret)
 409                return ret;
 410        ret = nfsd_init_socks(net, cred);
 411        if (ret)
 412                goto out_socks;
 413
 414        if (nfsd_needs_lockd(nn) && !nn->lockd_up) {
 415                ret = lockd_up(net, cred);
 416                if (ret)
 417                        goto out_socks;
 418                nn->lockd_up = true;
 419        }
 420
 421        ret = nfsd_file_cache_start_net(net);
 422        if (ret)
 423                goto out_lockd;
 424        ret = nfs4_state_start_net(net);
 425        if (ret)
 426                goto out_filecache;
 427
 428#ifdef CONFIG_NFSD_V4_2_INTER_SSC
 429        nfsd4_ssc_init_umount_work(nn);
 430#endif
 431        nn->nfsd_net_up = true;
 432        return 0;
 433
 434out_filecache:
 435        nfsd_file_cache_shutdown_net(net);
 436out_lockd:
 437        if (nn->lockd_up) {
 438                lockd_down(net);
 439                nn->lockd_up = false;
 440        }
 441out_socks:
 442        nfsd_shutdown_generic();
 443        return ret;
 444}
 445
 446static void nfsd_shutdown_net(struct net *net)
 447{
 448        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 449
 450        nfsd_file_cache_shutdown_net(net);
 451        nfs4_state_shutdown_net(net);
 452        if (nn->lockd_up) {
 453                lockd_down(net);
 454                nn->lockd_up = false;
 455        }
 456        nn->nfsd_net_up = false;
 457        nfsd_shutdown_generic();
 458}
 459
 460static DEFINE_SPINLOCK(nfsd_notifier_lock);
 461static int nfsd_inetaddr_event(struct notifier_block *this, unsigned long event,
 462        void *ptr)
 463{
 464        struct in_ifaddr *ifa = (struct in_ifaddr *)ptr;
 465        struct net_device *dev = ifa->ifa_dev->dev;
 466        struct net *net = dev_net(dev);
 467        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 468        struct sockaddr_in sin;
 469
 470        if (event != NETDEV_DOWN || !nn->nfsd_serv)
 471                goto out;
 472
 473        spin_lock(&nfsd_notifier_lock);
 474        if (nn->nfsd_serv) {
 475                dprintk("nfsd_inetaddr_event: removed %pI4\n", &ifa->ifa_local);
 476                sin.sin_family = AF_INET;
 477                sin.sin_addr.s_addr = ifa->ifa_local;
 478                svc_age_temp_xprts_now(nn->nfsd_serv, (struct sockaddr *)&sin);
 479        }
 480        spin_unlock(&nfsd_notifier_lock);
 481
 482out:
 483        return NOTIFY_DONE;
 484}
 485
 486static struct notifier_block nfsd_inetaddr_notifier = {
 487        .notifier_call = nfsd_inetaddr_event,
 488};
 489
 490#if IS_ENABLED(CONFIG_IPV6)
 491static int nfsd_inet6addr_event(struct notifier_block *this,
 492        unsigned long event, void *ptr)
 493{
 494        struct inet6_ifaddr *ifa = (struct inet6_ifaddr *)ptr;
 495        struct net_device *dev = ifa->idev->dev;
 496        struct net *net = dev_net(dev);
 497        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 498        struct sockaddr_in6 sin6;
 499
 500        if (event != NETDEV_DOWN || !nn->nfsd_serv)
 501                goto out;
 502
 503        spin_lock(&nfsd_notifier_lock);
 504        if (nn->nfsd_serv) {
 505                dprintk("nfsd_inet6addr_event: removed %pI6\n", &ifa->addr);
 506                sin6.sin6_family = AF_INET6;
 507                sin6.sin6_addr = ifa->addr;
 508                if (ipv6_addr_type(&sin6.sin6_addr) & IPV6_ADDR_LINKLOCAL)
 509                        sin6.sin6_scope_id = ifa->idev->dev->ifindex;
 510                svc_age_temp_xprts_now(nn->nfsd_serv, (struct sockaddr *)&sin6);
 511        }
 512        spin_unlock(&nfsd_notifier_lock);
 513
 514out:
 515        return NOTIFY_DONE;
 516}
 517
 518static struct notifier_block nfsd_inet6addr_notifier = {
 519        .notifier_call = nfsd_inet6addr_event,
 520};
 521#endif
 522
 523/* Only used under nfsd_mutex, so this atomic may be overkill: */
 524static atomic_t nfsd_notifier_refcount = ATOMIC_INIT(0);
 525
 526static void nfsd_last_thread(struct svc_serv *serv, struct net *net)
 527{
 528        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 529
 530        /* check if the notifier still has clients */
 531        if (atomic_dec_return(&nfsd_notifier_refcount) == 0) {
 532                unregister_inetaddr_notifier(&nfsd_inetaddr_notifier);
 533#if IS_ENABLED(CONFIG_IPV6)
 534                unregister_inet6addr_notifier(&nfsd_inet6addr_notifier);
 535#endif
 536        }
 537
 538        /*
 539         * write_ports can create the server without actually starting
 540         * any threads--if we get shut down before any threads are
 541         * started, then nfsd_last_thread will be run before any of this
 542         * other initialization has been done except the rpcb information.
 543         */
 544        svc_rpcb_cleanup(serv, net);
 545        if (!nn->nfsd_net_up)
 546                return;
 547
 548        nfsd_shutdown_net(net);
 549        pr_info("nfsd: last server has exited, flushing export cache\n");
 550        nfsd_export_flush(net);
 551}
 552
 553void nfsd_reset_versions(struct nfsd_net *nn)
 554{
 555        int i;
 556
 557        for (i = 0; i < NFSD_NRVERS; i++)
 558                if (nfsd_vers(nn, i, NFSD_TEST))
 559                        return;
 560
 561        for (i = 0; i < NFSD_NRVERS; i++)
 562                if (i != 4)
 563                        nfsd_vers(nn, i, NFSD_SET);
 564                else {
 565                        int minor = 0;
 566                        while (nfsd_minorversion(nn, minor, NFSD_SET) >= 0)
 567                                minor++;
 568                }
 569}
 570
 571/*
 572 * Each session guarantees a negotiated per slot memory cache for replies
 573 * which in turn consumes memory beyond the v2/v3/v4.0 server. A dedicated
 574 * NFSv4.1 server might want to use more memory for a DRC than a machine
 575 * with mutiple services.
 576 *
 577 * Impose a hard limit on the number of pages for the DRC which varies
 578 * according to the machines free pages. This is of course only a default.
 579 *
 580 * For now this is a #defined shift which could be under admin control
 581 * in the future.
 582 */
 583static void set_max_drc(void)
 584{
 585        #define NFSD_DRC_SIZE_SHIFT     7
 586        nfsd_drc_max_mem = (nr_free_buffer_pages()
 587                                        >> NFSD_DRC_SIZE_SHIFT) * PAGE_SIZE;
 588        nfsd_drc_mem_used = 0;
 589        dprintk("%s nfsd_drc_max_mem %lu \n", __func__, nfsd_drc_max_mem);
 590}
 591
 592static int nfsd_get_default_max_blksize(void)
 593{
 594        struct sysinfo i;
 595        unsigned long long target;
 596        unsigned long ret;
 597
 598        si_meminfo(&i);
 599        target = (i.totalram - i.totalhigh) << PAGE_SHIFT;
 600        /*
 601         * Aim for 1/4096 of memory per thread This gives 1MB on 4Gig
 602         * machines, but only uses 32K on 128M machines.  Bottom out at
 603         * 8K on 32M and smaller.  Of course, this is only a default.
 604         */
 605        target >>= 12;
 606
 607        ret = NFSSVC_MAXBLKSIZE;
 608        while (ret > target && ret >= 8*1024*2)
 609                ret /= 2;
 610        return ret;
 611}
 612
 613void nfsd_shutdown_threads(struct net *net)
 614{
 615        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 616        struct svc_serv *serv;
 617
 618        mutex_lock(&nfsd_mutex);
 619        serv = nn->nfsd_serv;
 620        if (serv == NULL) {
 621                mutex_unlock(&nfsd_mutex);
 622                return;
 623        }
 624
 625        svc_get(serv);
 626        /* Kill outstanding nfsd threads */
 627        svc_set_num_threads(serv, NULL, 0);
 628        nfsd_put(net);
 629        mutex_unlock(&nfsd_mutex);
 630}
 631
 632bool i_am_nfsd(void)
 633{
 634        return kthread_func(current) == nfsd;
 635}
 636
 637int nfsd_create_serv(struct net *net)
 638{
 639        int error;
 640        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 641        struct svc_serv *serv;
 642
 643        WARN_ON(!mutex_is_locked(&nfsd_mutex));
 644        if (nn->nfsd_serv) {
 645                svc_get(nn->nfsd_serv);
 646                return 0;
 647        }
 648        if (nfsd_max_blksize == 0)
 649                nfsd_max_blksize = nfsd_get_default_max_blksize();
 650        nfsd_reset_versions(nn);
 651        serv = svc_create_pooled(&nfsd_program, nfsd_max_blksize, nfsd);
 652        if (serv == NULL)
 653                return -ENOMEM;
 654
 655        serv->sv_maxconn = nn->max_connections;
 656        error = svc_bind(serv, net);
 657        if (error < 0) {
 658                /* NOT nfsd_put() as notifiers (see below) haven't
 659                 * been set up yet.
 660                 */
 661                svc_put(serv);
 662                return error;
 663        }
 664        spin_lock(&nfsd_notifier_lock);
 665        nn->nfsd_serv = serv;
 666        spin_unlock(&nfsd_notifier_lock);
 667
 668        set_max_drc();
 669        /* check if the notifier is already set */
 670        if (atomic_inc_return(&nfsd_notifier_refcount) == 1) {
 671                register_inetaddr_notifier(&nfsd_inetaddr_notifier);
 672#if IS_ENABLED(CONFIG_IPV6)
 673                register_inet6addr_notifier(&nfsd_inet6addr_notifier);
 674#endif
 675        }
 676        nfsd_reset_write_verifier(nn);
 677        return 0;
 678}
 679
 680int nfsd_nrpools(struct net *net)
 681{
 682        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 683
 684        if (nn->nfsd_serv == NULL)
 685                return 0;
 686        else
 687                return nn->nfsd_serv->sv_nrpools;
 688}
 689
 690int nfsd_get_nrthreads(int n, int *nthreads, struct net *net)
 691{
 692        int i = 0;
 693        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 694
 695        if (nn->nfsd_serv != NULL) {
 696                for (i = 0; i < nn->nfsd_serv->sv_nrpools && i < n; i++)
 697                        nthreads[i] = nn->nfsd_serv->sv_pools[i].sp_nrthreads;
 698        }
 699
 700        return 0;
 701}
 702
 703/* This is the callback for kref_put() below.
 704 * There is no code here as the first thing to be done is
 705 * call svc_shutdown_net(), but we cannot get the 'net' from
 706 * the kref.  So do all the work when kref_put returns true.
 707 */
 708static void nfsd_noop(struct kref *ref)
 709{
 710}
 711
 712void nfsd_put(struct net *net)
 713{
 714        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 715
 716        if (kref_put(&nn->nfsd_serv->sv_refcnt, nfsd_noop)) {
 717                svc_xprt_destroy_all(nn->nfsd_serv, net);
 718                nfsd_last_thread(nn->nfsd_serv, net);
 719                svc_destroy(&nn->nfsd_serv->sv_refcnt);
 720                spin_lock(&nfsd_notifier_lock);
 721                nn->nfsd_serv = NULL;
 722                spin_unlock(&nfsd_notifier_lock);
 723        }
 724}
 725
 726int nfsd_set_nrthreads(int n, int *nthreads, struct net *net)
 727{
 728        int i = 0;
 729        int tot = 0;
 730        int err = 0;
 731        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 732
 733        WARN_ON(!mutex_is_locked(&nfsd_mutex));
 734
 735        if (nn->nfsd_serv == NULL || n <= 0)
 736                return 0;
 737
 738        if (n > nn->nfsd_serv->sv_nrpools)
 739                n = nn->nfsd_serv->sv_nrpools;
 740
 741        /* enforce a global maximum number of threads */
 742        tot = 0;
 743        for (i = 0; i < n; i++) {
 744                nthreads[i] = min(nthreads[i], NFSD_MAXSERVS);
 745                tot += nthreads[i];
 746        }
 747        if (tot > NFSD_MAXSERVS) {
 748                /* total too large: scale down requested numbers */
 749                for (i = 0; i < n && tot > 0; i++) {
 750                        int new = nthreads[i] * NFSD_MAXSERVS / tot;
 751                        tot -= (nthreads[i] - new);
 752                        nthreads[i] = new;
 753                }
 754                for (i = 0; i < n && tot > 0; i++) {
 755                        nthreads[i]--;
 756                        tot--;
 757                }
 758        }
 759
 760        /*
 761         * There must always be a thread in pool 0; the admin
 762         * can't shut down NFS completely using pool_threads.
 763         */
 764        if (nthreads[0] == 0)
 765                nthreads[0] = 1;
 766
 767        /* apply the new numbers */
 768        svc_get(nn->nfsd_serv);
 769        for (i = 0; i < n; i++) {
 770                err = svc_set_num_threads(nn->nfsd_serv,
 771                                          &nn->nfsd_serv->sv_pools[i],
 772                                          nthreads[i]);
 773                if (err)
 774                        break;
 775        }
 776        nfsd_put(net);
 777        return err;
 778}
 779
 780/*
 781 * Adjust the number of threads and return the new number of threads.
 782 * This is also the function that starts the server if necessary, if
 783 * this is the first time nrservs is nonzero.
 784 */
 785int
 786nfsd_svc(int nrservs, struct net *net, const struct cred *cred)
 787{
 788        int     error;
 789        bool    nfsd_up_before;
 790        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 791
 792        mutex_lock(&nfsd_mutex);
 793        dprintk("nfsd: creating service\n");
 794
 795        nrservs = max(nrservs, 0);
 796        nrservs = min(nrservs, NFSD_MAXSERVS);
 797        error = 0;
 798
 799        if (nrservs == 0 && nn->nfsd_serv == NULL)
 800                goto out;
 801
 802        strlcpy(nn->nfsd_name, utsname()->nodename,
 803                sizeof(nn->nfsd_name));
 804
 805        error = nfsd_create_serv(net);
 806        if (error)
 807                goto out;
 808
 809        nfsd_up_before = nn->nfsd_net_up;
 810
 811        error = nfsd_startup_net(net, cred);
 812        if (error)
 813                goto out_put;
 814        error = svc_set_num_threads(nn->nfsd_serv, NULL, nrservs);
 815        if (error)
 816                goto out_shutdown;
 817        error = nn->nfsd_serv->sv_nrthreads;
 818out_shutdown:
 819        if (error < 0 && !nfsd_up_before)
 820                nfsd_shutdown_net(net);
 821out_put:
 822        /* Threads now hold service active */
 823        if (xchg(&nn->keep_active, 0))
 824                nfsd_put(net);
 825        nfsd_put(net);
 826out:
 827        mutex_unlock(&nfsd_mutex);
 828        return error;
 829}
 830
 831#if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
 832static bool
 833nfsd_support_acl_version(int vers)
 834{
 835        if (vers >= NFSD_ACL_MINVERS && vers < NFSD_ACL_NRVERS)
 836                return nfsd_acl_version[vers] != NULL;
 837        return false;
 838}
 839
 840static int
 841nfsd_acl_rpcbind_set(struct net *net, const struct svc_program *progp,
 842                     u32 version, int family, unsigned short proto,
 843                     unsigned short port)
 844{
 845        if (!nfsd_support_acl_version(version) ||
 846            !nfsd_vers(net_generic(net, nfsd_net_id), version, NFSD_TEST))
 847                return 0;
 848        return svc_generic_rpcbind_set(net, progp, version, family,
 849                        proto, port);
 850}
 851
 852static __be32
 853nfsd_acl_init_request(struct svc_rqst *rqstp,
 854                      const struct svc_program *progp,
 855                      struct svc_process_info *ret)
 856{
 857        struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
 858        int i;
 859
 860        if (likely(nfsd_support_acl_version(rqstp->rq_vers) &&
 861            nfsd_vers(nn, rqstp->rq_vers, NFSD_TEST)))
 862                return svc_generic_init_request(rqstp, progp, ret);
 863
 864        ret->mismatch.lovers = NFSD_ACL_NRVERS;
 865        for (i = NFSD_ACL_MINVERS; i < NFSD_ACL_NRVERS; i++) {
 866                if (nfsd_support_acl_version(rqstp->rq_vers) &&
 867                    nfsd_vers(nn, i, NFSD_TEST)) {
 868                        ret->mismatch.lovers = i;
 869                        break;
 870                }
 871        }
 872        if (ret->mismatch.lovers == NFSD_ACL_NRVERS)
 873                return rpc_prog_unavail;
 874        ret->mismatch.hivers = NFSD_ACL_MINVERS;
 875        for (i = NFSD_ACL_NRVERS - 1; i >= NFSD_ACL_MINVERS; i--) {
 876                if (nfsd_support_acl_version(rqstp->rq_vers) &&
 877                    nfsd_vers(nn, i, NFSD_TEST)) {
 878                        ret->mismatch.hivers = i;
 879                        break;
 880                }
 881        }
 882        return rpc_prog_mismatch;
 883}
 884#endif
 885
 886static int
 887nfsd_rpcbind_set(struct net *net, const struct svc_program *progp,
 888                 u32 version, int family, unsigned short proto,
 889                 unsigned short port)
 890{
 891        if (!nfsd_vers(net_generic(net, nfsd_net_id), version, NFSD_TEST))
 892                return 0;
 893        return svc_generic_rpcbind_set(net, progp, version, family,
 894                        proto, port);
 895}
 896
 897static __be32
 898nfsd_init_request(struct svc_rqst *rqstp,
 899                  const struct svc_program *progp,
 900                  struct svc_process_info *ret)
 901{
 902        struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
 903        int i;
 904
 905        if (likely(nfsd_vers(nn, rqstp->rq_vers, NFSD_TEST)))
 906                return svc_generic_init_request(rqstp, progp, ret);
 907
 908        ret->mismatch.lovers = NFSD_NRVERS;
 909        for (i = NFSD_MINVERS; i < NFSD_NRVERS; i++) {
 910                if (nfsd_vers(nn, i, NFSD_TEST)) {
 911                        ret->mismatch.lovers = i;
 912                        break;
 913                }
 914        }
 915        if (ret->mismatch.lovers == NFSD_NRVERS)
 916                return rpc_prog_unavail;
 917        ret->mismatch.hivers = NFSD_MINVERS;
 918        for (i = NFSD_NRVERS - 1; i >= NFSD_MINVERS; i--) {
 919                if (nfsd_vers(nn, i, NFSD_TEST)) {
 920                        ret->mismatch.hivers = i;
 921                        break;
 922                }
 923        }
 924        return rpc_prog_mismatch;
 925}
 926
 927/*
 928 * This is the NFS server kernel thread
 929 */
 930static int
 931nfsd(void *vrqstp)
 932{
 933        struct svc_rqst *rqstp = (struct svc_rqst *) vrqstp;
 934        struct svc_xprt *perm_sock = list_entry(rqstp->rq_server->sv_permsocks.next, typeof(struct svc_xprt), xpt_list);
 935        struct net *net = perm_sock->xpt_net;
 936        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 937        int err;
 938
 939        /* At this point, the thread shares current->fs
 940         * with the init process. We need to create files with the
 941         * umask as defined by the client instead of init's umask. */
 942        if (unshare_fs_struct() < 0) {
 943                printk("Unable to start nfsd thread: out of memory\n");
 944                goto out;
 945        }
 946
 947        current->fs->umask = 0;
 948
 949        /*
 950         * thread is spawned with all signals set to SIG_IGN, re-enable
 951         * the ones that will bring down the thread
 952         */
 953        allow_signal(SIGKILL);
 954        allow_signal(SIGHUP);
 955        allow_signal(SIGINT);
 956        allow_signal(SIGQUIT);
 957
 958        atomic_inc(&nfsdstats.th_cnt);
 959
 960        set_freezable();
 961
 962        /*
 963         * The main request loop
 964         */
 965        for (;;) {
 966                /* Update sv_maxconn if it has changed */
 967                rqstp->rq_server->sv_maxconn = nn->max_connections;
 968
 969                /*
 970                 * Find a socket with data available and call its
 971                 * recvfrom routine.
 972                 */
 973                while ((err = svc_recv(rqstp, 60*60*HZ)) == -EAGAIN)
 974                        ;
 975                if (err == -EINTR)
 976                        break;
 977                validate_process_creds();
 978                svc_process(rqstp);
 979                validate_process_creds();
 980        }
 981
 982        /* Clear signals before calling svc_exit_thread() */
 983        flush_signals(current);
 984
 985        atomic_dec(&nfsdstats.th_cnt);
 986
 987out:
 988        /* Take an extra ref so that the svc_put in svc_exit_thread()
 989         * doesn't call svc_destroy()
 990         */
 991        svc_get(nn->nfsd_serv);
 992
 993        /* Release the thread */
 994        svc_exit_thread(rqstp);
 995
 996        /* We need to drop a ref, but may not drop the last reference
 997         * without holding nfsd_mutex, and we cannot wait for nfsd_mutex as that
 998         * could deadlock with nfsd_shutdown_threads() waiting for us.
 999         * So three options are:
1000         * - drop a non-final reference,
1001         * - get the mutex without waiting
1002         * - sleep briefly andd try the above again
1003         */
1004        while (!svc_put_not_last(nn->nfsd_serv)) {
1005                if (mutex_trylock(&nfsd_mutex)) {
1006                        nfsd_put(net);
1007                        mutex_unlock(&nfsd_mutex);
1008                        break;
1009                }
1010                msleep(20);
1011        }
1012
1013        return 0;
1014}
1015
1016/**
1017 * nfsd_dispatch - Process an NFS or NFSACL Request
1018 * @rqstp: incoming request
1019 * @statp: pointer to location of accept_stat field in RPC Reply buffer
1020 *
1021 * This RPC dispatcher integrates the NFS server's duplicate reply cache.
1022 *
1023 * Return values:
1024 *  %0: Processing complete; do not send a Reply
1025 *  %1: Processing complete; send Reply in rqstp->rq_res
1026 */
1027int nfsd_dispatch(struct svc_rqst *rqstp, __be32 *statp)
1028{
1029        const struct svc_procedure *proc = rqstp->rq_procinfo;
1030
1031        /*
1032         * Give the xdr decoder a chance to change this if it wants
1033         * (necessary in the NFSv4.0 compound case)
1034         */
1035        rqstp->rq_cachetype = proc->pc_cachetype;
1036
1037        svcxdr_init_decode(rqstp);
1038        if (!proc->pc_decode(rqstp, &rqstp->rq_arg_stream))
1039                goto out_decode_err;
1040
1041        switch (nfsd_cache_lookup(rqstp)) {
1042        case RC_DOIT:
1043                break;
1044        case RC_REPLY:
1045                goto out_cached_reply;
1046        case RC_DROPIT:
1047                goto out_dropit;
1048        }
1049
1050        /*
1051         * Need to grab the location to store the status, as
1052         * NFSv4 does some encoding while processing
1053         */
1054        svcxdr_init_encode(rqstp);
1055
1056        *statp = proc->pc_func(rqstp);
1057        if (*statp == rpc_drop_reply || test_bit(RQ_DROPME, &rqstp->rq_flags))
1058                goto out_update_drop;
1059
1060        if (!proc->pc_encode(rqstp, &rqstp->rq_res_stream))
1061                goto out_encode_err;
1062
1063        nfsd_cache_update(rqstp, rqstp->rq_cachetype, statp + 1);
1064out_cached_reply:
1065        return 1;
1066
1067out_decode_err:
1068        trace_nfsd_garbage_args_err(rqstp);
1069        *statp = rpc_garbage_args;
1070        return 1;
1071
1072out_update_drop:
1073        nfsd_cache_update(rqstp, RC_NOCACHE, NULL);
1074out_dropit:
1075        return 0;
1076
1077out_encode_err:
1078        trace_nfsd_cant_encode_err(rqstp);
1079        nfsd_cache_update(rqstp, RC_NOCACHE, NULL);
1080        *statp = rpc_system_err;
1081        return 1;
1082}
1083
1084/**
1085 * nfssvc_decode_voidarg - Decode void arguments
1086 * @rqstp: Server RPC transaction context
1087 * @xdr: XDR stream positioned at arguments to decode
1088 *
1089 * Return values:
1090 *   %false: Arguments were not valid
1091 *   %true: Decoding was successful
1092 */
1093bool nfssvc_decode_voidarg(struct svc_rqst *rqstp, struct xdr_stream *xdr)
1094{
1095        return true;
1096}
1097
1098/**
1099 * nfssvc_encode_voidres - Encode void results
1100 * @rqstp: Server RPC transaction context
1101 * @xdr: XDR stream into which to encode results
1102 *
1103 * Return values:
1104 *   %false: Local error while encoding
1105 *   %true: Encoding was successful
1106 */
1107bool nfssvc_encode_voidres(struct svc_rqst *rqstp, struct xdr_stream *xdr)
1108{
1109        return true;
1110}
1111
1112int nfsd_pool_stats_open(struct inode *inode, struct file *file)
1113{
1114        int ret;
1115        struct nfsd_net *nn = net_generic(inode->i_sb->s_fs_info, nfsd_net_id);
1116
1117        mutex_lock(&nfsd_mutex);
1118        if (nn->nfsd_serv == NULL) {
1119                mutex_unlock(&nfsd_mutex);
1120                return -ENODEV;
1121        }
1122        svc_get(nn->nfsd_serv);
1123        ret = svc_pool_stats_open(nn->nfsd_serv, file);
1124        mutex_unlock(&nfsd_mutex);
1125        return ret;
1126}
1127
1128int nfsd_pool_stats_release(struct inode *inode, struct file *file)
1129{
1130        int ret = seq_release(inode, file);
1131        struct net *net = inode->i_sb->s_fs_info;
1132
1133        mutex_lock(&nfsd_mutex);
1134        nfsd_put(net);
1135        mutex_unlock(&nfsd_mutex);
1136        return ret;
1137}
1138