1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2020, Microsoft Corporation.
10 #include <linux/module.h>
11 #include <linux/nsproxy.h>
12 #include <linux/slab.h>
13 #include <linux/magic.h>
14 #include <linux/security.h>
15 #include <net/net_namespace.h>
16 #ifdef CONFIG_CIFS_DFS_UPCALL
17 #include "dfs_cache.h"
21 #include <linux/ctype.h>
22 #include <linux/fs_context.h>
23 #include <linux/fs_parser.h>
25 #include <linux/mount.h>
26 #include <linux/parser.h>
27 #include <linux/utsname.h>
31 #include "cifsproto.h"
32 #include "cifs_unicode.h"
33 #include "cifs_debug.h"
34 #include "cifs_fs_sb.h"
37 #include "rfc1002pdu.h"
38 #include "fs_context.h"
40 static const match_table_t cifs_smb_version_tokens = {
41 { Smb_1, SMB1_VERSION_STRING },
42 { Smb_20, SMB20_VERSION_STRING},
43 { Smb_21, SMB21_VERSION_STRING },
44 { Smb_30, SMB30_VERSION_STRING },
45 { Smb_302, SMB302_VERSION_STRING },
46 { Smb_302, ALT_SMB302_VERSION_STRING },
47 { Smb_311, SMB311_VERSION_STRING },
48 { Smb_311, ALT_SMB311_VERSION_STRING },
49 { Smb_3any, SMB3ANY_VERSION_STRING },
50 { Smb_default, SMBDEFAULT_VERSION_STRING },
51 { Smb_version_err, NULL }
54 static const match_table_t cifs_secflavor_tokens = {
55 { Opt_sec_krb5, "krb5" },
56 { Opt_sec_krb5i, "krb5i" },
57 { Opt_sec_krb5p, "krb5p" },
58 { Opt_sec_ntlmsspi, "ntlmsspi" },
59 { Opt_sec_ntlmssp, "ntlmssp" },
60 { Opt_sec_ntlmv2, "nontlm" },
61 { Opt_sec_ntlmv2, "ntlmv2" },
62 { Opt_sec_ntlmv2i, "ntlmv2i" },
63 { Opt_sec_none, "none" },
68 const struct fs_parameter_spec smb3_fs_parameters[] = {
69 /* Mount options that take no arguments */
70 fsparam_flag_no("user_xattr", Opt_user_xattr),
71 fsparam_flag_no("forceuid", Opt_forceuid),
72 fsparam_flag_no("multichannel", Opt_multichannel),
73 fsparam_flag_no("forcegid", Opt_forcegid),
74 fsparam_flag("noblocksend", Opt_noblocksend),
75 fsparam_flag("noautotune", Opt_noautotune),
76 fsparam_flag("nolease", Opt_nolease),
77 fsparam_flag_no("hard", Opt_hard),
78 fsparam_flag_no("soft", Opt_soft),
79 fsparam_flag_no("perm", Opt_perm),
80 fsparam_flag("nodelete", Opt_nodelete),
81 fsparam_flag_no("mapposix", Opt_mapposix),
82 fsparam_flag("mapchars", Opt_mapchars),
83 fsparam_flag("nomapchars", Opt_nomapchars),
84 fsparam_flag_no("sfu", Opt_sfu),
85 fsparam_flag("nodfs", Opt_nodfs),
86 fsparam_flag_no("posixpaths", Opt_posixpaths),
87 fsparam_flag_no("unix", Opt_unix),
88 fsparam_flag_no("linux", Opt_unix),
89 fsparam_flag_no("posix", Opt_unix),
90 fsparam_flag("nocase", Opt_nocase),
91 fsparam_flag("ignorecase", Opt_nocase),
92 fsparam_flag_no("brl", Opt_brl),
93 fsparam_flag_no("handlecache", Opt_handlecache),
94 fsparam_flag("forcemandatorylock", Opt_forcemandatorylock),
95 fsparam_flag("forcemand", Opt_forcemandatorylock),
96 fsparam_flag("setuidfromacl", Opt_setuidfromacl),
97 fsparam_flag("idsfromsid", Opt_setuidfromacl),
98 fsparam_flag_no("setuids", Opt_setuids),
99 fsparam_flag_no("dynperm", Opt_dynperm),
100 fsparam_flag_no("intr", Opt_intr),
101 fsparam_flag_no("strictsync", Opt_strictsync),
102 fsparam_flag_no("serverino", Opt_serverino),
103 fsparam_flag("rwpidforward", Opt_rwpidforward),
104 fsparam_flag("cifsacl", Opt_cifsacl),
105 fsparam_flag_no("acl", Opt_acl),
106 fsparam_flag("locallease", Opt_locallease),
107 fsparam_flag("sign", Opt_sign),
108 fsparam_flag("ignore_signature", Opt_ignore_signature),
109 fsparam_flag("signloosely", Opt_ignore_signature),
110 fsparam_flag("seal", Opt_seal),
111 fsparam_flag("noac", Opt_noac),
112 fsparam_flag("fsc", Opt_fsc),
113 fsparam_flag("mfsymlinks", Opt_mfsymlinks),
114 fsparam_flag("multiuser", Opt_multiuser),
115 fsparam_flag("sloppy", Opt_sloppy),
116 fsparam_flag("nosharesock", Opt_nosharesock),
117 fsparam_flag_no("persistenthandles", Opt_persistent),
118 fsparam_flag_no("resilienthandles", Opt_resilient),
119 fsparam_flag("domainauto", Opt_domainauto),
120 fsparam_flag("rdma", Opt_rdma),
121 fsparam_flag("modesid", Opt_modesid),
122 fsparam_flag("modefromsid", Opt_modesid),
123 fsparam_flag("rootfs", Opt_rootfs),
124 fsparam_flag("compress", Opt_compress),
125 fsparam_flag("witness", Opt_witness),
127 /* Mount options which take numeric value */
128 fsparam_u32("backupuid", Opt_backupuid),
129 fsparam_u32("backupgid", Opt_backupgid),
130 fsparam_u32("uid", Opt_uid),
131 fsparam_u32("cruid", Opt_cruid),
132 fsparam_u32("gid", Opt_gid),
133 fsparam_u32("file_mode", Opt_file_mode),
134 fsparam_u32("dirmode", Opt_dirmode),
135 fsparam_u32("dir_mode", Opt_dirmode),
136 fsparam_u32("port", Opt_port),
137 fsparam_u32("min_enc_offload", Opt_min_enc_offload),
138 fsparam_u32("esize", Opt_min_enc_offload),
139 fsparam_u32("bsize", Opt_blocksize),
140 fsparam_u32("rasize", Opt_rasize),
141 fsparam_u32("rsize", Opt_rsize),
142 fsparam_u32("wsize", Opt_wsize),
143 fsparam_u32("actimeo", Opt_actimeo),
144 fsparam_u32("acdirmax", Opt_acdirmax),
145 fsparam_u32("acregmax", Opt_acregmax),
146 fsparam_u32("echo_interval", Opt_echo_interval),
147 fsparam_u32("max_credits", Opt_max_credits),
148 fsparam_u32("handletimeout", Opt_handletimeout),
149 fsparam_u32("snapshot", Opt_snapshot),
150 fsparam_u32("max_channels", Opt_max_channels),
152 /* Mount options which take string value */
153 fsparam_string("source", Opt_source),
154 fsparam_string("user", Opt_user),
155 fsparam_string("username", Opt_user),
156 fsparam_string("pass", Opt_pass),
157 fsparam_string("password", Opt_pass),
158 fsparam_string("ip", Opt_ip),
159 fsparam_string("addr", Opt_ip),
160 fsparam_string("domain", Opt_domain),
161 fsparam_string("dom", Opt_domain),
162 fsparam_string("srcaddr", Opt_srcaddr),
163 fsparam_string("iocharset", Opt_iocharset),
164 fsparam_string("netbiosname", Opt_netbiosname),
165 fsparam_string("servern", Opt_servern),
166 fsparam_string("ver", Opt_ver),
167 fsparam_string("vers", Opt_vers),
168 fsparam_string("sec", Opt_sec),
169 fsparam_string("cache", Opt_cache),
171 /* Arguments that should be ignored */
172 fsparam_flag("guest", Opt_ignore),
173 fsparam_flag("noatime", Opt_ignore),
174 fsparam_flag("relatime", Opt_ignore),
175 fsparam_flag("_netdev", Opt_ignore),
176 fsparam_flag_no("suid", Opt_ignore),
177 fsparam_flag_no("exec", Opt_ignore),
178 fsparam_flag_no("dev", Opt_ignore),
179 fsparam_flag_no("mand", Opt_ignore),
180 fsparam_flag_no("auto", Opt_ignore),
181 fsparam_string("cred", Opt_ignore),
182 fsparam_string("credentials", Opt_ignore),
184 * UNC and prefixpath is now extracted from Opt_source
185 * in the new mount API so we can just ignore them going forward.
187 fsparam_string("unc", Opt_ignore),
188 fsparam_string("prefixpath", Opt_ignore),
193 cifs_parse_security_flavors(struct fs_context *fc, char *value, struct smb3_fs_context *ctx)
196 substring_t args[MAX_OPT_ARGS];
199 * With mount options, the last one should win. Reset any existing
200 * settings back to default.
202 ctx->sectype = Unspecified;
205 switch (match_token(value, cifs_secflavor_tokens, args)) {
207 cifs_errorf(fc, "sec=krb5p is not supported!\n");
213 ctx->sectype = Kerberos;
215 case Opt_sec_ntlmsspi:
218 case Opt_sec_ntlmssp:
219 ctx->sectype = RawNTLMSSP;
221 case Opt_sec_ntlmv2i:
225 ctx->sectype = NTLMv2;
231 cifs_errorf(fc, "bad security option: %s\n", value);
238 static const match_table_t cifs_cacheflavor_tokens = {
239 { Opt_cache_loose, "loose" },
240 { Opt_cache_strict, "strict" },
241 { Opt_cache_none, "none" },
242 { Opt_cache_ro, "ro" },
243 { Opt_cache_rw, "singleclient" },
244 { Opt_cache_err, NULL }
248 cifs_parse_cache_flavor(struct fs_context *fc, char *value, struct smb3_fs_context *ctx)
250 substring_t args[MAX_OPT_ARGS];
252 switch (match_token(value, cifs_cacheflavor_tokens, args)) {
253 case Opt_cache_loose:
254 ctx->direct_io = false;
255 ctx->strict_io = false;
256 ctx->cache_ro = false;
257 ctx->cache_rw = false;
259 case Opt_cache_strict:
260 ctx->direct_io = false;
261 ctx->strict_io = true;
262 ctx->cache_ro = false;
263 ctx->cache_rw = false;
266 ctx->direct_io = true;
267 ctx->strict_io = false;
268 ctx->cache_ro = false;
269 ctx->cache_rw = false;
272 ctx->direct_io = false;
273 ctx->strict_io = false;
274 ctx->cache_ro = true;
275 ctx->cache_rw = false;
278 ctx->direct_io = false;
279 ctx->strict_io = false;
280 ctx->cache_ro = false;
281 ctx->cache_rw = true;
284 cifs_errorf(fc, "bad cache= option: %s\n", value);
290 #define DUP_CTX_STR(field) \
293 new_ctx->field = kstrdup(ctx->field, GFP_ATOMIC); \
294 if (new_ctx->field == NULL) { \
295 smb3_cleanup_fs_context_contents(new_ctx); \
302 smb3_fs_context_dup(struct smb3_fs_context *new_ctx, struct smb3_fs_context *ctx)
304 memcpy(new_ctx, ctx, sizeof(*ctx));
305 new_ctx->prepath = NULL;
306 new_ctx->mount_options = NULL;
307 new_ctx->nodename = NULL;
308 new_ctx->username = NULL;
309 new_ctx->password = NULL;
310 new_ctx->domainname = NULL;
312 new_ctx->source = NULL;
313 new_ctx->iocharset = NULL;
315 * Make sure to stay in sync with smb3_cleanup_fs_context_contents()
317 DUP_CTX_STR(prepath);
318 DUP_CTX_STR(mount_options);
319 DUP_CTX_STR(username);
320 DUP_CTX_STR(password);
323 DUP_CTX_STR(domainname);
324 DUP_CTX_STR(nodename);
325 DUP_CTX_STR(iocharset);
331 cifs_parse_smb_version(struct fs_context *fc, char *value, struct smb3_fs_context *ctx, bool is_smb3)
333 substring_t args[MAX_OPT_ARGS];
335 switch (match_token(value, cifs_smb_version_tokens, args)) {
336 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
338 if (disable_legacy_dialects) {
339 cifs_errorf(fc, "mount with legacy dialect disabled\n");
343 cifs_errorf(fc, "vers=1.0 (cifs) not permitted when mounting with smb3\n");
346 cifs_errorf(fc, "Use of the less secure dialect vers=1.0 is not recommended unless required for access to very old servers\n");
347 ctx->ops = &smb1_operations;
348 ctx->vals = &smb1_values;
351 if (disable_legacy_dialects) {
352 cifs_errorf(fc, "mount with legacy dialect disabled\n");
356 cifs_errorf(fc, "vers=2.0 not permitted when mounting with smb3\n");
359 ctx->ops = &smb20_operations;
360 ctx->vals = &smb20_values;
364 cifs_errorf(fc, "vers=1.0 (cifs) mount not permitted when legacy dialects disabled\n");
367 cifs_errorf(fc, "vers=2.0 mount not permitted when legacy dialects disabled\n");
369 #endif /* CIFS_ALLOW_INSECURE_LEGACY */
371 ctx->ops = &smb21_operations;
372 ctx->vals = &smb21_values;
375 ctx->ops = &smb30_operations;
376 ctx->vals = &smb30_values;
379 ctx->ops = &smb30_operations; /* currently identical with 3.0 */
380 ctx->vals = &smb302_values;
383 ctx->ops = &smb311_operations;
384 ctx->vals = &smb311_values;
387 ctx->ops = &smb30_operations; /* currently identical with 3.0 */
388 ctx->vals = &smb3any_values;
391 ctx->ops = &smb30_operations;
392 ctx->vals = &smbdefault_values;
395 cifs_errorf(fc, "Unknown vers= option specified: %s\n", value);
401 int smb3_parse_opt(const char *options, const char *key, char **val)
404 char *opts, *orig, *p;
406 orig = opts = kstrdup(options, GFP_KERNEL);
410 while ((p = strsep(&opts, ","))) {
415 if (strncasecmp(p, key, strlen(key)))
417 nval = strchr(p, '=');
422 *val = kstrdup(nval, GFP_KERNEL);
423 rc = !*val ? -ENOMEM : 0;
433 * Parse a devname into substrings and populate the ctx->UNC and ctx->prepath
434 * fields with the result. Returns 0 on success and an error otherwise
435 * (e.g. ENOMEM or EINVAL)
438 smb3_parse_devname(const char *devname, struct smb3_fs_context *ctx)
441 const char *delims = "/\\";
444 if (unlikely(!devname || !*devname)) {
445 cifs_dbg(VFS, "Device name not specified\n");
449 /* make sure we have a valid UNC double delimiter prefix */
450 len = strspn(devname, delims);
454 /* find delimiter between host and sharename */
455 pos = strpbrk(devname + 2, delims);
459 /* skip past delimiter */
462 /* now go until next delimiter or end of string */
463 len = strcspn(pos, delims);
465 /* move "pos" up to delimiter or NULL */
468 ctx->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
472 convert_delimiter(ctx->UNC, '\\');
474 /* skip any delimiter */
475 if (*pos == '/' || *pos == '\\')
481 /* If pos is NULL then no prepath */
485 ctx->prepath = kstrdup(pos, GFP_KERNEL);
492 static void smb3_fs_context_free(struct fs_context *fc);
493 static int smb3_fs_context_parse_param(struct fs_context *fc,
494 struct fs_parameter *param);
495 static int smb3_fs_context_parse_monolithic(struct fs_context *fc,
497 static int smb3_get_tree(struct fs_context *fc);
498 static int smb3_reconfigure(struct fs_context *fc);
500 static const struct fs_context_operations smb3_fs_context_ops = {
501 .free = smb3_fs_context_free,
502 .parse_param = smb3_fs_context_parse_param,
503 .parse_monolithic = smb3_fs_context_parse_monolithic,
504 .get_tree = smb3_get_tree,
505 .reconfigure = smb3_reconfigure,
509 * Parse a monolithic block of data from sys_mount().
510 * smb3_fs_context_parse_monolithic - Parse key[=val][,key[=val]]* mount data
511 * @ctx: The superblock configuration to fill in.
512 * @data: The data to parse
514 * Parse a blob of data that's in key[=val][,key[=val]]* form. This can be
515 * called from the ->monolithic_mount_data() fs_context operation.
517 * Returns 0 on success or the error returned by the ->parse_option() fs_context
518 * operation on failure.
520 static int smb3_fs_context_parse_monolithic(struct fs_context *fc,
523 struct smb3_fs_context *ctx = smb3_fc2context(fc);
524 char *options = data, *key;
530 ctx->mount_options = kstrdup(data, GFP_KERNEL);
531 if (ctx->mount_options == NULL)
534 ret = security_sb_eat_lsm_opts(options, &fc->security);
538 /* BB Need to add support for sep= here TBD */
539 while ((key = strsep(&options, ",")) != NULL) {
546 /* Check if following character is the deliminator If yes,
547 * we have encountered a double deliminator reset the NULL
548 * character to the deliminator
550 while (options && options[0] == ',') {
552 strcpy(key + len, options);
553 options = strchr(options, ',');
560 value = strchr(key, '=');
568 ret = vfs_parse_fs_string(fc, key, value, len);
577 * Validate the preparsed information in the config.
579 static int smb3_fs_context_validate(struct fs_context *fc)
581 struct smb3_fs_context *ctx = smb3_fc2context(fc);
583 if (ctx->rdma && ctx->vals->protocol_id < SMB30_PROT_ID) {
584 cifs_errorf(fc, "SMB Direct requires Version >=3.0\n");
589 /* Muliuser mounts require CONFIG_KEYS support */
590 if (ctx->multiuser) {
591 cifs_errorf(fc, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
596 if (ctx->got_version == false)
597 pr_warn_once("No dialect specified on mount. Default has changed to a more secure dialect, SMB2.1 or later (e.g. SMB3.1.1), from CIFS (SMB1). To use the less secure SMB1 dialect to access old servers which do not support SMB3.1.1 (or even SMB3 or SMB2.1) specify vers=1.0 on mount.\n");
601 cifs_errorf(fc, "CIFS mount error: No usable UNC path provided in device string!\n");
605 /* make sure UNC has a share name */
606 if (strlen(ctx->UNC) < 3 || !strchr(ctx->UNC + 3, '\\')) {
607 cifs_errorf(fc, "Malformed UNC. Unable to find share name.\n");
615 /* No ip= option specified? Try to get it from UNC */
616 /* Use the address part of the UNC. */
617 slash = strchr(&ctx->UNC[2], '\\');
618 len = slash - &ctx->UNC[2];
619 if (!cifs_convert_address((struct sockaddr *)&ctx->dstaddr,
620 &ctx->UNC[2], len)) {
621 pr_err("Unable to determine destination address\n");
622 return -EHOSTUNREACH;
626 /* set the port that we got earlier */
627 cifs_set_port((struct sockaddr *)&ctx->dstaddr, ctx->port);
629 if (ctx->override_uid && !ctx->uid_specified) {
630 ctx->override_uid = 0;
631 pr_notice("ignoring forceuid mount option specified with no uid= option\n");
634 if (ctx->override_gid && !ctx->gid_specified) {
635 ctx->override_gid = 0;
636 pr_notice("ignoring forcegid mount option specified with no gid= option\n");
642 static int smb3_get_tree_common(struct fs_context *fc)
644 struct smb3_fs_context *ctx = smb3_fc2context(fc);
648 root = cifs_smb3_do_mount(fc->fs_type, 0, ctx);
650 return PTR_ERR(root);
658 * Create an SMB3 superblock from the parameters passed.
660 static int smb3_get_tree(struct fs_context *fc)
662 int err = smb3_fs_context_validate(fc);
666 return smb3_get_tree_common(fc);
669 static void smb3_fs_context_free(struct fs_context *fc)
671 struct smb3_fs_context *ctx = smb3_fc2context(fc);
673 smb3_cleanup_fs_context(ctx);
677 * Compare the old and new proposed context during reconfigure
678 * and check if the changes are compatible.
680 static int smb3_verify_reconfigure_ctx(struct fs_context *fc,
681 struct smb3_fs_context *new_ctx,
682 struct smb3_fs_context *old_ctx)
684 if (new_ctx->posix_paths != old_ctx->posix_paths) {
685 cifs_errorf(fc, "can not change posixpaths during remount\n");
688 if (new_ctx->sectype != old_ctx->sectype) {
689 cifs_errorf(fc, "can not change sec during remount\n");
692 if (new_ctx->multiuser != old_ctx->multiuser) {
693 cifs_errorf(fc, "can not change multiuser during remount\n");
697 (!old_ctx->UNC || strcmp(new_ctx->UNC, old_ctx->UNC))) {
698 cifs_errorf(fc, "can not change UNC during remount\n");
701 if (new_ctx->username &&
702 (!old_ctx->username || strcmp(new_ctx->username, old_ctx->username))) {
703 cifs_errorf(fc, "can not change username during remount\n");
706 if (new_ctx->password &&
707 (!old_ctx->password || strcmp(new_ctx->password, old_ctx->password))) {
708 cifs_errorf(fc, "can not change password during remount\n");
711 if (new_ctx->domainname &&
712 (!old_ctx->domainname || strcmp(new_ctx->domainname, old_ctx->domainname))) {
713 cifs_errorf(fc, "can not change domainname during remount\n");
716 if (new_ctx->nodename &&
717 (!old_ctx->nodename || strcmp(new_ctx->nodename, old_ctx->nodename))) {
718 cifs_errorf(fc, "can not change nodename during remount\n");
721 if (new_ctx->iocharset &&
722 (!old_ctx->iocharset || strcmp(new_ctx->iocharset, old_ctx->iocharset))) {
723 cifs_errorf(fc, "can not change iocharset during remount\n");
730 #define STEAL_STRING(cifs_sb, ctx, field) \
733 ctx->field = cifs_sb->ctx->field; \
734 cifs_sb->ctx->field = NULL; \
737 static int smb3_reconfigure(struct fs_context *fc)
739 struct smb3_fs_context *ctx = smb3_fc2context(fc);
740 struct dentry *root = fc->root;
741 struct cifs_sb_info *cifs_sb = CIFS_SB(root->d_sb);
744 rc = smb3_verify_reconfigure_ctx(fc, ctx, cifs_sb->ctx);
749 * We can not change UNC/username/password/domainname/nodename/iocharset
750 * during reconnect so ignore what we have in the new context and
751 * just use what we already have in cifs_sb->ctx.
753 STEAL_STRING(cifs_sb, ctx, UNC);
754 STEAL_STRING(cifs_sb, ctx, source);
755 STEAL_STRING(cifs_sb, ctx, username);
756 STEAL_STRING(cifs_sb, ctx, password);
757 STEAL_STRING(cifs_sb, ctx, domainname);
758 STEAL_STRING(cifs_sb, ctx, nodename);
759 STEAL_STRING(cifs_sb, ctx, iocharset);
761 /* if rsize or wsize not passed in on remount, use previous values */
763 ctx->rsize = cifs_sb->ctx->rsize;
765 ctx->wsize = cifs_sb->ctx->wsize;
768 smb3_cleanup_fs_context_contents(cifs_sb->ctx);
769 rc = smb3_fs_context_dup(cifs_sb->ctx, ctx);
770 smb3_update_mnt_flags(cifs_sb);
771 #ifdef CONFIG_CIFS_DFS_UPCALL
773 rc = dfs_cache_remount_fs(cifs_sb);
779 static int smb3_fs_context_parse_param(struct fs_context *fc,
780 struct fs_parameter *param)
782 struct fs_parse_result result;
783 struct smb3_fs_context *ctx = smb3_fc2context(fc);
785 bool is_smb3 = !strcmp(fc->fs_type->name, "smb3");
786 bool skip_parsing = false;
790 cifs_dbg(FYI, "CIFS: parsing cifs mount option '%s'\n", param->key);
793 * fs_parse can not handle string options with an empty value so
794 * we will need special handling of them.
796 if (param->type == fs_value_is_string && param->string[0] == 0) {
797 if (!strcmp("pass", param->key) || !strcmp("password", param->key)) {
800 } else if (!strcmp("user", param->key) || !strcmp("username", param->key)) {
807 opt = fs_parse(fc, smb3_fs_parameters, param, &result);
809 return ctx->sloppy ? 1 : opt;
814 ctx->compression = UNKNOWN_TYPE;
816 "SMB3 compression support is experimental\n");
838 ctx->sfu_remap = false; /* disable SFU mapping */
849 ctx->override_uid = 0;
851 ctx->override_uid = 1;
855 ctx->override_gid = 0;
857 ctx->override_gid = 1;
877 case Opt_noblocksend:
889 case Opt_multichannel:
890 if (result.negated) {
891 ctx->multichannel = false;
892 ctx->max_channels = 1;
894 ctx->multichannel = true;
895 /* if number of channels not specified, default to 2 */
896 if (ctx->max_channels < 2)
897 ctx->max_channels = 2;
901 uid = make_kuid(current_user_ns(), result.uint_32);
903 goto cifs_parse_mount_err;
904 ctx->linux_uid = uid;
905 ctx->uid_specified = true;
908 uid = make_kuid(current_user_ns(), result.uint_32);
910 goto cifs_parse_mount_err;
912 ctx->cruid_specified = true;
915 uid = make_kuid(current_user_ns(), result.uint_32);
917 goto cifs_parse_mount_err;
918 ctx->backupuid = uid;
919 ctx->backupuid_specified = true;
922 gid = make_kgid(current_user_ns(), result.uint_32);
924 goto cifs_parse_mount_err;
925 ctx->backupgid = gid;
926 ctx->backupgid_specified = true;
929 gid = make_kgid(current_user_ns(), result.uint_32);
931 goto cifs_parse_mount_err;
932 ctx->linux_gid = gid;
933 ctx->gid_specified = true;
936 ctx->port = result.uint_32;
939 ctx->file_mode = result.uint_32;
942 ctx->dir_mode = result.uint_32;
944 case Opt_min_enc_offload:
945 ctx->min_offload = result.uint_32;
949 * inode blocksize realistically should never need to be
950 * less than 16K or greater than 16M and default is 1MB.
951 * Note that small inode block sizes (e.g. 64K) can lead
952 * to very poor performance of common tools like cp and scp
954 if ((result.uint_32 < CIFS_MAX_MSGSIZE) ||
955 (result.uint_32 > (4 * SMB3_DEFAULT_IOSIZE))) {
956 cifs_errorf(fc, "%s: Invalid blocksize\n",
958 goto cifs_parse_mount_err;
960 ctx->bsize = result.uint_32;
961 ctx->got_bsize = true;
965 * readahead size realistically should never need to be
966 * less than 1M (CIFS_DEFAULT_IOSIZE) or greater than 32M
967 * (perhaps an exception should be considered in the
968 * for the case of a large number of channels
969 * when multichannel is negotiated) since that would lead
970 * to plenty of parallel I/O in flight to the server.
971 * Note that smaller read ahead sizes would
972 * hurt performance of common tools like cp and scp
973 * which often trigger sequential i/o with read ahead
975 if ((result.uint_32 > (8 * SMB3_DEFAULT_IOSIZE)) ||
976 (result.uint_32 < CIFS_DEFAULT_IOSIZE)) {
977 cifs_errorf(fc, "%s: Invalid rasize %d vs. %d\n",
978 __func__, result.uint_32, SMB3_DEFAULT_IOSIZE);
979 goto cifs_parse_mount_err;
981 ctx->rasize = result.uint_32;
984 ctx->rsize = result.uint_32;
985 ctx->got_rsize = true;
988 ctx->wsize = result.uint_32;
989 ctx->got_wsize = true;
992 ctx->acregmax = HZ * result.uint_32;
993 if (ctx->acregmax > CIFS_MAX_ACTIMEO) {
994 cifs_errorf(fc, "acregmax too large\n");
995 goto cifs_parse_mount_err;
999 ctx->acdirmax = HZ * result.uint_32;
1000 if (ctx->acdirmax > CIFS_MAX_ACTIMEO) {
1001 cifs_errorf(fc, "acdirmax too large\n");
1002 goto cifs_parse_mount_err;
1006 if (HZ * result.uint_32 > CIFS_MAX_ACTIMEO) {
1007 cifs_errorf(fc, "timeout too large\n");
1008 goto cifs_parse_mount_err;
1010 if ((ctx->acdirmax != CIFS_DEF_ACTIMEO) ||
1011 (ctx->acregmax != CIFS_DEF_ACTIMEO)) {
1012 cifs_errorf(fc, "actimeo ignored since acregmax or acdirmax specified\n");
1015 ctx->acdirmax = ctx->acregmax = HZ * result.uint_32;
1017 case Opt_echo_interval:
1018 ctx->echo_interval = result.uint_32;
1021 ctx->snapshot_time = result.uint_32;
1023 case Opt_max_credits:
1024 if (result.uint_32 < 20 || result.uint_32 > 60000) {
1025 cifs_errorf(fc, "%s: Invalid max_credits value\n",
1027 goto cifs_parse_mount_err;
1029 ctx->max_credits = result.uint_32;
1031 case Opt_max_channels:
1032 if (result.uint_32 < 1 || result.uint_32 > CIFS_MAX_CHANNELS) {
1033 cifs_errorf(fc, "%s: Invalid max_channels value, needs to be 1-%d\n",
1034 __func__, CIFS_MAX_CHANNELS);
1035 goto cifs_parse_mount_err;
1037 ctx->max_channels = result.uint_32;
1038 /* If more than one channel requested ... they want multichan */
1039 if (result.uint_32 > 1)
1040 ctx->multichannel = true;
1042 case Opt_handletimeout:
1043 ctx->handle_timeout = result.uint_32;
1044 if (ctx->handle_timeout > SMB3_MAX_HANDLE_TIMEOUT) {
1045 cifs_errorf(fc, "Invalid handle cache timeout, longer than 16 minutes\n");
1046 goto cifs_parse_mount_err;
1052 switch (smb3_parse_devname(param->string, ctx)) {
1056 cifs_errorf(fc, "Unable to allocate memory for devname\n");
1057 goto cifs_parse_mount_err;
1059 cifs_errorf(fc, "Malformed UNC in devname\n");
1060 goto cifs_parse_mount_err;
1062 cifs_errorf(fc, "Unknown error parsing devname\n");
1063 goto cifs_parse_mount_err;
1065 ctx->source = kstrdup(param->string, GFP_KERNEL);
1066 if (ctx->source == NULL) {
1067 cifs_errorf(fc, "OOM when copying UNC string\n");
1068 goto cifs_parse_mount_err;
1070 fc->source = kstrdup(param->string, GFP_KERNEL);
1071 if (fc->source == NULL) {
1072 cifs_errorf(fc, "OOM when copying UNC string\n");
1073 goto cifs_parse_mount_err;
1077 kfree(ctx->username);
1078 ctx->username = NULL;
1079 if (strlen(param->string) == 0) {
1080 /* null user, ie. anonymous authentication */
1085 if (strnlen(param->string, CIFS_MAX_USERNAME_LEN) >
1086 CIFS_MAX_USERNAME_LEN) {
1087 pr_warn("username too long\n");
1088 goto cifs_parse_mount_err;
1090 ctx->username = kstrdup(param->string, GFP_KERNEL);
1091 if (ctx->username == NULL) {
1092 cifs_errorf(fc, "OOM when copying username string\n");
1093 goto cifs_parse_mount_err;
1097 kfree(ctx->password);
1098 ctx->password = NULL;
1099 if (strlen(param->string) == 0)
1102 ctx->password = kstrdup(param->string, GFP_KERNEL);
1103 if (ctx->password == NULL) {
1104 cifs_errorf(fc, "OOM when copying password string\n");
1105 goto cifs_parse_mount_err;
1109 if (strlen(param->string) == 0) {
1110 ctx->got_ip = false;
1113 if (!cifs_convert_address((struct sockaddr *)&ctx->dstaddr,
1115 strlen(param->string))) {
1116 pr_err("bad ip= option (%s)\n", param->string);
1117 goto cifs_parse_mount_err;
1122 if (strnlen(param->string, CIFS_MAX_DOMAINNAME_LEN)
1123 == CIFS_MAX_DOMAINNAME_LEN) {
1124 pr_warn("domain name too long\n");
1125 goto cifs_parse_mount_err;
1128 kfree(ctx->domainname);
1129 ctx->domainname = kstrdup(param->string, GFP_KERNEL);
1130 if (ctx->domainname == NULL) {
1131 cifs_errorf(fc, "OOM when copying domainname string\n");
1132 goto cifs_parse_mount_err;
1134 cifs_dbg(FYI, "Domain name set\n");
1137 if (!cifs_convert_address(
1138 (struct sockaddr *)&ctx->srcaddr,
1139 param->string, strlen(param->string))) {
1140 pr_warn("Could not parse srcaddr: %s\n",
1142 goto cifs_parse_mount_err;
1146 if (strnlen(param->string, 1024) >= 65) {
1147 pr_warn("iocharset name too long\n");
1148 goto cifs_parse_mount_err;
1151 if (strncasecmp(param->string, "default", 7) != 0) {
1152 kfree(ctx->iocharset);
1153 ctx->iocharset = kstrdup(param->string, GFP_KERNEL);
1154 if (ctx->iocharset == NULL) {
1155 cifs_errorf(fc, "OOM when copying iocharset string\n");
1156 goto cifs_parse_mount_err;
1159 /* if iocharset not set then load_nls_default
1162 cifs_dbg(FYI, "iocharset set to %s\n", ctx->iocharset);
1164 case Opt_netbiosname:
1165 memset(ctx->source_rfc1001_name, 0x20,
1168 * FIXME: are there cases in which a comma can
1169 * be valid in workstation netbios name (and
1170 * need special handling)?
1172 for (i = 0; i < RFC1001_NAME_LEN; i++) {
1173 /* don't ucase netbiosname for user */
1174 if (param->string[i] == 0)
1176 ctx->source_rfc1001_name[i] = param->string[i];
1178 /* The string has 16th byte zero still from
1179 * set at top of the function
1181 if (i == RFC1001_NAME_LEN && param->string[i] != 0)
1182 pr_warn("netbiosname longer than 15 truncated\n");
1185 /* last byte, type, is 0x20 for servr type */
1186 memset(ctx->target_rfc1001_name, 0x20,
1187 RFC1001_NAME_LEN_WITH_NULL);
1189 * BB are there cases in which a comma can be valid in this
1190 * workstation netbios name (and need special handling)?
1193 /* user or mount helper must uppercase the netbios name */
1194 for (i = 0; i < 15; i++) {
1195 if (param->string[i] == 0)
1197 ctx->target_rfc1001_name[i] = param->string[i];
1200 /* The string has 16th byte zero still from set at top of function */
1201 if (i == RFC1001_NAME_LEN && param->string[i] != 0)
1202 pr_warn("server netbiosname longer than 15 truncated\n");
1205 /* version of mount userspace tools, not dialect */
1206 /* If interface changes in mount.cifs bump to new ver */
1207 if (strncasecmp(param->string, "1", 1) == 0) {
1208 if (strlen(param->string) > 1) {
1209 pr_warn("Bad mount helper ver=%s. Did you want SMB1 (CIFS) dialect and mean to type vers=1.0 instead?\n",
1211 goto cifs_parse_mount_err;
1213 /* This is the default */
1216 /* For all other value, error */
1217 pr_warn("Invalid mount helper version specified\n");
1218 goto cifs_parse_mount_err;
1220 /* protocol version (dialect) */
1221 if (cifs_parse_smb_version(fc, param->string, ctx, is_smb3) != 0)
1222 goto cifs_parse_mount_err;
1223 ctx->got_version = true;
1226 if (cifs_parse_security_flavors(fc, param->string, ctx) != 0)
1227 goto cifs_parse_mount_err;
1230 if (cifs_parse_cache_flavor(fc, param->string, ctx) != 0)
1231 goto cifs_parse_mount_err;
1234 #ifndef CONFIG_CIFS_SWN_UPCALL
1235 cifs_errorf(fc, "Witness support needs CONFIG_CIFS_SWN_UPCALL config option\n");
1236 goto cifs_parse_mount_err;
1238 ctx->witness = true;
1239 pr_warn_once("Witness protocol support is experimental\n");
1242 #ifndef CONFIG_CIFS_ROOT
1243 cifs_dbg(VFS, "rootfs support requires CONFIG_CIFS_ROOT config option\n");
1244 goto cifs_parse_mount_err;
1248 case Opt_posixpaths:
1250 ctx->posix_paths = 0;
1252 ctx->posix_paths = 1;
1255 if (result.negated) {
1256 if (ctx->linux_ext == 1)
1257 pr_warn_once("conflicting posix mount options specified\n");
1259 ctx->no_linux_ext = 1;
1261 if (ctx->no_linux_ext == 1)
1262 pr_warn_once("conflicting posix mount options specified\n");
1264 ctx->no_linux_ext = 0;
1271 if (result.negated) {
1273 * turn off mandatory locking in mode
1274 * if remote locking is turned off since the
1275 * local vfs will do advisory
1277 if (ctx->file_mode ==
1278 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1279 ctx->file_mode = S_IALLUGO;
1284 case Opt_handlecache:
1286 ctx->nohandlecache = 1;
1288 ctx->nohandlecache = 0;
1290 case Opt_forcemandatorylock:
1294 ctx->setuids = result.negated;
1297 ctx->intr = !result.negated;
1299 case Opt_setuidfromacl:
1300 ctx->setuidfromacl = 1;
1302 case Opt_strictsync:
1303 ctx->nostrictsync = result.negated;
1306 ctx->server_ino = !result.negated;
1308 case Opt_rwpidforward:
1309 ctx->rwpidforward = 1;
1315 ctx->cifs_acl = !result.negated;
1318 ctx->no_psx_acl = result.negated;
1320 case Opt_locallease:
1321 ctx->local_lease = 1;
1326 case Opt_ignore_signature:
1328 ctx->ignore_signature = true;
1331 /* we do not do the following in secFlags because seal
1332 * is a per tree connection (mount) not a per socket
1333 * or per-smb connection option in the protocol
1334 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1339 pr_warn("Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1342 #ifndef CONFIG_CIFS_FSCACHE
1343 cifs_errorf(fc, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1344 goto cifs_parse_mount_err;
1348 case Opt_mfsymlinks:
1349 ctx->mfsymlinks = true;
1352 ctx->multiuser = true;
1357 case Opt_nosharesock:
1358 ctx->nosharesock = true;
1360 case Opt_persistent:
1361 if (result.negated) {
1362 ctx->nopersistent = true;
1363 if (ctx->persistent) {
1364 cifs_errorf(fc, "persistenthandles mount options conflict\n");
1365 goto cifs_parse_mount_err;
1368 ctx->persistent = true;
1369 if ((ctx->nopersistent) || (ctx->resilient)) {
1370 cifs_errorf(fc, "persistenthandles mount options conflict\n");
1371 goto cifs_parse_mount_err;
1376 if (result.negated) {
1377 ctx->resilient = false; /* already the default */
1379 ctx->resilient = true;
1380 if (ctx->persistent) {
1381 cifs_errorf(fc, "persistenthandles mount options conflict\n");
1382 goto cifs_parse_mount_err;
1386 case Opt_domainauto:
1387 ctx->domainauto = true;
1393 /* case Opt_ignore: - is ignored as expected ... */
1397 cifs_parse_mount_err:
1401 int smb3_init_fs_context(struct fs_context *fc)
1403 struct smb3_fs_context *ctx;
1404 char *nodename = utsname()->nodename;
1407 ctx = kzalloc(sizeof(struct smb3_fs_context), GFP_KERNEL);
1412 * does not have to be perfect mapping since field is
1413 * informational, only used for servers that do not support
1414 * port 445 and it can be overridden at mount time
1416 memset(ctx->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1417 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1418 ctx->source_rfc1001_name[i] = toupper(nodename[i]);
1420 ctx->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1422 * null target name indicates to use *SMBSERVR default called name
1423 * if we end up sending RFC1001 session initialize
1425 ctx->target_rfc1001_name[0] = 0;
1426 ctx->cred_uid = current_uid();
1427 ctx->linux_uid = current_uid();
1428 ctx->linux_gid = current_gid();
1429 /* By default 4MB read ahead size, 1MB block size */
1430 ctx->bsize = CIFS_DEFAULT_IOSIZE; /* can improve cp performance significantly */
1431 ctx->rasize = 0; /* 0 = use default (ie negotiated rsize) for read ahead pages */
1434 * default to SFM style remapping of seven reserved characters
1435 * unless user overrides it or we negotiate CIFS POSIX where
1436 * it is unnecessary. Can not simultaneously use more than one mapping
1437 * since then readdir could list files that open could not open
1441 /* default to only allowing write access to owner of the mount */
1442 ctx->dir_mode = ctx->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1444 /* ctx->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1445 /* default is always to request posix paths. */
1446 ctx->posix_paths = 1;
1447 /* default to using server inode numbers where available */
1448 ctx->server_ino = 1;
1450 /* default is to use strict cifs caching semantics */
1451 ctx->strict_io = true;
1453 ctx->acregmax = CIFS_DEF_ACTIMEO;
1454 ctx->acdirmax = CIFS_DEF_ACTIMEO;
1456 /* Most clients set timeout to 0, allows server to use its default */
1457 ctx->handle_timeout = 0; /* See MS-SMB2 spec section 2.2.14.2.12 */
1459 /* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1460 ctx->ops = &smb30_operations;
1461 ctx->vals = &smbdefault_values;
1463 ctx->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1465 /* default to no multichannel (single server connection) */
1466 ctx->multichannel = false;
1467 ctx->max_channels = 1;
1469 ctx->backupuid_specified = false; /* no backup intent for a user */
1470 ctx->backupgid_specified = false; /* no backup intent for a group */
1473 * short int override_uid = -1;
1474 * short int override_gid = -1;
1475 * char *nodename = strdup(utsname()->nodename);
1476 * struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1479 fc->fs_private = ctx;
1480 fc->ops = &smb3_fs_context_ops;
1485 smb3_cleanup_fs_context_contents(struct smb3_fs_context *ctx)
1491 * Make sure this stays in sync with smb3_fs_context_dup()
1493 kfree(ctx->mount_options);
1494 ctx->mount_options = NULL;
1495 kfree(ctx->username);
1496 ctx->username = NULL;
1497 kfree_sensitive(ctx->password);
1498 ctx->password = NULL;
1503 kfree(ctx->domainname);
1504 ctx->domainname = NULL;
1505 kfree(ctx->nodename);
1506 ctx->nodename = NULL;
1507 kfree(ctx->iocharset);
1508 ctx->iocharset = NULL;
1509 kfree(ctx->prepath);
1510 ctx->prepath = NULL;
1514 smb3_cleanup_fs_context(struct smb3_fs_context *ctx)
1518 smb3_cleanup_fs_context_contents(ctx);
1522 void smb3_update_mnt_flags(struct cifs_sb_info *cifs_sb)
1524 struct smb3_fs_context *ctx = cifs_sb->ctx;
1527 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_DFS;
1529 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NO_DFS;
1532 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
1534 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NO_PERM;
1537 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
1539 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_SET_UID;
1541 if (ctx->setuidfromacl)
1542 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
1544 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_UID_FROM_ACL;
1546 if (ctx->server_ino)
1547 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
1549 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_SERVER_INUM;
1552 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
1554 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_MAP_SFM_CHR;
1557 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
1559 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_MAP_SPECIAL_CHR;
1562 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
1564 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NO_XATTR;
1567 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
1569 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_UNX_EMUL;
1572 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
1574 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NO_BRL;
1576 if (ctx->nohandlecache)
1577 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_HANDLE_CACHE;
1579 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NO_HANDLE_CACHE;
1581 if (ctx->nostrictsync)
1582 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
1584 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NOSSYNC;
1587 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
1589 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NOPOSIXBRL;
1591 if (ctx->rwpidforward)
1592 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
1594 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_RWPIDFORWARD;
1597 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MODE_FROM_SID;
1599 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_MODE_FROM_SID;
1602 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
1604 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_CIFS_ACL;
1606 if (ctx->backupuid_specified)
1607 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
1609 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_CIFS_BACKUPUID;
1611 if (ctx->backupgid_specified)
1612 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
1614 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_CIFS_BACKUPGID;
1616 if (ctx->override_uid)
1617 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
1619 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_OVERR_UID;
1621 if (ctx->override_gid)
1622 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
1624 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_OVERR_GID;
1627 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
1629 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_DYNPERM;
1632 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
1634 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_FSCACHE;
1637 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
1638 CIFS_MOUNT_NO_PERM);
1640 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_MULTIUSER;
1644 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
1646 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_STRICT_IO;
1649 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
1651 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_DIRECT_IO;
1653 if (ctx->mfsymlinks)
1654 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
1656 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_MF_SYMLINKS;
1657 if (ctx->mfsymlinks) {
1658 if (ctx->sfu_emul) {
1660 * Our SFU ("Services for Unix" emulation does not allow
1661 * creating symlinks but does allow reading existing SFU
1662 * symlinks (it does allow both creating and reading SFU
1663 * style mknod and FIFOs though). When "mfsymlinks" and
1664 * "sfu" are both enabled at the same time, it allows
1665 * reading both types of symlinks, but will only create
1666 * them with mfsymlinks format. This allows better
1667 * Apple compatibility (probably better for Samba too)
1668 * while still recognizing old Windows style symlinks.
1670 cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
1673 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_SHUTDOWN;