Linux 6.9-rc1
[linux-2.6-microblaze.git] / fs / cifs / fs_context.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 /*
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"
18 #endif
19 */
20
21 #include <linux/ctype.h>
22 #include <linux/fs_context.h>
23 #include <linux/fs_parser.h>
24 #include <linux/fs.h>
25 #include <linux/mount.h>
26 #include <linux/parser.h>
27 #include <linux/utsname.h>
28 #include "cifsfs.h"
29 #include "cifspdu.h"
30 #include "cifsglob.h"
31 #include "cifsproto.h"
32 #include "cifs_unicode.h"
33 #include "cifs_debug.h"
34 #include "cifs_fs_sb.h"
35 #include "ntlmssp.h"
36 #include "nterr.h"
37 #include "rfc1002pdu.h"
38 #include "fs_context.h"
39
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 }
52 };
53
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" },
64
65         { Opt_sec_err, NULL }
66 };
67
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),
126
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),
151
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),
170
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),
183         /*
184          * UNC and prefixpath is now extracted from Opt_source
185          * in the new mount API so we can just ignore them going forward.
186          */
187         fsparam_string("unc", Opt_ignore),
188         fsparam_string("prefixpath", Opt_ignore),
189         {}
190 };
191
192 static int
193 cifs_parse_security_flavors(struct fs_context *fc, char *value, struct smb3_fs_context *ctx)
194 {
195
196         substring_t args[MAX_OPT_ARGS];
197
198         /*
199          * With mount options, the last one should win. Reset any existing
200          * settings back to default.
201          */
202         ctx->sectype = Unspecified;
203         ctx->sign = false;
204
205         switch (match_token(value, cifs_secflavor_tokens, args)) {
206         case Opt_sec_krb5p:
207                 cifs_errorf(fc, "sec=krb5p is not supported!\n");
208                 return 1;
209         case Opt_sec_krb5i:
210                 ctx->sign = true;
211                 fallthrough;
212         case Opt_sec_krb5:
213                 ctx->sectype = Kerberos;
214                 break;
215         case Opt_sec_ntlmsspi:
216                 ctx->sign = true;
217                 fallthrough;
218         case Opt_sec_ntlmssp:
219                 ctx->sectype = RawNTLMSSP;
220                 break;
221         case Opt_sec_ntlmv2i:
222                 ctx->sign = true;
223                 fallthrough;
224         case Opt_sec_ntlmv2:
225                 ctx->sectype = NTLMv2;
226                 break;
227         case Opt_sec_none:
228                 ctx->nullauth = 1;
229                 break;
230         default:
231                 cifs_errorf(fc, "bad security option: %s\n", value);
232                 return 1;
233         }
234
235         return 0;
236 }
237
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 }
245 };
246
247 static int
248 cifs_parse_cache_flavor(struct fs_context *fc, char *value, struct smb3_fs_context *ctx)
249 {
250         substring_t args[MAX_OPT_ARGS];
251
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;
258                 break;
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;
264                 break;
265         case Opt_cache_none:
266                 ctx->direct_io = true;
267                 ctx->strict_io = false;
268                 ctx->cache_ro = false;
269                 ctx->cache_rw = false;
270                 break;
271         case Opt_cache_ro:
272                 ctx->direct_io = false;
273                 ctx->strict_io = false;
274                 ctx->cache_ro = true;
275                 ctx->cache_rw = false;
276                 break;
277         case Opt_cache_rw:
278                 ctx->direct_io = false;
279                 ctx->strict_io = false;
280                 ctx->cache_ro = false;
281                 ctx->cache_rw = true;
282                 break;
283         default:
284                 cifs_errorf(fc, "bad cache= option: %s\n", value);
285                 return 1;
286         }
287         return 0;
288 }
289
290 #define DUP_CTX_STR(field)                                              \
291 do {                                                                    \
292         if (ctx->field) {                                               \
293                 new_ctx->field = kstrdup(ctx->field, GFP_ATOMIC);       \
294                 if (new_ctx->field == NULL) {                           \
295                         smb3_cleanup_fs_context_contents(new_ctx);      \
296                         return -ENOMEM;                                 \
297                 }                                                       \
298         }                                                               \
299 } while (0)
300
301 int
302 smb3_fs_context_dup(struct smb3_fs_context *new_ctx, struct smb3_fs_context *ctx)
303 {
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;
311         new_ctx->UNC = NULL;
312         new_ctx->source = NULL;
313         new_ctx->iocharset = NULL;
314         /*
315          * Make sure to stay in sync with smb3_cleanup_fs_context_contents()
316          */
317         DUP_CTX_STR(prepath);
318         DUP_CTX_STR(mount_options);
319         DUP_CTX_STR(username);
320         DUP_CTX_STR(password);
321         DUP_CTX_STR(UNC);
322         DUP_CTX_STR(source);
323         DUP_CTX_STR(domainname);
324         DUP_CTX_STR(nodename);
325         DUP_CTX_STR(iocharset);
326
327         return 0;
328 }
329
330 static int
331 cifs_parse_smb_version(struct fs_context *fc, char *value, struct smb3_fs_context *ctx, bool is_smb3)
332 {
333         substring_t args[MAX_OPT_ARGS];
334
335         switch (match_token(value, cifs_smb_version_tokens, args)) {
336 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
337         case Smb_1:
338                 if (disable_legacy_dialects) {
339                         cifs_errorf(fc, "mount with legacy dialect disabled\n");
340                         return 1;
341                 }
342                 if (is_smb3) {
343                         cifs_errorf(fc, "vers=1.0 (cifs) not permitted when mounting with smb3\n");
344                         return 1;
345                 }
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;
349                 break;
350         case Smb_20:
351                 if (disable_legacy_dialects) {
352                         cifs_errorf(fc, "mount with legacy dialect disabled\n");
353                         return 1;
354                 }
355                 if (is_smb3) {
356                         cifs_errorf(fc, "vers=2.0 not permitted when mounting with smb3\n");
357                         return 1;
358                 }
359                 ctx->ops = &smb20_operations;
360                 ctx->vals = &smb20_values;
361                 break;
362 #else
363         case Smb_1:
364                 cifs_errorf(fc, "vers=1.0 (cifs) mount not permitted when legacy dialects disabled\n");
365                 return 1;
366         case Smb_20:
367                 cifs_errorf(fc, "vers=2.0 mount not permitted when legacy dialects disabled\n");
368                 return 1;
369 #endif /* CIFS_ALLOW_INSECURE_LEGACY */
370         case Smb_21:
371                 ctx->ops = &smb21_operations;
372                 ctx->vals = &smb21_values;
373                 break;
374         case Smb_30:
375                 ctx->ops = &smb30_operations;
376                 ctx->vals = &smb30_values;
377                 break;
378         case Smb_302:
379                 ctx->ops = &smb30_operations; /* currently identical with 3.0 */
380                 ctx->vals = &smb302_values;
381                 break;
382         case Smb_311:
383                 ctx->ops = &smb311_operations;
384                 ctx->vals = &smb311_values;
385                 break;
386         case Smb_3any:
387                 ctx->ops = &smb30_operations; /* currently identical with 3.0 */
388                 ctx->vals = &smb3any_values;
389                 break;
390         case Smb_default:
391                 ctx->ops = &smb30_operations;
392                 ctx->vals = &smbdefault_values;
393                 break;
394         default:
395                 cifs_errorf(fc, "Unknown vers= option specified: %s\n", value);
396                 return 1;
397         }
398         return 0;
399 }
400
401 int smb3_parse_opt(const char *options, const char *key, char **val)
402 {
403         int rc = -ENOENT;
404         char *opts, *orig, *p;
405
406         orig = opts = kstrdup(options, GFP_KERNEL);
407         if (!opts)
408                 return -ENOMEM;
409
410         while ((p = strsep(&opts, ","))) {
411                 char *nval;
412
413                 if (!*p)
414                         continue;
415                 if (strncasecmp(p, key, strlen(key)))
416                         continue;
417                 nval = strchr(p, '=');
418                 if (nval) {
419                         if (nval == p)
420                                 continue;
421                         *nval++ = 0;
422                         *val = kstrdup(nval, GFP_KERNEL);
423                         rc = !*val ? -ENOMEM : 0;
424                         goto out;
425                 }
426         }
427 out:
428         kfree(orig);
429         return rc;
430 }
431
432 /*
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)
436  */
437 int
438 smb3_parse_devname(const char *devname, struct smb3_fs_context *ctx)
439 {
440         char *pos;
441         const char *delims = "/\\";
442         size_t len;
443
444         if (unlikely(!devname || !*devname)) {
445                 cifs_dbg(VFS, "Device name not specified\n");
446                 return -EINVAL;
447         }
448
449         /* make sure we have a valid UNC double delimiter prefix */
450         len = strspn(devname, delims);
451         if (len != 2)
452                 return -EINVAL;
453
454         /* find delimiter between host and sharename */
455         pos = strpbrk(devname + 2, delims);
456         if (!pos)
457                 return -EINVAL;
458
459         /* skip past delimiter */
460         ++pos;
461
462         /* now go until next delimiter or end of string */
463         len = strcspn(pos, delims);
464
465         /* move "pos" up to delimiter or NULL */
466         pos += len;
467         kfree(ctx->UNC);
468         ctx->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
469         if (!ctx->UNC)
470                 return -ENOMEM;
471
472         convert_delimiter(ctx->UNC, '\\');
473
474         /* skip any delimiter */
475         if (*pos == '/' || *pos == '\\')
476                 pos++;
477
478         kfree(ctx->prepath);
479         ctx->prepath = NULL;
480
481         /* If pos is NULL then no prepath */
482         if (!*pos)
483                 return 0;
484
485         ctx->prepath = kstrdup(pos, GFP_KERNEL);
486         if (!ctx->prepath)
487                 return -ENOMEM;
488
489         return 0;
490 }
491
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,
496                                             void *data);
497 static int smb3_get_tree(struct fs_context *fc);
498 static int smb3_reconfigure(struct fs_context *fc);
499
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,
506 };
507
508 /*
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
513  *
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.
516  *
517  * Returns 0 on success or the error returned by the ->parse_option() fs_context
518  * operation on failure.
519  */
520 static int smb3_fs_context_parse_monolithic(struct fs_context *fc,
521                                            void *data)
522 {
523         struct smb3_fs_context *ctx = smb3_fc2context(fc);
524         char *options = data, *key;
525         int ret = 0;
526
527         if (!options)
528                 return 0;
529
530         ctx->mount_options = kstrdup(data, GFP_KERNEL);
531         if (ctx->mount_options == NULL)
532                 return -ENOMEM;
533
534         ret = security_sb_eat_lsm_opts(options, &fc->security);
535         if (ret)
536                 return ret;
537
538         /* BB Need to add support for sep= here TBD */
539         while ((key = strsep(&options, ",")) != NULL) {
540                 size_t len;
541                 char *value;
542
543                 if (*key == 0)
544                         break;
545
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
549                  */
550                 while (options && options[0] == ',') {
551                         len = strlen(key);
552                         strcpy(key + len, options);
553                         options = strchr(options, ',');
554                         if (options)
555                                 *options++ = 0;
556                 }
557
558
559                 len = 0;
560                 value = strchr(key, '=');
561                 if (value) {
562                         if (value == key)
563                                 continue;
564                         *value++ = 0;
565                         len = strlen(value);
566                 }
567
568                 ret = vfs_parse_fs_string(fc, key, value, len);
569                 if (ret < 0)
570                         break;
571         }
572
573         return ret;
574 }
575
576 /*
577  * Validate the preparsed information in the config.
578  */
579 static int smb3_fs_context_validate(struct fs_context *fc)
580 {
581         struct smb3_fs_context *ctx = smb3_fc2context(fc);
582
583         if (ctx->rdma && ctx->vals->protocol_id < SMB30_PROT_ID) {
584                 cifs_errorf(fc, "SMB Direct requires Version >=3.0\n");
585                 return -EOPNOTSUPP;
586         }
587
588 #ifndef CONFIG_KEYS
589         /* Muliuser mounts require CONFIG_KEYS support */
590         if (ctx->multiuser) {
591                 cifs_errorf(fc, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
592                 return -1;
593         }
594 #endif
595
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");
598
599
600         if (!ctx->UNC) {
601                 cifs_errorf(fc, "CIFS mount error: No usable UNC path provided in device string!\n");
602                 return -1;
603         }
604
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");
608                 return -ENOENT;
609         }
610
611         if (!ctx->got_ip) {
612                 int len;
613                 const char *slash;
614
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;
623                 }
624         }
625
626         /* set the port that we got earlier */
627         cifs_set_port((struct sockaddr *)&ctx->dstaddr, ctx->port);
628
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");
632         }
633
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");
637         }
638
639         return 0;
640 }
641
642 static int smb3_get_tree_common(struct fs_context *fc)
643 {
644         struct smb3_fs_context *ctx = smb3_fc2context(fc);
645         struct dentry *root;
646         int rc = 0;
647
648         root = cifs_smb3_do_mount(fc->fs_type, 0, ctx);
649         if (IS_ERR(root))
650                 return PTR_ERR(root);
651
652         fc->root = root;
653
654         return rc;
655 }
656
657 /*
658  * Create an SMB3 superblock from the parameters passed.
659  */
660 static int smb3_get_tree(struct fs_context *fc)
661 {
662         int err = smb3_fs_context_validate(fc);
663
664         if (err)
665                 return err;
666         return smb3_get_tree_common(fc);
667 }
668
669 static void smb3_fs_context_free(struct fs_context *fc)
670 {
671         struct smb3_fs_context *ctx = smb3_fc2context(fc);
672
673         smb3_cleanup_fs_context(ctx);
674 }
675
676 /*
677  * Compare the old and new proposed context during reconfigure
678  * and check if the changes are compatible.
679  */
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)
683 {
684         if (new_ctx->posix_paths != old_ctx->posix_paths) {
685                 cifs_errorf(fc, "can not change posixpaths during remount\n");
686                 return -EINVAL;
687         }
688         if (new_ctx->sectype != old_ctx->sectype) {
689                 cifs_errorf(fc, "can not change sec during remount\n");
690                 return -EINVAL;
691         }
692         if (new_ctx->multiuser != old_ctx->multiuser) {
693                 cifs_errorf(fc, "can not change multiuser during remount\n");
694                 return -EINVAL;
695         }
696         if (new_ctx->UNC &&
697             (!old_ctx->UNC || strcmp(new_ctx->UNC, old_ctx->UNC))) {
698                 cifs_errorf(fc, "can not change UNC during remount\n");
699                 return -EINVAL;
700         }
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");
704                 return -EINVAL;
705         }
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");
709                 return -EINVAL;
710         }
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");
714                 return -EINVAL;
715         }
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");
719                 return -EINVAL;
720         }
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");
724                 return -EINVAL;
725         }
726
727         return 0;
728 }
729
730 #define STEAL_STRING(cifs_sb, ctx, field)                               \
731 do {                                                                    \
732         kfree(ctx->field);                                              \
733         ctx->field = cifs_sb->ctx->field;                               \
734         cifs_sb->ctx->field = NULL;                                     \
735 } while (0)
736
737 static int smb3_reconfigure(struct fs_context *fc)
738 {
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);
742         int rc;
743
744         rc = smb3_verify_reconfigure_ctx(fc, ctx, cifs_sb->ctx);
745         if (rc)
746                 return rc;
747
748         /*
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.
752          */
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);
760
761         /* if rsize or wsize not passed in on remount, use previous values */
762         if (ctx->rsize == 0)
763                 ctx->rsize = cifs_sb->ctx->rsize;
764         if (ctx->wsize == 0)
765                 ctx->wsize = cifs_sb->ctx->wsize;
766
767
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
772         if (!rc)
773                 rc = dfs_cache_remount_fs(cifs_sb);
774 #endif
775
776         return rc;
777 }
778
779 static int smb3_fs_context_parse_param(struct fs_context *fc,
780                                       struct fs_parameter *param)
781 {
782         struct fs_parse_result result;
783         struct smb3_fs_context *ctx = smb3_fc2context(fc);
784         int i, opt;
785         bool is_smb3 = !strcmp(fc->fs_type->name, "smb3");
786         bool skip_parsing = false;
787         kuid_t uid;
788         kgid_t gid;
789
790         cifs_dbg(FYI, "CIFS: parsing cifs mount option '%s'\n", param->key);
791
792         /*
793          * fs_parse can not handle string options with an empty value so
794          * we will need special handling of them.
795          */
796         if (param->type == fs_value_is_string && param->string[0] == 0) {
797                 if (!strcmp("pass", param->key) || !strcmp("password", param->key)) {
798                         skip_parsing = true;
799                         opt = Opt_pass;
800                 } else if (!strcmp("user", param->key) || !strcmp("username", param->key)) {
801                         skip_parsing = true;
802                         opt = Opt_user;
803                 }
804         }
805
806         if (!skip_parsing) {
807                 opt = fs_parse(fc, smb3_fs_parameters, param, &result);
808                 if (opt < 0)
809                         return ctx->sloppy ? 1 : opt;
810         }
811
812         switch (opt) {
813         case Opt_compress:
814                 ctx->compression = UNKNOWN_TYPE;
815                 cifs_dbg(VFS,
816                         "SMB3 compression support is experimental\n");
817                 break;
818         case Opt_nodfs:
819                 ctx->nodfs = 1;
820                 break;
821         case Opt_hard:
822                 if (result.negated)
823                         ctx->retry = 0;
824                 else
825                         ctx->retry = 1;
826                 break;
827         case Opt_soft:
828                 if (result.negated)
829                         ctx->retry = 1;
830                 else
831                         ctx->retry = 0;
832                 break;
833         case Opt_mapposix:
834                 if (result.negated)
835                         ctx->remap = false;
836                 else {
837                         ctx->remap = true;
838                         ctx->sfu_remap = false; /* disable SFU mapping */
839                 }
840                 break;
841         case Opt_user_xattr:
842                 if (result.negated)
843                         ctx->no_xattr = 1;
844                 else
845                         ctx->no_xattr = 0;
846                 break;
847         case Opt_forceuid:
848                 if (result.negated)
849                         ctx->override_uid = 0;
850                 else
851                         ctx->override_uid = 1;
852                 break;
853         case Opt_forcegid:
854                 if (result.negated)
855                         ctx->override_gid = 0;
856                 else
857                         ctx->override_gid = 1;
858                 break;
859         case Opt_perm:
860                 if (result.negated)
861                         ctx->noperm = 1;
862                 else
863                         ctx->noperm = 0;
864                 break;
865         case Opt_dynperm:
866                 if (result.negated)
867                         ctx->dynperm = 0;
868                 else
869                         ctx->dynperm = 1;
870                 break;
871         case Opt_sfu:
872                 if (result.negated)
873                         ctx->sfu_emul = 0;
874                 else
875                         ctx->sfu_emul = 1;
876                 break;
877         case Opt_noblocksend:
878                 ctx->noblocksnd = 1;
879                 break;
880         case Opt_noautotune:
881                 ctx->noautotune = 1;
882                 break;
883         case Opt_nolease:
884                 ctx->no_lease = 1;
885                 break;
886         case Opt_nodelete:
887                 ctx->nodelete = 1;
888                 break;
889         case Opt_multichannel:
890                 if (result.negated) {
891                         ctx->multichannel = false;
892                         ctx->max_channels = 1;
893                 } else {
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;
898                 }
899                 break;
900         case Opt_uid:
901                 uid = make_kuid(current_user_ns(), result.uint_32);
902                 if (!uid_valid(uid))
903                         goto cifs_parse_mount_err;
904                 ctx->linux_uid = uid;
905                 ctx->uid_specified = true;
906                 break;
907         case Opt_cruid:
908                 uid = make_kuid(current_user_ns(), result.uint_32);
909                 if (!uid_valid(uid))
910                         goto cifs_parse_mount_err;
911                 ctx->cred_uid = uid;
912                 ctx->cruid_specified = true;
913                 break;
914         case Opt_backupuid:
915                 uid = make_kuid(current_user_ns(), result.uint_32);
916                 if (!uid_valid(uid))
917                         goto cifs_parse_mount_err;
918                 ctx->backupuid = uid;
919                 ctx->backupuid_specified = true;
920                 break;
921         case Opt_backupgid:
922                 gid = make_kgid(current_user_ns(), result.uint_32);
923                 if (!gid_valid(gid))
924                         goto cifs_parse_mount_err;
925                 ctx->backupgid = gid;
926                 ctx->backupgid_specified = true;
927                 break;
928         case Opt_gid:
929                 gid = make_kgid(current_user_ns(), result.uint_32);
930                 if (!gid_valid(gid))
931                         goto cifs_parse_mount_err;
932                 ctx->linux_gid = gid;
933                 ctx->gid_specified = true;
934                 break;
935         case Opt_port:
936                 ctx->port = result.uint_32;
937                 break;
938         case Opt_file_mode:
939                 ctx->file_mode = result.uint_32;
940                 break;
941         case Opt_dirmode:
942                 ctx->dir_mode = result.uint_32;
943                 break;
944         case Opt_min_enc_offload:
945                 ctx->min_offload = result.uint_32;
946                 break;
947         case Opt_blocksize:
948                 /*
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
953                  */
954                 if ((result.uint_32 < CIFS_MAX_MSGSIZE) ||
955                    (result.uint_32 > (4 * SMB3_DEFAULT_IOSIZE))) {
956                         cifs_errorf(fc, "%s: Invalid blocksize\n",
957                                 __func__);
958                         goto cifs_parse_mount_err;
959                 }
960                 ctx->bsize = result.uint_32;
961                 ctx->got_bsize = true;
962                 break;
963         case Opt_rasize:
964                 /*
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
974                  */
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;
980                 }
981                 ctx->rasize = result.uint_32;
982                 break;
983         case Opt_rsize:
984                 ctx->rsize = result.uint_32;
985                 ctx->got_rsize = true;
986                 break;
987         case Opt_wsize:
988                 ctx->wsize = result.uint_32;
989                 ctx->got_wsize = true;
990                 break;
991         case Opt_acregmax:
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;
996                 }
997                 break;
998         case Opt_acdirmax:
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;
1003                 }
1004                 break;
1005         case Opt_actimeo:
1006                 if (HZ * result.uint_32 > CIFS_MAX_ACTIMEO) {
1007                         cifs_errorf(fc, "timeout too large\n");
1008                         goto cifs_parse_mount_err;
1009                 }
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");
1013                         break;
1014                 }
1015                 ctx->acdirmax = ctx->acregmax = HZ * result.uint_32;
1016                 break;
1017         case Opt_echo_interval:
1018                 ctx->echo_interval = result.uint_32;
1019                 break;
1020         case Opt_snapshot:
1021                 ctx->snapshot_time = result.uint_32;
1022                 break;
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",
1026                                  __func__);
1027                         goto cifs_parse_mount_err;
1028                 }
1029                 ctx->max_credits = result.uint_32;
1030                 break;
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;
1036                 }
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;
1041                 break;
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;
1047                 }
1048                 break;
1049         case Opt_source:
1050                 kfree(ctx->UNC);
1051                 ctx->UNC = NULL;
1052                 switch (smb3_parse_devname(param->string, ctx)) {
1053                 case 0:
1054                         break;
1055                 case -ENOMEM:
1056                         cifs_errorf(fc, "Unable to allocate memory for devname\n");
1057                         goto cifs_parse_mount_err;
1058                 case -EINVAL:
1059                         cifs_errorf(fc, "Malformed UNC in devname\n");
1060                         goto cifs_parse_mount_err;
1061                 default:
1062                         cifs_errorf(fc, "Unknown error parsing devname\n");
1063                         goto cifs_parse_mount_err;
1064                 }
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;
1069                 }
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;
1074                 }
1075                 break;
1076         case Opt_user:
1077                 kfree(ctx->username);
1078                 ctx->username = NULL;
1079                 if (strlen(param->string) == 0) {
1080                         /* null user, ie. anonymous authentication */
1081                         ctx->nullauth = 1;
1082                         break;
1083                 }
1084
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;
1089                 }
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;
1094                 }
1095                 break;
1096         case Opt_pass:
1097                 kfree(ctx->password);
1098                 ctx->password = NULL;
1099                 if (strlen(param->string) == 0)
1100                         break;
1101
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;
1106                 }
1107                 break;
1108         case Opt_ip:
1109                 if (strlen(param->string) == 0) {
1110                         ctx->got_ip = false;
1111                         break;
1112                 }
1113                 if (!cifs_convert_address((struct sockaddr *)&ctx->dstaddr,
1114                                           param->string,
1115                                           strlen(param->string))) {
1116                         pr_err("bad ip= option (%s)\n", param->string);
1117                         goto cifs_parse_mount_err;
1118                 }
1119                 ctx->got_ip = true;
1120                 break;
1121         case Opt_domain:
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;
1126                 }
1127
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;
1133                 }
1134                 cifs_dbg(FYI, "Domain name set\n");
1135                 break;
1136         case Opt_srcaddr:
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",
1141                                 param->string);
1142                         goto cifs_parse_mount_err;
1143                 }
1144                 break;
1145         case Opt_iocharset:
1146                 if (strnlen(param->string, 1024) >= 65) {
1147                         pr_warn("iocharset name too long\n");
1148                         goto cifs_parse_mount_err;
1149                 }
1150
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;
1157                         }
1158                 }
1159                 /* if iocharset not set then load_nls_default
1160                  * is used by caller
1161                  */
1162                 cifs_dbg(FYI, "iocharset set to %s\n", ctx->iocharset);
1163                 break;
1164         case Opt_netbiosname:
1165                 memset(ctx->source_rfc1001_name, 0x20,
1166                         RFC1001_NAME_LEN);
1167                 /*
1168                  * FIXME: are there cases in which a comma can
1169                  * be valid in workstation netbios name (and
1170                  * need special handling)?
1171                  */
1172                 for (i = 0; i < RFC1001_NAME_LEN; i++) {
1173                         /* don't ucase netbiosname for user */
1174                         if (param->string[i] == 0)
1175                                 break;
1176                         ctx->source_rfc1001_name[i] = param->string[i];
1177                 }
1178                 /* The string has 16th byte zero still from
1179                  * set at top of the function
1180                  */
1181                 if (i == RFC1001_NAME_LEN && param->string[i] != 0)
1182                         pr_warn("netbiosname longer than 15 truncated\n");
1183                 break;
1184         case Opt_servern:
1185                 /* last byte, type, is 0x20 for servr type */
1186                 memset(ctx->target_rfc1001_name, 0x20,
1187                         RFC1001_NAME_LEN_WITH_NULL);
1188                 /*
1189                  * BB are there cases in which a comma can be valid in this
1190                  * workstation netbios name (and need special handling)?
1191                  */
1192
1193                 /* user or mount helper must uppercase the netbios name */
1194                 for (i = 0; i < 15; i++) {
1195                         if (param->string[i] == 0)
1196                                 break;
1197                         ctx->target_rfc1001_name[i] = param->string[i];
1198                 }
1199
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");
1203                 break;
1204         case Opt_ver:
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",
1210                                         param->string);
1211                                 goto cifs_parse_mount_err;
1212                         }
1213                         /* This is the default */
1214                         break;
1215                 }
1216                 /* For all other value, error */
1217                 pr_warn("Invalid mount helper version specified\n");
1218                 goto cifs_parse_mount_err;
1219         case Opt_vers:
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;
1224                 break;
1225         case Opt_sec:
1226                 if (cifs_parse_security_flavors(fc, param->string, ctx) != 0)
1227                         goto cifs_parse_mount_err;
1228                 break;
1229         case Opt_cache:
1230                 if (cifs_parse_cache_flavor(fc, param->string, ctx) != 0)
1231                         goto cifs_parse_mount_err;
1232                 break;
1233         case Opt_witness:
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;
1237 #endif
1238                 ctx->witness = true;
1239                 pr_warn_once("Witness protocol support is experimental\n");
1240                 break;
1241         case Opt_rootfs:
1242 #ifndef CONFIG_CIFS_ROOT
1243                 cifs_dbg(VFS, "rootfs support requires CONFIG_CIFS_ROOT config option\n");
1244                 goto cifs_parse_mount_err;
1245 #endif
1246                 ctx->rootfs = true;
1247                 break;
1248         case Opt_posixpaths:
1249                 if (result.negated)
1250                         ctx->posix_paths = 0;
1251                 else
1252                         ctx->posix_paths = 1;
1253                 break;
1254         case Opt_unix:
1255                 if (result.negated) {
1256                         if (ctx->linux_ext == 1)
1257                                 pr_warn_once("conflicting posix mount options specified\n");
1258                         ctx->linux_ext = 0;
1259                         ctx->no_linux_ext = 1;
1260                 } else {
1261                         if (ctx->no_linux_ext == 1)
1262                                 pr_warn_once("conflicting posix mount options specified\n");
1263                         ctx->linux_ext = 1;
1264                         ctx->no_linux_ext = 0;
1265                 }
1266                 break;
1267         case Opt_nocase:
1268                 ctx->nocase = 1;
1269                 break;
1270         case Opt_brl:
1271                 if (result.negated) {
1272                         /*
1273                          * turn off mandatory locking in mode
1274                          * if remote locking is turned off since the
1275                          * local vfs will do advisory
1276                          */
1277                         if (ctx->file_mode ==
1278                                 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1279                                 ctx->file_mode = S_IALLUGO;
1280                         ctx->nobrl =  1;
1281                 } else
1282                         ctx->nobrl =  0;
1283                 break;
1284         case Opt_handlecache:
1285                 if (result.negated)
1286                         ctx->nohandlecache = 1;
1287                 else
1288                         ctx->nohandlecache = 0;
1289                 break;
1290         case Opt_forcemandatorylock:
1291                 ctx->mand_lock = 1;
1292                 break;
1293         case Opt_setuids:
1294                 ctx->setuids = result.negated;
1295                 break;
1296         case Opt_intr:
1297                 ctx->intr = !result.negated;
1298                 break;
1299         case Opt_setuidfromacl:
1300                 ctx->setuidfromacl = 1;
1301                 break;
1302         case Opt_strictsync:
1303                 ctx->nostrictsync = result.negated;
1304                 break;
1305         case Opt_serverino:
1306                 ctx->server_ino = !result.negated;
1307                 break;
1308         case Opt_rwpidforward:
1309                 ctx->rwpidforward = 1;
1310                 break;
1311         case Opt_modesid:
1312                 ctx->mode_ace = 1;
1313                 break;
1314         case Opt_cifsacl:
1315                 ctx->cifs_acl = !result.negated;
1316                 break;
1317         case Opt_acl:
1318                 ctx->no_psx_acl = result.negated;
1319                 break;
1320         case Opt_locallease:
1321                 ctx->local_lease = 1;
1322                 break;
1323         case Opt_sign:
1324                 ctx->sign = true;
1325                 break;
1326         case Opt_ignore_signature:
1327                 ctx->sign = true;
1328                 ctx->ignore_signature = true;
1329                 break;
1330         case Opt_seal:
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;
1335                  */
1336                 ctx->seal = 1;
1337                 break;
1338         case Opt_noac:
1339                 pr_warn("Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1340                 break;
1341         case Opt_fsc:
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;
1345 #endif
1346                 ctx->fsc = true;
1347                 break;
1348         case Opt_mfsymlinks:
1349                 ctx->mfsymlinks = true;
1350                 break;
1351         case Opt_multiuser:
1352                 ctx->multiuser = true;
1353                 break;
1354         case Opt_sloppy:
1355                 ctx->sloppy = true;
1356                 break;
1357         case Opt_nosharesock:
1358                 ctx->nosharesock = true;
1359                 break;
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;
1366                         }
1367                 } else {
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;
1372                         }
1373                 }
1374                 break;
1375         case Opt_resilient:
1376                 if (result.negated) {
1377                         ctx->resilient = false; /* already the default */
1378                 } else {
1379                         ctx->resilient = true;
1380                         if (ctx->persistent) {
1381                                 cifs_errorf(fc, "persistenthandles mount options conflict\n");
1382                                 goto cifs_parse_mount_err;
1383                         }
1384                 }
1385                 break;
1386         case Opt_domainauto:
1387                 ctx->domainauto = true;
1388                 break;
1389         case Opt_rdma:
1390                 ctx->rdma = true;
1391                 break;
1392         }
1393         /* case Opt_ignore: - is ignored as expected ... */
1394
1395         return 0;
1396
1397  cifs_parse_mount_err:
1398         return -EINVAL;
1399 }
1400
1401 int smb3_init_fs_context(struct fs_context *fc)
1402 {
1403         struct smb3_fs_context *ctx;
1404         char *nodename = utsname()->nodename;
1405         int i;
1406
1407         ctx = kzalloc(sizeof(struct smb3_fs_context), GFP_KERNEL);
1408         if (unlikely(!ctx))
1409                 return -ENOMEM;
1410
1411         /*
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
1415          */
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]);
1419
1420         ctx->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1421         /*
1422          * null target name indicates to use *SMBSERVR default called name
1423          *  if we end up sending RFC1001 session initialize
1424          */
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 */
1432
1433         /*
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
1438          */
1439         ctx->remap = true;
1440
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;
1443
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;
1449
1450         /* default is to use strict cifs caching semantics */
1451         ctx->strict_io = true;
1452
1453         ctx->acregmax = CIFS_DEF_ACTIMEO;
1454         ctx->acdirmax = CIFS_DEF_ACTIMEO;
1455
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 */
1458
1459         /* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1460         ctx->ops = &smb30_operations;
1461         ctx->vals = &smbdefault_values;
1462
1463         ctx->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1464
1465         /* default to no multichannel (single server connection) */
1466         ctx->multichannel = false;
1467         ctx->max_channels = 1;
1468
1469         ctx->backupuid_specified = false; /* no backup intent for a user */
1470         ctx->backupgid_specified = false; /* no backup intent for a group */
1471
1472 /*
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;
1477  */
1478
1479         fc->fs_private = ctx;
1480         fc->ops = &smb3_fs_context_ops;
1481         return 0;
1482 }
1483
1484 void
1485 smb3_cleanup_fs_context_contents(struct smb3_fs_context *ctx)
1486 {
1487         if (ctx == NULL)
1488                 return;
1489
1490         /*
1491          * Make sure this stays in sync with smb3_fs_context_dup()
1492          */
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;
1499         kfree(ctx->UNC);
1500         ctx->UNC = NULL;
1501         kfree(ctx->source);
1502         ctx->source = 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;
1511 }
1512
1513 void
1514 smb3_cleanup_fs_context(struct smb3_fs_context *ctx)
1515 {
1516         if (!ctx)
1517                 return;
1518         smb3_cleanup_fs_context_contents(ctx);
1519         kfree(ctx);
1520 }
1521
1522 void smb3_update_mnt_flags(struct cifs_sb_info *cifs_sb)
1523 {
1524         struct smb3_fs_context *ctx = cifs_sb->ctx;
1525
1526         if (ctx->nodfs)
1527                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_DFS;
1528         else
1529                 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NO_DFS;
1530
1531         if (ctx->noperm)
1532                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
1533         else
1534                 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NO_PERM;
1535
1536         if (ctx->setuids)
1537                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
1538         else
1539                 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_SET_UID;
1540
1541         if (ctx->setuidfromacl)
1542                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
1543         else
1544                 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_UID_FROM_ACL;
1545
1546         if (ctx->server_ino)
1547                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
1548         else
1549                 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_SERVER_INUM;
1550
1551         if (ctx->remap)
1552                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
1553         else
1554                 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_MAP_SFM_CHR;
1555
1556         if (ctx->sfu_remap)
1557                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
1558         else
1559                 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_MAP_SPECIAL_CHR;
1560
1561         if (ctx->no_xattr)
1562                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
1563         else
1564                 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NO_XATTR;
1565
1566         if (ctx->sfu_emul)
1567                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
1568         else
1569                 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_UNX_EMUL;
1570
1571         if (ctx->nobrl)
1572                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
1573         else
1574                 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NO_BRL;
1575
1576         if (ctx->nohandlecache)
1577                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_HANDLE_CACHE;
1578         else
1579                 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NO_HANDLE_CACHE;
1580
1581         if (ctx->nostrictsync)
1582                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
1583         else
1584                 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NOSSYNC;
1585
1586         if (ctx->mand_lock)
1587                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
1588         else
1589                 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NOPOSIXBRL;
1590
1591         if (ctx->rwpidforward)
1592                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
1593         else
1594                 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_RWPIDFORWARD;
1595
1596         if (ctx->mode_ace)
1597                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MODE_FROM_SID;
1598         else
1599                 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_MODE_FROM_SID;
1600
1601         if (ctx->cifs_acl)
1602                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
1603         else
1604                 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_CIFS_ACL;
1605
1606         if (ctx->backupuid_specified)
1607                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
1608         else
1609                 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_CIFS_BACKUPUID;
1610
1611         if (ctx->backupgid_specified)
1612                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
1613         else
1614                 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_CIFS_BACKUPGID;
1615
1616         if (ctx->override_uid)
1617                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
1618         else
1619                 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_OVERR_UID;
1620
1621         if (ctx->override_gid)
1622                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
1623         else
1624                 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_OVERR_GID;
1625
1626         if (ctx->dynperm)
1627                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
1628         else
1629                 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_DYNPERM;
1630
1631         if (ctx->fsc)
1632                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
1633         else
1634                 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_FSCACHE;
1635
1636         if (ctx->multiuser)
1637                 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
1638                                             CIFS_MOUNT_NO_PERM);
1639         else
1640                 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_MULTIUSER;
1641
1642
1643         if (ctx->strict_io)
1644                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
1645         else
1646                 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_STRICT_IO;
1647
1648         if (ctx->direct_io)
1649                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
1650         else
1651                 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_DIRECT_IO;
1652
1653         if (ctx->mfsymlinks)
1654                 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
1655         else
1656                 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_MF_SYMLINKS;
1657         if (ctx->mfsymlinks) {
1658                 if (ctx->sfu_emul) {
1659                         /*
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.
1669                          */
1670                         cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
1671                 }
1672         }
1673         cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_SHUTDOWN;
1674
1675         return;
1676 }