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