325 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2/*3 * Copyright (C) 2020, Microsoft Corporation.4 *5 * Author(s): Steve French <stfrench@microsoft.com>6 * David Howells <dhowells@redhat.com>7 */8 9#ifndef _FS_CONTEXT_H10#define _FS_CONTEXT_H11 12#include "cifsglob.h"13#include <linux/parser.h>14#include <linux/fs_parser.h>15 16/* Log errors in fs_context (new mount api) but also in dmesg (old style) */17#define cifs_errorf(fc, fmt, ...) \18 do { \19 errorf(fc, fmt, ## __VA_ARGS__); \20 cifs_dbg(VFS, fmt, ## __VA_ARGS__); \21 } while (0)22 23enum smb_version {24 Smb_1 = 1,25 Smb_20,26 Smb_21,27 Smb_30,28 Smb_302,29 Smb_311,30 Smb_3any,31 Smb_default,32 Smb_version_err33};34 35enum {36 Opt_cache_loose,37 Opt_cache_strict,38 Opt_cache_none,39 Opt_cache_ro,40 Opt_cache_rw,41 Opt_cache_err42};43 44enum cifs_reparse_parm {45 Opt_reparse_default,46 Opt_reparse_nfs,47 Opt_reparse_wsl,48 Opt_reparse_err49};50 51enum cifs_sec_param {52 Opt_sec_krb5,53 Opt_sec_krb5i,54 Opt_sec_krb5p,55 Opt_sec_ntlmsspi,56 Opt_sec_ntlmssp,57 Opt_sec_ntlmv2,58 Opt_sec_ntlmv2i,59 Opt_sec_none,60 61 Opt_sec_err62};63 64enum cifs_param {65 /* Mount options that take no arguments */66 Opt_user_xattr,67 Opt_forceuid,68 Opt_forcegid,69 Opt_noblocksend,70 Opt_noautotune,71 Opt_nolease,72 Opt_nosparse,73 Opt_hard,74 Opt_soft,75 Opt_perm,76 Opt_nodelete,77 Opt_mapposix,78 Opt_mapchars,79 Opt_nomapchars,80 Opt_sfu,81 Opt_nodfs,82 Opt_posixpaths,83 Opt_unix,84 Opt_nocase,85 Opt_brl,86 Opt_handlecache,87 Opt_forcemandatorylock,88 Opt_setuidfromacl,89 Opt_setuids,90 Opt_dynperm,91 Opt_intr,92 Opt_strictsync,93 Opt_serverino,94 Opt_rwpidforward,95 Opt_cifsacl,96 Opt_acl,97 Opt_locallease,98 Opt_sign,99 Opt_ignore_signature,100 Opt_seal,101 Opt_noac,102 Opt_fsc,103 Opt_mfsymlinks,104 Opt_multiuser,105 Opt_sloppy,106 Opt_nosharesock,107 Opt_persistent,108 Opt_resilient,109 Opt_tcp_nodelay,110 Opt_domainauto,111 Opt_rdma,112 Opt_modesid,113 Opt_rootfs,114 Opt_multichannel,115 Opt_compress,116 Opt_witness,117 118 /* Mount options which take numeric value */119 Opt_backupuid,120 Opt_backupgid,121 Opt_uid,122 Opt_cruid,123 Opt_gid,124 Opt_port,125 Opt_file_mode,126 Opt_dirmode,127 Opt_min_enc_offload,128 Opt_retrans,129 Opt_blocksize,130 Opt_rasize,131 Opt_rsize,132 Opt_wsize,133 Opt_actimeo,134 Opt_acdirmax,135 Opt_acregmax,136 Opt_closetimeo,137 Opt_echo_interval,138 Opt_max_credits,139 Opt_max_cached_dirs,140 Opt_snapshot,141 Opt_max_channels,142 Opt_handletimeout,143 144 /* Mount options which take string value */145 Opt_source,146 Opt_user,147 Opt_pass,148 Opt_pass2,149 Opt_ip,150 Opt_domain,151 Opt_srcaddr,152 Opt_iocharset,153 Opt_netbiosname,154 Opt_servern,155 Opt_ver,156 Opt_vers,157 Opt_sec,158 Opt_cache,159 Opt_reparse,160 161 /* Mount options to be ignored */162 Opt_ignore,163 164 Opt_err165};166 167struct smb3_fs_context {168 bool forceuid_specified;169 bool forcegid_specified;170 bool uid_specified;171 bool cruid_specified;172 bool gid_specified;173 bool sloppy;174 bool got_ip;175 bool got_version;176 bool got_rsize;177 bool got_wsize;178 bool got_bsize;179 unsigned short port;180 181 char *username;182 char *password;183 char *password2;184 char *domainname;185 char *source;186 char *server_hostname;187 char *UNC;188 char *nodename;189 char workstation_name[CIFS_MAX_WORKSTATION_LEN];190 char *iocharset; /* local code page for mapping to and from Unicode */191 char source_rfc1001_name[RFC1001_NAME_LEN_WITH_NULL]; /* clnt nb name */192 char target_rfc1001_name[RFC1001_NAME_LEN_WITH_NULL]; /* srvr nb name */193 kuid_t cred_uid;194 kuid_t linux_uid;195 kgid_t linux_gid;196 kuid_t backupuid;197 kgid_t backupgid;198 umode_t file_mode;199 umode_t dir_mode;200 enum securityEnum sectype; /* sectype requested via mnt opts */201 bool sign; /* was signing requested via mnt opts? */202 bool ignore_signature:1;203 bool retry:1;204 bool intr:1;205 bool setuids:1;206 bool setuidfromacl:1;207 bool override_uid:1;208 bool override_gid:1;209 bool dynperm:1;210 bool noperm:1;211 bool nodelete:1;212 bool mode_ace:1;213 bool no_psx_acl:1; /* set if posix acl support should be disabled */214 bool cifs_acl:1;215 bool backupuid_specified; /* mount option backupuid is specified */216 bool backupgid_specified; /* mount option backupgid is specified */217 bool no_xattr:1; /* set if xattr (EA) support should be disabled*/218 bool server_ino:1; /* use inode numbers from server ie UniqueId */219 bool direct_io:1;220 bool strict_io:1; /* strict cache behavior */221 bool cache_ro:1;222 bool cache_rw:1;223 bool remap:1; /* set to remap seven reserved chars in filenames */224 bool sfu_remap:1; /* remap seven reserved chars ala SFU */225 bool posix_paths:1; /* unset to not ask for posix pathnames. */226 bool no_linux_ext:1;227 bool linux_ext:1;228 bool sfu_emul:1;229 bool nullauth:1; /* attempt to authenticate with null user */230 bool nocase:1; /* request case insensitive filenames */231 bool nobrl:1; /* disable sending byte range locks to srv */232 bool nohandlecache:1; /* disable caching dir handles if srvr probs */233 bool mand_lock:1; /* send mandatory not posix byte range lock reqs */234 bool seal:1; /* request transport encryption on share */235 bool nodfs:1; /* Do not request DFS, even if available */236 bool local_lease:1; /* check leases only on local system, not remote */237 bool noblocksnd:1;238 bool noautotune:1;239 bool nostrictsync:1; /* do not force expensive SMBflush on every sync */240 bool no_lease:1; /* disable requesting leases */241 bool no_sparse:1; /* do not attempt to set files sparse */242 bool fsc:1; /* enable fscache */243 bool mfsymlinks:1; /* use Minshall+French Symlinks */244 bool multiuser:1;245 bool rwpidforward:1; /* pid forward for read/write operations */246 bool nosharesock:1;247 bool persistent:1;248 bool nopersistent:1;249 bool resilient:1; /* noresilient not required since not fored for CA */250 bool domainauto:1;251 bool rdma:1;252 bool multichannel:1;253 bool use_client_guid:1;254 /* reuse existing guid for multichannel */255 u8 client_guid[SMB2_CLIENT_GUID_SIZE];256 unsigned int bsize;257 unsigned int rasize;258 unsigned int rsize;259 unsigned int wsize;260 unsigned int min_offload;261 unsigned int retrans;262 bool sockopt_tcp_nodelay:1;263 /* attribute cache timeout for files and directories in jiffies */264 unsigned long acregmax;265 unsigned long acdirmax;266 /* timeout for deferred close of files in jiffies */267 unsigned long closetimeo;268 struct smb_version_operations *ops;269 struct smb_version_values *vals;270 char *prepath;271 struct sockaddr_storage dstaddr; /* destination address */272 struct sockaddr_storage srcaddr; /* allow binding to a local IP */273 struct nls_table *local_nls; /* This is a copy of the pointer in cifs_sb */274 unsigned int echo_interval; /* echo interval in secs */275 __u64 snapshot_time; /* needed for timewarp tokens */276 __u32 handle_timeout; /* persistent and durable handle timeout in ms */277 unsigned int max_credits; /* smb3 max_credits 10 < credits < 60000 */278 unsigned int max_channels;279 unsigned int max_cached_dirs;280 bool compress; /* enable SMB2 messages (READ/WRITE) de/compression */281 bool rootfs:1; /* if it's a SMB root file system */282 bool witness:1; /* use witness protocol */283 char *leaf_fullpath;284 struct cifs_ses *dfs_root_ses;285 bool dfs_automount:1; /* set for dfs automount only */286 enum cifs_reparse_type reparse_type;287 bool dfs_conn:1; /* set for dfs mounts */288};289 290extern const struct fs_parameter_spec smb3_fs_parameters[];291 292extern int smb3_init_fs_context(struct fs_context *fc);293extern void smb3_cleanup_fs_context_contents(struct smb3_fs_context *ctx);294extern void smb3_cleanup_fs_context(struct smb3_fs_context *ctx);295 296static inline struct smb3_fs_context *smb3_fc2context(const struct fs_context *fc)297{298 return fc->fs_private;299}300 301extern int smb3_fs_context_dup(struct smb3_fs_context *new_ctx, struct smb3_fs_context *ctx);302extern void smb3_update_mnt_flags(struct cifs_sb_info *cifs_sb);303 304/*305 * max deferred close timeout (jiffies) - 2^30306 */307#define SMB3_MAX_DCLOSETIMEO (1 << 30)308#define SMB3_DEF_DCLOSETIMEO (1 * HZ) /* even 1 sec enough to help eg open/write/close/open/read */309#define MAX_CACHED_FIDS 16310extern char *cifs_sanitize_prepath(char *prepath, gfp_t gfp);311 312extern struct mutex cifs_mount_mutex;313 314static inline void cifs_mount_lock(void)315{316 mutex_lock(&cifs_mount_mutex);317}318 319static inline void cifs_mount_unlock(void)320{321 mutex_unlock(&cifs_mount_mutex);322}323 324#endif325