xref: /openbmc/linux/fs/smb/client/fs_context.h (revision b4ca2942a0a413e08161a5e4a1b32eb3d2d9f8f7)
138c8a9a5SSteve French /* SPDX-License-Identifier: GPL-2.0-or-later */
238c8a9a5SSteve French /*
338c8a9a5SSteve French  *   Copyright (C) 2020, Microsoft Corporation.
438c8a9a5SSteve French  *
538c8a9a5SSteve French  *   Author(s): Steve French <stfrench@microsoft.com>
638c8a9a5SSteve French  *              David Howells <dhowells@redhat.com>
738c8a9a5SSteve French  */
838c8a9a5SSteve French 
938c8a9a5SSteve French #ifndef _FS_CONTEXT_H
1038c8a9a5SSteve French #define _FS_CONTEXT_H
1138c8a9a5SSteve French 
1238c8a9a5SSteve French #include "cifsglob.h"
1338c8a9a5SSteve French #include <linux/parser.h>
1438c8a9a5SSteve French #include <linux/fs_parser.h>
1538c8a9a5SSteve French 
1638c8a9a5SSteve French /* Log errors in fs_context (new mount api) but also in dmesg (old style) */
1738c8a9a5SSteve French #define cifs_errorf(fc, fmt, ...)			\
1838c8a9a5SSteve French 	do {						\
1938c8a9a5SSteve French 		errorf(fc, fmt, ## __VA_ARGS__);	\
2038c8a9a5SSteve French 		cifs_dbg(VFS, fmt, ## __VA_ARGS__);	\
2138c8a9a5SSteve French 	} while (0)
2238c8a9a5SSteve French 
2338c8a9a5SSteve French enum smb_version {
2438c8a9a5SSteve French 	Smb_1 = 1,
2538c8a9a5SSteve French 	Smb_20,
2638c8a9a5SSteve French 	Smb_21,
2738c8a9a5SSteve French 	Smb_30,
2838c8a9a5SSteve French 	Smb_302,
2938c8a9a5SSteve French 	Smb_311,
3038c8a9a5SSteve French 	Smb_3any,
3138c8a9a5SSteve French 	Smb_default,
3238c8a9a5SSteve French 	Smb_version_err
3338c8a9a5SSteve French };
3438c8a9a5SSteve French 
3538c8a9a5SSteve French enum {
3638c8a9a5SSteve French 	Opt_cache_loose,
3738c8a9a5SSteve French 	Opt_cache_strict,
3838c8a9a5SSteve French 	Opt_cache_none,
3938c8a9a5SSteve French 	Opt_cache_ro,
4038c8a9a5SSteve French 	Opt_cache_rw,
4138c8a9a5SSteve French 	Opt_cache_err
4238c8a9a5SSteve French };
4338c8a9a5SSteve French 
4438c8a9a5SSteve French enum cifs_sec_param {
4538c8a9a5SSteve French 	Opt_sec_krb5,
4638c8a9a5SSteve French 	Opt_sec_krb5i,
4738c8a9a5SSteve French 	Opt_sec_krb5p,
4838c8a9a5SSteve French 	Opt_sec_ntlmsspi,
4938c8a9a5SSteve French 	Opt_sec_ntlmssp,
5038c8a9a5SSteve French 	Opt_sec_ntlmv2,
5138c8a9a5SSteve French 	Opt_sec_ntlmv2i,
5238c8a9a5SSteve French 	Opt_sec_none,
5338c8a9a5SSteve French 
5438c8a9a5SSteve French 	Opt_sec_err
5538c8a9a5SSteve French };
5638c8a9a5SSteve French 
5738c8a9a5SSteve French enum cifs_param {
5838c8a9a5SSteve French 	/* Mount options that take no arguments */
5938c8a9a5SSteve French 	Opt_user_xattr,
6038c8a9a5SSteve French 	Opt_forceuid,
6138c8a9a5SSteve French 	Opt_forcegid,
6238c8a9a5SSteve French 	Opt_noblocksend,
6338c8a9a5SSteve French 	Opt_noautotune,
6438c8a9a5SSteve French 	Opt_nolease,
6538c8a9a5SSteve French 	Opt_nosparse,
6638c8a9a5SSteve French 	Opt_hard,
6738c8a9a5SSteve French 	Opt_soft,
6838c8a9a5SSteve French 	Opt_perm,
6938c8a9a5SSteve French 	Opt_nodelete,
7038c8a9a5SSteve French 	Opt_mapposix,
7138c8a9a5SSteve French 	Opt_mapchars,
7238c8a9a5SSteve French 	Opt_nomapchars,
7338c8a9a5SSteve French 	Opt_sfu,
7438c8a9a5SSteve French 	Opt_nodfs,
7538c8a9a5SSteve French 	Opt_posixpaths,
7638c8a9a5SSteve French 	Opt_unix,
7738c8a9a5SSteve French 	Opt_nocase,
7838c8a9a5SSteve French 	Opt_brl,
7938c8a9a5SSteve French 	Opt_handlecache,
8038c8a9a5SSteve French 	Opt_forcemandatorylock,
8138c8a9a5SSteve French 	Opt_setuidfromacl,
8238c8a9a5SSteve French 	Opt_setuids,
8338c8a9a5SSteve French 	Opt_dynperm,
8438c8a9a5SSteve French 	Opt_intr,
8538c8a9a5SSteve French 	Opt_strictsync,
8638c8a9a5SSteve French 	Opt_serverino,
8738c8a9a5SSteve French 	Opt_rwpidforward,
8838c8a9a5SSteve French 	Opt_cifsacl,
8938c8a9a5SSteve French 	Opt_acl,
9038c8a9a5SSteve French 	Opt_locallease,
9138c8a9a5SSteve French 	Opt_sign,
9238c8a9a5SSteve French 	Opt_ignore_signature,
9338c8a9a5SSteve French 	Opt_seal,
9438c8a9a5SSteve French 	Opt_noac,
9538c8a9a5SSteve French 	Opt_fsc,
9638c8a9a5SSteve French 	Opt_mfsymlinks,
9738c8a9a5SSteve French 	Opt_multiuser,
9838c8a9a5SSteve French 	Opt_sloppy,
9938c8a9a5SSteve French 	Opt_nosharesock,
10038c8a9a5SSteve French 	Opt_persistent,
10138c8a9a5SSteve French 	Opt_resilient,
10238c8a9a5SSteve French 	Opt_tcp_nodelay,
10338c8a9a5SSteve French 	Opt_domainauto,
10438c8a9a5SSteve French 	Opt_rdma,
10538c8a9a5SSteve French 	Opt_modesid,
10638c8a9a5SSteve French 	Opt_rootfs,
10738c8a9a5SSteve French 	Opt_multichannel,
10838c8a9a5SSteve French 	Opt_compress,
10938c8a9a5SSteve French 	Opt_witness,
11038c8a9a5SSteve French 
11138c8a9a5SSteve French 	/* Mount options which take numeric value */
11238c8a9a5SSteve French 	Opt_backupuid,
11338c8a9a5SSteve French 	Opt_backupgid,
11438c8a9a5SSteve French 	Opt_uid,
11538c8a9a5SSteve French 	Opt_cruid,
11638c8a9a5SSteve French 	Opt_gid,
11738c8a9a5SSteve French 	Opt_port,
11838c8a9a5SSteve French 	Opt_file_mode,
11938c8a9a5SSteve French 	Opt_dirmode,
12038c8a9a5SSteve French 	Opt_min_enc_offload,
121*b4ca2942SShyam Prasad N 	Opt_retrans,
12238c8a9a5SSteve French 	Opt_blocksize,
12338c8a9a5SSteve French 	Opt_rasize,
12438c8a9a5SSteve French 	Opt_rsize,
12538c8a9a5SSteve French 	Opt_wsize,
12638c8a9a5SSteve French 	Opt_actimeo,
12738c8a9a5SSteve French 	Opt_acdirmax,
12838c8a9a5SSteve French 	Opt_acregmax,
12938c8a9a5SSteve French 	Opt_closetimeo,
13038c8a9a5SSteve French 	Opt_echo_interval,
13138c8a9a5SSteve French 	Opt_max_credits,
1326a50d71dSSteve French 	Opt_max_cached_dirs,
13338c8a9a5SSteve French 	Opt_snapshot,
13438c8a9a5SSteve French 	Opt_max_channels,
13538c8a9a5SSteve French 	Opt_handletimeout,
13638c8a9a5SSteve French 
13738c8a9a5SSteve French 	/* Mount options which take string value */
13838c8a9a5SSteve French 	Opt_source,
13938c8a9a5SSteve French 	Opt_user,
14038c8a9a5SSteve French 	Opt_pass,
14108bedfbcSSteve French 	Opt_pass2,
14238c8a9a5SSteve French 	Opt_ip,
14338c8a9a5SSteve French 	Opt_domain,
14438c8a9a5SSteve French 	Opt_srcaddr,
14538c8a9a5SSteve French 	Opt_iocharset,
14638c8a9a5SSteve French 	Opt_netbiosname,
14738c8a9a5SSteve French 	Opt_servern,
14838c8a9a5SSteve French 	Opt_ver,
14938c8a9a5SSteve French 	Opt_vers,
15038c8a9a5SSteve French 	Opt_sec,
15138c8a9a5SSteve French 	Opt_cache,
15238c8a9a5SSteve French 
15338c8a9a5SSteve French 	/* Mount options to be ignored */
15438c8a9a5SSteve French 	Opt_ignore,
15538c8a9a5SSteve French 
15638c8a9a5SSteve French 	Opt_err
15738c8a9a5SSteve French };
15838c8a9a5SSteve French 
15938c8a9a5SSteve French struct smb3_fs_context {
160fc1860a1STakayuki Nagata 	bool forceuid_specified;
161fc1860a1STakayuki Nagata 	bool forcegid_specified;
16238c8a9a5SSteve French 	bool uid_specified;
16338c8a9a5SSteve French 	bool cruid_specified;
16438c8a9a5SSteve French 	bool gid_specified;
16538c8a9a5SSteve French 	bool sloppy;
16638c8a9a5SSteve French 	bool got_ip;
16738c8a9a5SSteve French 	bool got_version;
16838c8a9a5SSteve French 	bool got_rsize;
16938c8a9a5SSteve French 	bool got_wsize;
17038c8a9a5SSteve French 	bool got_bsize;
17138c8a9a5SSteve French 	unsigned short port;
17238c8a9a5SSteve French 
17338c8a9a5SSteve French 	char *username;
17438c8a9a5SSteve French 	char *password;
17508bedfbcSSteve French 	char *password2;
17638c8a9a5SSteve French 	char *domainname;
17738c8a9a5SSteve French 	char *source;
17838c8a9a5SSteve French 	char *server_hostname;
17938c8a9a5SSteve French 	char *UNC;
18038c8a9a5SSteve French 	char *nodename;
18138c8a9a5SSteve French 	char workstation_name[CIFS_MAX_WORKSTATION_LEN];
18238c8a9a5SSteve French 	char *iocharset;  /* local code page for mapping to and from Unicode */
18338c8a9a5SSteve French 	char source_rfc1001_name[RFC1001_NAME_LEN_WITH_NULL]; /* clnt nb name */
18438c8a9a5SSteve French 	char target_rfc1001_name[RFC1001_NAME_LEN_WITH_NULL]; /* srvr nb name */
18538c8a9a5SSteve French 	kuid_t cred_uid;
18638c8a9a5SSteve French 	kuid_t linux_uid;
18738c8a9a5SSteve French 	kgid_t linux_gid;
18838c8a9a5SSteve French 	kuid_t backupuid;
18938c8a9a5SSteve French 	kgid_t backupgid;
19038c8a9a5SSteve French 	umode_t file_mode;
19138c8a9a5SSteve French 	umode_t dir_mode;
19238c8a9a5SSteve French 	enum securityEnum sectype; /* sectype requested via mnt opts */
19338c8a9a5SSteve French 	bool sign; /* was signing requested via mnt opts? */
19438c8a9a5SSteve French 	bool ignore_signature:1;
19538c8a9a5SSteve French 	bool retry:1;
19638c8a9a5SSteve French 	bool intr:1;
19738c8a9a5SSteve French 	bool setuids:1;
19838c8a9a5SSteve French 	bool setuidfromacl:1;
19938c8a9a5SSteve French 	bool override_uid:1;
20038c8a9a5SSteve French 	bool override_gid:1;
20138c8a9a5SSteve French 	bool dynperm:1;
20238c8a9a5SSteve French 	bool noperm:1;
20338c8a9a5SSteve French 	bool nodelete:1;
20438c8a9a5SSteve French 	bool mode_ace:1;
20538c8a9a5SSteve French 	bool no_psx_acl:1; /* set if posix acl support should be disabled */
20638c8a9a5SSteve French 	bool cifs_acl:1;
20738c8a9a5SSteve French 	bool backupuid_specified; /* mount option  backupuid  is specified */
20838c8a9a5SSteve French 	bool backupgid_specified; /* mount option  backupgid  is specified */
20938c8a9a5SSteve French 	bool no_xattr:1;   /* set if xattr (EA) support should be disabled*/
21038c8a9a5SSteve French 	bool server_ino:1; /* use inode numbers from server ie UniqueId */
21138c8a9a5SSteve French 	bool direct_io:1;
21238c8a9a5SSteve French 	bool strict_io:1; /* strict cache behavior */
21338c8a9a5SSteve French 	bool cache_ro:1;
21438c8a9a5SSteve French 	bool cache_rw:1;
21538c8a9a5SSteve French 	bool remap:1;      /* set to remap seven reserved chars in filenames */
21638c8a9a5SSteve French 	bool sfu_remap:1;  /* remap seven reserved chars ala SFU */
21738c8a9a5SSteve French 	bool posix_paths:1; /* unset to not ask for posix pathnames. */
21838c8a9a5SSteve French 	bool no_linux_ext:1;
21938c8a9a5SSteve French 	bool linux_ext:1;
22038c8a9a5SSteve French 	bool sfu_emul:1;
22138c8a9a5SSteve French 	bool nullauth:1;   /* attempt to authenticate with null user */
22238c8a9a5SSteve French 	bool nocase:1;     /* request case insensitive filenames */
22338c8a9a5SSteve French 	bool nobrl:1;      /* disable sending byte range locks to srv */
22438c8a9a5SSteve French 	bool nohandlecache:1; /* disable caching dir handles if srvr probs */
22538c8a9a5SSteve French 	bool mand_lock:1;  /* send mandatory not posix byte range lock reqs */
22638c8a9a5SSteve French 	bool seal:1;       /* request transport encryption on share */
22738c8a9a5SSteve French 	bool nodfs:1;      /* Do not request DFS, even if available */
22838c8a9a5SSteve French 	bool local_lease:1; /* check leases only on local system, not remote */
22938c8a9a5SSteve French 	bool noblocksnd:1;
23038c8a9a5SSteve French 	bool noautotune:1;
23138c8a9a5SSteve French 	bool nostrictsync:1; /* do not force expensive SMBflush on every sync */
23238c8a9a5SSteve French 	bool no_lease:1;     /* disable requesting leases */
23338c8a9a5SSteve French 	bool no_sparse:1;    /* do not attempt to set files sparse */
23438c8a9a5SSteve French 	bool fsc:1;	/* enable fscache */
23538c8a9a5SSteve French 	bool mfsymlinks:1; /* use Minshall+French Symlinks */
23638c8a9a5SSteve French 	bool multiuser:1;
23738c8a9a5SSteve French 	bool rwpidforward:1; /* pid forward for read/write operations */
23838c8a9a5SSteve French 	bool nosharesock:1;
23938c8a9a5SSteve French 	bool persistent:1;
24038c8a9a5SSteve French 	bool nopersistent:1;
24138c8a9a5SSteve French 	bool resilient:1; /* noresilient not required since not fored for CA */
24238c8a9a5SSteve French 	bool domainauto:1;
24338c8a9a5SSteve French 	bool rdma:1;
24438c8a9a5SSteve French 	bool multichannel:1;
24538c8a9a5SSteve French 	bool use_client_guid:1;
24638c8a9a5SSteve French 	/* reuse existing guid for multichannel */
24738c8a9a5SSteve French 	u8 client_guid[SMB2_CLIENT_GUID_SIZE];
24838c8a9a5SSteve French 	unsigned int bsize;
24938c8a9a5SSteve French 	unsigned int rasize;
25038c8a9a5SSteve French 	unsigned int rsize;
25138c8a9a5SSteve French 	unsigned int wsize;
25238c8a9a5SSteve French 	unsigned int min_offload;
253*b4ca2942SShyam Prasad N 	unsigned int retrans;
25438c8a9a5SSteve French 	bool sockopt_tcp_nodelay:1;
25538c8a9a5SSteve French 	/* attribute cache timemout for files and directories in jiffies */
25638c8a9a5SSteve French 	unsigned long acregmax;
25738c8a9a5SSteve French 	unsigned long acdirmax;
25838c8a9a5SSteve French 	/* timeout for deferred close of files in jiffies */
25938c8a9a5SSteve French 	unsigned long closetimeo;
26038c8a9a5SSteve French 	struct smb_version_operations *ops;
26138c8a9a5SSteve French 	struct smb_version_values *vals;
26238c8a9a5SSteve French 	char *prepath;
26338c8a9a5SSteve French 	struct sockaddr_storage dstaddr; /* destination address */
26438c8a9a5SSteve French 	struct sockaddr_storage srcaddr; /* allow binding to a local IP */
26538c8a9a5SSteve French 	struct nls_table *local_nls; /* This is a copy of the pointer in cifs_sb */
26638c8a9a5SSteve French 	unsigned int echo_interval; /* echo interval in secs */
26738c8a9a5SSteve French 	__u64 snapshot_time; /* needed for timewarp tokens */
26838c8a9a5SSteve French 	__u32 handle_timeout; /* persistent and durable handle timeout in ms */
26938c8a9a5SSteve French 	unsigned int max_credits; /* smb3 max_credits 10 < credits < 60000 */
27038c8a9a5SSteve French 	unsigned int max_channels;
2716a50d71dSSteve French 	unsigned int max_cached_dirs;
27238c8a9a5SSteve French 	__u16 compression; /* compression algorithm 0xFFFF default 0=disabled */
27338c8a9a5SSteve French 	bool rootfs:1; /* if it's a SMB root file system */
27438c8a9a5SSteve French 	bool witness:1; /* use witness protocol */
27538c8a9a5SSteve French 	char *leaf_fullpath;
27638c8a9a5SSteve French 	struct cifs_ses *dfs_root_ses;
277390c08fdSPaulo Alcantara 	bool dfs_automount:1; /* set for dfs automount only */
27838c8a9a5SSteve French };
27938c8a9a5SSteve French 
28038c8a9a5SSteve French extern const struct fs_parameter_spec smb3_fs_parameters[];
28138c8a9a5SSteve French 
28238c8a9a5SSteve French extern int smb3_init_fs_context(struct fs_context *fc);
28338c8a9a5SSteve French extern void smb3_cleanup_fs_context_contents(struct smb3_fs_context *ctx);
28438c8a9a5SSteve French extern void smb3_cleanup_fs_context(struct smb3_fs_context *ctx);
28538c8a9a5SSteve French 
28638c8a9a5SSteve French static inline struct smb3_fs_context *smb3_fc2context(const struct fs_context *fc)
28738c8a9a5SSteve French {
28838c8a9a5SSteve French 	return fc->fs_private;
28938c8a9a5SSteve French }
29038c8a9a5SSteve French 
29138c8a9a5SSteve French extern int smb3_fs_context_dup(struct smb3_fs_context *new_ctx, struct smb3_fs_context *ctx);
29238c8a9a5SSteve French extern void smb3_update_mnt_flags(struct cifs_sb_info *cifs_sb);
29338c8a9a5SSteve French 
29438c8a9a5SSteve French /*
29538c8a9a5SSteve French  * max deferred close timeout (jiffies) - 2^30
29638c8a9a5SSteve French  */
29738c8a9a5SSteve French #define SMB3_MAX_DCLOSETIMEO (1 << 30)
29838c8a9a5SSteve French #define SMB3_DEF_DCLOSETIMEO (1 * HZ) /* even 1 sec enough to help eg open/write/close/open/read */
2996a50d71dSSteve French #define MAX_CACHED_FIDS 16
30038c8a9a5SSteve French extern char *cifs_sanitize_prepath(char *prepath, gfp_t gfp);
30138c8a9a5SSteve French 
302ba55f8a9SPaulo Alcantara extern struct mutex cifs_mount_mutex;
303ba55f8a9SPaulo Alcantara 
304ba55f8a9SPaulo Alcantara static inline void cifs_mount_lock(void)
305ba55f8a9SPaulo Alcantara {
306ba55f8a9SPaulo Alcantara 	mutex_lock(&cifs_mount_mutex);
307ba55f8a9SPaulo Alcantara }
308ba55f8a9SPaulo Alcantara 
309ba55f8a9SPaulo Alcantara static inline void cifs_mount_unlock(void)
310ba55f8a9SPaulo Alcantara {
311ba55f8a9SPaulo Alcantara 	mutex_unlock(&cifs_mount_mutex);
312ba55f8a9SPaulo Alcantara }
313ba55f8a9SPaulo Alcantara 
31438c8a9a5SSteve French #endif
315