LCOV - code coverage report
Current view: top level - net/sunrpc - svc.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 0 669 0.0 %
Date: 2022-04-01 13:59:58 Functions: 0 42 0.0 %
Branches: 0 330 0.0 %

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: GPL-2.0-only
       2                 :            : /*
       3                 :            :  * linux/net/sunrpc/svc.c
       4                 :            :  *
       5                 :            :  * High-level RPC service routines
       6                 :            :  *
       7                 :            :  * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
       8                 :            :  *
       9                 :            :  * Multiple threads pools and NUMAisation
      10                 :            :  * Copyright (c) 2006 Silicon Graphics, Inc.
      11                 :            :  * by Greg Banks <gnb@melbourne.sgi.com>
      12                 :            :  */
      13                 :            : 
      14                 :            : #include <linux/linkage.h>
      15                 :            : #include <linux/sched/signal.h>
      16                 :            : #include <linux/errno.h>
      17                 :            : #include <linux/net.h>
      18                 :            : #include <linux/in.h>
      19                 :            : #include <linux/mm.h>
      20                 :            : #include <linux/interrupt.h>
      21                 :            : #include <linux/module.h>
      22                 :            : #include <linux/kthread.h>
      23                 :            : #include <linux/slab.h>
      24                 :            : 
      25                 :            : #include <linux/sunrpc/types.h>
      26                 :            : #include <linux/sunrpc/xdr.h>
      27                 :            : #include <linux/sunrpc/stats.h>
      28                 :            : #include <linux/sunrpc/svcsock.h>
      29                 :            : #include <linux/sunrpc/clnt.h>
      30                 :            : #include <linux/sunrpc/bc_xprt.h>
      31                 :            : 
      32                 :            : #include <trace/events/sunrpc.h>
      33                 :            : 
      34                 :            : #define RPCDBG_FACILITY RPCDBG_SVCDSP
      35                 :            : 
      36                 :            : static void svc_unregister(const struct svc_serv *serv, struct net *net);
      37                 :            : 
      38                 :            : #define svc_serv_is_pooled(serv)    ((serv)->sv_ops->svo_function)
      39                 :            : 
      40                 :            : #define SVC_POOL_DEFAULT        SVC_POOL_GLOBAL
      41                 :            : 
      42                 :            : /*
      43                 :            :  * Structure for mapping cpus to pools and vice versa.
      44                 :            :  * Setup once during sunrpc initialisation.
      45                 :            :  */
      46                 :            : struct svc_pool_map svc_pool_map = {
      47                 :            :         .mode = SVC_POOL_DEFAULT
      48                 :            : };
      49                 :            : EXPORT_SYMBOL_GPL(svc_pool_map);
      50                 :            : 
      51                 :            : static DEFINE_MUTEX(svc_pool_map_mutex);/* protects svc_pool_map.count only */
      52                 :            : 
      53                 :            : static int
      54                 :          0 : param_set_pool_mode(const char *val, const struct kernel_param *kp)
      55                 :            : {
      56                 :          0 :         int *ip = (int *)kp->arg;
      57                 :          0 :         struct svc_pool_map *m = &svc_pool_map;
      58                 :          0 :         int err;
      59                 :            : 
      60                 :          0 :         mutex_lock(&svc_pool_map_mutex);
      61                 :            : 
      62                 :          0 :         err = -EBUSY;
      63         [ #  # ]:          0 :         if (m->count)
      64                 :          0 :                 goto out;
      65                 :            : 
      66                 :          0 :         err = 0;
      67         [ #  # ]:          0 :         if (!strncmp(val, "auto", 4))
      68                 :          0 :                 *ip = SVC_POOL_AUTO;
      69         [ #  # ]:          0 :         else if (!strncmp(val, "global", 6))
      70                 :          0 :                 *ip = SVC_POOL_GLOBAL;
      71         [ #  # ]:          0 :         else if (!strncmp(val, "percpu", 6))
      72                 :          0 :                 *ip = SVC_POOL_PERCPU;
      73         [ #  # ]:          0 :         else if (!strncmp(val, "pernode", 7))
      74                 :          0 :                 *ip = SVC_POOL_PERNODE;
      75                 :            :         else
      76                 :            :                 err = -EINVAL;
      77                 :            : 
      78                 :          0 : out:
      79                 :          0 :         mutex_unlock(&svc_pool_map_mutex);
      80                 :          0 :         return err;
      81                 :            : }
      82                 :            : 
      83                 :            : static int
      84                 :          0 : param_get_pool_mode(char *buf, const struct kernel_param *kp)
      85                 :            : {
      86                 :          0 :         int *ip = (int *)kp->arg;
      87                 :            : 
      88   [ #  #  #  #  :          0 :         switch (*ip)
                      # ]
      89                 :            :         {
      90                 :          0 :         case SVC_POOL_AUTO:
      91                 :          0 :                 return strlcpy(buf, "auto", 20);
      92                 :          0 :         case SVC_POOL_GLOBAL:
      93                 :          0 :                 return strlcpy(buf, "global", 20);
      94                 :          0 :         case SVC_POOL_PERCPU:
      95                 :          0 :                 return strlcpy(buf, "percpu", 20);
      96                 :          0 :         case SVC_POOL_PERNODE:
      97                 :          0 :                 return strlcpy(buf, "pernode", 20);
      98                 :          0 :         default:
      99                 :          0 :                 return sprintf(buf, "%d", *ip);
     100                 :            :         }
     101                 :            : }
     102                 :            : 
     103                 :            : module_param_call(pool_mode, param_set_pool_mode, param_get_pool_mode,
     104                 :            :                  &svc_pool_map.mode, 0644);
     105                 :            : 
     106                 :            : /*
     107                 :            :  * Detect best pool mapping mode heuristically,
     108                 :            :  * according to the machine's topology.
     109                 :            :  */
     110                 :            : static int
     111                 :          0 : svc_pool_map_choose_mode(void)
     112                 :            : {
     113                 :          0 :         unsigned int node;
     114                 :            : 
     115         [ #  # ]:          0 :         if (nr_online_nodes > 1) {
     116                 :            :                 /*
     117                 :            :                  * Actually have multiple NUMA nodes,
     118                 :            :                  * so split pools on NUMA node boundaries
     119                 :            :                  */
     120                 :            :                 return SVC_POOL_PERNODE;
     121                 :            :         }
     122                 :            : 
     123                 :          0 :         node = first_online_node;
     124         [ #  # ]:          0 :         if (nr_cpus_node(node) > 2) {
     125                 :            :                 /*
     126                 :            :                  * Non-trivial SMP, or CONFIG_NUMA on
     127                 :            :                  * non-NUMA hardware, e.g. with a generic
     128                 :            :                  * x86_64 kernel on Xeons.  In this case we
     129                 :            :                  * want to divide the pools on cpu boundaries.
     130                 :            :                  */
     131                 :          0 :                 return SVC_POOL_PERCPU;
     132                 :            :         }
     133                 :            : 
     134                 :            :         /* default: one global pool */
     135                 :            :         return SVC_POOL_GLOBAL;
     136                 :            : }
     137                 :            : 
     138                 :            : /*
     139                 :            :  * Allocate the to_pool[] and pool_to[] arrays.
     140                 :            :  * Returns 0 on success or an errno.
     141                 :            :  */
     142                 :            : static int
     143                 :            : svc_pool_map_alloc_arrays(struct svc_pool_map *m, unsigned int maxpools)
     144                 :            : {
     145                 :            :         m->to_pool = kcalloc(maxpools, sizeof(unsigned int), GFP_KERNEL);
     146                 :            :         if (!m->to_pool)
     147                 :            :                 goto fail;
     148                 :            :         m->pool_to = kcalloc(maxpools, sizeof(unsigned int), GFP_KERNEL);
     149                 :            :         if (!m->pool_to)
     150                 :            :                 goto fail_free;
     151                 :            : 
     152                 :            :         return 0;
     153                 :            : 
     154                 :            : fail_free:
     155                 :            :         kfree(m->to_pool);
     156                 :            :         m->to_pool = NULL;
     157                 :            : fail:
     158                 :            :         return -ENOMEM;
     159                 :            : }
     160                 :            : 
     161                 :            : /*
     162                 :            :  * Initialise the pool map for SVC_POOL_PERCPU mode.
     163                 :            :  * Returns number of pools or <0 on error.
     164                 :            :  */
     165                 :            : static int
     166                 :          0 : svc_pool_map_init_percpu(struct svc_pool_map *m)
     167                 :            : {
     168                 :          0 :         unsigned int maxpools = nr_cpu_ids;
     169                 :          0 :         unsigned int pidx = 0;
     170                 :          0 :         unsigned int cpu;
     171                 :          0 :         int err;
     172                 :            : 
     173                 :          0 :         err = svc_pool_map_alloc_arrays(m, maxpools);
     174         [ #  # ]:          0 :         if (err)
     175                 :            :                 return err;
     176                 :            : 
     177         [ #  # ]:          0 :         for_each_online_cpu(cpu) {
     178         [ #  # ]:          0 :                 BUG_ON(pidx >= maxpools);
     179                 :          0 :                 m->to_pool[cpu] = pidx;
     180                 :          0 :                 m->pool_to[pidx] = cpu;
     181                 :          0 :                 pidx++;
     182                 :            :         }
     183                 :            :         /* cpus brought online later all get mapped to pool0, sorry */
     184                 :            : 
     185                 :          0 :         return pidx;
     186                 :            : };
     187                 :            : 
     188                 :            : 
     189                 :            : /*
     190                 :            :  * Initialise the pool map for SVC_POOL_PERNODE mode.
     191                 :            :  * Returns number of pools or <0 on error.
     192                 :            :  */
     193                 :            : static int
     194                 :          0 : svc_pool_map_init_pernode(struct svc_pool_map *m)
     195                 :            : {
     196                 :          0 :         unsigned int maxpools = nr_node_ids;
     197                 :          0 :         unsigned int pidx = 0;
     198                 :          0 :         unsigned int node;
     199                 :          0 :         int err;
     200                 :            : 
     201                 :          0 :         err = svc_pool_map_alloc_arrays(m, maxpools);
     202         [ #  # ]:          0 :         if (err)
     203                 :            :                 return err;
     204                 :            : 
     205   [ #  #  #  # ]:          0 :         for_each_node_with_cpus(node) {
     206                 :            :                 /* some architectures (e.g. SN2) have cpuless nodes */
     207         [ #  # ]:          0 :                 BUG_ON(pidx > maxpools);
     208                 :          0 :                 m->to_pool[node] = pidx;
     209                 :          0 :                 m->pool_to[pidx] = node;
     210                 :          0 :                 pidx++;
     211                 :            :         }
     212                 :            :         /* nodes brought online later all get mapped to pool0, sorry */
     213                 :            : 
     214                 :          0 :         return pidx;
     215                 :            : }
     216                 :            : 
     217                 :            : 
     218                 :            : /*
     219                 :            :  * Add a reference to the global map of cpus to pools (and
     220                 :            :  * vice versa).  Initialise the map if we're the first user.
     221                 :            :  * Returns the number of pools.
     222                 :            :  */
     223                 :            : unsigned int
     224                 :          0 : svc_pool_map_get(void)
     225                 :            : {
     226                 :          0 :         struct svc_pool_map *m = &svc_pool_map;
     227                 :          0 :         int npools = -1;
     228                 :            : 
     229                 :          0 :         mutex_lock(&svc_pool_map_mutex);
     230                 :            : 
     231         [ #  # ]:          0 :         if (m->count++) {
     232                 :          0 :                 mutex_unlock(&svc_pool_map_mutex);
     233                 :          0 :                 return m->npools;
     234                 :            :         }
     235                 :            : 
     236         [ #  # ]:          0 :         if (m->mode == SVC_POOL_AUTO)
     237                 :          0 :                 m->mode = svc_pool_map_choose_mode();
     238                 :            : 
     239      [ #  #  # ]:          0 :         switch (m->mode) {
     240                 :          0 :         case SVC_POOL_PERCPU:
     241                 :          0 :                 npools = svc_pool_map_init_percpu(m);
     242                 :          0 :                 break;
     243                 :          0 :         case SVC_POOL_PERNODE:
     244                 :          0 :                 npools = svc_pool_map_init_pernode(m);
     245                 :          0 :                 break;
     246                 :            :         }
     247                 :            : 
     248         [ #  # ]:          0 :         if (npools < 0) {
     249                 :            :                 /* default, or memory allocation failure */
     250                 :          0 :                 npools = 1;
     251                 :          0 :                 m->mode = SVC_POOL_GLOBAL;
     252                 :            :         }
     253                 :          0 :         m->npools = npools;
     254                 :            : 
     255                 :          0 :         mutex_unlock(&svc_pool_map_mutex);
     256                 :          0 :         return m->npools;
     257                 :            : }
     258                 :            : EXPORT_SYMBOL_GPL(svc_pool_map_get);
     259                 :            : 
     260                 :            : /*
     261                 :            :  * Drop a reference to the global map of cpus to pools.
     262                 :            :  * When the last reference is dropped, the map data is
     263                 :            :  * freed; this allows the sysadmin to change the pool
     264                 :            :  * mode using the pool_mode module option without
     265                 :            :  * rebooting or re-loading sunrpc.ko.
     266                 :            :  */
     267                 :            : void
     268                 :          0 : svc_pool_map_put(void)
     269                 :            : {
     270                 :          0 :         struct svc_pool_map *m = &svc_pool_map;
     271                 :            : 
     272                 :          0 :         mutex_lock(&svc_pool_map_mutex);
     273                 :            : 
     274         [ #  # ]:          0 :         if (!--m->count) {
     275                 :          0 :                 kfree(m->to_pool);
     276                 :          0 :                 m->to_pool = NULL;
     277                 :          0 :                 kfree(m->pool_to);
     278                 :          0 :                 m->pool_to = NULL;
     279                 :          0 :                 m->npools = 0;
     280                 :            :         }
     281                 :            : 
     282                 :          0 :         mutex_unlock(&svc_pool_map_mutex);
     283                 :          0 : }
     284                 :            : EXPORT_SYMBOL_GPL(svc_pool_map_put);
     285                 :            : 
     286                 :          0 : static int svc_pool_map_get_node(unsigned int pidx)
     287                 :            : {
     288                 :          0 :         const struct svc_pool_map *m = &svc_pool_map;
     289                 :            : 
     290         [ #  # ]:          0 :         if (m->count) {
     291         [ #  # ]:          0 :                 if (m->mode == SVC_POOL_PERCPU)
     292                 :          0 :                         return cpu_to_node(m->pool_to[pidx]);
     293         [ #  # ]:          0 :                 if (m->mode == SVC_POOL_PERNODE)
     294                 :          0 :                         return m->pool_to[pidx];
     295                 :            :         }
     296                 :            :         return NUMA_NO_NODE;
     297                 :            : }
     298                 :            : /*
     299                 :            :  * Set the given thread's cpus_allowed mask so that it
     300                 :            :  * will only run on cpus in the given pool.
     301                 :            :  */
     302                 :            : static inline void
     303                 :          0 : svc_pool_map_set_cpumask(struct task_struct *task, unsigned int pidx)
     304                 :            : {
     305                 :          0 :         struct svc_pool_map *m = &svc_pool_map;
     306                 :          0 :         unsigned int node = m->pool_to[pidx];
     307                 :            : 
     308                 :            :         /*
     309                 :            :          * The caller checks for sv_nrpools > 1, which
     310                 :            :          * implies that we've been initialized.
     311                 :            :          */
     312         [ #  # ]:          0 :         WARN_ON_ONCE(m->count == 0);
     313         [ #  # ]:          0 :         if (m->count == 0)
     314                 :            :                 return;
     315                 :            : 
     316      [ #  #  # ]:          0 :         switch (m->mode) {
     317                 :            :         case SVC_POOL_PERCPU:
     318                 :            :         {
     319                 :          0 :                 set_cpus_allowed_ptr(task, cpumask_of(node));
     320                 :          0 :                 break;
     321                 :            :         }
     322                 :          0 :         case SVC_POOL_PERNODE:
     323                 :            :         {
     324                 :          0 :                 set_cpus_allowed_ptr(task, cpumask_of_node(node));
     325                 :          0 :                 break;
     326                 :            :         }
     327                 :            :         }
     328                 :          0 : }
     329                 :            : 
     330                 :            : /*
     331                 :            :  * Use the mapping mode to choose a pool for a given CPU.
     332                 :            :  * Used when enqueueing an incoming RPC.  Always returns
     333                 :            :  * a non-NULL pool pointer.
     334                 :            :  */
     335                 :            : struct svc_pool *
     336                 :          0 : svc_pool_for_cpu(struct svc_serv *serv, int cpu)
     337                 :            : {
     338                 :          0 :         struct svc_pool_map *m = &svc_pool_map;
     339                 :          0 :         unsigned int pidx = 0;
     340                 :            : 
     341                 :            :         /*
     342                 :            :          * An uninitialised map happens in a pure client when
     343                 :            :          * lockd is brought up, so silently treat it the
     344                 :            :          * same as SVC_POOL_GLOBAL.
     345                 :            :          */
     346         [ #  # ]:          0 :         if (svc_serv_is_pooled(serv)) {
     347      [ #  #  # ]:          0 :                 switch (m->mode) {
     348                 :          0 :                 case SVC_POOL_PERCPU:
     349                 :          0 :                         pidx = m->to_pool[cpu];
     350                 :          0 :                         break;
     351                 :          0 :                 case SVC_POOL_PERNODE:
     352                 :          0 :                         pidx = m->to_pool[cpu_to_node(cpu)];
     353                 :          0 :                         break;
     354                 :            :                 }
     355                 :          0 :         }
     356                 :          0 :         return &serv->sv_pools[pidx % serv->sv_nrpools];
     357                 :            : }
     358                 :            : 
     359                 :          0 : int svc_rpcb_setup(struct svc_serv *serv, struct net *net)
     360                 :            : {
     361                 :          0 :         int err;
     362                 :            : 
     363                 :          0 :         err = rpcb_create_local(net);
     364   [ #  #  #  # ]:          0 :         if (err)
     365                 :            :                 return err;
     366                 :            : 
     367                 :            :         /* Remove any stale portmap registrations */
     368                 :          0 :         svc_unregister(serv, net);
     369                 :          0 :         return 0;
     370                 :            : }
     371                 :            : EXPORT_SYMBOL_GPL(svc_rpcb_setup);
     372                 :            : 
     373                 :          0 : void svc_rpcb_cleanup(struct svc_serv *serv, struct net *net)
     374                 :            : {
     375                 :          0 :         svc_unregister(serv, net);
     376                 :          0 :         rpcb_put_local(net);
     377                 :          0 : }
     378                 :            : EXPORT_SYMBOL_GPL(svc_rpcb_cleanup);
     379                 :            : 
     380                 :          0 : static int svc_uses_rpcbind(struct svc_serv *serv)
     381                 :            : {
     382                 :          0 :         struct svc_program      *progp;
     383                 :          0 :         unsigned int            i;
     384                 :            : 
     385         [ #  # ]:          0 :         for (progp = serv->sv_program; progp; progp = progp->pg_next) {
     386         [ #  # ]:          0 :                 for (i = 0; i < progp->pg_nvers; i++) {
     387         [ #  # ]:          0 :                         if (progp->pg_vers[i] == NULL)
     388                 :          0 :                                 continue;
     389         [ #  # ]:          0 :                         if (!progp->pg_vers[i]->vs_hidden)
     390                 :            :                                 return 1;
     391                 :            :                 }
     392                 :            :         }
     393                 :            : 
     394                 :            :         return 0;
     395                 :            : }
     396                 :            : 
     397                 :          0 : int svc_bind(struct svc_serv *serv, struct net *net)
     398                 :            : {
     399         [ #  # ]:          0 :         if (!svc_uses_rpcbind(serv))
     400                 :            :                 return 0;
     401                 :          0 :         return svc_rpcb_setup(serv, net);
     402                 :            : }
     403                 :            : EXPORT_SYMBOL_GPL(svc_bind);
     404                 :            : 
     405                 :            : #if defined(CONFIG_SUNRPC_BACKCHANNEL)
     406                 :            : static void
     407                 :            : __svc_init_bc(struct svc_serv *serv)
     408                 :            : {
     409                 :            :         INIT_LIST_HEAD(&serv->sv_cb_list);
     410                 :            :         spin_lock_init(&serv->sv_cb_lock);
     411                 :            :         init_waitqueue_head(&serv->sv_cb_waitq);
     412                 :            : }
     413                 :            : #else
     414                 :            : static void
     415                 :          0 : __svc_init_bc(struct svc_serv *serv)
     416                 :            : {
     417                 :          0 : }
     418                 :            : #endif
     419                 :            : 
     420                 :            : /*
     421                 :            :  * Create an RPC service
     422                 :            :  */
     423                 :            : static struct svc_serv *
     424                 :          0 : __svc_create(struct svc_program *prog, unsigned int bufsize, int npools,
     425                 :            :              const struct svc_serv_ops *ops)
     426                 :            : {
     427                 :          0 :         struct svc_serv *serv;
     428                 :          0 :         unsigned int vers;
     429                 :          0 :         unsigned int xdrsize;
     430                 :          0 :         unsigned int i;
     431                 :            : 
     432         [ #  # ]:          0 :         if (!(serv = kzalloc(sizeof(*serv), GFP_KERNEL)))
     433                 :            :                 return NULL;
     434                 :          0 :         serv->sv_name      = prog->pg_name;
     435                 :          0 :         serv->sv_program   = prog;
     436                 :          0 :         serv->sv_nrthreads = 1;
     437                 :          0 :         serv->sv_stats     = prog->pg_stats;
     438         [ #  # ]:          0 :         if (bufsize > RPCSVC_MAXPAYLOAD)
     439                 :            :                 bufsize = RPCSVC_MAXPAYLOAD;
     440         [ #  # ]:          0 :         serv->sv_max_payload = bufsize? bufsize : 4096;
     441                 :          0 :         serv->sv_max_mesg  = roundup(serv->sv_max_payload + PAGE_SIZE, PAGE_SIZE);
     442                 :          0 :         serv->sv_ops = ops;
     443                 :          0 :         xdrsize = 0;
     444         [ #  # ]:          0 :         while (prog) {
     445                 :          0 :                 prog->pg_lovers = prog->pg_nvers-1;
     446         [ #  # ]:          0 :                 for (vers=0; vers<prog->pg_nvers ; vers++)
     447         [ #  # ]:          0 :                         if (prog->pg_vers[vers]) {
     448                 :          0 :                                 prog->pg_hivers = vers;
     449         [ #  # ]:          0 :                                 if (prog->pg_lovers > vers)
     450                 :          0 :                                         prog->pg_lovers = vers;
     451                 :          0 :                                 if (prog->pg_vers[vers]->vs_xdrsize > xdrsize)
     452                 :            :                                         xdrsize = prog->pg_vers[vers]->vs_xdrsize;
     453                 :            :                         }
     454                 :          0 :                 prog = prog->pg_next;
     455                 :            :         }
     456                 :          0 :         serv->sv_xdrsize   = xdrsize;
     457                 :          0 :         INIT_LIST_HEAD(&serv->sv_tempsocks);
     458                 :          0 :         INIT_LIST_HEAD(&serv->sv_permsocks);
     459                 :          0 :         timer_setup(&serv->sv_temptimer, NULL, 0);
     460                 :          0 :         spin_lock_init(&serv->sv_lock);
     461                 :            : 
     462                 :          0 :         __svc_init_bc(serv);
     463                 :            : 
     464                 :          0 :         serv->sv_nrpools = npools;
     465                 :          0 :         serv->sv_pools =
     466                 :          0 :                 kcalloc(serv->sv_nrpools, sizeof(struct svc_pool),
     467                 :            :                         GFP_KERNEL);
     468         [ #  # ]:          0 :         if (!serv->sv_pools) {
     469                 :          0 :                 kfree(serv);
     470                 :          0 :                 return NULL;
     471                 :            :         }
     472                 :            : 
     473         [ #  # ]:          0 :         for (i = 0; i < serv->sv_nrpools; i++) {
     474                 :          0 :                 struct svc_pool *pool = &serv->sv_pools[i];
     475                 :            : 
     476                 :          0 :                 dprintk("svc: initialising pool %u for %s\n",
     477                 :            :                                 i, serv->sv_name);
     478                 :            : 
     479                 :          0 :                 pool->sp_id = i;
     480                 :          0 :                 INIT_LIST_HEAD(&pool->sp_sockets);
     481                 :          0 :                 INIT_LIST_HEAD(&pool->sp_all_threads);
     482                 :          0 :                 spin_lock_init(&pool->sp_lock);
     483                 :            :         }
     484                 :            : 
     485                 :            :         return serv;
     486                 :            : }
     487                 :            : 
     488                 :            : struct svc_serv *
     489                 :          0 : svc_create(struct svc_program *prog, unsigned int bufsize,
     490                 :            :            const struct svc_serv_ops *ops)
     491                 :            : {
     492                 :          0 :         return __svc_create(prog, bufsize, /*npools*/1, ops);
     493                 :            : }
     494                 :            : EXPORT_SYMBOL_GPL(svc_create);
     495                 :            : 
     496                 :            : struct svc_serv *
     497                 :          0 : svc_create_pooled(struct svc_program *prog, unsigned int bufsize,
     498                 :            :                   const struct svc_serv_ops *ops)
     499                 :            : {
     500                 :          0 :         struct svc_serv *serv;
     501                 :          0 :         unsigned int npools = svc_pool_map_get();
     502                 :            : 
     503                 :          0 :         serv = __svc_create(prog, bufsize, npools, ops);
     504         [ #  # ]:          0 :         if (!serv)
     505                 :          0 :                 goto out_err;
     506                 :            :         return serv;
     507                 :            : out_err:
     508                 :          0 :         svc_pool_map_put();
     509                 :          0 :         return NULL;
     510                 :            : }
     511                 :            : EXPORT_SYMBOL_GPL(svc_create_pooled);
     512                 :            : 
     513                 :          0 : void svc_shutdown_net(struct svc_serv *serv, struct net *net)
     514                 :            : {
     515                 :          0 :         svc_close_net(serv, net);
     516                 :            : 
     517         [ #  # ]:          0 :         if (serv->sv_ops->svo_shutdown)
     518                 :          0 :                 serv->sv_ops->svo_shutdown(serv, net);
     519                 :          0 : }
     520                 :            : EXPORT_SYMBOL_GPL(svc_shutdown_net);
     521                 :            : 
     522                 :            : /*
     523                 :            :  * Destroy an RPC service. Should be called with appropriate locking to
     524                 :            :  * protect the sv_nrthreads, sv_permsocks and sv_tempsocks.
     525                 :            :  */
     526                 :            : void
     527                 :          0 : svc_destroy(struct svc_serv *serv)
     528                 :            : {
     529                 :          0 :         dprintk("svc: svc_destroy(%s, %d)\n",
     530                 :            :                                 serv->sv_program->pg_name,
     531                 :            :                                 serv->sv_nrthreads);
     532                 :            : 
     533         [ #  # ]:          0 :         if (serv->sv_nrthreads) {
     534         [ #  # ]:          0 :                 if (--(serv->sv_nrthreads) != 0) {
     535                 :          0 :                         svc_sock_update_bufs(serv);
     536                 :          0 :                         return;
     537                 :            :                 }
     538                 :            :         } else
     539                 :          0 :                 printk("svc_destroy: no threads for serv=%p!\n", serv);
     540                 :            : 
     541                 :          0 :         del_timer_sync(&serv->sv_temptimer);
     542                 :            : 
     543                 :            :         /*
     544                 :            :          * The last user is gone and thus all sockets have to be destroyed to
     545                 :            :          * the point. Check this.
     546                 :            :          */
     547         [ #  # ]:          0 :         BUG_ON(!list_empty(&serv->sv_permsocks));
     548         [ #  # ]:          0 :         BUG_ON(!list_empty(&serv->sv_tempsocks));
     549                 :            : 
     550                 :          0 :         cache_clean_deferred(serv);
     551                 :            : 
     552         [ #  # ]:          0 :         if (svc_serv_is_pooled(serv))
     553                 :          0 :                 svc_pool_map_put();
     554                 :            : 
     555                 :          0 :         kfree(serv->sv_pools);
     556                 :          0 :         kfree(serv);
     557                 :            : }
     558                 :            : EXPORT_SYMBOL_GPL(svc_destroy);
     559                 :            : 
     560                 :            : /*
     561                 :            :  * Allocate an RPC server's buffer space.
     562                 :            :  * We allocate pages and place them in rq_argpages.
     563                 :            :  */
     564                 :            : static int
     565                 :          0 : svc_init_buffer(struct svc_rqst *rqstp, unsigned int size, int node)
     566                 :            : {
     567                 :          0 :         unsigned int pages, arghi;
     568                 :            : 
     569                 :            :         /* bc_xprt uses fore channel allocated buffers */
     570         [ #  # ]:          0 :         if (svc_is_backchannel(rqstp))
     571                 :            :                 return 1;
     572                 :            : 
     573                 :          0 :         pages = size / PAGE_SIZE + 1; /* extra page as we hold both request and reply.
     574                 :            :                                        * We assume one is at most one page
     575                 :            :                                        */
     576                 :          0 :         arghi = 0;
     577         [ #  # ]:          0 :         WARN_ON_ONCE(pages > RPCSVC_MAXPAGES);
     578                 :          0 :         if (pages > RPCSVC_MAXPAGES)
     579                 :            :                 pages = RPCSVC_MAXPAGES;
     580         [ #  # ]:          0 :         while (pages) {
     581         [ #  # ]:          0 :                 struct page *p = alloc_pages_node(node, GFP_KERNEL, 0);
     582         [ #  # ]:          0 :                 if (!p)
     583                 :            :                         break;
     584                 :          0 :                 rqstp->rq_pages[arghi++] = p;
     585                 :          0 :                 pages--;
     586                 :            :         }
     587                 :          0 :         return pages == 0;
     588                 :            : }
     589                 :            : 
     590                 :            : /*
     591                 :            :  * Release an RPC server buffer
     592                 :            :  */
     593                 :            : static void
     594                 :          0 : svc_release_buffer(struct svc_rqst *rqstp)
     595                 :            : {
     596                 :          0 :         unsigned int i;
     597                 :            : 
     598         [ #  # ]:          0 :         for (i = 0; i < ARRAY_SIZE(rqstp->rq_pages); i++)
     599         [ #  # ]:          0 :                 if (rqstp->rq_pages[i])
     600                 :          0 :                         put_page(rqstp->rq_pages[i]);
     601                 :            : }
     602                 :            : 
     603                 :            : struct svc_rqst *
     604                 :          0 : svc_rqst_alloc(struct svc_serv *serv, struct svc_pool *pool, int node)
     605                 :            : {
     606                 :          0 :         struct svc_rqst *rqstp;
     607                 :            : 
     608                 :          0 :         rqstp = kzalloc_node(sizeof(*rqstp), GFP_KERNEL, node);
     609         [ #  # ]:          0 :         if (!rqstp)
     610                 :            :                 return rqstp;
     611                 :            : 
     612                 :          0 :         __set_bit(RQ_BUSY, &rqstp->rq_flags);
     613         [ #  # ]:          0 :         spin_lock_init(&rqstp->rq_lock);
     614                 :          0 :         rqstp->rq_server = serv;
     615                 :          0 :         rqstp->rq_pool = pool;
     616                 :            : 
     617         [ #  # ]:          0 :         rqstp->rq_argp = kmalloc_node(serv->sv_xdrsize, GFP_KERNEL, node);
     618         [ #  # ]:          0 :         if (!rqstp->rq_argp)
     619                 :          0 :                 goto out_enomem;
     620                 :            : 
     621         [ #  # ]:          0 :         rqstp->rq_resp = kmalloc_node(serv->sv_xdrsize, GFP_KERNEL, node);
     622         [ #  # ]:          0 :         if (!rqstp->rq_resp)
     623                 :          0 :                 goto out_enomem;
     624                 :            : 
     625         [ #  # ]:          0 :         if (!svc_init_buffer(rqstp, serv->sv_max_mesg, node))
     626                 :          0 :                 goto out_enomem;
     627                 :            : 
     628                 :            :         return rqstp;
     629                 :          0 : out_enomem:
     630                 :          0 :         svc_rqst_free(rqstp);
     631                 :          0 :         return NULL;
     632                 :            : }
     633                 :            : EXPORT_SYMBOL_GPL(svc_rqst_alloc);
     634                 :            : 
     635                 :            : struct svc_rqst *
     636                 :          0 : svc_prepare_thread(struct svc_serv *serv, struct svc_pool *pool, int node)
     637                 :            : {
     638                 :          0 :         struct svc_rqst *rqstp;
     639                 :            : 
     640                 :          0 :         rqstp = svc_rqst_alloc(serv, pool, node);
     641         [ #  # ]:          0 :         if (!rqstp)
     642                 :            :                 return ERR_PTR(-ENOMEM);
     643                 :            : 
     644                 :          0 :         serv->sv_nrthreads++;
     645                 :          0 :         spin_lock_bh(&pool->sp_lock);
     646                 :          0 :         pool->sp_nrthreads++;
     647                 :          0 :         list_add_rcu(&rqstp->rq_all, &pool->sp_all_threads);
     648                 :          0 :         spin_unlock_bh(&pool->sp_lock);
     649                 :          0 :         return rqstp;
     650                 :            : }
     651                 :            : EXPORT_SYMBOL_GPL(svc_prepare_thread);
     652                 :            : 
     653                 :            : /*
     654                 :            :  * Choose a pool in which to create a new thread, for svc_set_num_threads
     655                 :            :  */
     656                 :            : static inline struct svc_pool *
     657                 :          0 : choose_pool(struct svc_serv *serv, struct svc_pool *pool, unsigned int *state)
     658                 :            : {
     659                 :          0 :         if (pool != NULL)
     660                 :            :                 return pool;
     661                 :            : 
     662                 :          0 :         return &serv->sv_pools[(*state)++ % serv->sv_nrpools];
     663                 :            : }
     664                 :            : 
     665                 :            : /*
     666                 :            :  * Choose a thread to kill, for svc_set_num_threads
     667                 :            :  */
     668                 :            : static inline struct task_struct *
     669                 :            : choose_victim(struct svc_serv *serv, struct svc_pool *pool, unsigned int *state)
     670                 :            : {
     671                 :            :         unsigned int i;
     672                 :            :         struct task_struct *task = NULL;
     673                 :            : 
     674                 :            :         if (pool != NULL) {
     675                 :            :                 spin_lock_bh(&pool->sp_lock);
     676                 :            :         } else {
     677                 :            :                 /* choose a pool in round-robin fashion */
     678                 :            :                 for (i = 0; i < serv->sv_nrpools; i++) {
     679                 :            :                         pool = &serv->sv_pools[--(*state) % serv->sv_nrpools];
     680                 :            :                         spin_lock_bh(&pool->sp_lock);
     681                 :            :                         if (!list_empty(&pool->sp_all_threads))
     682                 :            :                                 goto found_pool;
     683                 :            :                         spin_unlock_bh(&pool->sp_lock);
     684                 :            :                 }
     685                 :            :                 return NULL;
     686                 :            :         }
     687                 :            : 
     688                 :            : found_pool:
     689                 :            :         if (!list_empty(&pool->sp_all_threads)) {
     690                 :            :                 struct svc_rqst *rqstp;
     691                 :            : 
     692                 :            :                 /*
     693                 :            :                  * Remove from the pool->sp_all_threads list
     694                 :            :                  * so we don't try to kill it again.
     695                 :            :                  */
     696                 :            :                 rqstp = list_entry(pool->sp_all_threads.next, struct svc_rqst, rq_all);
     697                 :            :                 set_bit(RQ_VICTIM, &rqstp->rq_flags);
     698                 :            :                 list_del_rcu(&rqstp->rq_all);
     699                 :            :                 task = rqstp->rq_task;
     700                 :            :         }
     701                 :            :         spin_unlock_bh(&pool->sp_lock);
     702                 :            : 
     703                 :            :         return task;
     704                 :            : }
     705                 :            : 
     706                 :            : /* create new threads */
     707                 :            : static int
     708                 :          0 : svc_start_kthreads(struct svc_serv *serv, struct svc_pool *pool, int nrservs)
     709                 :            : {
     710                 :          0 :         struct svc_rqst *rqstp;
     711                 :          0 :         struct task_struct *task;
     712                 :          0 :         struct svc_pool *chosen_pool;
     713                 :          0 :         unsigned int state = serv->sv_nrthreads-1;
     714                 :          0 :         int node;
     715                 :            : 
     716                 :          0 :         do {
     717                 :          0 :                 nrservs--;
     718         [ #  # ]:          0 :                 chosen_pool = choose_pool(serv, pool, &state);
     719                 :            : 
     720                 :          0 :                 node = svc_pool_map_get_node(chosen_pool->sp_id);
     721                 :          0 :                 rqstp = svc_prepare_thread(serv, chosen_pool, node);
     722         [ #  # ]:          0 :                 if (IS_ERR(rqstp))
     723                 :          0 :                         return PTR_ERR(rqstp);
     724                 :            : 
     725                 :          0 :                 __module_get(serv->sv_ops->svo_module);
     726                 :          0 :                 task = kthread_create_on_node(serv->sv_ops->svo_function, rqstp,
     727                 :            :                                               node, "%s", serv->sv_name);
     728         [ #  # ]:          0 :                 if (IS_ERR(task)) {
     729                 :          0 :                         module_put(serv->sv_ops->svo_module);
     730                 :          0 :                         svc_exit_thread(rqstp);
     731                 :          0 :                         return PTR_ERR(task);
     732                 :            :                 }
     733                 :            : 
     734                 :          0 :                 rqstp->rq_task = task;
     735         [ #  # ]:          0 :                 if (serv->sv_nrpools > 1)
     736                 :          0 :                         svc_pool_map_set_cpumask(task, chosen_pool->sp_id);
     737                 :            : 
     738                 :          0 :                 svc_sock_update_bufs(serv);
     739                 :          0 :                 wake_up_process(task);
     740         [ #  # ]:          0 :         } while (nrservs > 0);
     741                 :            : 
     742                 :            :         return 0;
     743                 :            : }
     744                 :            : 
     745                 :            : 
     746                 :            : /* destroy old threads */
     747                 :            : static int
     748                 :          0 : svc_signal_kthreads(struct svc_serv *serv, struct svc_pool *pool, int nrservs)
     749                 :            : {
     750                 :          0 :         struct task_struct *task;
     751                 :          0 :         unsigned int state = serv->sv_nrthreads-1;
     752                 :            : 
     753                 :            :         /* destroy old threads */
     754                 :          0 :         do {
     755                 :          0 :                 task = choose_victim(serv, pool, &state);
     756         [ #  # ]:          0 :                 if (task == NULL)
     757                 :            :                         break;
     758                 :          0 :                 send_sig(SIGINT, task, 1);
     759                 :          0 :                 nrservs++;
     760         [ #  # ]:          0 :         } while (nrservs < 0);
     761                 :            : 
     762                 :          0 :         return 0;
     763                 :            : }
     764                 :            : 
     765                 :            : /*
     766                 :            :  * Create or destroy enough new threads to make the number
     767                 :            :  * of threads the given number.  If `pool' is non-NULL, applies
     768                 :            :  * only to threads in that pool, otherwise round-robins between
     769                 :            :  * all pools.  Caller must ensure that mutual exclusion between this and
     770                 :            :  * server startup or shutdown.
     771                 :            :  *
     772                 :            :  * Destroying threads relies on the service threads filling in
     773                 :            :  * rqstp->rq_task, which only the nfs ones do.  Assumes the serv
     774                 :            :  * has been created using svc_create_pooled().
     775                 :            :  *
     776                 :            :  * Based on code that used to be in nfsd_svc() but tweaked
     777                 :            :  * to be pool-aware.
     778                 :            :  */
     779                 :            : int
     780                 :          0 : svc_set_num_threads(struct svc_serv *serv, struct svc_pool *pool, int nrservs)
     781                 :            : {
     782         [ #  # ]:          0 :         if (pool == NULL) {
     783                 :            :                 /* The -1 assumes caller has done a svc_get() */
     784                 :          0 :                 nrservs -= (serv->sv_nrthreads-1);
     785                 :            :         } else {
     786                 :          0 :                 spin_lock_bh(&pool->sp_lock);
     787                 :          0 :                 nrservs -= pool->sp_nrthreads;
     788                 :          0 :                 spin_unlock_bh(&pool->sp_lock);
     789                 :            :         }
     790                 :            : 
     791         [ #  # ]:          0 :         if (nrservs > 0)
     792                 :          0 :                 return svc_start_kthreads(serv, pool, nrservs);
     793         [ #  # ]:          0 :         if (nrservs < 0)
     794                 :          0 :                 return svc_signal_kthreads(serv, pool, nrservs);
     795                 :            :         return 0;
     796                 :            : }
     797                 :            : EXPORT_SYMBOL_GPL(svc_set_num_threads);
     798                 :            : 
     799                 :            : /* destroy old threads */
     800                 :            : static int
     801                 :          0 : svc_stop_kthreads(struct svc_serv *serv, struct svc_pool *pool, int nrservs)
     802                 :            : {
     803                 :          0 :         struct task_struct *task;
     804                 :          0 :         unsigned int state = serv->sv_nrthreads-1;
     805                 :            : 
     806                 :            :         /* destroy old threads */
     807                 :          0 :         do {
     808                 :          0 :                 task = choose_victim(serv, pool, &state);
     809         [ #  # ]:          0 :                 if (task == NULL)
     810                 :            :                         break;
     811                 :          0 :                 kthread_stop(task);
     812                 :          0 :                 nrservs++;
     813         [ #  # ]:          0 :         } while (nrservs < 0);
     814                 :          0 :         return 0;
     815                 :            : }
     816                 :            : 
     817                 :            : int
     818                 :          0 : svc_set_num_threads_sync(struct svc_serv *serv, struct svc_pool *pool, int nrservs)
     819                 :            : {
     820         [ #  # ]:          0 :         if (pool == NULL) {
     821                 :            :                 /* The -1 assumes caller has done a svc_get() */
     822                 :          0 :                 nrservs -= (serv->sv_nrthreads-1);
     823                 :            :         } else {
     824                 :          0 :                 spin_lock_bh(&pool->sp_lock);
     825                 :          0 :                 nrservs -= pool->sp_nrthreads;
     826                 :          0 :                 spin_unlock_bh(&pool->sp_lock);
     827                 :            :         }
     828                 :            : 
     829         [ #  # ]:          0 :         if (nrservs > 0)
     830                 :          0 :                 return svc_start_kthreads(serv, pool, nrservs);
     831         [ #  # ]:          0 :         if (nrservs < 0)
     832                 :          0 :                 return svc_stop_kthreads(serv, pool, nrservs);
     833                 :            :         return 0;
     834                 :            : }
     835                 :            : EXPORT_SYMBOL_GPL(svc_set_num_threads_sync);
     836                 :            : 
     837                 :            : /*
     838                 :            :  * Called from a server thread as it's exiting. Caller must hold the "service
     839                 :            :  * mutex" for the service.
     840                 :            :  */
     841                 :            : void
     842                 :          0 : svc_rqst_free(struct svc_rqst *rqstp)
     843                 :            : {
     844                 :          0 :         svc_release_buffer(rqstp);
     845                 :          0 :         kfree(rqstp->rq_resp);
     846                 :          0 :         kfree(rqstp->rq_argp);
     847                 :          0 :         kfree(rqstp->rq_auth_data);
     848         [ #  # ]:          0 :         kfree_rcu(rqstp, rq_rcu_head);
     849                 :          0 : }
     850                 :            : EXPORT_SYMBOL_GPL(svc_rqst_free);
     851                 :            : 
     852                 :            : void
     853                 :          0 : svc_exit_thread(struct svc_rqst *rqstp)
     854                 :            : {
     855                 :          0 :         struct svc_serv *serv = rqstp->rq_server;
     856                 :          0 :         struct svc_pool *pool = rqstp->rq_pool;
     857                 :            : 
     858                 :          0 :         spin_lock_bh(&pool->sp_lock);
     859                 :          0 :         pool->sp_nrthreads--;
     860         [ #  # ]:          0 :         if (!test_and_set_bit(RQ_VICTIM, &rqstp->rq_flags))
     861                 :          0 :                 list_del_rcu(&rqstp->rq_all);
     862                 :          0 :         spin_unlock_bh(&pool->sp_lock);
     863                 :            : 
     864                 :          0 :         svc_rqst_free(rqstp);
     865                 :            : 
     866                 :            :         /* Release the server */
     867         [ #  # ]:          0 :         if (serv)
     868                 :          0 :                 svc_destroy(serv);
     869                 :          0 : }
     870                 :            : EXPORT_SYMBOL_GPL(svc_exit_thread);
     871                 :            : 
     872                 :            : /*
     873                 :            :  * Register an "inet" protocol family netid with the local
     874                 :            :  * rpcbind daemon via an rpcbind v4 SET request.
     875                 :            :  *
     876                 :            :  * No netconfig infrastructure is available in the kernel, so
     877                 :            :  * we map IP_ protocol numbers to netids by hand.
     878                 :            :  *
     879                 :            :  * Returns zero on success; a negative errno value is returned
     880                 :            :  * if any error occurs.
     881                 :            :  */
     882                 :          0 : static int __svc_rpcb_register4(struct net *net, const u32 program,
     883                 :            :                                 const u32 version,
     884                 :            :                                 const unsigned short protocol,
     885                 :            :                                 const unsigned short port)
     886                 :            : {
     887                 :          0 :         const struct sockaddr_in sin = {
     888                 :            :                 .sin_family             = AF_INET,
     889                 :            :                 .sin_addr.s_addr        = htonl(INADDR_ANY),
     890                 :          0 :                 .sin_port               = htons(port),
     891                 :            :         };
     892                 :          0 :         const char *netid;
     893                 :          0 :         int error;
     894                 :            : 
     895      [ #  #  # ]:          0 :         switch (protocol) {
     896                 :            :         case IPPROTO_UDP:
     897                 :            :                 netid = RPCBIND_NETID_UDP;
     898                 :            :                 break;
     899                 :          0 :         case IPPROTO_TCP:
     900                 :          0 :                 netid = RPCBIND_NETID_TCP;
     901                 :          0 :                 break;
     902                 :            :         default:
     903                 :            :                 return -ENOPROTOOPT;
     904                 :            :         }
     905                 :            : 
     906                 :          0 :         error = rpcb_v4_register(net, program, version,
     907                 :            :                                         (const struct sockaddr *)&sin, netid);
     908                 :            : 
     909                 :            :         /*
     910                 :            :          * User space didn't support rpcbind v4, so retry this
     911                 :            :          * registration request with the legacy rpcbind v2 protocol.
     912                 :            :          */
     913         [ #  # ]:          0 :         if (error == -EPROTONOSUPPORT)
     914                 :          0 :                 error = rpcb_register(net, program, version, protocol, port);
     915                 :            : 
     916                 :            :         return error;
     917                 :            : }
     918                 :            : 
     919                 :            : #if IS_ENABLED(CONFIG_IPV6)
     920                 :            : /*
     921                 :            :  * Register an "inet6" protocol family netid with the local
     922                 :            :  * rpcbind daemon via an rpcbind v4 SET request.
     923                 :            :  *
     924                 :            :  * No netconfig infrastructure is available in the kernel, so
     925                 :            :  * we map IP_ protocol numbers to netids by hand.
     926                 :            :  *
     927                 :            :  * Returns zero on success; a negative errno value is returned
     928                 :            :  * if any error occurs.
     929                 :            :  */
     930                 :          0 : static int __svc_rpcb_register6(struct net *net, const u32 program,
     931                 :            :                                 const u32 version,
     932                 :            :                                 const unsigned short protocol,
     933                 :            :                                 const unsigned short port)
     934                 :            : {
     935                 :          0 :         const struct sockaddr_in6 sin6 = {
     936                 :            :                 .sin6_family            = AF_INET6,
     937                 :            :                 .sin6_addr              = IN6ADDR_ANY_INIT,
     938                 :          0 :                 .sin6_port              = htons(port),
     939                 :            :         };
     940                 :          0 :         const char *netid;
     941                 :          0 :         int error;
     942                 :            : 
     943      [ #  #  # ]:          0 :         switch (protocol) {
     944                 :            :         case IPPROTO_UDP:
     945                 :            :                 netid = RPCBIND_NETID_UDP6;
     946                 :            :                 break;
     947                 :          0 :         case IPPROTO_TCP:
     948                 :          0 :                 netid = RPCBIND_NETID_TCP6;
     949                 :          0 :                 break;
     950                 :            :         default:
     951                 :            :                 return -ENOPROTOOPT;
     952                 :            :         }
     953                 :            : 
     954                 :          0 :         error = rpcb_v4_register(net, program, version,
     955                 :            :                                         (const struct sockaddr *)&sin6, netid);
     956                 :            : 
     957                 :            :         /*
     958                 :            :          * User space didn't support rpcbind version 4, so we won't
     959                 :            :          * use a PF_INET6 listener.
     960                 :            :          */
     961         [ #  # ]:          0 :         if (error == -EPROTONOSUPPORT)
     962                 :          0 :                 error = -EAFNOSUPPORT;
     963                 :            : 
     964                 :            :         return error;
     965                 :            : }
     966                 :            : #endif  /* IS_ENABLED(CONFIG_IPV6) */
     967                 :            : 
     968                 :            : /*
     969                 :            :  * Register a kernel RPC service via rpcbind version 4.
     970                 :            :  *
     971                 :            :  * Returns zero on success; a negative errno value is returned
     972                 :            :  * if any error occurs.
     973                 :            :  */
     974                 :          0 : static int __svc_register(struct net *net, const char *progname,
     975                 :            :                           const u32 program, const u32 version,
     976                 :            :                           const int family,
     977                 :            :                           const unsigned short protocol,
     978                 :            :                           const unsigned short port)
     979                 :            : {
     980                 :          0 :         int error = -EAFNOSUPPORT;
     981                 :            : 
     982      [ #  #  # ]:          0 :         switch (family) {
     983                 :          0 :         case PF_INET:
     984                 :          0 :                 error = __svc_rpcb_register4(net, program, version,
     985                 :            :                                                 protocol, port);
     986                 :          0 :                 break;
     987                 :            : #if IS_ENABLED(CONFIG_IPV6)
     988                 :          0 :         case PF_INET6:
     989                 :          0 :                 error = __svc_rpcb_register6(net, program, version,
     990                 :            :                                                 protocol, port);
     991                 :            : #endif
     992                 :            :         }
     993                 :            : 
     994                 :          0 :         return error;
     995                 :            : }
     996                 :            : 
     997                 :          0 : int svc_rpcbind_set_version(struct net *net,
     998                 :            :                             const struct svc_program *progp,
     999                 :            :                             u32 version, int family,
    1000                 :            :                             unsigned short proto,
    1001                 :            :                             unsigned short port)
    1002                 :            : {
    1003                 :          0 :         dprintk("svc: svc_register(%sv%d, %s, %u, %u)\n",
    1004                 :            :                 progp->pg_name, version,
    1005                 :            :                 proto == IPPROTO_UDP?  "udp" : "tcp",
    1006                 :            :                 port, family);
    1007                 :            : 
    1008                 :          0 :         return __svc_register(net, progp->pg_name, progp->pg_prog,
    1009                 :            :                                 version, family, proto, port);
    1010                 :            : 
    1011                 :            : }
    1012                 :            : EXPORT_SYMBOL_GPL(svc_rpcbind_set_version);
    1013                 :            : 
    1014                 :          0 : int svc_generic_rpcbind_set(struct net *net,
    1015                 :            :                             const struct svc_program *progp,
    1016                 :            :                             u32 version, int family,
    1017                 :            :                             unsigned short proto,
    1018                 :            :                             unsigned short port)
    1019                 :            : {
    1020                 :          0 :         const struct svc_version *vers = progp->pg_vers[version];
    1021                 :          0 :         int error;
    1022                 :            : 
    1023         [ #  # ]:          0 :         if (vers == NULL)
    1024                 :            :                 return 0;
    1025                 :            : 
    1026         [ #  # ]:          0 :         if (vers->vs_hidden) {
    1027                 :            :                 dprintk("svc: svc_register(%sv%d, %s, %u, %u)"
    1028                 :            :                         " (but not telling portmap)\n",
    1029                 :            :                         progp->pg_name, version,
    1030                 :            :                         proto == IPPROTO_UDP?  "udp" : "tcp",
    1031                 :            :                         port, family);
    1032                 :            :                 return 0;
    1033                 :            :         }
    1034                 :            : 
    1035                 :            :         /*
    1036                 :            :          * Don't register a UDP port if we need congestion
    1037                 :            :          * control.
    1038                 :            :          */
    1039   [ #  #  #  # ]:          0 :         if (vers->vs_need_cong_ctrl && proto == IPPROTO_UDP)
    1040                 :            :                 return 0;
    1041                 :            : 
    1042                 :          0 :         error = svc_rpcbind_set_version(net, progp, version,
    1043                 :            :                                         family, proto, port);
    1044                 :            : 
    1045         [ #  # ]:          0 :         return (vers->vs_rpcb_optnl) ? 0 : error;
    1046                 :            : }
    1047                 :            : EXPORT_SYMBOL_GPL(svc_generic_rpcbind_set);
    1048                 :            : 
    1049                 :            : /**
    1050                 :            :  * svc_register - register an RPC service with the local portmapper
    1051                 :            :  * @serv: svc_serv struct for the service to register
    1052                 :            :  * @net: net namespace for the service to register
    1053                 :            :  * @family: protocol family of service's listener socket
    1054                 :            :  * @proto: transport protocol number to advertise
    1055                 :            :  * @port: port to advertise
    1056                 :            :  *
    1057                 :            :  * Service is registered for any address in the passed-in protocol family
    1058                 :            :  */
    1059                 :          0 : int svc_register(const struct svc_serv *serv, struct net *net,
    1060                 :            :                  const int family, const unsigned short proto,
    1061                 :            :                  const unsigned short port)
    1062                 :            : {
    1063                 :          0 :         struct svc_program      *progp;
    1064                 :          0 :         unsigned int            i;
    1065                 :          0 :         int                     error = 0;
    1066                 :            : 
    1067         [ #  # ]:          0 :         WARN_ON_ONCE(proto == 0 && port == 0);
    1068         [ #  # ]:          0 :         if (proto == 0 && port == 0)
    1069                 :            :                 return -EINVAL;
    1070                 :            : 
    1071         [ #  # ]:          0 :         for (progp = serv->sv_program; progp; progp = progp->pg_next) {
    1072         [ #  # ]:          0 :                 for (i = 0; i < progp->pg_nvers; i++) {
    1073                 :            : 
    1074                 :          0 :                         error = progp->pg_rpcbind_set(net, progp, i,
    1075                 :            :                                         family, proto, port);
    1076         [ #  # ]:          0 :                         if (error < 0) {
    1077                 :          0 :                                 printk(KERN_WARNING "svc: failed to register "
    1078                 :            :                                         "%sv%u RPC service (errno %d).\n",
    1079                 :            :                                         progp->pg_name, i, -error);
    1080                 :          0 :                                 break;
    1081                 :            :                         }
    1082                 :            :                 }
    1083                 :            :         }
    1084                 :            : 
    1085                 :            :         return error;
    1086                 :            : }
    1087                 :            : 
    1088                 :            : /*
    1089                 :            :  * If user space is running rpcbind, it should take the v4 UNSET
    1090                 :            :  * and clear everything for this [program, version].  If user space
    1091                 :            :  * is running portmap, it will reject the v4 UNSET, but won't have
    1092                 :            :  * any "inet6" entries anyway.  So a PMAP_UNSET should be sufficient
    1093                 :            :  * in this case to clear all existing entries for [program, version].
    1094                 :            :  */
    1095                 :            : static void __svc_unregister(struct net *net, const u32 program, const u32 version,
    1096                 :            :                              const char *progname)
    1097                 :            : {
    1098                 :            :         int error;
    1099                 :            : 
    1100                 :            :         error = rpcb_v4_register(net, program, version, NULL, "");
    1101                 :            : 
    1102                 :            :         /*
    1103                 :            :          * User space didn't support rpcbind v4, so retry this
    1104                 :            :          * request with the legacy rpcbind v2 protocol.
    1105                 :            :          */
    1106                 :            :         if (error == -EPROTONOSUPPORT)
    1107                 :            :                 error = rpcb_register(net, program, version, 0, 0);
    1108                 :            : 
    1109                 :            :         dprintk("svc: %s(%sv%u), error %d\n",
    1110                 :            :                         __func__, progname, version, error);
    1111                 :            : }
    1112                 :            : 
    1113                 :            : /*
    1114                 :            :  * All netids, bind addresses and ports registered for [program, version]
    1115                 :            :  * are removed from the local rpcbind database (if the service is not
    1116                 :            :  * hidden) to make way for a new instance of the service.
    1117                 :            :  *
    1118                 :            :  * The result of unregistration is reported via dprintk for those who want
    1119                 :            :  * verification of the result, but is otherwise not important.
    1120                 :            :  */
    1121                 :            : static void svc_unregister(const struct svc_serv *serv, struct net *net)
    1122                 :            : {
    1123                 :            :         struct svc_program *progp;
    1124                 :            :         unsigned long flags;
    1125                 :            :         unsigned int i;
    1126                 :            : 
    1127                 :            :         clear_thread_flag(TIF_SIGPENDING);
    1128                 :            : 
    1129                 :            :         for (progp = serv->sv_program; progp; progp = progp->pg_next) {
    1130                 :            :                 for (i = 0; i < progp->pg_nvers; i++) {
    1131                 :            :                         if (progp->pg_vers[i] == NULL)
    1132                 :            :                                 continue;
    1133                 :            :                         if (progp->pg_vers[i]->vs_hidden)
    1134                 :            :                                 continue;
    1135                 :            : 
    1136                 :            :                         dprintk("svc: attempting to unregister %sv%u\n",
    1137                 :            :                                 progp->pg_name, i);
    1138                 :            :                         __svc_unregister(net, progp->pg_prog, i, progp->pg_name);
    1139                 :            :                 }
    1140                 :            :         }
    1141                 :            : 
    1142                 :            :         spin_lock_irqsave(&current->sighand->siglock, flags);
    1143                 :            :         recalc_sigpending();
    1144                 :            :         spin_unlock_irqrestore(&current->sighand->siglock, flags);
    1145                 :            : }
    1146                 :            : 
    1147                 :            : /*
    1148                 :            :  * dprintk the given error with the address of the client that caused it.
    1149                 :            :  */
    1150                 :            : #if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
    1151                 :            : static __printf(2, 3)
    1152                 :            : void svc_printk(struct svc_rqst *rqstp, const char *fmt, ...)
    1153                 :            : {
    1154                 :            :         struct va_format vaf;
    1155                 :            :         va_list args;
    1156                 :            :         char    buf[RPC_MAX_ADDRBUFLEN];
    1157                 :            : 
    1158                 :            :         va_start(args, fmt);
    1159                 :            : 
    1160                 :            :         vaf.fmt = fmt;
    1161                 :            :         vaf.va = &args;
    1162                 :            : 
    1163                 :            :         dprintk("svc: %s: %pV", svc_print_addr(rqstp, buf, sizeof(buf)), &vaf);
    1164                 :            : 
    1165                 :            :         va_end(args);
    1166                 :            : }
    1167                 :            : #else
    1168                 :          0 : static __printf(2,3) void svc_printk(struct svc_rqst *rqstp, const char *fmt, ...) {}
    1169                 :            : #endif
    1170                 :            : 
    1171                 :            : __be32
    1172                 :          0 : svc_return_autherr(struct svc_rqst *rqstp, __be32 auth_err)
    1173                 :            : {
    1174                 :          0 :         set_bit(RQ_AUTHERR, &rqstp->rq_flags);
    1175                 :          0 :         return auth_err;
    1176                 :            : }
    1177                 :            : EXPORT_SYMBOL_GPL(svc_return_autherr);
    1178                 :            : 
    1179                 :            : static __be32
    1180                 :          0 : svc_get_autherr(struct svc_rqst *rqstp, __be32 *statp)
    1181                 :            : {
    1182         [ #  # ]:          0 :         if (test_and_clear_bit(RQ_AUTHERR, &rqstp->rq_flags))
    1183                 :          0 :                 return *statp;
    1184                 :            :         return rpc_auth_ok;
    1185                 :            : }
    1186                 :            : 
    1187                 :            : static int
    1188                 :          0 : svc_generic_dispatch(struct svc_rqst *rqstp, __be32 *statp)
    1189                 :            : {
    1190                 :          0 :         struct kvec *argv = &rqstp->rq_arg.head[0];
    1191                 :          0 :         struct kvec *resv = &rqstp->rq_res.head[0];
    1192                 :          0 :         const struct svc_procedure *procp = rqstp->rq_procinfo;
    1193                 :            : 
    1194                 :            :         /*
    1195                 :            :          * Decode arguments
    1196                 :            :          * XXX: why do we ignore the return value?
    1197                 :            :          */
    1198   [ #  #  #  # ]:          0 :         if (procp->pc_decode &&
    1199                 :          0 :             !procp->pc_decode(rqstp, argv->iov_base)) {
    1200                 :          0 :                 *statp = rpc_garbage_args;
    1201                 :          0 :                 return 1;
    1202                 :            :         }
    1203                 :            : 
    1204                 :          0 :         *statp = procp->pc_func(rqstp);
    1205                 :            : 
    1206   [ #  #  #  # ]:          0 :         if (*statp == rpc_drop_reply ||
    1207                 :          0 :             test_bit(RQ_DROPME, &rqstp->rq_flags))
    1208                 :          0 :                 return 0;
    1209                 :            : 
    1210         [ #  # ]:          0 :         if (test_bit(RQ_AUTHERR, &rqstp->rq_flags))
    1211                 :            :                 return 1;
    1212                 :            : 
    1213         [ #  # ]:          0 :         if (*statp != rpc_success)
    1214                 :            :                 return 1;
    1215                 :            : 
    1216                 :            :         /* Encode reply */
    1217   [ #  #  #  # ]:          0 :         if (procp->pc_encode &&
    1218                 :          0 :             !procp->pc_encode(rqstp, resv->iov_base + resv->iov_len)) {
    1219                 :          0 :                 dprintk("svc: failed to encode reply\n");
    1220                 :            :                 /* serv->sv_stats->rpcsystemerr++; */
    1221                 :          0 :                 *statp = rpc_system_err;
    1222                 :            :         }
    1223                 :            :         return 1;
    1224                 :            : }
    1225                 :            : 
    1226                 :            : __be32
    1227                 :          0 : svc_generic_init_request(struct svc_rqst *rqstp,
    1228                 :            :                 const struct svc_program *progp,
    1229                 :            :                 struct svc_process_info *ret)
    1230                 :            : {
    1231                 :          0 :         const struct svc_version *versp = NULL; /* compiler food */
    1232                 :          0 :         const struct svc_procedure *procp = NULL;
    1233                 :            : 
    1234         [ #  # ]:          0 :         if (rqstp->rq_vers >= progp->pg_nvers )
    1235                 :          0 :                 goto err_bad_vers;
    1236                 :          0 :         versp = progp->pg_vers[rqstp->rq_vers];
    1237         [ #  # ]:          0 :         if (!versp)
    1238                 :          0 :                 goto err_bad_vers;
    1239                 :            : 
    1240                 :            :         /*
    1241                 :            :          * Some protocol versions (namely NFSv4) require some form of
    1242                 :            :          * congestion control.  (See RFC 7530 section 3.1 paragraph 2)
    1243                 :            :          * In other words, UDP is not allowed. We mark those when setting
    1244                 :            :          * up the svc_xprt, and verify that here.
    1245                 :            :          *
    1246                 :            :          * The spec is not very clear about what error should be returned
    1247                 :            :          * when someone tries to access a server that is listening on UDP
    1248                 :            :          * for lower versions. RPC_PROG_MISMATCH seems to be the closest
    1249                 :            :          * fit.
    1250                 :            :          */
    1251   [ #  #  #  #  :          0 :         if (versp->vs_need_cong_ctrl && rqstp->rq_xprt &&
                   #  # ]
    1252                 :          0 :             !test_bit(XPT_CONG_CTRL, &rqstp->rq_xprt->xpt_flags))
    1253                 :          0 :                 goto err_bad_vers;
    1254                 :            : 
    1255         [ #  # ]:          0 :         if (rqstp->rq_proc >= versp->vs_nproc)
    1256                 :          0 :                 goto err_bad_proc;
    1257                 :          0 :         rqstp->rq_procinfo = procp = &versp->vs_proc[rqstp->rq_proc];
    1258         [ #  # ]:          0 :         if (!procp)
    1259                 :          0 :                 goto err_bad_proc;
    1260                 :            : 
    1261                 :            :         /* Initialize storage for argp and resp */
    1262                 :          0 :         memset(rqstp->rq_argp, 0, procp->pc_argsize);
    1263                 :          0 :         memset(rqstp->rq_resp, 0, procp->pc_ressize);
    1264                 :            : 
    1265                 :            :         /* Bump per-procedure stats counter */
    1266                 :          0 :         versp->vs_count[rqstp->rq_proc]++;
    1267                 :            : 
    1268                 :          0 :         ret->dispatch = versp->vs_dispatch;
    1269                 :          0 :         return rpc_success;
    1270                 :          0 : err_bad_vers:
    1271                 :          0 :         ret->mismatch.lovers = progp->pg_lovers;
    1272                 :          0 :         ret->mismatch.hivers = progp->pg_hivers;
    1273                 :          0 :         return rpc_prog_mismatch;
    1274                 :            : err_bad_proc:
    1275                 :            :         return rpc_proc_unavail;
    1276                 :            : }
    1277                 :            : EXPORT_SYMBOL_GPL(svc_generic_init_request);
    1278                 :            : 
    1279                 :            : /*
    1280                 :            :  * Common routine for processing the RPC request.
    1281                 :            :  */
    1282                 :            : static int
    1283                 :          0 : svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv)
    1284                 :            : {
    1285                 :          0 :         struct svc_program      *progp;
    1286                 :          0 :         const struct svc_procedure *procp = NULL;
    1287                 :          0 :         struct svc_serv         *serv = rqstp->rq_server;
    1288                 :          0 :         struct svc_process_info process;
    1289                 :          0 :         __be32                  *statp;
    1290                 :          0 :         u32                     prog, vers;
    1291                 :          0 :         __be32                  auth_stat, rpc_stat;
    1292                 :          0 :         int                     auth_res;
    1293                 :          0 :         __be32                  *reply_statp;
    1294                 :            : 
    1295                 :          0 :         rpc_stat = rpc_success;
    1296                 :            : 
    1297         [ #  # ]:          0 :         if (argv->iov_len < 6*4)
    1298                 :          0 :                 goto err_short_len;
    1299                 :            : 
    1300                 :            :         /* Will be turned off by GSS integrity and privacy services */
    1301                 :          0 :         set_bit(RQ_SPLICE_OK, &rqstp->rq_flags);
    1302                 :            :         /* Will be turned off only when NFSv4 Sessions are used */
    1303                 :          0 :         set_bit(RQ_USEDEFERRAL, &rqstp->rq_flags);
    1304                 :          0 :         clear_bit(RQ_DROPME, &rqstp->rq_flags);
    1305                 :            : 
    1306         [ #  # ]:          0 :         svc_putu32(resv, rqstp->rq_xid);
    1307                 :            : 
    1308         [ #  # ]:          0 :         vers = svc_getnl(argv);
    1309                 :            : 
    1310                 :            :         /* First words of reply: */
    1311         [ #  # ]:          0 :         svc_putnl(resv, 1);             /* REPLY */
    1312                 :            : 
    1313         [ #  # ]:          0 :         if (vers != 2)          /* RPC version number */
    1314                 :          0 :                 goto err_bad_rpc;
    1315                 :            : 
    1316                 :            :         /* Save position in case we later decide to reject: */
    1317                 :          0 :         reply_statp = resv->iov_base + resv->iov_len;
    1318                 :            : 
    1319                 :          0 :         svc_putnl(resv, 0);             /* ACCEPT */
    1320                 :            : 
    1321                 :          0 :         rqstp->rq_prog = prog = svc_getnl(argv);     /* program number */
    1322                 :          0 :         rqstp->rq_vers = svc_getnl(argv);    /* version number */
    1323                 :          0 :         rqstp->rq_proc = svc_getnl(argv);    /* procedure number */
    1324                 :            : 
    1325         [ #  # ]:          0 :         for (progp = serv->sv_program; progp; progp = progp->pg_next)
    1326         [ #  # ]:          0 :                 if (prog == progp->pg_prog)
    1327                 :            :                         break;
    1328                 :            : 
    1329                 :            :         /*
    1330                 :            :          * Decode auth data, and add verifier to reply buffer.
    1331                 :            :          * We do this before anything else in order to get a decent
    1332                 :            :          * auth verifier.
    1333                 :            :          */
    1334                 :          0 :         auth_res = svc_authenticate(rqstp, &auth_stat);
    1335                 :            :         /* Also give the program a chance to reject this call: */
    1336         [ #  # ]:          0 :         if (auth_res == SVC_OK && progp) {
    1337                 :          0 :                 auth_stat = rpc_autherr_badcred;
    1338                 :          0 :                 auth_res = progp->pg_authenticate(rqstp);
    1339                 :            :         }
    1340         [ #  # ]:          0 :         if (auth_res != SVC_OK)
    1341                 :          0 :                 trace_svc_authenticate(rqstp, auth_res, auth_stat);
    1342   [ #  #  #  #  :          0 :         switch (auth_res) {
                #  #  # ]
    1343                 :            :         case SVC_OK:
    1344                 :            :                 break;
    1345                 :          0 :         case SVC_GARBAGE:
    1346                 :          0 :                 goto err_garbage;
    1347                 :          0 :         case SVC_SYSERR:
    1348                 :          0 :                 rpc_stat = rpc_system_err;
    1349                 :          0 :                 goto err_bad;
    1350                 :          0 :         case SVC_DENIED:
    1351                 :          0 :                 goto err_bad_auth;
    1352                 :          0 :         case SVC_CLOSE:
    1353                 :          0 :                 goto close;
    1354                 :          0 :         case SVC_DROP:
    1355                 :          0 :                 goto dropit;
    1356                 :          0 :         case SVC_COMPLETE:
    1357                 :          0 :                 goto sendit;
    1358                 :            :         }
    1359                 :            : 
    1360         [ #  # ]:          0 :         if (progp == NULL)
    1361                 :          0 :                 goto err_bad_prog;
    1362                 :            : 
    1363                 :          0 :         rpc_stat = progp->pg_init_request(rqstp, progp, &process);
    1364   [ #  #  #  # ]:          0 :         switch (rpc_stat) {
    1365                 :            :         case rpc_success:
    1366                 :            :                 break;
    1367                 :          0 :         case rpc_prog_unavail:
    1368                 :          0 :                 goto err_bad_prog;
    1369                 :          0 :         case rpc_prog_mismatch:
    1370                 :          0 :                 goto err_bad_vers;
    1371                 :          0 :         case rpc_proc_unavail:
    1372                 :          0 :                 goto err_bad_proc;
    1373                 :            :         }
    1374                 :            : 
    1375                 :          0 :         procp = rqstp->rq_procinfo;
    1376                 :            :         /* Should this check go into the dispatcher? */
    1377   [ #  #  #  # ]:          0 :         if (!procp || !procp->pc_func)
    1378                 :          0 :                 goto err_bad_proc;
    1379                 :            : 
    1380                 :            :         /* Syntactic check complete */
    1381                 :          0 :         serv->sv_stats->rpccnt++;
    1382                 :          0 :         trace_svc_process(rqstp, progp->pg_name);
    1383                 :            : 
    1384                 :            :         /* Build the reply header. */
    1385                 :          0 :         statp = resv->iov_base +resv->iov_len;
    1386         [ #  # ]:          0 :         svc_putnl(resv, RPC_SUCCESS);
    1387                 :            : 
    1388                 :            :         /* un-reserve some of the out-queue now that we have a
    1389                 :            :          * better idea of reply size
    1390                 :            :          */
    1391         [ #  # ]:          0 :         if (procp->pc_xdrressize)
    1392                 :          0 :                 svc_reserve_auth(rqstp, procp->pc_xdrressize<<2);
    1393                 :            : 
    1394                 :            :         /* Call the function that processes the request. */
    1395         [ #  # ]:          0 :         if (!process.dispatch) {
    1396         [ #  # ]:          0 :                 if (!svc_generic_dispatch(rqstp, statp))
    1397                 :          0 :                         goto release_dropit;
    1398         [ #  # ]:          0 :                 if (*statp == rpc_garbage_args)
    1399                 :          0 :                         goto err_garbage;
    1400                 :          0 :                 auth_stat = svc_get_autherr(rqstp, statp);
    1401         [ #  # ]:          0 :                 if (auth_stat != rpc_auth_ok)
    1402                 :          0 :                         goto err_release_bad_auth;
    1403                 :            :         } else {
    1404                 :          0 :                 dprintk("svc: calling dispatcher\n");
    1405         [ #  # ]:          0 :                 if (!process.dispatch(rqstp, statp))
    1406                 :          0 :                         goto release_dropit; /* Release reply info */
    1407                 :            :         }
    1408                 :            : 
    1409                 :            :         /* Check RPC status result */
    1410         [ #  # ]:          0 :         if (*statp != rpc_success)
    1411                 :          0 :                 resv->iov_len = ((void*)statp)  - resv->iov_base + 4;
    1412                 :            : 
    1413                 :            :         /* Release reply info */
    1414         [ #  # ]:          0 :         if (procp->pc_release)
    1415                 :          0 :                 procp->pc_release(rqstp);
    1416                 :            : 
    1417         [ #  # ]:          0 :         if (procp->pc_encode == NULL)
    1418                 :          0 :                 goto dropit;
    1419                 :            : 
    1420                 :          0 :  sendit:
    1421         [ #  # ]:          0 :         if (svc_authorise(rqstp))
    1422                 :          0 :                 goto close;
    1423                 :            :         return 1;               /* Caller can now send it */
    1424                 :            : 
    1425                 :          0 : release_dropit:
    1426         [ #  # ]:          0 :         if (procp->pc_release)
    1427                 :          0 :                 procp->pc_release(rqstp);
    1428                 :          0 :  dropit:
    1429                 :          0 :         svc_authorise(rqstp);   /* doesn't hurt to call this twice */
    1430                 :          0 :         dprintk("svc: svc_process dropit\n");
    1431                 :          0 :         return 0;
    1432                 :            : 
    1433                 :          0 :  close:
    1434   [ #  #  #  # ]:          0 :         if (rqstp->rq_xprt && test_bit(XPT_TEMP, &rqstp->rq_xprt->xpt_flags))
    1435                 :          0 :                 svc_close_xprt(rqstp->rq_xprt);
    1436                 :            :         dprintk("svc: svc_process close\n");
    1437                 :            :         return 0;
    1438                 :            : 
    1439                 :            : err_short_len:
    1440                 :          0 :         svc_printk(rqstp, "short len %zd, dropping request\n",
    1441                 :            :                         argv->iov_len);
    1442                 :          0 :         goto close;
    1443                 :            : 
    1444                 :            : err_bad_rpc:
    1445                 :          0 :         serv->sv_stats->rpcbadfmt++;
    1446                 :          0 :         svc_putnl(resv, 1);     /* REJECT */
    1447                 :          0 :         svc_putnl(resv, 0);     /* RPC_MISMATCH */
    1448                 :          0 :         svc_putnl(resv, 2);     /* Only RPCv2 supported */
    1449                 :          0 :         svc_putnl(resv, 2);
    1450                 :          0 :         goto sendit;
    1451                 :            : 
    1452                 :            : err_release_bad_auth:
    1453         [ #  # ]:          0 :         if (procp->pc_release)
    1454                 :          0 :                 procp->pc_release(rqstp);
    1455                 :          0 : err_bad_auth:
    1456                 :          0 :         dprintk("svc: authentication failed (%d)\n", ntohl(auth_stat));
    1457                 :          0 :         serv->sv_stats->rpcbadauth++;
    1458                 :            :         /* Restore write pointer to location of accept status: */
    1459                 :          0 :         xdr_ressize_check(rqstp, reply_statp);
    1460                 :          0 :         svc_putnl(resv, 1);     /* REJECT */
    1461                 :          0 :         svc_putnl(resv, 1);     /* AUTH_ERROR */
    1462                 :          0 :         svc_putnl(resv, ntohl(auth_stat));      /* status */
    1463                 :          0 :         goto sendit;
    1464                 :            : 
    1465                 :          0 : err_bad_prog:
    1466                 :          0 :         dprintk("svc: unknown program %d\n", prog);
    1467                 :          0 :         serv->sv_stats->rpcbadfmt++;
    1468                 :          0 :         svc_putnl(resv, RPC_PROG_UNAVAIL);
    1469                 :          0 :         goto sendit;
    1470                 :            : 
    1471                 :            : err_bad_vers:
    1472                 :          0 :         svc_printk(rqstp, "unknown version (%d for prog %d, %s)\n",
    1473                 :            :                        rqstp->rq_vers, rqstp->rq_prog, progp->pg_name);
    1474                 :            : 
    1475                 :          0 :         serv->sv_stats->rpcbadfmt++;
    1476                 :          0 :         svc_putnl(resv, RPC_PROG_MISMATCH);
    1477                 :          0 :         svc_putnl(resv, process.mismatch.lovers);
    1478                 :          0 :         svc_putnl(resv, process.mismatch.hivers);
    1479                 :          0 :         goto sendit;
    1480                 :            : 
    1481                 :          0 : err_bad_proc:
    1482                 :          0 :         svc_printk(rqstp, "unknown procedure (%d)\n", rqstp->rq_proc);
    1483                 :            : 
    1484                 :          0 :         serv->sv_stats->rpcbadfmt++;
    1485                 :          0 :         svc_putnl(resv, RPC_PROC_UNAVAIL);
    1486                 :          0 :         goto sendit;
    1487                 :            : 
    1488                 :            : err_garbage:
    1489                 :            :         svc_printk(rqstp, "failed to decode args\n");
    1490                 :            : 
    1491                 :            :         rpc_stat = rpc_garbage_args;
    1492                 :          0 : err_bad:
    1493                 :          0 :         serv->sv_stats->rpcbadfmt++;
    1494                 :          0 :         svc_putnl(resv, ntohl(rpc_stat));
    1495                 :          0 :         goto sendit;
    1496                 :            : }
    1497                 :            : 
    1498                 :            : /*
    1499                 :            :  * Process the RPC request.
    1500                 :            :  */
    1501                 :            : int
    1502                 :          0 : svc_process(struct svc_rqst *rqstp)
    1503                 :            : {
    1504                 :          0 :         struct kvec             *argv = &rqstp->rq_arg.head[0];
    1505                 :          0 :         struct kvec             *resv = &rqstp->rq_res.head[0];
    1506                 :          0 :         struct svc_serv         *serv = rqstp->rq_server;
    1507                 :          0 :         u32                     dir;
    1508                 :            : 
    1509                 :            :         /*
    1510                 :            :          * Setup response xdr_buf.
    1511                 :            :          * Initially it has just one page
    1512                 :            :          */
    1513                 :          0 :         rqstp->rq_next_page = &rqstp->rq_respages[1];
    1514         [ #  # ]:          0 :         resv->iov_base = page_address(rqstp->rq_respages[0]);
    1515                 :          0 :         resv->iov_len = 0;
    1516                 :          0 :         rqstp->rq_res.pages = rqstp->rq_respages + 1;
    1517                 :          0 :         rqstp->rq_res.len = 0;
    1518                 :          0 :         rqstp->rq_res.page_base = 0;
    1519                 :          0 :         rqstp->rq_res.page_len = 0;
    1520                 :          0 :         rqstp->rq_res.buflen = PAGE_SIZE;
    1521                 :          0 :         rqstp->rq_res.tail[0].iov_base = NULL;
    1522                 :          0 :         rqstp->rq_res.tail[0].iov_len = 0;
    1523                 :            : 
    1524         [ #  # ]:          0 :         dir  = svc_getnl(argv);
    1525         [ #  # ]:          0 :         if (dir != 0) {
    1526                 :            :                 /* direction != CALL */
    1527                 :          0 :                 svc_printk(rqstp, "bad direction %d, dropping request\n", dir);
    1528                 :          0 :                 serv->sv_stats->rpcbadfmt++;
    1529                 :          0 :                 goto out_drop;
    1530                 :            :         }
    1531                 :            : 
    1532                 :            :         /* Reserve space for the record marker */
    1533         [ #  # ]:          0 :         if (rqstp->rq_prot == IPPROTO_TCP)
    1534                 :          0 :                 svc_putnl(resv, 0);
    1535                 :            : 
    1536                 :            :         /* Returns 1 for send, 0 for drop */
    1537         [ #  # ]:          0 :         if (likely(svc_process_common(rqstp, argv, resv)))
    1538                 :          0 :                 return svc_send(rqstp);
    1539                 :            : 
    1540                 :          0 : out_drop:
    1541                 :          0 :         svc_drop(rqstp);
    1542                 :          0 :         return 0;
    1543                 :            : }
    1544                 :            : EXPORT_SYMBOL_GPL(svc_process);
    1545                 :            : 
    1546                 :            : #if defined(CONFIG_SUNRPC_BACKCHANNEL)
    1547                 :            : /*
    1548                 :            :  * Process a backchannel RPC request that arrived over an existing
    1549                 :            :  * outbound connection
    1550                 :            :  */
    1551                 :            : int
    1552                 :            : bc_svc_process(struct svc_serv *serv, struct rpc_rqst *req,
    1553                 :            :                struct svc_rqst *rqstp)
    1554                 :            : {
    1555                 :            :         struct kvec     *argv = &rqstp->rq_arg.head[0];
    1556                 :            :         struct kvec     *resv = &rqstp->rq_res.head[0];
    1557                 :            :         struct rpc_task *task;
    1558                 :            :         int proc_error;
    1559                 :            :         int error;
    1560                 :            : 
    1561                 :            :         dprintk("svc: %s(%p)\n", __func__, req);
    1562                 :            : 
    1563                 :            :         /* Build the svc_rqst used by the common processing routine */
    1564                 :            :         rqstp->rq_xid = req->rq_xid;
    1565                 :            :         rqstp->rq_prot = req->rq_xprt->prot;
    1566                 :            :         rqstp->rq_server = serv;
    1567                 :            :         rqstp->rq_bc_net = req->rq_xprt->xprt_net;
    1568                 :            : 
    1569                 :            :         rqstp->rq_addrlen = sizeof(req->rq_xprt->addr);
    1570                 :            :         memcpy(&rqstp->rq_addr, &req->rq_xprt->addr, rqstp->rq_addrlen);
    1571                 :            :         memcpy(&rqstp->rq_arg, &req->rq_rcv_buf, sizeof(rqstp->rq_arg));
    1572                 :            :         memcpy(&rqstp->rq_res, &req->rq_snd_buf, sizeof(rqstp->rq_res));
    1573                 :            : 
    1574                 :            :         /* Adjust the argument buffer length */
    1575                 :            :         rqstp->rq_arg.len = req->rq_private_buf.len;
    1576                 :            :         if (rqstp->rq_arg.len <= rqstp->rq_arg.head[0].iov_len) {
    1577                 :            :                 rqstp->rq_arg.head[0].iov_len = rqstp->rq_arg.len;
    1578                 :            :                 rqstp->rq_arg.page_len = 0;
    1579                 :            :         } else if (rqstp->rq_arg.len <= rqstp->rq_arg.head[0].iov_len +
    1580                 :            :                         rqstp->rq_arg.page_len)
    1581                 :            :                 rqstp->rq_arg.page_len = rqstp->rq_arg.len -
    1582                 :            :                         rqstp->rq_arg.head[0].iov_len;
    1583                 :            :         else
    1584                 :            :                 rqstp->rq_arg.len = rqstp->rq_arg.head[0].iov_len +
    1585                 :            :                         rqstp->rq_arg.page_len;
    1586                 :            : 
    1587                 :            :         /* reset result send buffer "put" position */
    1588                 :            :         resv->iov_len = 0;
    1589                 :            : 
    1590                 :            :         /*
    1591                 :            :          * Skip the next two words because they've already been
    1592                 :            :          * processed in the transport
    1593                 :            :          */
    1594                 :            :         svc_getu32(argv);       /* XID */
    1595                 :            :         svc_getnl(argv);        /* CALLDIR */
    1596                 :            : 
    1597                 :            :         /* Parse and execute the bc call */
    1598                 :            :         proc_error = svc_process_common(rqstp, argv, resv);
    1599                 :            : 
    1600                 :            :         atomic_dec(&req->rq_xprt->bc_slot_count);
    1601                 :            :         if (!proc_error) {
    1602                 :            :                 /* Processing error: drop the request */
    1603                 :            :                 xprt_free_bc_request(req);
    1604                 :            :                 error = -EINVAL;
    1605                 :            :                 goto out;
    1606                 :            :         }
    1607                 :            :         /* Finally, send the reply synchronously */
    1608                 :            :         memcpy(&req->rq_snd_buf, &rqstp->rq_res, sizeof(req->rq_snd_buf));
    1609                 :            :         task = rpc_run_bc_task(req);
    1610                 :            :         if (IS_ERR(task)) {
    1611                 :            :                 error = PTR_ERR(task);
    1612                 :            :                 goto out;
    1613                 :            :         }
    1614                 :            : 
    1615                 :            :         WARN_ON_ONCE(atomic_read(&task->tk_count) != 1);
    1616                 :            :         error = task->tk_status;
    1617                 :            :         rpc_put_task(task);
    1618                 :            : 
    1619                 :            : out:
    1620                 :            :         dprintk("svc: %s(), error=%d\n", __func__, error);
    1621                 :            :         return error;
    1622                 :            : }
    1623                 :            : EXPORT_SYMBOL_GPL(bc_svc_process);
    1624                 :            : #endif /* CONFIG_SUNRPC_BACKCHANNEL */
    1625                 :            : 
    1626                 :            : /*
    1627                 :            :  * Return (transport-specific) limit on the rpc payload.
    1628                 :            :  */
    1629                 :          0 : u32 svc_max_payload(const struct svc_rqst *rqstp)
    1630                 :            : {
    1631                 :          0 :         u32 max = rqstp->rq_xprt->xpt_class->xcl_max_payload;
    1632                 :            : 
    1633                 :          0 :         if (rqstp->rq_server->sv_max_payload < max)
    1634                 :            :                 max = rqstp->rq_server->sv_max_payload;
    1635                 :          0 :         return max;
    1636                 :            : }
    1637                 :            : EXPORT_SYMBOL_GPL(svc_max_payload);
    1638                 :            : 
    1639                 :            : /**
    1640                 :            :  * svc_fill_write_vector - Construct data argument for VFS write call
    1641                 :            :  * @rqstp: svc_rqst to operate on
    1642                 :            :  * @pages: list of pages containing data payload
    1643                 :            :  * @first: buffer containing first section of write payload
    1644                 :            :  * @total: total number of bytes of write payload
    1645                 :            :  *
    1646                 :            :  * Fills in rqstp::rq_vec, and returns the number of elements.
    1647                 :            :  */
    1648                 :          0 : unsigned int svc_fill_write_vector(struct svc_rqst *rqstp, struct page **pages,
    1649                 :            :                                    struct kvec *first, size_t total)
    1650                 :            : {
    1651                 :          0 :         struct kvec *vec = rqstp->rq_vec;
    1652                 :          0 :         unsigned int i;
    1653                 :            : 
    1654                 :            :         /* Some types of transport can present the write payload
    1655                 :            :          * entirely in rq_arg.pages. In this case, @first is empty.
    1656                 :            :          */
    1657                 :          0 :         i = 0;
    1658         [ #  # ]:          0 :         if (first->iov_len) {
    1659                 :          0 :                 vec[i].iov_base = first->iov_base;
    1660                 :          0 :                 vec[i].iov_len = min_t(size_t, total, first->iov_len);
    1661                 :          0 :                 total -= vec[i].iov_len;
    1662                 :          0 :                 ++i;
    1663                 :            :         }
    1664                 :            : 
    1665         [ #  # ]:          0 :         while (total) {
    1666                 :          0 :                 vec[i].iov_base = page_address(*pages);
    1667                 :          0 :                 vec[i].iov_len = min_t(size_t, total, PAGE_SIZE);
    1668                 :          0 :                 total -= vec[i].iov_len;
    1669                 :          0 :                 ++i;
    1670                 :          0 :                 ++pages;
    1671                 :            :         }
    1672                 :            : 
    1673         [ #  # ]:          0 :         WARN_ON_ONCE(i > ARRAY_SIZE(rqstp->rq_vec));
    1674                 :          0 :         return i;
    1675                 :            : }
    1676                 :            : EXPORT_SYMBOL_GPL(svc_fill_write_vector);
    1677                 :            : 
    1678                 :            : /**
    1679                 :            :  * svc_fill_symlink_pathname - Construct pathname argument for VFS symlink call
    1680                 :            :  * @rqstp: svc_rqst to operate on
    1681                 :            :  * @first: buffer containing first section of pathname
    1682                 :            :  * @p: buffer containing remaining section of pathname
    1683                 :            :  * @total: total length of the pathname argument
    1684                 :            :  *
    1685                 :            :  * The VFS symlink API demands a NUL-terminated pathname in mapped memory.
    1686                 :            :  * Returns pointer to a NUL-terminated string, or an ERR_PTR. Caller must free
    1687                 :            :  * the returned string.
    1688                 :            :  */
    1689                 :          0 : char *svc_fill_symlink_pathname(struct svc_rqst *rqstp, struct kvec *first,
    1690                 :            :                                 void *p, size_t total)
    1691                 :            : {
    1692                 :          0 :         size_t len, remaining;
    1693                 :          0 :         char *result, *dst;
    1694                 :            : 
    1695         [ #  # ]:          0 :         result = kmalloc(total + 1, GFP_KERNEL);
    1696         [ #  # ]:          0 :         if (!result)
    1697                 :            :                 return ERR_PTR(-ESERVERFAULT);
    1698                 :            : 
    1699                 :          0 :         dst = result;
    1700                 :          0 :         remaining = total;
    1701                 :            : 
    1702                 :          0 :         len = min_t(size_t, total, first->iov_len);
    1703         [ #  # ]:          0 :         if (len) {
    1704                 :          0 :                 memcpy(dst, first->iov_base, len);
    1705                 :          0 :                 dst += len;
    1706                 :          0 :                 remaining -= len;
    1707                 :            :         }
    1708                 :            : 
    1709         [ #  # ]:          0 :         if (remaining) {
    1710                 :          0 :                 len = min_t(size_t, remaining, PAGE_SIZE);
    1711                 :          0 :                 memcpy(dst, p, len);
    1712                 :          0 :                 dst += len;
    1713                 :            :         }
    1714                 :            : 
    1715                 :          0 :         *dst = '\0';
    1716                 :            : 
    1717                 :            :         /* Sanity check: Linux doesn't allow the pathname argument to
    1718                 :            :          * contain a NUL byte.
    1719                 :            :          */
    1720         [ #  # ]:          0 :         if (strlen(result) != total) {
    1721                 :          0 :                 kfree(result);
    1722                 :          0 :                 return ERR_PTR(-EINVAL);
    1723                 :            :         }
    1724                 :            :         return result;
    1725                 :            : }
    1726                 :            : EXPORT_SYMBOL_GPL(svc_fill_symlink_pathname);

Generated by: LCOV version 1.14