162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *   Copyright (C) 2020, Microsoft Corporation.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *   Author(s): Steve French <stfrench@microsoft.com>
662306a36Sopenharmony_ci *              David Howells <dhowells@redhat.com>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#ifndef _FS_CONTEXT_H
1062306a36Sopenharmony_ci#define _FS_CONTEXT_H
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include "cifsglob.h"
1362306a36Sopenharmony_ci#include <linux/parser.h>
1462306a36Sopenharmony_ci#include <linux/fs_parser.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci/* Log errors in fs_context (new mount api) but also in dmesg (old style) */
1762306a36Sopenharmony_ci#define cifs_errorf(fc, fmt, ...)			\
1862306a36Sopenharmony_ci	do {						\
1962306a36Sopenharmony_ci		errorf(fc, fmt, ## __VA_ARGS__);	\
2062306a36Sopenharmony_ci		cifs_dbg(VFS, fmt, ## __VA_ARGS__);	\
2162306a36Sopenharmony_ci	} while (0)
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cienum smb_version {
2462306a36Sopenharmony_ci	Smb_1 = 1,
2562306a36Sopenharmony_ci	Smb_20,
2662306a36Sopenharmony_ci	Smb_21,
2762306a36Sopenharmony_ci	Smb_30,
2862306a36Sopenharmony_ci	Smb_302,
2962306a36Sopenharmony_ci	Smb_311,
3062306a36Sopenharmony_ci	Smb_3any,
3162306a36Sopenharmony_ci	Smb_default,
3262306a36Sopenharmony_ci	Smb_version_err
3362306a36Sopenharmony_ci};
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_cienum {
3662306a36Sopenharmony_ci	Opt_cache_loose,
3762306a36Sopenharmony_ci	Opt_cache_strict,
3862306a36Sopenharmony_ci	Opt_cache_none,
3962306a36Sopenharmony_ci	Opt_cache_ro,
4062306a36Sopenharmony_ci	Opt_cache_rw,
4162306a36Sopenharmony_ci	Opt_cache_err
4262306a36Sopenharmony_ci};
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cienum cifs_sec_param {
4562306a36Sopenharmony_ci	Opt_sec_krb5,
4662306a36Sopenharmony_ci	Opt_sec_krb5i,
4762306a36Sopenharmony_ci	Opt_sec_krb5p,
4862306a36Sopenharmony_ci	Opt_sec_ntlmsspi,
4962306a36Sopenharmony_ci	Opt_sec_ntlmssp,
5062306a36Sopenharmony_ci	Opt_sec_ntlmv2,
5162306a36Sopenharmony_ci	Opt_sec_ntlmv2i,
5262306a36Sopenharmony_ci	Opt_sec_none,
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	Opt_sec_err
5562306a36Sopenharmony_ci};
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cienum cifs_param {
5862306a36Sopenharmony_ci	/* Mount options that take no arguments */
5962306a36Sopenharmony_ci	Opt_user_xattr,
6062306a36Sopenharmony_ci	Opt_forceuid,
6162306a36Sopenharmony_ci	Opt_forcegid,
6262306a36Sopenharmony_ci	Opt_noblocksend,
6362306a36Sopenharmony_ci	Opt_noautotune,
6462306a36Sopenharmony_ci	Opt_nolease,
6562306a36Sopenharmony_ci	Opt_nosparse,
6662306a36Sopenharmony_ci	Opt_hard,
6762306a36Sopenharmony_ci	Opt_soft,
6862306a36Sopenharmony_ci	Opt_perm,
6962306a36Sopenharmony_ci	Opt_nodelete,
7062306a36Sopenharmony_ci	Opt_mapposix,
7162306a36Sopenharmony_ci	Opt_mapchars,
7262306a36Sopenharmony_ci	Opt_nomapchars,
7362306a36Sopenharmony_ci	Opt_sfu,
7462306a36Sopenharmony_ci	Opt_nodfs,
7562306a36Sopenharmony_ci	Opt_posixpaths,
7662306a36Sopenharmony_ci	Opt_unix,
7762306a36Sopenharmony_ci	Opt_nocase,
7862306a36Sopenharmony_ci	Opt_brl,
7962306a36Sopenharmony_ci	Opt_handlecache,
8062306a36Sopenharmony_ci	Opt_forcemandatorylock,
8162306a36Sopenharmony_ci	Opt_setuidfromacl,
8262306a36Sopenharmony_ci	Opt_setuids,
8362306a36Sopenharmony_ci	Opt_dynperm,
8462306a36Sopenharmony_ci	Opt_intr,
8562306a36Sopenharmony_ci	Opt_strictsync,
8662306a36Sopenharmony_ci	Opt_serverino,
8762306a36Sopenharmony_ci	Opt_rwpidforward,
8862306a36Sopenharmony_ci	Opt_cifsacl,
8962306a36Sopenharmony_ci	Opt_acl,
9062306a36Sopenharmony_ci	Opt_locallease,
9162306a36Sopenharmony_ci	Opt_sign,
9262306a36Sopenharmony_ci	Opt_ignore_signature,
9362306a36Sopenharmony_ci	Opt_seal,
9462306a36Sopenharmony_ci	Opt_noac,
9562306a36Sopenharmony_ci	Opt_fsc,
9662306a36Sopenharmony_ci	Opt_mfsymlinks,
9762306a36Sopenharmony_ci	Opt_multiuser,
9862306a36Sopenharmony_ci	Opt_sloppy,
9962306a36Sopenharmony_ci	Opt_nosharesock,
10062306a36Sopenharmony_ci	Opt_persistent,
10162306a36Sopenharmony_ci	Opt_resilient,
10262306a36Sopenharmony_ci	Opt_tcp_nodelay,
10362306a36Sopenharmony_ci	Opt_domainauto,
10462306a36Sopenharmony_ci	Opt_rdma,
10562306a36Sopenharmony_ci	Opt_modesid,
10662306a36Sopenharmony_ci	Opt_rootfs,
10762306a36Sopenharmony_ci	Opt_multichannel,
10862306a36Sopenharmony_ci	Opt_compress,
10962306a36Sopenharmony_ci	Opt_witness,
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	/* Mount options which take numeric value */
11262306a36Sopenharmony_ci	Opt_backupuid,
11362306a36Sopenharmony_ci	Opt_backupgid,
11462306a36Sopenharmony_ci	Opt_uid,
11562306a36Sopenharmony_ci	Opt_cruid,
11662306a36Sopenharmony_ci	Opt_gid,
11762306a36Sopenharmony_ci	Opt_port,
11862306a36Sopenharmony_ci	Opt_file_mode,
11962306a36Sopenharmony_ci	Opt_dirmode,
12062306a36Sopenharmony_ci	Opt_min_enc_offload,
12162306a36Sopenharmony_ci	Opt_blocksize,
12262306a36Sopenharmony_ci	Opt_rasize,
12362306a36Sopenharmony_ci	Opt_rsize,
12462306a36Sopenharmony_ci	Opt_wsize,
12562306a36Sopenharmony_ci	Opt_actimeo,
12662306a36Sopenharmony_ci	Opt_acdirmax,
12762306a36Sopenharmony_ci	Opt_acregmax,
12862306a36Sopenharmony_ci	Opt_closetimeo,
12962306a36Sopenharmony_ci	Opt_echo_interval,
13062306a36Sopenharmony_ci	Opt_max_credits,
13162306a36Sopenharmony_ci	Opt_max_cached_dirs,
13262306a36Sopenharmony_ci	Opt_snapshot,
13362306a36Sopenharmony_ci	Opt_max_channels,
13462306a36Sopenharmony_ci	Opt_handletimeout,
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ci	/* Mount options which take string value */
13762306a36Sopenharmony_ci	Opt_source,
13862306a36Sopenharmony_ci	Opt_user,
13962306a36Sopenharmony_ci	Opt_pass,
14062306a36Sopenharmony_ci	Opt_ip,
14162306a36Sopenharmony_ci	Opt_domain,
14262306a36Sopenharmony_ci	Opt_srcaddr,
14362306a36Sopenharmony_ci	Opt_iocharset,
14462306a36Sopenharmony_ci	Opt_netbiosname,
14562306a36Sopenharmony_ci	Opt_servern,
14662306a36Sopenharmony_ci	Opt_ver,
14762306a36Sopenharmony_ci	Opt_vers,
14862306a36Sopenharmony_ci	Opt_sec,
14962306a36Sopenharmony_ci	Opt_cache,
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci	/* Mount options to be ignored */
15262306a36Sopenharmony_ci	Opt_ignore,
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci	Opt_err
15562306a36Sopenharmony_ci};
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_cistruct smb3_fs_context {
15862306a36Sopenharmony_ci	bool uid_specified;
15962306a36Sopenharmony_ci	bool cruid_specified;
16062306a36Sopenharmony_ci	bool gid_specified;
16162306a36Sopenharmony_ci	bool sloppy;
16262306a36Sopenharmony_ci	bool got_ip;
16362306a36Sopenharmony_ci	bool got_version;
16462306a36Sopenharmony_ci	bool got_rsize;
16562306a36Sopenharmony_ci	bool got_wsize;
16662306a36Sopenharmony_ci	bool got_bsize;
16762306a36Sopenharmony_ci	unsigned short port;
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci	char *username;
17062306a36Sopenharmony_ci	char *password;
17162306a36Sopenharmony_ci	char *domainname;
17262306a36Sopenharmony_ci	char *source;
17362306a36Sopenharmony_ci	char *server_hostname;
17462306a36Sopenharmony_ci	char *UNC;
17562306a36Sopenharmony_ci	char *nodename;
17662306a36Sopenharmony_ci	char workstation_name[CIFS_MAX_WORKSTATION_LEN];
17762306a36Sopenharmony_ci	char *iocharset;  /* local code page for mapping to and from Unicode */
17862306a36Sopenharmony_ci	char source_rfc1001_name[RFC1001_NAME_LEN_WITH_NULL]; /* clnt nb name */
17962306a36Sopenharmony_ci	char target_rfc1001_name[RFC1001_NAME_LEN_WITH_NULL]; /* srvr nb name */
18062306a36Sopenharmony_ci	kuid_t cred_uid;
18162306a36Sopenharmony_ci	kuid_t linux_uid;
18262306a36Sopenharmony_ci	kgid_t linux_gid;
18362306a36Sopenharmony_ci	kuid_t backupuid;
18462306a36Sopenharmony_ci	kgid_t backupgid;
18562306a36Sopenharmony_ci	umode_t file_mode;
18662306a36Sopenharmony_ci	umode_t dir_mode;
18762306a36Sopenharmony_ci	enum securityEnum sectype; /* sectype requested via mnt opts */
18862306a36Sopenharmony_ci	bool sign; /* was signing requested via mnt opts? */
18962306a36Sopenharmony_ci	bool ignore_signature:1;
19062306a36Sopenharmony_ci	bool retry:1;
19162306a36Sopenharmony_ci	bool intr:1;
19262306a36Sopenharmony_ci	bool setuids:1;
19362306a36Sopenharmony_ci	bool setuidfromacl:1;
19462306a36Sopenharmony_ci	bool override_uid:1;
19562306a36Sopenharmony_ci	bool override_gid:1;
19662306a36Sopenharmony_ci	bool dynperm:1;
19762306a36Sopenharmony_ci	bool noperm:1;
19862306a36Sopenharmony_ci	bool nodelete:1;
19962306a36Sopenharmony_ci	bool mode_ace:1;
20062306a36Sopenharmony_ci	bool no_psx_acl:1; /* set if posix acl support should be disabled */
20162306a36Sopenharmony_ci	bool cifs_acl:1;
20262306a36Sopenharmony_ci	bool backupuid_specified; /* mount option  backupuid  is specified */
20362306a36Sopenharmony_ci	bool backupgid_specified; /* mount option  backupgid  is specified */
20462306a36Sopenharmony_ci	bool no_xattr:1;   /* set if xattr (EA) support should be disabled*/
20562306a36Sopenharmony_ci	bool server_ino:1; /* use inode numbers from server ie UniqueId */
20662306a36Sopenharmony_ci	bool direct_io:1;
20762306a36Sopenharmony_ci	bool strict_io:1; /* strict cache behavior */
20862306a36Sopenharmony_ci	bool cache_ro:1;
20962306a36Sopenharmony_ci	bool cache_rw:1;
21062306a36Sopenharmony_ci	bool remap:1;      /* set to remap seven reserved chars in filenames */
21162306a36Sopenharmony_ci	bool sfu_remap:1;  /* remap seven reserved chars ala SFU */
21262306a36Sopenharmony_ci	bool posix_paths:1; /* unset to not ask for posix pathnames. */
21362306a36Sopenharmony_ci	bool no_linux_ext:1;
21462306a36Sopenharmony_ci	bool linux_ext:1;
21562306a36Sopenharmony_ci	bool sfu_emul:1;
21662306a36Sopenharmony_ci	bool nullauth:1;   /* attempt to authenticate with null user */
21762306a36Sopenharmony_ci	bool nocase:1;     /* request case insensitive filenames */
21862306a36Sopenharmony_ci	bool nobrl:1;      /* disable sending byte range locks to srv */
21962306a36Sopenharmony_ci	bool nohandlecache:1; /* disable caching dir handles if srvr probs */
22062306a36Sopenharmony_ci	bool mand_lock:1;  /* send mandatory not posix byte range lock reqs */
22162306a36Sopenharmony_ci	bool seal:1;       /* request transport encryption on share */
22262306a36Sopenharmony_ci	bool nodfs:1;      /* Do not request DFS, even if available */
22362306a36Sopenharmony_ci	bool local_lease:1; /* check leases only on local system, not remote */
22462306a36Sopenharmony_ci	bool noblocksnd:1;
22562306a36Sopenharmony_ci	bool noautotune:1;
22662306a36Sopenharmony_ci	bool nostrictsync:1; /* do not force expensive SMBflush on every sync */
22762306a36Sopenharmony_ci	bool no_lease:1;     /* disable requesting leases */
22862306a36Sopenharmony_ci	bool no_sparse:1;    /* do not attempt to set files sparse */
22962306a36Sopenharmony_ci	bool fsc:1;	/* enable fscache */
23062306a36Sopenharmony_ci	bool mfsymlinks:1; /* use Minshall+French Symlinks */
23162306a36Sopenharmony_ci	bool multiuser:1;
23262306a36Sopenharmony_ci	bool rwpidforward:1; /* pid forward for read/write operations */
23362306a36Sopenharmony_ci	bool nosharesock:1;
23462306a36Sopenharmony_ci	bool persistent:1;
23562306a36Sopenharmony_ci	bool nopersistent:1;
23662306a36Sopenharmony_ci	bool resilient:1; /* noresilient not required since not fored for CA */
23762306a36Sopenharmony_ci	bool domainauto:1;
23862306a36Sopenharmony_ci	bool rdma:1;
23962306a36Sopenharmony_ci	bool multichannel:1;
24062306a36Sopenharmony_ci	bool use_client_guid:1;
24162306a36Sopenharmony_ci	/* reuse existing guid for multichannel */
24262306a36Sopenharmony_ci	u8 client_guid[SMB2_CLIENT_GUID_SIZE];
24362306a36Sopenharmony_ci	unsigned int bsize;
24462306a36Sopenharmony_ci	unsigned int rasize;
24562306a36Sopenharmony_ci	unsigned int rsize;
24662306a36Sopenharmony_ci	unsigned int wsize;
24762306a36Sopenharmony_ci	unsigned int min_offload;
24862306a36Sopenharmony_ci	bool sockopt_tcp_nodelay:1;
24962306a36Sopenharmony_ci	/* attribute cache timemout for files and directories in jiffies */
25062306a36Sopenharmony_ci	unsigned long acregmax;
25162306a36Sopenharmony_ci	unsigned long acdirmax;
25262306a36Sopenharmony_ci	/* timeout for deferred close of files in jiffies */
25362306a36Sopenharmony_ci	unsigned long closetimeo;
25462306a36Sopenharmony_ci	struct smb_version_operations *ops;
25562306a36Sopenharmony_ci	struct smb_version_values *vals;
25662306a36Sopenharmony_ci	char *prepath;
25762306a36Sopenharmony_ci	struct sockaddr_storage dstaddr; /* destination address */
25862306a36Sopenharmony_ci	struct sockaddr_storage srcaddr; /* allow binding to a local IP */
25962306a36Sopenharmony_ci	struct nls_table *local_nls; /* This is a copy of the pointer in cifs_sb */
26062306a36Sopenharmony_ci	unsigned int echo_interval; /* echo interval in secs */
26162306a36Sopenharmony_ci	__u64 snapshot_time; /* needed for timewarp tokens */
26262306a36Sopenharmony_ci	__u32 handle_timeout; /* persistent and durable handle timeout in ms */
26362306a36Sopenharmony_ci	unsigned int max_credits; /* smb3 max_credits 10 < credits < 60000 */
26462306a36Sopenharmony_ci	unsigned int max_channels;
26562306a36Sopenharmony_ci	unsigned int max_cached_dirs;
26662306a36Sopenharmony_ci	__u16 compression; /* compression algorithm 0xFFFF default 0=disabled */
26762306a36Sopenharmony_ci	bool rootfs:1; /* if it's a SMB root file system */
26862306a36Sopenharmony_ci	bool witness:1; /* use witness protocol */
26962306a36Sopenharmony_ci	char *leaf_fullpath;
27062306a36Sopenharmony_ci	struct cifs_ses *dfs_root_ses;
27162306a36Sopenharmony_ci	bool dfs_automount:1; /* set for dfs automount only */
27262306a36Sopenharmony_ci};
27362306a36Sopenharmony_ci
27462306a36Sopenharmony_ciextern const struct fs_parameter_spec smb3_fs_parameters[];
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_ciextern int smb3_init_fs_context(struct fs_context *fc);
27762306a36Sopenharmony_ciextern void smb3_cleanup_fs_context_contents(struct smb3_fs_context *ctx);
27862306a36Sopenharmony_ciextern void smb3_cleanup_fs_context(struct smb3_fs_context *ctx);
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_cistatic inline struct smb3_fs_context *smb3_fc2context(const struct fs_context *fc)
28162306a36Sopenharmony_ci{
28262306a36Sopenharmony_ci	return fc->fs_private;
28362306a36Sopenharmony_ci}
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_ciextern int smb3_fs_context_dup(struct smb3_fs_context *new_ctx, struct smb3_fs_context *ctx);
28662306a36Sopenharmony_ciextern void smb3_update_mnt_flags(struct cifs_sb_info *cifs_sb);
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_ci/*
28962306a36Sopenharmony_ci * max deferred close timeout (jiffies) - 2^30
29062306a36Sopenharmony_ci */
29162306a36Sopenharmony_ci#define SMB3_MAX_DCLOSETIMEO (1 << 30)
29262306a36Sopenharmony_ci#define SMB3_DEF_DCLOSETIMEO (1 * HZ) /* even 1 sec enough to help eg open/write/close/open/read */
29362306a36Sopenharmony_ci#define MAX_CACHED_FIDS 16
29462306a36Sopenharmony_ciextern char *cifs_sanitize_prepath(char *prepath, gfp_t gfp);
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci#endif
297