/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Copyright (C) 2020, Microsoft Corporation. * * Author(s): Steve French * David Howells */ #ifndef _FS_CONTEXT_H #define _FS_CONTEXT_H #include "cifsglob.h" #include #include /* Log errors in fs_context (new mount api) but also in dmesg (old style) */ #define cifs_errorf(fc, fmt, ...) \ do { \ errorf(fc, fmt, ## __VA_ARGS__); \ cifs_dbg(VFS, fmt, ## __VA_ARGS__); \ } while (0) enum smb_version { Smb_1 = 1, Smb_20, Smb_21, Smb_30, Smb_302, Smb_311, Smb_3any, Smb_default, Smb_version_err }; enum { Opt_cache_loose, Opt_cache_strict, Opt_cache_none, Opt_cache_ro, Opt_cache_rw, Opt_cache_err }; enum cifs_sec_param { Opt_sec_krb5, Opt_sec_krb5i, Opt_sec_krb5p, Opt_sec_ntlmsspi, Opt_sec_ntlmssp, Opt_sec_ntlmv2, Opt_sec_ntlmv2i, Opt_sec_none, Opt_sec_err }; enum cifs_param { /* Mount options that take no arguments */ Opt_user_xattr, Opt_forceuid, Opt_forcegid, Opt_noblocksend, Opt_noautotune, Opt_nolease, Opt_nosparse, Opt_hard, Opt_soft, Opt_perm, Opt_nodelete, Opt_mapposix, Opt_mapchars, Opt_nomapchars, Opt_sfu, Opt_nodfs, Opt_posixpaths, Opt_unix, Opt_nocase, Opt_brl, Opt_handlecache, Opt_forcemandatorylock, Opt_setuidfromacl, Opt_setuids, Opt_dynperm, Opt_intr, Opt_strictsync, Opt_serverino, Opt_rwpidforward, Opt_cifsacl, Opt_acl, Opt_locallease, Opt_sign, Opt_ignore_signature, Opt_seal, Opt_noac, Opt_fsc, Opt_mfsymlinks, Opt_multiuser, Opt_sloppy, Opt_nosharesock, Opt_persistent, Opt_resilient, Opt_tcp_nodelay, Opt_domainauto, Opt_rdma, Opt_modesid, Opt_rootfs, Opt_multichannel, Opt_compress, Opt_witness, /* Mount options which take numeric value */ Opt_backupuid, Opt_backupgid, Opt_uid, Opt_cruid, Opt_gid, Opt_port, Opt_file_mode, Opt_dirmode, Opt_min_enc_offload, Opt_blocksize, Opt_rasize, Opt_rsize, Opt_wsize, Opt_actimeo, Opt_acdirmax, Opt_acregmax, Opt_closetimeo, Opt_echo_interval, Opt_max_credits, Opt_max_cached_dirs, Opt_snapshot, Opt_max_channels, Opt_handletimeout, /* Mount options which take string value */ Opt_source, Opt_user, Opt_pass, Opt_ip, Opt_domain, Opt_srcaddr, Opt_iocharset, Opt_netbiosname, Opt_servern, Opt_ver, Opt_vers, Opt_sec, Opt_cache, /* Mount options to be ignored */ Opt_ignore, Opt_err }; struct smb3_fs_context { bool uid_specified; bool cruid_specified; bool gid_specified; bool sloppy; bool got_ip; bool got_version; bool got_rsize; bool got_wsize; bool got_bsize; unsigned short port; char *username; char *password; char *domainname; char *source; char *server_hostname; char *UNC; char *nodename; char workstation_name[CIFS_MAX_WORKSTATION_LEN]; char *iocharset; /* local code page for mapping to and from Unicode */ char source_rfc1001_name[RFC1001_NAME_LEN_WITH_NULL]; /* clnt nb name */ char target_rfc1001_name[RFC1001_NAME_LEN_WITH_NULL]; /* srvr nb name */ kuid_t cred_uid; kuid_t linux_uid; kgid_t linux_gid; kuid_t backupuid; kgid_t backupgid; umode_t file_mode; umode_t dir_mode; enum securityEnum sectype; /* sectype requested via mnt opts */ bool sign; /* was signing requested via mnt opts? */ bool ignore_signature:1; bool retry:1; bool intr:1; bool setuids:1; bool setuidfromacl:1; bool override_uid:1; bool override_gid:1; bool dynperm:1; bool noperm:1; bool nodelete:1; bool mode_ace:1; bool no_psx_acl:1; /* set if posix acl support should be disabled */ bool cifs_acl:1; bool backupuid_specified; /* mount option backupuid is specified */ bool backupgid_specified; /* mount option backupgid is specified */ bool no_xattr:1; /* set if xattr (EA) support should be disabled*/ bool server_ino:1; /* use inode numbers from server ie UniqueId */ bool direct_io:1; bool strict_io:1; /* strict cache behavior */ bool cache_ro:1; bool cache_rw:1; bool remap:1; /* set to remap seven reserved chars in filenames */ bool sfu_remap:1; /* remap seven reserved chars ala SFU */ bool posix_paths:1; /* unset to not ask for posix pathnames. */ bool no_linux_ext:1; bool linux_ext:1; bool sfu_emul:1; bool nullauth:1; /* attempt to authenticate with null user */ bool nocase:1; /* request case insensitive filenames */ bool nobrl:1; /* disable sending byte range locks to srv */ bool nohandlecache:1; /* disable caching dir handles if srvr probs */ bool mand_lock:1; /* send mandatory not posix byte range lock reqs */ bool seal:1; /* request transport encryption on share */ bool nodfs:1; /* Do not request DFS, even if available */ bool local_lease:1; /* check leases only on local system, not remote */ bool noblocksnd:1; bool noautotune:1; bool nostrictsync:1; /* do not force expensive SMBflush on every sync */ bool no_lease:1; /* disable requesting leases */ bool no_sparse:1; /* do not attempt to set files sparse */ bool fsc:1; /* enable fscache */ bool mfsymlinks:1; /* use Minshall+French Symlinks */ bool multiuser:1; bool rwpidforward:1; /* pid forward for read/write operations */ bool nosharesock:1; bool persistent:1; bool nopersistent:1; bool resilient:1; /* noresilient not required since not fored for CA */ bool domainauto:1; bool rdma:1; bool multichannel:1; bool use_client_guid:1; /* reuse existing guid for multichannel */ u8 client_guid[SMB2_CLIENT_GUID_SIZE]; unsigned int bsize; unsigned int rasize; unsigned int rsize; unsigned int wsize; unsigned int min_offload; bool sockopt_tcp_nodelay:1; /* attribute cache timemout for files and directories in jiffies */ unsigned long acregmax; unsigned long acdirmax; /* timeout for deferred close of files in jiffies */ unsigned long closetimeo; struct smb_version_operations *ops; struct smb_version_values *vals; char *prepath; struct sockaddr_storage dstaddr; /* destination address */ struct sockaddr_storage srcaddr; /* allow binding to a local IP */ struct nls_table *local_nls; /* This is a copy of the pointer in cifs_sb */ unsigned int echo_interval; /* echo interval in secs */ __u64 snapshot_time; /* needed for timewarp tokens */ __u32 handle_timeout; /* persistent and durable handle timeout in ms */ unsigned int max_credits; /* smb3 max_credits 10 < credits < 60000 */ unsigned int max_channels; unsigned int max_cached_dirs; __u16 compression; /* compression algorithm 0xFFFF default 0=disabled */ bool rootfs:1; /* if it's a SMB root file system */ bool witness:1; /* use witness protocol */ char *leaf_fullpath; struct cifs_ses *dfs_root_ses; bool dfs_automount:1; /* set for dfs automount only */ }; extern const struct fs_parameter_spec smb3_fs_parameters[]; extern int smb3_init_fs_context(struct fs_context *fc); extern void smb3_cleanup_fs_context_contents(struct smb3_fs_context *ctx); extern void smb3_cleanup_fs_context(struct smb3_fs_context *ctx); static inline struct smb3_fs_context *smb3_fc2context(const struct fs_context *fc) { return fc->fs_private; } extern int smb3_fs_context_dup(struct smb3_fs_context *new_ctx, struct smb3_fs_context *ctx); extern void smb3_update_mnt_flags(struct cifs_sb_info *cifs_sb); /* * max deferred close timeout (jiffies) - 2^30 */ #define SMB3_MAX_DCLOSETIMEO (1 << 30) #define SMB3_DEF_DCLOSETIMEO (1 * HZ) /* even 1 sec enough to help eg open/write/close/open/read */ #define MAX_CACHED_FIDS 16 extern char *cifs_sanitize_prepath(char *prepath, gfp_t gfp); extern struct mutex cifs_mount_mutex; static inline void cifs_mount_lock(void) { mutex_lock(&cifs_mount_mutex); } static inline void cifs_mount_unlock(void) { mutex_unlock(&cifs_mount_mutex); } #endif