| 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		caps;		/* server capabilities */ | 
|---|
| 176 | __u64			fattr_valid;	/* Valid attributes */ | 
|---|
| 177 | unsigned int		rsize;		/* read size */ | 
|---|
| 178 | unsigned int		rpages;		/* read size (in pages) */ | 
|---|
| 179 | unsigned int		wsize;		/* write size */ | 
|---|
| 180 | unsigned int		wtmult;		/* server disk block size */ | 
|---|
| 181 | unsigned int		dtsize;		/* readdir size */ | 
|---|
| 182 | unsigned short		port;		/* "port=" setting */ | 
|---|
| 183 | unsigned int		bsize;		/* server block size */ | 
|---|
| 184 | #ifdef CONFIG_NFS_V4_2 | 
|---|
| 185 | unsigned int		gxasize;	/* getxattr size */ | 
|---|
| 186 | unsigned int		sxasize;	/* setxattr size */ | 
|---|
| 187 | unsigned int		lxasize;	/* listxattr size */ | 
|---|
| 188 | #endif | 
|---|
| 189 | unsigned int		acregmin;	/* attr cache timeouts */ | 
|---|
| 190 | unsigned int		acregmax; | 
|---|
| 191 | unsigned int		acdirmin; | 
|---|
| 192 | unsigned int		acdirmax; | 
|---|
| 193 | unsigned int		namelen; | 
|---|
| 194 | unsigned int		options;	/* extra options enabled by mount */ | 
|---|
| 195 | unsigned int		clone_blksize;	/* granularity of a CLONE operation */ | 
|---|
| 196 | #define NFS_OPTION_FSCACHE	0x00000001	/* - local caching enabled */ | 
|---|
| 197 | #define NFS_OPTION_MIGRATION	0x00000002	/* - NFSv4 migration enabled */ | 
|---|
| 198 |  | 
|---|
| 199 | enum nfs4_change_attr_type | 
|---|
| 200 | change_attr_type;/* Description of change attribute */ | 
|---|
| 201 |  | 
|---|
| 202 | struct nfs_fsid		fsid; | 
|---|
| 203 | int			s_sysfs_id;	/* sysfs dentry index */ | 
|---|
| 204 | __u64			maxfilesize;	/* maximum file size */ | 
|---|
| 205 | unsigned long		mount_time;	/* when this fs was mounted */ | 
|---|
| 206 | struct super_block	*super;		/* VFS super block */ | 
|---|
| 207 | dev_t			s_dev;		/* superblock dev numbers */ | 
|---|
| 208 | struct nfs_auth_info	auth_info;	/* parsed auth flavors */ | 
|---|
| 209 |  | 
|---|
| 210 | #ifdef CONFIG_NFS_FSCACHE | 
|---|
| 211 | struct fscache_volume	*fscache;	/* superblock cookie */ | 
|---|
| 212 | char			*fscache_uniq;	/* Uniquifier (or NULL) */ | 
|---|
| 213 | #endif | 
|---|
| 214 |  | 
|---|
| 215 | /* The following #defines numerically match the NFSv4 equivalents */ | 
|---|
| 216 | #define NFS_FH_NOEXPIRE_WITH_OPEN (0x1) | 
|---|
| 217 | #define NFS_FH_VOLATILE_ANY (0x2) | 
|---|
| 218 | #define NFS_FH_VOL_MIGRATION (0x4) | 
|---|
| 219 | #define NFS_FH_VOL_RENAME (0x8) | 
|---|
| 220 | #define NFS_FH_RENAME_UNSAFE (NFS_FH_VOLATILE_ANY | NFS_FH_VOL_RENAME) | 
|---|
| 221 | u32			fh_expire_type;	/* V4 bitmask representing file | 
|---|
| 222 | handle volatility type for | 
|---|
| 223 | this filesystem */ | 
|---|
| 224 | u32			pnfs_blksize;	/* layout_blksize attr */ | 
|---|
| 225 | #if IS_ENABLED(CONFIG_NFS_V4) | 
|---|
| 226 | u32			attr_bitmask[3];/* V4 bitmask representing the set | 
|---|
| 227 | of attributes supported on this | 
|---|
| 228 | filesystem */ | 
|---|
| 229 | u32			attr_bitmask_nl[3]; | 
|---|
| 230 | /* V4 bitmask representing the | 
|---|
| 231 | set of attributes supported | 
|---|
| 232 | on this filesystem excluding | 
|---|
| 233 | the label support bit. */ | 
|---|
| 234 | u32			exclcreat_bitmask[3]; | 
|---|
| 235 | /* V4 bitmask representing the | 
|---|
| 236 | set of attributes supported | 
|---|
| 237 | on this filesystem for the | 
|---|
| 238 | exclusive create. */ | 
|---|
| 239 | u32			cache_consistency_bitmask[3]; | 
|---|
| 240 | /* V4 bitmask representing the subset | 
|---|
| 241 | of change attribute, size, ctime | 
|---|
| 242 | and mtime attributes supported by | 
|---|
| 243 | the server */ | 
|---|
| 244 | u32			acl_bitmask;	/* V4 bitmask representing the ACEs | 
|---|
| 245 | that are supported on this | 
|---|
| 246 | filesystem */ | 
|---|
| 247 | struct pnfs_layoutdriver_type  *pnfs_curr_ld; /* Active layout driver */ | 
|---|
| 248 | struct rpc_wait_queue	roc_rpcwaitq; | 
|---|
| 249 |  | 
|---|
| 250 | /* the following fields are protected by nfs_client->cl_lock */ | 
|---|
| 251 | struct rb_root		state_owners; | 
|---|
| 252 | #endif | 
|---|
| 253 | atomic64_t		owner_ctr; | 
|---|
| 254 | struct list_head	state_owners_lru; | 
|---|
| 255 | struct list_head	layouts; | 
|---|
| 256 | struct list_head	delegations; | 
|---|
| 257 | atomic_long_t		nr_active_delegations; | 
|---|
| 258 | unsigned int		delegation_hash_mask; | 
|---|
| 259 | struct hlist_head	*delegation_hash_table; | 
|---|
| 260 | struct list_head	ss_copies; | 
|---|
| 261 | struct list_head	ss_src_copies; | 
|---|
| 262 |  | 
|---|
| 263 | unsigned long		delegation_flags; | 
|---|
| 264 | #define NFS4SERV_DELEGRETURN		(1) | 
|---|
| 265 | #define NFS4SERV_DELEGATION_EXPIRED	(2) | 
|---|
| 266 | #define NFS4SERV_DELEGRETURN_DELAYED	(3) | 
|---|
| 267 | unsigned long		delegation_gen; | 
|---|
| 268 | unsigned long		mig_gen; | 
|---|
| 269 | unsigned long		mig_status; | 
|---|
| 270 | #define NFS_MIG_IN_TRANSITION		(1) | 
|---|
| 271 | #define NFS_MIG_FAILED			(2) | 
|---|
| 272 | #define NFS_MIG_TSM_POSSIBLE		(3) | 
|---|
| 273 |  | 
|---|
| 274 | void (*destroy)(struct nfs_server *); | 
|---|
| 275 |  | 
|---|
| 276 | atomic_t active; /* Keep trace of any activity to this server */ | 
|---|
| 277 |  | 
|---|
| 278 | /* mountd-related mount options */ | 
|---|
| 279 | struct sockaddr_storage	mountd_address; | 
|---|
| 280 | size_t			mountd_addrlen; | 
|---|
| 281 | u32			mountd_version; | 
|---|
| 282 | unsigned short		mountd_port; | 
|---|
| 283 | unsigned short		mountd_protocol; | 
|---|
| 284 | struct rpc_wait_queue	uoc_rpcwaitq; | 
|---|
| 285 |  | 
|---|
| 286 | /* XDR related information */ | 
|---|
| 287 | unsigned int		read_hdrsize; | 
|---|
| 288 |  | 
|---|
| 289 | /* User namespace info */ | 
|---|
| 290 | const struct cred	*cred; | 
|---|
| 291 | bool			has_sec_mnt_opts; | 
|---|
| 292 | struct kobject		kobj; | 
|---|
| 293 | struct rcu_head		rcu; | 
|---|
| 294 | }; | 
|---|
| 295 |  | 
|---|
| 296 | /* Server capabilities */ | 
|---|
| 297 | #define NFS_CAP_READDIRPLUS	(1U << 0) | 
|---|
| 298 | #define NFS_CAP_HARDLINKS	(1U << 1) | 
|---|
| 299 | #define NFS_CAP_SYMLINKS	(1U << 2) | 
|---|
| 300 | #define NFS_CAP_ACLS		(1U << 3) | 
|---|
| 301 | #define NFS_CAP_ATOMIC_OPEN	(1U << 4) | 
|---|
| 302 | #define NFS_CAP_LGOPEN		(1U << 5) | 
|---|
| 303 | #define NFS_CAP_CASE_INSENSITIVE	(1U << 6) | 
|---|
| 304 | #define NFS_CAP_CASE_PRESERVING	(1U << 7) | 
|---|
| 305 | #define NFS_CAP_REBOOT_LAYOUTRETURN	(1U << 8) | 
|---|
| 306 | #define NFS_CAP_OFFLOAD_STATUS	(1U << 9) | 
|---|
| 307 | #define NFS_CAP_ZERO_RANGE	(1U << 10) | 
|---|
| 308 | #define NFS_CAP_OPEN_XOR	(1U << 12) | 
|---|
| 309 | #define NFS_CAP_DELEGTIME	(1U << 13) | 
|---|
| 310 | #define NFS_CAP_POSIX_LOCK	(1U << 14) | 
|---|
| 311 | #define NFS_CAP_UIDGID_NOMAP	(1U << 15) | 
|---|
| 312 | #define NFS_CAP_STATEID_NFSV41	(1U << 16) | 
|---|
| 313 | #define NFS_CAP_ATOMIC_OPEN_V1	(1U << 17) | 
|---|
| 314 | #define NFS_CAP_SECURITY_LABEL	(1U << 18) | 
|---|
| 315 | #define NFS_CAP_SEEK		(1U << 19) | 
|---|
| 316 | #define NFS_CAP_ALLOCATE	(1U << 20) | 
|---|
| 317 | #define NFS_CAP_DEALLOCATE	(1U << 21) | 
|---|
| 318 | #define NFS_CAP_LAYOUTSTATS	(1U << 22) | 
|---|
| 319 | #define NFS_CAP_CLONE		(1U << 23) | 
|---|
| 320 | #define NFS_CAP_COPY		(1U << 24) | 
|---|
| 321 | #define NFS_CAP_OFFLOAD_CANCEL	(1U << 25) | 
|---|
| 322 | #define NFS_CAP_LAYOUTERROR	(1U << 26) | 
|---|
| 323 | #define NFS_CAP_COPY_NOTIFY	(1U << 27) | 
|---|
| 324 | #define NFS_CAP_XATTR		(1U << 28) | 
|---|
| 325 | #define NFS_CAP_READ_PLUS	(1U << 29) | 
|---|
| 326 | #define NFS_CAP_FS_LOCATIONS	(1U << 30) | 
|---|
| 327 | #define NFS_CAP_MOVEABLE	(1U << 31) | 
|---|
| 328 | #endif | 
|---|
| 329 |  | 
|---|