| 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
| 2 | #ifndef _NFS_FS_SB |
| 3 | #define _NFS_FS_SB |
| 4 | |
| 5 | #include <linux/list.h> |
| 6 | #include <linux/backing-dev.h> |
| 7 | #include <linux/idr.h> |
| 8 | #include <linux/wait.h> |
| 9 | #include <linux/nfs_xdr.h> |
| 10 | #include <linux/sunrpc/xprt.h> |
| 11 | #include <linux/nfslocalio.h> |
| 12 | |
| 13 | #include <linux/atomic.h> |
| 14 | #include <linux/refcount.h> |
| 15 | |
| 16 | struct nfs4_session; |
| 17 | struct nfs_iostats; |
| 18 | struct nlm_host; |
| 19 | struct nfs4_sequence_args; |
| 20 | struct nfs4_sequence_res; |
| 21 | struct nfs_server; |
| 22 | struct nfs4_minor_version_ops; |
| 23 | struct nfs41_server_scope; |
| 24 | struct nfs41_impl_id; |
| 25 | |
| 26 | /* |
| 27 | * The nfs_client identifies our client state to the server. |
| 28 | */ |
| 29 | struct nfs_client { |
| 30 | refcount_t cl_count; |
| 31 | atomic_t cl_mds_count; |
| 32 | int cl_cons_state; /* current construction state (-ve: init error) */ |
| 33 | #define NFS_CS_READY 0 /* ready to be used */ |
| 34 | #define NFS_CS_INITING 1 /* busy initialising */ |
| 35 | #define NFS_CS_SESSION_INITING 2 /* busy initialising session */ |
| 36 | unsigned long cl_res_state; /* NFS resources state */ |
| 37 | #define NFS_CS_CALLBACK 1 /* - callback started */ |
| 38 | #define NFS_CS_IDMAP 2 /* - idmap started */ |
| 39 | #define NFS_CS_RENEWD 3 /* - renewd started */ |
| 40 | #define NFS_CS_STOP_RENEW 4 /* no more state to renew */ |
| 41 | #define NFS_CS_CHECK_LEASE_TIME 5 /* need to check lease time */ |
| 42 | unsigned long cl_flags; /* behavior switches */ |
| 43 | #define NFS_CS_NORESVPORT 0 /* - use ephemeral src port */ |
| 44 | #define NFS_CS_DISCRTRY 1 /* - disconnect on RPC retry */ |
| 45 | #define NFS_CS_MIGRATION 2 /* - transparent state migr */ |
| 46 | #define NFS_CS_INFINITE_SLOTS 3 /* - don't limit TCP slots */ |
| 47 | #define NFS_CS_NO_RETRANS_TIMEOUT 4 /* - Disable retransmit timeouts */ |
| 48 | #define NFS_CS_TSM_POSSIBLE 5 /* - Maybe state migration */ |
| 49 | #define NFS_CS_NOPING 6 /* - don't ping on connect */ |
| 50 | #define NFS_CS_DS 7 /* - Server is a DS */ |
| 51 | #define NFS_CS_REUSEPORT 8 /* - reuse src port on reconnect */ |
| 52 | #define NFS_CS_PNFS 9 /* - Server used for pnfs */ |
| 53 | #define NFS_CS_NETUNREACH_FATAL 10 /* - ENETUNREACH errors are fatal */ |
| 54 | struct sockaddr_storage cl_addr; /* server identifier */ |
| 55 | size_t cl_addrlen; |
| 56 | char * cl_hostname; /* hostname of server */ |
| 57 | char * cl_acceptor; /* GSSAPI acceptor name */ |
| 58 | struct list_head cl_share_link; /* link in global client list */ |
| 59 | struct list_head cl_superblocks; /* List of nfs_server structs */ |
| 60 | |
| 61 | struct rpc_clnt * cl_rpcclient; |
| 62 | const struct nfs_rpc_ops *rpc_ops; /* NFS protocol vector */ |
| 63 | int cl_proto; /* Network transport protocol */ |
| 64 | struct nfs_subversion * cl_nfs_mod; /* pointer to nfs version module */ |
| 65 | |
| 66 | u32 cl_minorversion;/* NFSv4 minorversion */ |
| 67 | unsigned int cl_nconnect; /* Number of connections */ |
| 68 | unsigned int cl_max_connect; /* max number of xprts allowed */ |
| 69 | const char * cl_principal; /* used for machine cred */ |
| 70 | struct xprtsec_parms cl_xprtsec; /* xprt security policy */ |
| 71 | |
| 72 | #if IS_ENABLED(CONFIG_NFS_V4) |
| 73 | struct list_head cl_ds_clients; /* auth flavor data servers */ |
| 74 | u64 cl_clientid; /* constant */ |
| 75 | nfs4_verifier cl_confirm; /* Clientid verifier */ |
| 76 | unsigned long cl_state; |
| 77 | |
| 78 | spinlock_t cl_lock; |
| 79 | |
| 80 | unsigned long cl_lease_time; |
| 81 | unsigned long cl_last_renewal; |
| 82 | struct delayed_work cl_renewd; |
| 83 | |
| 84 | struct rpc_wait_queue cl_rpcwaitq; |
| 85 | |
| 86 | /* idmapper */ |
| 87 | struct idmap * cl_idmap; |
| 88 | |
| 89 | /* Client owner identifier */ |
| 90 | const char * cl_owner_id; |
| 91 | |
| 92 | u32 cl_cb_ident; /* v4.0 callback identifier */ |
| 93 | const struct nfs4_minor_version_ops *cl_mvops; |
| 94 | unsigned long cl_mig_gen; |
| 95 | |
| 96 | /* NFSv4.0 transport blocking */ |
| 97 | struct nfs4_slot_table *cl_slot_tbl; |
| 98 | |
| 99 | /* The sequence id to use for the next CREATE_SESSION */ |
| 100 | u32 cl_seqid; |
| 101 | /* The flags used for obtaining the clientid during EXCHANGE_ID */ |
| 102 | u32 cl_exchange_flags; |
| 103 | struct nfs4_session *cl_session; /* shared session */ |
| 104 | bool cl_preserve_clid; |
| 105 | struct nfs41_server_owner *cl_serverowner; |
| 106 | struct nfs41_server_scope *cl_serverscope; |
| 107 | struct nfs41_impl_id *cl_implid; |
| 108 | /* nfs 4.1+ state protection modes: */ |
| 109 | unsigned long cl_sp4_flags; |
| 110 | #define NFS_SP4_MACH_CRED_MINIMAL 1 /* Minimal sp4_mach_cred - state ops |
| 111 | * must use machine cred */ |
| 112 | #define NFS_SP4_MACH_CRED_CLEANUP 2 /* CLOSE and LOCKU */ |
| 113 | #define NFS_SP4_MACH_CRED_SECINFO 3 /* SECINFO and SECINFO_NO_NAME */ |
| 114 | #define NFS_SP4_MACH_CRED_STATEID 4 /* TEST_STATEID and FREE_STATEID */ |
| 115 | #define NFS_SP4_MACH_CRED_WRITE 5 /* WRITE */ |
| 116 | #define NFS_SP4_MACH_CRED_COMMIT 6 /* COMMIT */ |
| 117 | #define NFS_SP4_MACH_CRED_PNFS_CLEANUP 7 /* LAYOUTRETURN */ |
| 118 | #if IS_ENABLED(CONFIG_NFS_V4_1) |
| 119 | wait_queue_head_t cl_lock_waitq; |
| 120 | #endif /* CONFIG_NFS_V4_1 */ |
| 121 | #endif /* CONFIG_NFS_V4 */ |
| 122 | |
| 123 | /* Our own IP address, as a null-terminated string. |
| 124 | * This is used to generate the mv0 callback address. |
| 125 | */ |
| 126 | char cl_ipaddr[48]; |
| 127 | struct net *cl_net; |
| 128 | netns_tracker cl_ns_tracker; |
| 129 | struct list_head pending_cb_stateids; |
| 130 | struct rcu_head rcu; |
| 131 | |
| 132 | #if IS_ENABLED(CONFIG_NFS_LOCALIO) |
| 133 | struct timespec64 cl_nfssvc_boot; |
| 134 | seqlock_t cl_boot_lock; |
| 135 | nfs_uuid_t cl_uuid; |
| 136 | struct work_struct cl_local_probe_work; |
| 137 | #endif /* CONFIG_NFS_LOCALIO */ |
| 138 | }; |
| 139 | |
| 140 | /* |
| 141 | * NFS client parameters stored in the superblock. |
| 142 | */ |
| 143 | struct nfs_server { |
| 144 | struct nfs_client * nfs_client; /* shared client and NFS4 state */ |
| 145 | struct list_head client_link; /* List of other nfs_server structs |
| 146 | * that share the same client |
| 147 | */ |
| 148 | struct list_head master_link; /* link in master servers list */ |
| 149 | struct rpc_clnt * client; /* RPC client handle */ |
| 150 | struct rpc_clnt * client_acl; /* ACL RPC client handle */ |
| 151 | struct nlm_host *nlm_host; /* NLM client handle */ |
| 152 | struct nfs_iostats __percpu *io_stats; /* I/O statistics */ |
| 153 | wait_queue_head_t write_congestion_wait; /* wait until write congestion eases */ |
| 154 | atomic_long_t writeback; /* number of writeback pages */ |
| 155 | unsigned int write_congested;/* flag set when writeback gets too high */ |
| 156 | unsigned int flags; /* various flags */ |
| 157 | |
| 158 | /* The following are for internal use only. Also see uapi/linux/nfs_mount.h */ |
| 159 | #define NFS_MOUNT_LOOKUP_CACHE_NONEG 0x10000 |
| 160 | #define NFS_MOUNT_LOOKUP_CACHE_NONE 0x20000 |
| 161 | #define NFS_MOUNT_NORESVPORT 0x40000 |
| 162 | #define NFS_MOUNT_LEGACY_INTERFACE 0x80000 |
| 163 | #define NFS_MOUNT_LOCAL_FLOCK 0x100000 |
| 164 | #define NFS_MOUNT_LOCAL_FCNTL 0x200000 |
| 165 | #define NFS_MOUNT_SOFTERR 0x400000 |
| 166 | #define NFS_MOUNT_SOFTREVAL 0x800000 |
| 167 | #define NFS_MOUNT_WRITE_EAGER 0x01000000 |
| 168 | #define NFS_MOUNT_WRITE_WAIT 0x02000000 |
| 169 | #define NFS_MOUNT_TRUNK_DISCOVERY 0x04000000 |
| 170 | #define NFS_MOUNT_SHUTDOWN 0x08000000 |
| 171 | #define NFS_MOUNT_NO_ALIGNWRITE 0x10000000 |
| 172 | #define NFS_MOUNT_FORCE_RDIRPLUS 0x20000000 |
| 173 | #define NFS_MOUNT_NETUNREACH_FATAL 0x40000000 |
| 174 | |
| 175 | unsigned int automount_inherit; /* Properties inherited by automount */ |
| 176 | #define NFS_AUTOMOUNT_INHERIT_BSIZE 0x0001 |
| 177 | #define NFS_AUTOMOUNT_INHERIT_RSIZE 0x0002 |
| 178 | #define NFS_AUTOMOUNT_INHERIT_WSIZE 0x0004 |
| 179 | |
| 180 | unsigned int caps; /* server capabilities */ |
| 181 | __u64 fattr_valid; /* Valid attributes */ |
| 182 | unsigned int rsize; /* read size */ |
| 183 | unsigned int rpages; /* read size (in pages) */ |
| 184 | unsigned int wsize; /* write size */ |
| 185 | unsigned int wtmult; /* server disk block size */ |
| 186 | unsigned int dtsize; /* readdir size */ |
| 187 | unsigned short port; /* "port=" setting */ |
| 188 | unsigned int bsize; /* server block size */ |
| 189 | #ifdef CONFIG_NFS_V4_2 |
| 190 | unsigned int gxasize; /* getxattr size */ |
| 191 | unsigned int sxasize; /* setxattr size */ |
| 192 | unsigned int lxasize; /* listxattr size */ |
| 193 | #endif |
| 194 | unsigned int acregmin; /* attr cache timeouts */ |
| 195 | unsigned int acregmax; |
| 196 | unsigned int acdirmin; |
| 197 | unsigned int acdirmax; |
| 198 | unsigned int namelen; |
| 199 | unsigned int options; /* extra options enabled by mount */ |
| 200 | unsigned int clone_blksize; /* granularity of a CLONE operation */ |
| 201 | #define NFS_OPTION_FSCACHE 0x00000001 /* - local caching enabled */ |
| 202 | #define NFS_OPTION_MIGRATION 0x00000002 /* - NFSv4 migration enabled */ |
| 203 | |
| 204 | enum nfs4_change_attr_type |
| 205 | change_attr_type;/* Description of change attribute */ |
| 206 | |
| 207 | struct nfs_fsid fsid; |
| 208 | int s_sysfs_id; /* sysfs dentry index */ |
| 209 | __u64 maxfilesize; /* maximum file size */ |
| 210 | unsigned long mount_time; /* when this fs was mounted */ |
| 211 | struct super_block *super; /* VFS super block */ |
| 212 | dev_t s_dev; /* superblock dev numbers */ |
| 213 | struct nfs_auth_info auth_info; /* parsed auth flavors */ |
| 214 | |
| 215 | #ifdef CONFIG_NFS_FSCACHE |
| 216 | struct fscache_volume *fscache; /* superblock cookie */ |
| 217 | char *fscache_uniq; /* Uniquifier (or NULL) */ |
| 218 | #endif |
| 219 | |
| 220 | /* The following #defines numerically match the NFSv4 equivalents */ |
| 221 | #define NFS_FH_NOEXPIRE_WITH_OPEN (0x1) |
| 222 | #define NFS_FH_VOLATILE_ANY (0x2) |
| 223 | #define NFS_FH_VOL_MIGRATION (0x4) |
| 224 | #define NFS_FH_VOL_RENAME (0x8) |
| 225 | #define NFS_FH_RENAME_UNSAFE (NFS_FH_VOLATILE_ANY | NFS_FH_VOL_RENAME) |
| 226 | u32 fh_expire_type; /* V4 bitmask representing file |
| 227 | handle volatility type for |
| 228 | this filesystem */ |
| 229 | u32 pnfs_blksize; /* layout_blksize attr */ |
| 230 | #if IS_ENABLED(CONFIG_NFS_V4) |
| 231 | u32 attr_bitmask[3];/* V4 bitmask representing the set |
| 232 | of attributes supported on this |
| 233 | filesystem */ |
| 234 | u32 attr_bitmask_nl[3]; |
| 235 | /* V4 bitmask representing the |
| 236 | set of attributes supported |
| 237 | on this filesystem excluding |
| 238 | the label support bit. */ |
| 239 | u32 exclcreat_bitmask[3]; |
| 240 | /* V4 bitmask representing the |
| 241 | set of attributes supported |
| 242 | on this filesystem for the |
| 243 | exclusive create. */ |
| 244 | u32 cache_consistency_bitmask[3]; |
| 245 | /* V4 bitmask representing the subset |
| 246 | of change attribute, size, ctime |
| 247 | and mtime attributes supported by |
| 248 | the server */ |
| 249 | u32 acl_bitmask; /* V4 bitmask representing the ACEs |
| 250 | that are supported on this |
| 251 | filesystem */ |
| 252 | struct pnfs_layoutdriver_type *pnfs_curr_ld; /* Active layout driver */ |
| 253 | struct rpc_wait_queue roc_rpcwaitq; |
| 254 | |
| 255 | /* the following fields are protected by nfs_client->cl_lock */ |
| 256 | struct rb_root state_owners; |
| 257 | #endif |
| 258 | atomic64_t owner_ctr; |
| 259 | struct list_head state_owners_lru; |
| 260 | struct list_head layouts; |
| 261 | struct list_head delegations; |
| 262 | atomic_long_t nr_active_delegations; |
| 263 | unsigned int delegation_hash_mask; |
| 264 | struct hlist_head *delegation_hash_table; |
| 265 | struct list_head ss_copies; |
| 266 | struct list_head ss_src_copies; |
| 267 | |
| 268 | unsigned long delegation_flags; |
| 269 | #define NFS4SERV_DELEGRETURN (1) |
| 270 | #define NFS4SERV_DELEGATION_EXPIRED (2) |
| 271 | #define NFS4SERV_DELEGRETURN_DELAYED (3) |
| 272 | unsigned long delegation_gen; |
| 273 | unsigned long mig_gen; |
| 274 | unsigned long mig_status; |
| 275 | #define NFS_MIG_IN_TRANSITION (1) |
| 276 | #define NFS_MIG_FAILED (2) |
| 277 | #define NFS_MIG_TSM_POSSIBLE (3) |
| 278 | |
| 279 | void (*destroy)(struct nfs_server *); |
| 280 | |
| 281 | atomic_t active; /* Keep trace of any activity to this server */ |
| 282 | |
| 283 | /* mountd-related mount options */ |
| 284 | struct sockaddr_storage mountd_address; |
| 285 | size_t mountd_addrlen; |
| 286 | u32 mountd_version; |
| 287 | unsigned short mountd_port; |
| 288 | unsigned short mountd_protocol; |
| 289 | struct rpc_wait_queue uoc_rpcwaitq; |
| 290 | |
| 291 | /* XDR related information */ |
| 292 | unsigned int read_hdrsize; |
| 293 | |
| 294 | /* User namespace info */ |
| 295 | const struct cred *cred; |
| 296 | bool has_sec_mnt_opts; |
| 297 | struct kobject kobj; |
| 298 | struct rcu_head rcu; |
| 299 | }; |
| 300 | |
| 301 | /* Server capabilities */ |
| 302 | #define NFS_CAP_READDIRPLUS (1U << 0) |
| 303 | #define NFS_CAP_HARDLINKS (1U << 1) |
| 304 | #define NFS_CAP_SYMLINKS (1U << 2) |
| 305 | #define NFS_CAP_ACLS (1U << 3) |
| 306 | #define NFS_CAP_ATOMIC_OPEN (1U << 4) |
| 307 | #define NFS_CAP_LGOPEN (1U << 5) |
| 308 | #define NFS_CAP_CASE_INSENSITIVE (1U << 6) |
| 309 | #define NFS_CAP_CASE_PRESERVING (1U << 7) |
| 310 | #define NFS_CAP_REBOOT_LAYOUTRETURN (1U << 8) |
| 311 | #define NFS_CAP_OFFLOAD_STATUS (1U << 9) |
| 312 | #define NFS_CAP_ZERO_RANGE (1U << 10) |
| 313 | #define NFS_CAP_DIR_DELEG (1U << 11) |
| 314 | #define NFS_CAP_OPEN_XOR (1U << 12) |
| 315 | #define NFS_CAP_DELEGTIME (1U << 13) |
| 316 | #define NFS_CAP_POSIX_LOCK (1U << 14) |
| 317 | #define NFS_CAP_UIDGID_NOMAP (1U << 15) |
| 318 | #define NFS_CAP_STATEID_NFSV41 (1U << 16) |
| 319 | #define NFS_CAP_ATOMIC_OPEN_V1 (1U << 17) |
| 320 | #define NFS_CAP_SECURITY_LABEL (1U << 18) |
| 321 | #define NFS_CAP_SEEK (1U << 19) |
| 322 | #define NFS_CAP_ALLOCATE (1U << 20) |
| 323 | #define NFS_CAP_DEALLOCATE (1U << 21) |
| 324 | #define NFS_CAP_LAYOUTSTATS (1U << 22) |
| 325 | #define NFS_CAP_CLONE (1U << 23) |
| 326 | #define NFS_CAP_COPY (1U << 24) |
| 327 | #define NFS_CAP_OFFLOAD_CANCEL (1U << 25) |
| 328 | #define NFS_CAP_LAYOUTERROR (1U << 26) |
| 329 | #define NFS_CAP_COPY_NOTIFY (1U << 27) |
| 330 | #define NFS_CAP_XATTR (1U << 28) |
| 331 | #define NFS_CAP_READ_PLUS (1U << 29) |
| 332 | #define NFS_CAP_FS_LOCATIONS (1U << 30) |
| 333 | #define NFS_CAP_MOVEABLE (1U << 31) |
| 334 | #endif |
| 335 | |