linux/fs/nfsd/netns.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-or-later */
   2/*
   3 * per net namespace data structures for nfsd
   4 *
   5 * Copyright (C) 2012, Jeff Layton <jlayton@redhat.com>
   6 */
   7
   8#ifndef __NFSD_NETNS_H__
   9#define __NFSD_NETNS_H__
  10
  11#include <net/net_namespace.h>
  12#include <net/netns/generic.h>
  13#include <linux/percpu_counter.h>
  14#include <linux/siphash.h>
  15
  16/* Hash tables for nfs4_clientid state */
  17#define CLIENT_HASH_BITS                 4
  18#define CLIENT_HASH_SIZE                (1 << CLIENT_HASH_BITS)
  19#define CLIENT_HASH_MASK                (CLIENT_HASH_SIZE - 1)
  20
  21#define SESSION_HASH_SIZE       512
  22
  23struct cld_net;
  24struct nfsd4_client_tracking_ops;
  25
  26enum {
  27        /* cache misses due only to checksum comparison failures */
  28        NFSD_NET_PAYLOAD_MISSES,
  29        /* amount of memory (in bytes) currently consumed by the DRC */
  30        NFSD_NET_DRC_MEM_USAGE,
  31        NFSD_NET_COUNTERS_NUM
  32};
  33
  34/*
  35 * Represents a nfsd "container". With respect to nfsv4 state tracking, the
  36 * fields of interest are the *_id_hashtbls and the *_name_tree. These track
  37 * the nfs4_client objects by either short or long form clientid.
  38 *
  39 * Each nfsd_net runs a nfs4_laundromat workqueue job when necessary to clean
  40 * up expired clients and delegations within the container.
  41 */
  42struct nfsd_net {
  43        struct cld_net *cld_net;
  44
  45        struct cache_detail *svc_expkey_cache;
  46        struct cache_detail *svc_export_cache;
  47
  48        struct cache_detail *idtoname_cache;
  49        struct cache_detail *nametoid_cache;
  50
  51        struct lock_manager nfsd4_manager;
  52        bool grace_ended;
  53        time64_t boot_time;
  54
  55        struct dentry *nfsd_client_dir;
  56
  57        /*
  58         * reclaim_str_hashtbl[] holds known client info from previous reset/reboot
  59         * used in reboot/reset lease grace period processing
  60         *
  61         * conf_id_hashtbl[], and conf_name_tree hold confirmed
  62         * setclientid_confirmed info.
  63         *
  64         * unconf_str_hastbl[] and unconf_name_tree hold unconfirmed
  65         * setclientid info.
  66         */
  67        struct list_head *reclaim_str_hashtbl;
  68        int reclaim_str_hashtbl_size;
  69        struct list_head *conf_id_hashtbl;
  70        struct rb_root conf_name_tree;
  71        struct list_head *unconf_id_hashtbl;
  72        struct rb_root unconf_name_tree;
  73        struct list_head *sessionid_hashtbl;
  74        /*
  75         * client_lru holds client queue ordered by nfs4_client.cl_time
  76         * for lease renewal.
  77         *
  78         * close_lru holds (open) stateowner queue ordered by nfs4_stateowner.so_time
  79         * for last close replay.
  80         *
  81         * All of the above fields are protected by the client_mutex.
  82         */
  83        struct list_head client_lru;
  84        struct list_head close_lru;
  85        struct list_head del_recall_lru;
  86
  87        /* protected by blocked_locks_lock */
  88        struct list_head blocked_locks_lru;
  89
  90        struct delayed_work laundromat_work;
  91
  92        /* client_lock protects the client lru list and session hash table */
  93        spinlock_t client_lock;
  94
  95        /* protects blocked_locks_lru */
  96        spinlock_t blocked_locks_lock;
  97
  98        struct file *rec_file;
  99        bool in_grace;
 100        const struct nfsd4_client_tracking_ops *client_tracking_ops;
 101
 102        time64_t nfsd4_lease;
 103        time64_t nfsd4_grace;
 104        bool somebody_reclaimed;
 105
 106        bool track_reclaim_completes;
 107        atomic_t nr_reclaim_complete;
 108
 109        bool nfsd_net_up;
 110        bool lockd_up;
 111
 112        seqlock_t writeverf_lock;
 113        unsigned char writeverf[8];
 114
 115        /*
 116         * Max number of connections this nfsd container will allow. Defaults
 117         * to '0' which is means that it bases this on the number of threads.
 118         */
 119        unsigned int max_connections;
 120
 121        u32 clientid_base;
 122        u32 clientid_counter;
 123        u32 clverifier_counter;
 124
 125        struct svc_serv *nfsd_serv;
 126        /* When a listening socket is added to nfsd, keep_active is set
 127         * and this justifies a reference on nfsd_serv.  This stops
 128         * nfsd_serv from being freed.  When the number of threads is
 129         * set, keep_active is cleared and the reference is dropped.  So
 130         * when the last thread exits, the service will be destroyed.
 131         */
 132        int keep_active;
 133
 134        /*
 135         * clientid and stateid data for construction of net unique COPY
 136         * stateids.
 137         */
 138        u32             s2s_cp_cl_id;
 139        struct idr      s2s_cp_stateids;
 140        spinlock_t      s2s_cp_lock;
 141
 142        /*
 143         * Version information
 144         */
 145        bool *nfsd_versions;
 146        bool *nfsd4_minorversions;
 147
 148        /*
 149         * Duplicate reply cache
 150         */
 151        struct nfsd_drc_bucket   *drc_hashtbl;
 152
 153        /* max number of entries allowed in the cache */
 154        unsigned int             max_drc_entries;
 155
 156        /* number of significant bits in the hash value */
 157        unsigned int             maskbits;
 158        unsigned int             drc_hashsize;
 159
 160        /*
 161         * Stats and other tracking of on the duplicate reply cache.
 162         * The longest_chain* fields are modified with only the per-bucket
 163         * cache lock, which isn't really safe and should be fixed if we want
 164         * these statistics to be completely accurate.
 165         */
 166
 167        /* total number of entries */
 168        atomic_t                 num_drc_entries;
 169
 170        /* Per-netns stats counters */
 171        struct percpu_counter    counter[NFSD_NET_COUNTERS_NUM];
 172
 173        /* longest hash chain seen */
 174        unsigned int             longest_chain;
 175
 176        /* size of cache when we saw the longest hash chain */
 177        unsigned int             longest_chain_cachesize;
 178
 179        struct shrinker         nfsd_reply_cache_shrinker;
 180
 181        /* tracking server-to-server copy mounts */
 182        spinlock_t              nfsd_ssc_lock;
 183        struct list_head        nfsd_ssc_mount_list;
 184        wait_queue_head_t       nfsd_ssc_waitq;
 185
 186        /* utsname taken from the process that starts the server */
 187        char                    nfsd_name[UNX_MAXNODENAME+1];
 188
 189        struct nfsd_fcache_disposal *fcache_disposal;
 190
 191        siphash_key_t           siphash_key;
 192};
 193
 194/* Simple check to find out if a given net was properly initialized */
 195#define nfsd_netns_ready(nn) ((nn)->sessionid_hashtbl)
 196
 197extern void nfsd_netns_free_versions(struct nfsd_net *nn);
 198
 199extern unsigned int nfsd_net_id;
 200
 201void nfsd_copy_write_verifier(__be32 verf[2], struct nfsd_net *nn);
 202void nfsd_reset_write_verifier(struct nfsd_net *nn);
 203#endif /* __NFSD_NETNS_H__ */
 204