Linux Audio

Check our new training course

Loading...
v6.2
   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
  40static DEFINE_MUTEX(cifs_mount_mutex);
  41
  42static const match_table_t cifs_smb_version_tokens = {
  43	{ Smb_1, SMB1_VERSION_STRING },
  44	{ Smb_20, SMB20_VERSION_STRING},
  45	{ Smb_21, SMB21_VERSION_STRING },
  46	{ Smb_30, SMB30_VERSION_STRING },
  47	{ Smb_302, SMB302_VERSION_STRING },
  48	{ Smb_302, ALT_SMB302_VERSION_STRING },
  49	{ Smb_311, SMB311_VERSION_STRING },
  50	{ Smb_311, ALT_SMB311_VERSION_STRING },
  51	{ Smb_3any, SMB3ANY_VERSION_STRING },
  52	{ Smb_default, SMBDEFAULT_VERSION_STRING },
  53	{ Smb_version_err, NULL }
  54};
  55
  56static const match_table_t cifs_secflavor_tokens = {
  57	{ Opt_sec_krb5, "krb5" },
  58	{ Opt_sec_krb5i, "krb5i" },
  59	{ Opt_sec_krb5p, "krb5p" },
  60	{ Opt_sec_ntlmsspi, "ntlmsspi" },
  61	{ Opt_sec_ntlmssp, "ntlmssp" },
 
 
  62	{ Opt_sec_ntlmv2, "nontlm" },
  63	{ Opt_sec_ntlmv2, "ntlmv2" },
  64	{ Opt_sec_ntlmv2i, "ntlmv2i" },
 
  65	{ Opt_sec_none, "none" },
  66
  67	{ Opt_sec_err, NULL }
  68};
  69
  70const struct fs_parameter_spec smb3_fs_parameters[] = {
  71	/* Mount options that take no arguments */
  72	fsparam_flag_no("user_xattr", Opt_user_xattr),
  73	fsparam_flag_no("forceuid", Opt_forceuid),
  74	fsparam_flag_no("multichannel", Opt_multichannel),
  75	fsparam_flag_no("forcegid", Opt_forcegid),
  76	fsparam_flag("noblocksend", Opt_noblocksend),
  77	fsparam_flag("noautotune", Opt_noautotune),
  78	fsparam_flag("nolease", Opt_nolease),
  79	fsparam_flag_no("hard", Opt_hard),
  80	fsparam_flag_no("soft", Opt_soft),
  81	fsparam_flag_no("perm", Opt_perm),
  82	fsparam_flag("nodelete", Opt_nodelete),
  83	fsparam_flag_no("mapposix", Opt_mapposix),
  84	fsparam_flag("mapchars", Opt_mapchars),
  85	fsparam_flag("nomapchars", Opt_nomapchars),
  86	fsparam_flag_no("sfu", Opt_sfu),
  87	fsparam_flag("nodfs", Opt_nodfs),
  88	fsparam_flag_no("posixpaths", Opt_posixpaths),
  89	fsparam_flag_no("unix", Opt_unix),
  90	fsparam_flag_no("linux", Opt_unix),
  91	fsparam_flag_no("posix", Opt_unix),
  92	fsparam_flag("nocase", Opt_nocase),
  93	fsparam_flag("ignorecase", Opt_nocase),
  94	fsparam_flag_no("brl", Opt_brl),
  95	fsparam_flag_no("handlecache", Opt_handlecache),
  96	fsparam_flag("forcemandatorylock", Opt_forcemandatorylock),
  97	fsparam_flag("forcemand", Opt_forcemandatorylock),
  98	fsparam_flag("setuidfromacl", Opt_setuidfromacl),
  99	fsparam_flag("idsfromsid", Opt_setuidfromacl),
 100	fsparam_flag_no("setuids", Opt_setuids),
 101	fsparam_flag_no("dynperm", Opt_dynperm),
 102	fsparam_flag_no("intr", Opt_intr),
 103	fsparam_flag_no("strictsync", Opt_strictsync),
 104	fsparam_flag_no("serverino", Opt_serverino),
 105	fsparam_flag("rwpidforward", Opt_rwpidforward),
 106	fsparam_flag("cifsacl", Opt_cifsacl),
 107	fsparam_flag_no("acl", Opt_acl),
 108	fsparam_flag("locallease", Opt_locallease),
 109	fsparam_flag("sign", Opt_sign),
 110	fsparam_flag("ignore_signature", Opt_ignore_signature),
 111	fsparam_flag("signloosely", Opt_ignore_signature),
 112	fsparam_flag("seal", Opt_seal),
 113	fsparam_flag("noac", Opt_noac),
 114	fsparam_flag("fsc", Opt_fsc),
 115	fsparam_flag("mfsymlinks", Opt_mfsymlinks),
 116	fsparam_flag("multiuser", Opt_multiuser),
 117	fsparam_flag("sloppy", Opt_sloppy),
 118	fsparam_flag("nosharesock", Opt_nosharesock),
 119	fsparam_flag_no("persistenthandles", Opt_persistent),
 120	fsparam_flag_no("resilienthandles", Opt_resilient),
 121	fsparam_flag_no("tcpnodelay", Opt_tcp_nodelay),
 122	fsparam_flag("nosparse", Opt_nosparse),
 123	fsparam_flag("domainauto", Opt_domainauto),
 124	fsparam_flag("rdma", Opt_rdma),
 125	fsparam_flag("modesid", Opt_modesid),
 126	fsparam_flag("modefromsid", Opt_modesid),
 127	fsparam_flag("rootfs", Opt_rootfs),
 128	fsparam_flag("compress", Opt_compress),
 129	fsparam_flag("witness", Opt_witness),
 130
 131	/* Mount options which take numeric value */
 132	fsparam_u32("backupuid", Opt_backupuid),
 133	fsparam_u32("backupgid", Opt_backupgid),
 134	fsparam_u32("uid", Opt_uid),
 135	fsparam_u32("cruid", Opt_cruid),
 136	fsparam_u32("gid", Opt_gid),
 137	fsparam_u32("file_mode", Opt_file_mode),
 138	fsparam_u32("dirmode", Opt_dirmode),
 139	fsparam_u32("dir_mode", Opt_dirmode),
 140	fsparam_u32("port", Opt_port),
 141	fsparam_u32("min_enc_offload", Opt_min_enc_offload),
 142	fsparam_u32("esize", Opt_min_enc_offload),
 143	fsparam_u32("bsize", Opt_blocksize),
 144	fsparam_u32("rasize", Opt_rasize),
 145	fsparam_u32("rsize", Opt_rsize),
 146	fsparam_u32("wsize", Opt_wsize),
 147	fsparam_u32("actimeo", Opt_actimeo),
 148	fsparam_u32("acdirmax", Opt_acdirmax),
 149	fsparam_u32("acregmax", Opt_acregmax),
 150	fsparam_u32("closetimeo", Opt_closetimeo),
 151	fsparam_u32("echo_interval", Opt_echo_interval),
 152	fsparam_u32("max_credits", Opt_max_credits),
 153	fsparam_u32("handletimeout", Opt_handletimeout),
 154	fsparam_u64("snapshot", Opt_snapshot),
 155	fsparam_u32("max_channels", Opt_max_channels),
 156
 157	/* Mount options which take string value */
 158	fsparam_string("source", Opt_source),
 159	fsparam_string("user", Opt_user),
 160	fsparam_string("username", Opt_user),
 161	fsparam_string("pass", Opt_pass),
 162	fsparam_string("password", Opt_pass),
 163	fsparam_string("ip", Opt_ip),
 164	fsparam_string("addr", Opt_ip),
 165	fsparam_string("domain", Opt_domain),
 166	fsparam_string("dom", Opt_domain),
 167	fsparam_string("srcaddr", Opt_srcaddr),
 168	fsparam_string("iocharset", Opt_iocharset),
 169	fsparam_string("netbiosname", Opt_netbiosname),
 170	fsparam_string("servern", Opt_servern),
 171	fsparam_string("ver", Opt_ver),
 172	fsparam_string("vers", Opt_vers),
 173	fsparam_string("sec", Opt_sec),
 174	fsparam_string("cache", Opt_cache),
 175
 176	/* Arguments that should be ignored */
 177	fsparam_flag("guest", Opt_ignore),
 178	fsparam_flag("noatime", Opt_ignore),
 179	fsparam_flag("relatime", Opt_ignore),
 180	fsparam_flag("_netdev", Opt_ignore),
 181	fsparam_flag_no("suid", Opt_ignore),
 182	fsparam_flag_no("exec", Opt_ignore),
 183	fsparam_flag_no("dev", Opt_ignore),
 184	fsparam_flag_no("mand", Opt_ignore),
 185	fsparam_flag_no("auto", Opt_ignore),
 186	fsparam_string("cred", Opt_ignore),
 187	fsparam_string("credentials", Opt_ignore),
 188	/*
 189	 * UNC and prefixpath is now extracted from Opt_source
 190	 * in the new mount API so we can just ignore them going forward.
 191	 */
 192	fsparam_string("unc", Opt_ignore),
 193	fsparam_string("prefixpath", Opt_ignore),
 194	{}
 195};
 196
 197static int
 198cifs_parse_security_flavors(struct fs_context *fc, char *value, struct smb3_fs_context *ctx)
 199{
 200
 201	substring_t args[MAX_OPT_ARGS];
 202
 203	/*
 204	 * With mount options, the last one should win. Reset any existing
 205	 * settings back to default.
 206	 */
 207	ctx->sectype = Unspecified;
 208	ctx->sign = false;
 209
 210	switch (match_token(value, cifs_secflavor_tokens, args)) {
 211	case Opt_sec_krb5p:
 212		cifs_errorf(fc, "sec=krb5p is not supported!\n");
 213		return 1;
 214	case Opt_sec_krb5i:
 215		ctx->sign = true;
 216		fallthrough;
 217	case Opt_sec_krb5:
 218		ctx->sectype = Kerberos;
 219		break;
 220	case Opt_sec_ntlmsspi:
 221		ctx->sign = true;
 222		fallthrough;
 223	case Opt_sec_ntlmssp:
 224		ctx->sectype = RawNTLMSSP;
 225		break;
 
 
 
 
 
 
 226	case Opt_sec_ntlmv2i:
 227		ctx->sign = true;
 228		fallthrough;
 229	case Opt_sec_ntlmv2:
 230		ctx->sectype = NTLMv2;
 231		break;
 
 
 
 
 
 232	case Opt_sec_none:
 233		ctx->nullauth = 1;
 234		break;
 235	default:
 236		cifs_errorf(fc, "bad security option: %s\n", value);
 237		return 1;
 238	}
 239
 240	return 0;
 241}
 242
 243static const match_table_t cifs_cacheflavor_tokens = {
 244	{ Opt_cache_loose, "loose" },
 245	{ Opt_cache_strict, "strict" },
 246	{ Opt_cache_none, "none" },
 247	{ Opt_cache_ro, "ro" },
 248	{ Opt_cache_rw, "singleclient" },
 249	{ Opt_cache_err, NULL }
 250};
 251
 252static int
 253cifs_parse_cache_flavor(struct fs_context *fc, char *value, struct smb3_fs_context *ctx)
 254{
 255	substring_t args[MAX_OPT_ARGS];
 256
 257	switch (match_token(value, cifs_cacheflavor_tokens, args)) {
 258	case Opt_cache_loose:
 259		ctx->direct_io = false;
 260		ctx->strict_io = false;
 261		ctx->cache_ro = false;
 262		ctx->cache_rw = false;
 263		break;
 264	case Opt_cache_strict:
 265		ctx->direct_io = false;
 266		ctx->strict_io = true;
 267		ctx->cache_ro = false;
 268		ctx->cache_rw = false;
 269		break;
 270	case Opt_cache_none:
 271		ctx->direct_io = true;
 272		ctx->strict_io = false;
 273		ctx->cache_ro = false;
 274		ctx->cache_rw = false;
 275		break;
 276	case Opt_cache_ro:
 277		ctx->direct_io = false;
 278		ctx->strict_io = false;
 279		ctx->cache_ro = true;
 280		ctx->cache_rw = false;
 281		break;
 282	case Opt_cache_rw:
 283		ctx->direct_io = false;
 284		ctx->strict_io = false;
 285		ctx->cache_ro = false;
 286		ctx->cache_rw = true;
 287		break;
 288	default:
 289		cifs_errorf(fc, "bad cache= option: %s\n", value);
 290		return 1;
 291	}
 292	return 0;
 293}
 294
 295#define DUP_CTX_STR(field)						\
 296do {									\
 297	if (ctx->field) {						\
 298		new_ctx->field = kstrdup(ctx->field, GFP_ATOMIC);	\
 299		if (new_ctx->field == NULL) {				\
 300			smb3_cleanup_fs_context_contents(new_ctx);	\
 301			return -ENOMEM;					\
 302		}							\
 303	}								\
 304} while (0)
 305
 306int
 307smb3_fs_context_dup(struct smb3_fs_context *new_ctx, struct smb3_fs_context *ctx)
 308{
 309	memcpy(new_ctx, ctx, sizeof(*ctx));
 310	new_ctx->prepath = NULL;
 
 311	new_ctx->nodename = NULL;
 312	new_ctx->username = NULL;
 313	new_ctx->password = NULL;
 314	new_ctx->server_hostname = NULL;
 315	new_ctx->domainname = NULL;
 316	new_ctx->UNC = NULL;
 317	new_ctx->source = NULL;
 318	new_ctx->iocharset = NULL;
 319	new_ctx->leaf_fullpath = NULL;
 320	/*
 321	 * Make sure to stay in sync with smb3_cleanup_fs_context_contents()
 322	 */
 323	DUP_CTX_STR(prepath);
 
 324	DUP_CTX_STR(username);
 325	DUP_CTX_STR(password);
 326	DUP_CTX_STR(server_hostname);
 327	DUP_CTX_STR(UNC);
 328	DUP_CTX_STR(source);
 329	DUP_CTX_STR(domainname);
 330	DUP_CTX_STR(nodename);
 331	DUP_CTX_STR(iocharset);
 332	DUP_CTX_STR(leaf_fullpath);
 333
 334	return 0;
 335}
 336
 337static int
 338cifs_parse_smb_version(struct fs_context *fc, char *value, struct smb3_fs_context *ctx, bool is_smb3)
 339{
 340	substring_t args[MAX_OPT_ARGS];
 341
 342	switch (match_token(value, cifs_smb_version_tokens, args)) {
 343#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
 344	case Smb_1:
 345		if (disable_legacy_dialects) {
 346			cifs_errorf(fc, "mount with legacy dialect disabled\n");
 347			return 1;
 348		}
 349		if (is_smb3) {
 350			cifs_errorf(fc, "vers=1.0 (cifs) not permitted when mounting with smb3\n");
 351			return 1;
 352		}
 353		cifs_errorf(fc, "Use of the less secure dialect vers=1.0 is not recommended unless required for access to very old servers\n");
 354		ctx->ops = &smb1_operations;
 355		ctx->vals = &smb1_values;
 356		break;
 357	case Smb_20:
 358		if (disable_legacy_dialects) {
 359			cifs_errorf(fc, "mount with legacy dialect disabled\n");
 360			return 1;
 361		}
 362		if (is_smb3) {
 363			cifs_errorf(fc, "vers=2.0 not permitted when mounting with smb3\n");
 364			return 1;
 365		}
 366		ctx->ops = &smb20_operations;
 367		ctx->vals = &smb20_values;
 368		break;
 369#else
 370	case Smb_1:
 371		cifs_errorf(fc, "vers=1.0 (cifs) mount not permitted when legacy dialects disabled\n");
 372		return 1;
 373	case Smb_20:
 374		cifs_errorf(fc, "vers=2.0 mount not permitted when legacy dialects disabled\n");
 375		return 1;
 376#endif /* CIFS_ALLOW_INSECURE_LEGACY */
 377	case Smb_21:
 378		ctx->ops = &smb21_operations;
 379		ctx->vals = &smb21_values;
 380		break;
 381	case Smb_30:
 382		ctx->ops = &smb30_operations;
 383		ctx->vals = &smb30_values;
 384		break;
 385	case Smb_302:
 386		ctx->ops = &smb30_operations; /* currently identical with 3.0 */
 387		ctx->vals = &smb302_values;
 388		break;
 389	case Smb_311:
 390		ctx->ops = &smb311_operations;
 391		ctx->vals = &smb311_values;
 392		break;
 393	case Smb_3any:
 394		ctx->ops = &smb30_operations; /* currently identical with 3.0 */
 395		ctx->vals = &smb3any_values;
 396		break;
 397	case Smb_default:
 398		ctx->ops = &smb30_operations;
 399		ctx->vals = &smbdefault_values;
 400		break;
 401	default:
 402		cifs_errorf(fc, "Unknown vers= option specified: %s\n", value);
 403		return 1;
 404	}
 405	return 0;
 406}
 407
 408int smb3_parse_opt(const char *options, const char *key, char **val)
 409{
 410	int rc = -ENOENT;
 411	char *opts, *orig, *p;
 412
 413	orig = opts = kstrdup(options, GFP_KERNEL);
 414	if (!opts)
 415		return -ENOMEM;
 416
 417	while ((p = strsep(&opts, ","))) {
 418		char *nval;
 419
 420		if (!*p)
 421			continue;
 422		if (strncasecmp(p, key, strlen(key)))
 423			continue;
 424		nval = strchr(p, '=');
 425		if (nval) {
 426			if (nval == p)
 427				continue;
 428			*nval++ = 0;
 429			*val = kstrdup(nval, GFP_KERNEL);
 430			rc = !*val ? -ENOMEM : 0;
 431			goto out;
 432		}
 433	}
 434out:
 435	kfree(orig);
 436	return rc;
 437}
 438
 439/*
 440 * Remove duplicate path delimiters. Windows is supposed to do that
 441 * but there are some bugs that prevent rename from working if there are
 442 * multiple delimiters.
 443 *
 444 * Returns a sanitized duplicate of @path. The caller is responsible for
 445 * cleaning up the original.
 446 */
 447#define IS_DELIM(c) ((c) == '/' || (c) == '\\')
 448static char *sanitize_path(char *path)
 449{
 450	char *cursor1 = path, *cursor2 = path;
 451
 452	/* skip all prepended delimiters */
 453	while (IS_DELIM(*cursor1))
 454		cursor1++;
 455
 456	/* copy the first letter */
 457	*cursor2 = *cursor1;
 458
 459	/* copy the remainder... */
 460	while (*(cursor1++)) {
 461		/* ... skipping all duplicated delimiters */
 462		if (IS_DELIM(*cursor1) && IS_DELIM(*cursor2))
 463			continue;
 464		*(++cursor2) = *cursor1;
 465	}
 466
 467	/* if the last character is a delimiter, skip it */
 468	if (IS_DELIM(*(cursor2 - 1)))
 469		cursor2--;
 470
 471	*(cursor2) = '\0';
 472	return kstrdup(path, GFP_KERNEL);
 473}
 474
 475/*
 476 * Parse a devname into substrings and populate the ctx->UNC and ctx->prepath
 477 * fields with the result. Returns 0 on success and an error otherwise
 478 * (e.g. ENOMEM or EINVAL)
 479 */
 480int
 481smb3_parse_devname(const char *devname, struct smb3_fs_context *ctx)
 482{
 483	char *pos;
 484	const char *delims = "/\\";
 485	size_t len;
 486
 487	if (unlikely(!devname || !*devname)) {
 488		cifs_dbg(VFS, "Device name not specified\n");
 489		return -EINVAL;
 490	}
 491
 492	/* make sure we have a valid UNC double delimiter prefix */
 493	len = strspn(devname, delims);
 494	if (len != 2)
 495		return -EINVAL;
 496
 497	/* find delimiter between host and sharename */
 498	pos = strpbrk(devname + 2, delims);
 499	if (!pos)
 500		return -EINVAL;
 501
 502	/* record the server hostname */
 503	kfree(ctx->server_hostname);
 504	ctx->server_hostname = kstrndup(devname + 2, pos - devname - 2, GFP_KERNEL);
 505	if (!ctx->server_hostname)
 506		return -ENOMEM;
 507
 508	/* skip past delimiter */
 509	++pos;
 510
 511	/* now go until next delimiter or end of string */
 512	len = strcspn(pos, delims);
 513
 514	/* move "pos" up to delimiter or NULL */
 515	pos += len;
 516	kfree(ctx->UNC);
 517	ctx->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
 518	if (!ctx->UNC)
 519		return -ENOMEM;
 520
 521	convert_delimiter(ctx->UNC, '\\');
 522
 523	/* skip any delimiter */
 524	if (*pos == '/' || *pos == '\\')
 525		pos++;
 526
 527	kfree(ctx->prepath);
 528	ctx->prepath = NULL;
 529
 530	/* If pos is NULL then no prepath */
 531	if (!*pos)
 532		return 0;
 533
 534	ctx->prepath = sanitize_path(pos);
 535	if (!ctx->prepath)
 536		return -ENOMEM;
 537
 538	return 0;
 539}
 540
 541static void smb3_fs_context_free(struct fs_context *fc);
 542static int smb3_fs_context_parse_param(struct fs_context *fc,
 543				       struct fs_parameter *param);
 544static int smb3_fs_context_parse_monolithic(struct fs_context *fc,
 545					    void *data);
 546static int smb3_get_tree(struct fs_context *fc);
 547static int smb3_reconfigure(struct fs_context *fc);
 548
 549static const struct fs_context_operations smb3_fs_context_ops = {
 550	.free			= smb3_fs_context_free,
 551	.parse_param		= smb3_fs_context_parse_param,
 552	.parse_monolithic	= smb3_fs_context_parse_monolithic,
 553	.get_tree		= smb3_get_tree,
 554	.reconfigure		= smb3_reconfigure,
 555};
 556
 557/*
 558 * Parse a monolithic block of data from sys_mount().
 559 * smb3_fs_context_parse_monolithic - Parse key[=val][,key[=val]]* mount data
 560 * @ctx: The superblock configuration to fill in.
 561 * @data: The data to parse
 562 *
 563 * Parse a blob of data that's in key[=val][,key[=val]]* form.  This can be
 564 * called from the ->monolithic_mount_data() fs_context operation.
 565 *
 566 * Returns 0 on success or the error returned by the ->parse_option() fs_context
 567 * operation on failure.
 568 */
 569static int smb3_fs_context_parse_monolithic(struct fs_context *fc,
 570					   void *data)
 571{
 
 572	char *options = data, *key;
 573	int ret = 0;
 574
 575	if (!options)
 576		return 0;
 577
 
 
 
 
 578	ret = security_sb_eat_lsm_opts(options, &fc->security);
 579	if (ret)
 580		return ret;
 581
 582	/* BB Need to add support for sep= here TBD */
 583	while ((key = strsep(&options, ",")) != NULL) {
 584		size_t len;
 585		char *value;
 586
 587		if (*key == 0)
 588			break;
 589
 590		/* Check if following character is the deliminator If yes,
 591		 * we have encountered a double deliminator reset the NULL
 592		 * character to the deliminator
 593		 */
 594		while (options && options[0] == ',') {
 595			len = strlen(key);
 596			strcpy(key + len, options);
 597			options = strchr(options, ',');
 598			if (options)
 599				*options++ = 0;
 600		}
 601
 602
 603		len = 0;
 604		value = strchr(key, '=');
 605		if (value) {
 606			if (value == key)
 607				continue;
 608			*value++ = 0;
 609			len = strlen(value);
 610		}
 611
 612		ret = vfs_parse_fs_string(fc, key, value, len);
 613		if (ret < 0)
 614			break;
 615	}
 616
 617	return ret;
 618}
 619
 620/*
 621 * Validate the preparsed information in the config.
 622 */
 623static int smb3_fs_context_validate(struct fs_context *fc)
 624{
 625	struct smb3_fs_context *ctx = smb3_fc2context(fc);
 626
 627	if (ctx->rdma && ctx->vals->protocol_id < SMB30_PROT_ID) {
 628		cifs_errorf(fc, "SMB Direct requires Version >=3.0\n");
 629		return -EOPNOTSUPP;
 630	}
 631
 632#ifndef CONFIG_KEYS
 633	/* Muliuser mounts require CONFIG_KEYS support */
 634	if (ctx->multiuser) {
 635		cifs_errorf(fc, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
 636		return -1;
 637	}
 638#endif
 639
 640	if (ctx->got_version == false)
 641		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");
 642
 643
 644	if (!ctx->UNC) {
 645		cifs_errorf(fc, "CIFS mount error: No usable UNC path provided in device string!\n");
 646		return -1;
 647	}
 648
 649	/* make sure UNC has a share name */
 650	if (strlen(ctx->UNC) < 3 || !strchr(ctx->UNC + 3, '\\')) {
 651		cifs_errorf(fc, "Malformed UNC. Unable to find share name.\n");
 652		return -ENOENT;
 653	}
 654
 655	if (!ctx->got_ip) {
 656		int len;
 657		const char *slash;
 658
 659		/* No ip= option specified? Try to get it from UNC */
 660		/* Use the address part of the UNC. */
 661		slash = strchr(&ctx->UNC[2], '\\');
 662		len = slash - &ctx->UNC[2];
 663		if (!cifs_convert_address((struct sockaddr *)&ctx->dstaddr,
 664					  &ctx->UNC[2], len)) {
 665			pr_err("Unable to determine destination address\n");
 666			return -EHOSTUNREACH;
 667		}
 668	}
 669
 670	/* set the port that we got earlier */
 671	cifs_set_port((struct sockaddr *)&ctx->dstaddr, ctx->port);
 672
 673	if (ctx->override_uid && !ctx->uid_specified) {
 674		ctx->override_uid = 0;
 675		pr_notice("ignoring forceuid mount option specified with no uid= option\n");
 676	}
 677
 678	if (ctx->override_gid && !ctx->gid_specified) {
 679		ctx->override_gid = 0;
 680		pr_notice("ignoring forcegid mount option specified with no gid= option\n");
 681	}
 682
 683	return 0;
 684}
 685
 686static int smb3_get_tree_common(struct fs_context *fc)
 687{
 688	struct smb3_fs_context *ctx = smb3_fc2context(fc);
 689	struct dentry *root;
 690	int rc = 0;
 691
 692	root = cifs_smb3_do_mount(fc->fs_type, 0, ctx);
 693	if (IS_ERR(root))
 694		return PTR_ERR(root);
 695
 696	fc->root = root;
 697
 698	return rc;
 699}
 700
 701/*
 702 * Create an SMB3 superblock from the parameters passed.
 703 */
 704static int smb3_get_tree(struct fs_context *fc)
 705{
 706	int err = smb3_fs_context_validate(fc);
 707	int ret;
 708
 709	if (err)
 710		return err;
 711	mutex_lock(&cifs_mount_mutex);
 712	ret = smb3_get_tree_common(fc);
 713	mutex_unlock(&cifs_mount_mutex);
 714	return ret;
 715}
 716
 717static void smb3_fs_context_free(struct fs_context *fc)
 718{
 719	struct smb3_fs_context *ctx = smb3_fc2context(fc);
 720
 721	smb3_cleanup_fs_context(ctx);
 722}
 723
 724/*
 725 * Compare the old and new proposed context during reconfigure
 726 * and check if the changes are compatible.
 727 */
 728static int smb3_verify_reconfigure_ctx(struct fs_context *fc,
 729				       struct smb3_fs_context *new_ctx,
 730				       struct smb3_fs_context *old_ctx)
 731{
 732	if (new_ctx->posix_paths != old_ctx->posix_paths) {
 733		cifs_errorf(fc, "can not change posixpaths during remount\n");
 734		return -EINVAL;
 735	}
 736	if (new_ctx->sectype != old_ctx->sectype) {
 737		cifs_errorf(fc, "can not change sec during remount\n");
 738		return -EINVAL;
 739	}
 740	if (new_ctx->multiuser != old_ctx->multiuser) {
 741		cifs_errorf(fc, "can not change multiuser during remount\n");
 742		return -EINVAL;
 743	}
 744	if (new_ctx->UNC &&
 745	    (!old_ctx->UNC || strcmp(new_ctx->UNC, old_ctx->UNC))) {
 746		cifs_errorf(fc, "can not change UNC during remount\n");
 747		return -EINVAL;
 748	}
 749	if (new_ctx->username &&
 750	    (!old_ctx->username || strcmp(new_ctx->username, old_ctx->username))) {
 751		cifs_errorf(fc, "can not change username during remount\n");
 752		return -EINVAL;
 753	}
 754	if (new_ctx->password &&
 755	    (!old_ctx->password || strcmp(new_ctx->password, old_ctx->password))) {
 756		cifs_errorf(fc, "can not change password during remount\n");
 757		return -EINVAL;
 758	}
 759	if (new_ctx->domainname &&
 760	    (!old_ctx->domainname || strcmp(new_ctx->domainname, old_ctx->domainname))) {
 761		cifs_errorf(fc, "can not change domainname during remount\n");
 762		return -EINVAL;
 763	}
 764	if (strcmp(new_ctx->workstation_name, old_ctx->workstation_name)) {
 765		cifs_errorf(fc, "can not change workstation_name during remount\n");
 766		return -EINVAL;
 767	}
 768	if (new_ctx->nodename &&
 769	    (!old_ctx->nodename || strcmp(new_ctx->nodename, old_ctx->nodename))) {
 770		cifs_errorf(fc, "can not change nodename during remount\n");
 771		return -EINVAL;
 772	}
 773	if (new_ctx->iocharset &&
 774	    (!old_ctx->iocharset || strcmp(new_ctx->iocharset, old_ctx->iocharset))) {
 775		cifs_errorf(fc, "can not change iocharset during remount\n");
 776		return -EINVAL;
 777	}
 778
 779	return 0;
 780}
 781
 782#define STEAL_STRING(cifs_sb, ctx, field)				\
 783do {									\
 784	kfree(ctx->field);						\
 785	ctx->field = cifs_sb->ctx->field;				\
 786	cifs_sb->ctx->field = NULL;					\
 787} while (0)
 788
 789#define STEAL_STRING_SENSITIVE(cifs_sb, ctx, field)			\
 790do {									\
 791	kfree_sensitive(ctx->field);					\
 792	ctx->field = cifs_sb->ctx->field;				\
 793	cifs_sb->ctx->field = NULL;					\
 794} while (0)
 795
 796static int smb3_reconfigure(struct fs_context *fc)
 797{
 798	struct smb3_fs_context *ctx = smb3_fc2context(fc);
 799	struct dentry *root = fc->root;
 800	struct cifs_sb_info *cifs_sb = CIFS_SB(root->d_sb);
 801	int rc;
 802
 803	rc = smb3_verify_reconfigure_ctx(fc, ctx, cifs_sb->ctx);
 804	if (rc)
 805		return rc;
 806
 807	/*
 808	 * We can not change UNC/username/password/domainname/
 809	 * workstation_name/nodename/iocharset
 810	 * during reconnect so ignore what we have in the new context and
 811	 * just use what we already have in cifs_sb->ctx.
 812	 */
 813	STEAL_STRING(cifs_sb, ctx, UNC);
 814	STEAL_STRING(cifs_sb, ctx, source);
 815	STEAL_STRING(cifs_sb, ctx, username);
 816	STEAL_STRING_SENSITIVE(cifs_sb, ctx, password);
 817	STEAL_STRING(cifs_sb, ctx, domainname);
 818	STEAL_STRING(cifs_sb, ctx, nodename);
 819	STEAL_STRING(cifs_sb, ctx, iocharset);
 820
 821	/* if rsize or wsize not passed in on remount, use previous values */
 822	if (ctx->rsize == 0)
 823		ctx->rsize = cifs_sb->ctx->rsize;
 824	if (ctx->wsize == 0)
 825		ctx->wsize = cifs_sb->ctx->wsize;
 826
 827
 828	smb3_cleanup_fs_context_contents(cifs_sb->ctx);
 829	rc = smb3_fs_context_dup(cifs_sb->ctx, ctx);
 830	smb3_update_mnt_flags(cifs_sb);
 831#ifdef CONFIG_CIFS_DFS_UPCALL
 832	if (!rc)
 833		rc = dfs_cache_remount_fs(cifs_sb);
 834#endif
 835
 836	return rc;
 837}
 838
 839static int smb3_fs_context_parse_param(struct fs_context *fc,
 840				      struct fs_parameter *param)
 841{
 842	struct fs_parse_result result;
 843	struct smb3_fs_context *ctx = smb3_fc2context(fc);
 844	int i, opt;
 845	bool is_smb3 = !strcmp(fc->fs_type->name, "smb3");
 846	bool skip_parsing = false;
 847	kuid_t uid;
 848	kgid_t gid;
 849
 850	cifs_dbg(FYI, "CIFS: parsing cifs mount option '%s'\n", param->key);
 851
 852	/*
 853	 * fs_parse can not handle string options with an empty value so
 854	 * we will need special handling of them.
 855	 */
 856	if (param->type == fs_value_is_string && param->string[0] == 0) {
 857		if (!strcmp("pass", param->key) || !strcmp("password", param->key)) {
 858			skip_parsing = true;
 859			opt = Opt_pass;
 860		} else if (!strcmp("user", param->key) || !strcmp("username", param->key)) {
 861			skip_parsing = true;
 862			opt = Opt_user;
 863		}
 864	}
 865
 866	if (!skip_parsing) {
 867		opt = fs_parse(fc, smb3_fs_parameters, param, &result);
 868		if (opt < 0)
 869			return ctx->sloppy ? 1 : opt;
 870	}
 871
 872	switch (opt) {
 873	case Opt_compress:
 874		ctx->compression = UNKNOWN_TYPE;
 875		cifs_dbg(VFS,
 876			"SMB3 compression support is experimental\n");
 877		break;
 878	case Opt_nodfs:
 879		ctx->nodfs = 1;
 880		break;
 881	case Opt_hard:
 882		if (result.negated) {
 883			if (ctx->retry == 1)
 884				cifs_dbg(VFS, "conflicting hard vs. soft mount options\n");
 885			ctx->retry = 0;
 886		} else
 887			ctx->retry = 1;
 888		break;
 889	case Opt_soft:
 890		if (result.negated)
 891			ctx->retry = 1;
 892		else {
 893			if (ctx->retry == 1)
 894				cifs_dbg(VFS, "conflicting hard vs soft mount options\n");
 895			ctx->retry = 0;
 896		}
 897		break;
 898	case Opt_mapposix:
 899		if (result.negated)
 900			ctx->remap = false;
 901		else {
 902			ctx->remap = true;
 903			ctx->sfu_remap = false; /* disable SFU mapping */
 904		}
 905		break;
 906	case Opt_user_xattr:
 907		if (result.negated)
 908			ctx->no_xattr = 1;
 909		else
 910			ctx->no_xattr = 0;
 911		break;
 912	case Opt_forceuid:
 913		if (result.negated)
 914			ctx->override_uid = 0;
 915		else
 916			ctx->override_uid = 1;
 917		break;
 918	case Opt_forcegid:
 919		if (result.negated)
 920			ctx->override_gid = 0;
 921		else
 922			ctx->override_gid = 1;
 923		break;
 924	case Opt_perm:
 925		if (result.negated)
 926			ctx->noperm = 1;
 927		else
 928			ctx->noperm = 0;
 929		break;
 930	case Opt_dynperm:
 931		if (result.negated)
 932			ctx->dynperm = 0;
 933		else
 934			ctx->dynperm = 1;
 935		break;
 936	case Opt_sfu:
 937		if (result.negated)
 938			ctx->sfu_emul = 0;
 939		else
 940			ctx->sfu_emul = 1;
 941		break;
 942	case Opt_noblocksend:
 943		ctx->noblocksnd = 1;
 944		break;
 945	case Opt_noautotune:
 946		ctx->noautotune = 1;
 947		break;
 948	case Opt_nolease:
 949		ctx->no_lease = 1;
 950		break;
 951	case Opt_nosparse:
 952		ctx->no_sparse = 1;
 953		break;
 954	case Opt_nodelete:
 955		ctx->nodelete = 1;
 956		break;
 957	case Opt_multichannel:
 958		if (result.negated) {
 959			ctx->multichannel = false;
 960			ctx->max_channels = 1;
 961		} else {
 962			ctx->multichannel = true;
 963			/* if number of channels not specified, default to 2 */
 964			if (ctx->max_channels < 2)
 965				ctx->max_channels = 2;
 966		}
 967		break;
 968	case Opt_uid:
 969		uid = make_kuid(current_user_ns(), result.uint_32);
 970		if (!uid_valid(uid))
 971			goto cifs_parse_mount_err;
 972		ctx->linux_uid = uid;
 973		ctx->uid_specified = true;
 974		break;
 975	case Opt_cruid:
 976		uid = make_kuid(current_user_ns(), result.uint_32);
 977		if (!uid_valid(uid))
 978			goto cifs_parse_mount_err;
 979		ctx->cred_uid = uid;
 980		ctx->cruid_specified = true;
 981		break;
 982	case Opt_backupuid:
 983		uid = make_kuid(current_user_ns(), result.uint_32);
 984		if (!uid_valid(uid))
 985			goto cifs_parse_mount_err;
 986		ctx->backupuid = uid;
 987		ctx->backupuid_specified = true;
 988		break;
 989	case Opt_backupgid:
 990		gid = make_kgid(current_user_ns(), result.uint_32);
 991		if (!gid_valid(gid))
 992			goto cifs_parse_mount_err;
 993		ctx->backupgid = gid;
 994		ctx->backupgid_specified = true;
 995		break;
 996	case Opt_gid:
 997		gid = make_kgid(current_user_ns(), result.uint_32);
 998		if (!gid_valid(gid))
 999			goto cifs_parse_mount_err;
1000		ctx->linux_gid = gid;
1001		ctx->gid_specified = true;
1002		break;
1003	case Opt_port:
1004		ctx->port = result.uint_32;
1005		break;
1006	case Opt_file_mode:
1007		ctx->file_mode = result.uint_32;
1008		break;
1009	case Opt_dirmode:
1010		ctx->dir_mode = result.uint_32;
1011		break;
1012	case Opt_min_enc_offload:
1013		ctx->min_offload = result.uint_32;
1014		break;
1015	case Opt_blocksize:
1016		/*
1017		 * inode blocksize realistically should never need to be
1018		 * less than 16K or greater than 16M and default is 1MB.
1019		 * Note that small inode block sizes (e.g. 64K) can lead
1020		 * to very poor performance of common tools like cp and scp
1021		 */
1022		if ((result.uint_32 < CIFS_MAX_MSGSIZE) ||
1023		   (result.uint_32 > (4 * SMB3_DEFAULT_IOSIZE))) {
1024			cifs_errorf(fc, "%s: Invalid blocksize\n",
1025				__func__);
1026			goto cifs_parse_mount_err;
1027		}
1028		ctx->bsize = result.uint_32;
1029		ctx->got_bsize = true;
1030		break;
1031	case Opt_rasize:
1032		/*
1033		 * readahead size realistically should never need to be
1034		 * less than 1M (CIFS_DEFAULT_IOSIZE) or greater than 32M
1035		 * (perhaps an exception should be considered in the
1036		 * for the case of a large number of channels
1037		 * when multichannel is negotiated) since that would lead
1038		 * to plenty of parallel I/O in flight to the server.
1039		 * Note that smaller read ahead sizes would
1040		 * hurt performance of common tools like cp and scp
1041		 * which often trigger sequential i/o with read ahead
1042		 */
1043		if ((result.uint_32 > (8 * SMB3_DEFAULT_IOSIZE)) ||
1044		    (result.uint_32 < CIFS_DEFAULT_IOSIZE)) {
1045			cifs_errorf(fc, "%s: Invalid rasize %d vs. %d\n",
1046				__func__, result.uint_32, SMB3_DEFAULT_IOSIZE);
1047			goto cifs_parse_mount_err;
1048		}
1049		ctx->rasize = result.uint_32;
1050		break;
1051	case Opt_rsize:
1052		ctx->rsize = result.uint_32;
1053		ctx->got_rsize = true;
1054		break;
1055	case Opt_wsize:
1056		ctx->wsize = result.uint_32;
1057		ctx->got_wsize = true;
1058		break;
1059	case Opt_acregmax:
1060		ctx->acregmax = HZ * result.uint_32;
1061		if (ctx->acregmax > CIFS_MAX_ACTIMEO) {
1062			cifs_errorf(fc, "acregmax too large\n");
1063			goto cifs_parse_mount_err;
1064		}
1065		break;
1066	case Opt_acdirmax:
1067		ctx->acdirmax = HZ * result.uint_32;
1068		if (ctx->acdirmax > CIFS_MAX_ACTIMEO) {
1069			cifs_errorf(fc, "acdirmax too large\n");
1070			goto cifs_parse_mount_err;
1071		}
1072		break;
1073	case Opt_actimeo:
1074		if (HZ * result.uint_32 > CIFS_MAX_ACTIMEO) {
1075			cifs_errorf(fc, "timeout too large\n");
1076			goto cifs_parse_mount_err;
1077		}
1078		if ((ctx->acdirmax != CIFS_DEF_ACTIMEO) ||
1079		    (ctx->acregmax != CIFS_DEF_ACTIMEO)) {
1080			cifs_errorf(fc, "actimeo ignored since acregmax or acdirmax specified\n");
1081			break;
1082		}
1083		ctx->acdirmax = ctx->acregmax = HZ * result.uint_32;
1084		break;
1085	case Opt_closetimeo:
1086		ctx->closetimeo = HZ * result.uint_32;
1087		if (ctx->closetimeo > SMB3_MAX_DCLOSETIMEO) {
1088			cifs_errorf(fc, "closetimeo too large\n");
1089			goto cifs_parse_mount_err;
1090		}
1091		break;
1092	case Opt_echo_interval:
1093		ctx->echo_interval = result.uint_32;
1094		break;
1095	case Opt_snapshot:
1096		ctx->snapshot_time = result.uint_64;
1097		break;
1098	case Opt_max_credits:
1099		if (result.uint_32 < 20 || result.uint_32 > 60000) {
1100			cifs_errorf(fc, "%s: Invalid max_credits value\n",
1101				 __func__);
1102			goto cifs_parse_mount_err;
1103		}
1104		ctx->max_credits = result.uint_32;
1105		break;
1106	case Opt_max_channels:
1107		if (result.uint_32 < 1 || result.uint_32 > CIFS_MAX_CHANNELS) {
1108			cifs_errorf(fc, "%s: Invalid max_channels value, needs to be 1-%d\n",
1109				 __func__, CIFS_MAX_CHANNELS);
1110			goto cifs_parse_mount_err;
1111		}
1112		ctx->max_channels = result.uint_32;
1113		/* If more than one channel requested ... they want multichan */
1114		if (result.uint_32 > 1)
1115			ctx->multichannel = true;
1116		break;
1117	case Opt_handletimeout:
1118		ctx->handle_timeout = result.uint_32;
1119		if (ctx->handle_timeout > SMB3_MAX_HANDLE_TIMEOUT) {
1120			cifs_errorf(fc, "Invalid handle cache timeout, longer than 16 minutes\n");
1121			goto cifs_parse_mount_err;
1122		}
1123		break;
1124	case Opt_source:
1125		kfree(ctx->UNC);
1126		ctx->UNC = NULL;
1127		switch (smb3_parse_devname(param->string, ctx)) {
1128		case 0:
1129			break;
1130		case -ENOMEM:
1131			cifs_errorf(fc, "Unable to allocate memory for devname\n");
1132			goto cifs_parse_mount_err;
1133		case -EINVAL:
1134			cifs_errorf(fc, "Malformed UNC in devname\n");
1135			goto cifs_parse_mount_err;
1136		default:
1137			cifs_errorf(fc, "Unknown error parsing devname\n");
1138			goto cifs_parse_mount_err;
1139		}
1140		ctx->source = kstrdup(param->string, GFP_KERNEL);
1141		if (ctx->source == NULL) {
1142			cifs_errorf(fc, "OOM when copying UNC string\n");
1143			goto cifs_parse_mount_err;
1144		}
1145		fc->source = kstrdup(param->string, GFP_KERNEL);
1146		if (fc->source == NULL) {
1147			cifs_errorf(fc, "OOM when copying UNC string\n");
1148			goto cifs_parse_mount_err;
1149		}
1150		break;
1151	case Opt_user:
1152		kfree(ctx->username);
1153		ctx->username = NULL;
1154		if (strlen(param->string) == 0) {
1155			/* null user, ie. anonymous authentication */
1156			ctx->nullauth = 1;
1157			break;
1158		}
1159
1160		if (strnlen(param->string, CIFS_MAX_USERNAME_LEN) >
1161		    CIFS_MAX_USERNAME_LEN) {
1162			pr_warn("username too long\n");
1163			goto cifs_parse_mount_err;
1164		}
1165		ctx->username = kstrdup(param->string, GFP_KERNEL);
1166		if (ctx->username == NULL) {
1167			cifs_errorf(fc, "OOM when copying username string\n");
1168			goto cifs_parse_mount_err;
1169		}
1170		break;
1171	case Opt_pass:
1172		kfree_sensitive(ctx->password);
1173		ctx->password = NULL;
1174		if (strlen(param->string) == 0)
1175			break;
1176
1177		ctx->password = kstrdup(param->string, GFP_KERNEL);
1178		if (ctx->password == NULL) {
1179			cifs_errorf(fc, "OOM when copying password string\n");
1180			goto cifs_parse_mount_err;
1181		}
1182		break;
1183	case Opt_ip:
1184		if (strlen(param->string) == 0) {
1185			ctx->got_ip = false;
1186			break;
1187		}
1188		if (!cifs_convert_address((struct sockaddr *)&ctx->dstaddr,
1189					  param->string,
1190					  strlen(param->string))) {
1191			pr_err("bad ip= option (%s)\n", param->string);
1192			goto cifs_parse_mount_err;
1193		}
1194		ctx->got_ip = true;
1195		break;
1196	case Opt_domain:
1197		if (strnlen(param->string, CIFS_MAX_DOMAINNAME_LEN)
1198				== CIFS_MAX_DOMAINNAME_LEN) {
1199			pr_warn("domain name too long\n");
1200			goto cifs_parse_mount_err;
1201		}
1202
1203		kfree(ctx->domainname);
1204		ctx->domainname = kstrdup(param->string, GFP_KERNEL);
1205		if (ctx->domainname == NULL) {
1206			cifs_errorf(fc, "OOM when copying domainname string\n");
1207			goto cifs_parse_mount_err;
1208		}
1209		cifs_dbg(FYI, "Domain name set\n");
1210		break;
1211	case Opt_srcaddr:
1212		if (!cifs_convert_address(
1213				(struct sockaddr *)&ctx->srcaddr,
1214				param->string, strlen(param->string))) {
1215			pr_warn("Could not parse srcaddr: %s\n",
1216				param->string);
1217			goto cifs_parse_mount_err;
1218		}
1219		break;
1220	case Opt_iocharset:
1221		if (strnlen(param->string, 1024) >= 65) {
1222			pr_warn("iocharset name too long\n");
1223			goto cifs_parse_mount_err;
1224		}
1225
1226		if (strncasecmp(param->string, "default", 7) != 0) {
1227			kfree(ctx->iocharset);
1228			ctx->iocharset = kstrdup(param->string, GFP_KERNEL);
1229			if (ctx->iocharset == NULL) {
1230				cifs_errorf(fc, "OOM when copying iocharset string\n");
1231				goto cifs_parse_mount_err;
1232			}
1233		}
1234		/* if iocharset not set then load_nls_default
1235		 * is used by caller
1236		 */
1237		cifs_dbg(FYI, "iocharset set to %s\n", ctx->iocharset);
1238		break;
1239	case Opt_netbiosname:
1240		memset(ctx->source_rfc1001_name, 0x20,
1241			RFC1001_NAME_LEN);
1242		/*
1243		 * FIXME: are there cases in which a comma can
1244		 * be valid in workstation netbios name (and
1245		 * need special handling)?
1246		 */
1247		for (i = 0; i < RFC1001_NAME_LEN; i++) {
1248			/* don't ucase netbiosname for user */
1249			if (param->string[i] == 0)
1250				break;
1251			ctx->source_rfc1001_name[i] = param->string[i];
1252		}
1253		/* The string has 16th byte zero still from
1254		 * set at top of the function
1255		 */
1256		if (i == RFC1001_NAME_LEN && param->string[i] != 0)
1257			pr_warn("netbiosname longer than 15 truncated\n");
1258		break;
1259	case Opt_servern:
1260		/* last byte, type, is 0x20 for servr type */
1261		memset(ctx->target_rfc1001_name, 0x20,
1262			RFC1001_NAME_LEN_WITH_NULL);
1263		/*
1264		 * BB are there cases in which a comma can be valid in this
1265		 * workstation netbios name (and need special handling)?
1266		 */
1267
1268		/* user or mount helper must uppercase the netbios name */
1269		for (i = 0; i < 15; i++) {
1270			if (param->string[i] == 0)
1271				break;
1272			ctx->target_rfc1001_name[i] = param->string[i];
1273		}
1274
1275		/* The string has 16th byte zero still from set at top of function */
1276		if (i == RFC1001_NAME_LEN && param->string[i] != 0)
1277			pr_warn("server netbiosname longer than 15 truncated\n");
1278		break;
1279	case Opt_ver:
1280		/* version of mount userspace tools, not dialect */
1281		/* If interface changes in mount.cifs bump to new ver */
1282		if (strncasecmp(param->string, "1", 1) == 0) {
1283			if (strlen(param->string) > 1) {
1284				pr_warn("Bad mount helper ver=%s. Did you want SMB1 (CIFS) dialect and mean to type vers=1.0 instead?\n",
1285					param->string);
1286				goto cifs_parse_mount_err;
1287			}
1288			/* This is the default */
1289			break;
1290		}
1291		/* For all other value, error */
1292		pr_warn("Invalid mount helper version specified\n");
1293		goto cifs_parse_mount_err;
1294	case Opt_vers:
1295		/* protocol version (dialect) */
1296		if (cifs_parse_smb_version(fc, param->string, ctx, is_smb3) != 0)
1297			goto cifs_parse_mount_err;
1298		ctx->got_version = true;
1299		break;
1300	case Opt_sec:
1301		if (cifs_parse_security_flavors(fc, param->string, ctx) != 0)
1302			goto cifs_parse_mount_err;
1303		break;
1304	case Opt_cache:
1305		if (cifs_parse_cache_flavor(fc, param->string, ctx) != 0)
1306			goto cifs_parse_mount_err;
1307		break;
1308	case Opt_witness:
1309#ifndef CONFIG_CIFS_SWN_UPCALL
1310		cifs_errorf(fc, "Witness support needs CONFIG_CIFS_SWN_UPCALL config option\n");
1311			goto cifs_parse_mount_err;
1312#endif
1313		ctx->witness = true;
1314		pr_warn_once("Witness protocol support is experimental\n");
1315		break;
1316	case Opt_rootfs:
1317#ifndef CONFIG_CIFS_ROOT
1318		cifs_dbg(VFS, "rootfs support requires CONFIG_CIFS_ROOT config option\n");
1319		goto cifs_parse_mount_err;
1320#endif
1321		ctx->rootfs = true;
1322		break;
1323	case Opt_posixpaths:
1324		if (result.negated)
1325			ctx->posix_paths = 0;
1326		else
1327			ctx->posix_paths = 1;
1328		break;
1329	case Opt_unix:
1330		if (result.negated) {
1331			if (ctx->linux_ext == 1)
1332				pr_warn_once("conflicting posix mount options specified\n");
1333			ctx->linux_ext = 0;
1334			ctx->no_linux_ext = 1;
1335		} else {
1336			if (ctx->no_linux_ext == 1)
1337				pr_warn_once("conflicting posix mount options specified\n");
1338			ctx->linux_ext = 1;
1339			ctx->no_linux_ext = 0;
1340		}
1341		break;
1342	case Opt_nocase:
1343		ctx->nocase = 1;
1344		break;
1345	case Opt_brl:
1346		if (result.negated) {
1347			/*
1348			 * turn off mandatory locking in mode
1349			 * if remote locking is turned off since the
1350			 * local vfs will do advisory
1351			 */
1352			if (ctx->file_mode ==
1353				(S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1354				ctx->file_mode = S_IALLUGO;
1355			ctx->nobrl =  1;
1356		} else
1357			ctx->nobrl =  0;
1358		break;
1359	case Opt_handlecache:
1360		if (result.negated)
1361			ctx->nohandlecache = 1;
1362		else
1363			ctx->nohandlecache = 0;
1364		break;
1365	case Opt_forcemandatorylock:
1366		ctx->mand_lock = 1;
1367		break;
1368	case Opt_setuids:
1369		ctx->setuids = result.negated;
1370		break;
1371	case Opt_intr:
1372		ctx->intr = !result.negated;
1373		break;
1374	case Opt_setuidfromacl:
1375		ctx->setuidfromacl = 1;
1376		break;
1377	case Opt_strictsync:
1378		ctx->nostrictsync = result.negated;
1379		break;
1380	case Opt_serverino:
1381		ctx->server_ino = !result.negated;
1382		break;
1383	case Opt_rwpidforward:
1384		ctx->rwpidforward = 1;
1385		break;
1386	case Opt_modesid:
1387		ctx->mode_ace = 1;
1388		break;
1389	case Opt_cifsacl:
1390		ctx->cifs_acl = !result.negated;
1391		break;
1392	case Opt_acl:
1393		ctx->no_psx_acl = result.negated;
1394		break;
1395	case Opt_locallease:
1396		ctx->local_lease = 1;
1397		break;
1398	case Opt_sign:
1399		ctx->sign = true;
1400		break;
1401	case Opt_ignore_signature:
1402		ctx->sign = true;
1403		ctx->ignore_signature = true;
1404		break;
1405	case Opt_seal:
1406		/* we do not do the following in secFlags because seal
1407		 * is a per tree connection (mount) not a per socket
1408		 * or per-smb connection option in the protocol
1409		 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1410		 */
1411		ctx->seal = 1;
1412		break;
1413	case Opt_noac:
1414		pr_warn("Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1415		break;
1416	case Opt_fsc:
1417#ifndef CONFIG_CIFS_FSCACHE
1418		cifs_errorf(fc, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1419		goto cifs_parse_mount_err;
1420#endif
1421		ctx->fsc = true;
1422		break;
1423	case Opt_mfsymlinks:
1424		ctx->mfsymlinks = true;
1425		break;
1426	case Opt_multiuser:
1427		ctx->multiuser = true;
1428		break;
1429	case Opt_sloppy:
1430		ctx->sloppy = true;
1431		break;
1432	case Opt_nosharesock:
1433		ctx->nosharesock = true;
1434		break;
1435	case Opt_persistent:
1436		if (result.negated) {
1437			ctx->nopersistent = true;
1438			if (ctx->persistent) {
1439				cifs_errorf(fc, "persistenthandles mount options conflict\n");
1440				goto cifs_parse_mount_err;
1441			}
1442		} else {
1443			ctx->persistent = true;
1444			if ((ctx->nopersistent) || (ctx->resilient)) {
1445				cifs_errorf(fc, "persistenthandles mount options conflict\n");
1446				goto cifs_parse_mount_err;
1447			}
1448		}
1449		break;
1450	case Opt_resilient:
1451		if (result.negated) {
1452			ctx->resilient = false; /* already the default */
1453		} else {
1454			ctx->resilient = true;
1455			if (ctx->persistent) {
1456				cifs_errorf(fc, "persistenthandles mount options conflict\n");
1457				goto cifs_parse_mount_err;
1458			}
1459		}
1460		break;
1461	case Opt_tcp_nodelay:
1462		/* tcp nodelay should not usually be needed since we CORK/UNCORK the socket */
1463		if (result.negated)
1464			ctx->sockopt_tcp_nodelay = false;
1465		else
1466			ctx->sockopt_tcp_nodelay = true;
1467		break;
1468	case Opt_domainauto:
1469		ctx->domainauto = true;
1470		break;
1471	case Opt_rdma:
1472		ctx->rdma = true;
1473		break;
1474	}
1475	/* case Opt_ignore: - is ignored as expected ... */
1476
1477	return 0;
1478
1479 cifs_parse_mount_err:
1480	kfree_sensitive(ctx->password);
1481	return -EINVAL;
1482}
1483
1484int smb3_init_fs_context(struct fs_context *fc)
1485{
1486	struct smb3_fs_context *ctx;
1487	char *nodename = utsname()->nodename;
1488	int i;
1489
1490	ctx = kzalloc(sizeof(struct smb3_fs_context), GFP_KERNEL);
1491	if (unlikely(!ctx))
1492		return -ENOMEM;
1493
1494	strscpy(ctx->workstation_name, nodename, sizeof(ctx->workstation_name));
1495
1496	/*
1497	 * does not have to be perfect mapping since field is
1498	 * informational, only used for servers that do not support
1499	 * port 445 and it can be overridden at mount time
1500	 */
1501	memset(ctx->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1502	for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1503		ctx->source_rfc1001_name[i] = toupper(nodename[i]);
1504
1505	ctx->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1506	/*
1507	 * null target name indicates to use *SMBSERVR default called name
1508	 *  if we end up sending RFC1001 session initialize
1509	 */
1510	ctx->target_rfc1001_name[0] = 0;
1511	ctx->cred_uid = current_uid();
1512	ctx->linux_uid = current_uid();
1513	ctx->linux_gid = current_gid();
1514	/* By default 4MB read ahead size, 1MB block size */
1515	ctx->bsize = CIFS_DEFAULT_IOSIZE; /* can improve cp performance significantly */
1516	ctx->rasize = 0; /* 0 = use default (ie negotiated rsize) for read ahead pages */
1517
1518	/*
1519	 * default to SFM style remapping of seven reserved characters
1520	 * unless user overrides it or we negotiate CIFS POSIX where
1521	 * it is unnecessary.  Can not simultaneously use more than one mapping
1522	 * since then readdir could list files that open could not open
1523	 */
1524	ctx->remap = true;
1525
1526	/* default to only allowing write access to owner of the mount */
1527	ctx->dir_mode = ctx->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1528
1529	/* ctx->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1530	/* default is always to request posix paths. */
1531	ctx->posix_paths = 1;
1532	/* default to using server inode numbers where available */
1533	ctx->server_ino = 1;
1534
1535	/* default is to use strict cifs caching semantics */
1536	ctx->strict_io = true;
1537
1538	ctx->acregmax = CIFS_DEF_ACTIMEO;
1539	ctx->acdirmax = CIFS_DEF_ACTIMEO;
1540	ctx->closetimeo = SMB3_DEF_DCLOSETIMEO;
1541
1542	/* Most clients set timeout to 0, allows server to use its default */
1543	ctx->handle_timeout = 0; /* See MS-SMB2 spec section 2.2.14.2.12 */
1544
1545	/* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1546	ctx->ops = &smb30_operations;
1547	ctx->vals = &smbdefault_values;
1548
1549	ctx->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1550
1551	/* default to no multichannel (single server connection) */
1552	ctx->multichannel = false;
1553	ctx->max_channels = 1;
1554
1555	ctx->backupuid_specified = false; /* no backup intent for a user */
1556	ctx->backupgid_specified = false; /* no backup intent for a group */
1557
1558/*
1559 *	short int override_uid = -1;
1560 *	short int override_gid = -1;
1561 *	char *nodename = strdup(utsname()->nodename);
1562 *	struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1563 */
1564
1565	fc->fs_private = ctx;
1566	fc->ops = &smb3_fs_context_ops;
1567	return 0;
1568}
1569
1570void
1571smb3_cleanup_fs_context_contents(struct smb3_fs_context *ctx)
1572{
1573	if (ctx == NULL)
1574		return;
1575
1576	/*
1577	 * Make sure this stays in sync with smb3_fs_context_dup()
1578	 */
 
 
1579	kfree(ctx->username);
1580	ctx->username = NULL;
1581	kfree_sensitive(ctx->password);
1582	ctx->password = NULL;
1583	kfree(ctx->server_hostname);
1584	ctx->server_hostname = NULL;
1585	kfree(ctx->UNC);
1586	ctx->UNC = NULL;
1587	kfree(ctx->source);
1588	ctx->source = NULL;
1589	kfree(ctx->domainname);
1590	ctx->domainname = NULL;
1591	kfree(ctx->nodename);
1592	ctx->nodename = NULL;
1593	kfree(ctx->iocharset);
1594	ctx->iocharset = NULL;
1595	kfree(ctx->prepath);
1596	ctx->prepath = NULL;
1597	kfree(ctx->leaf_fullpath);
1598	ctx->leaf_fullpath = NULL;
1599}
1600
1601void
1602smb3_cleanup_fs_context(struct smb3_fs_context *ctx)
1603{
1604	if (!ctx)
1605		return;
1606	smb3_cleanup_fs_context_contents(ctx);
1607	kfree(ctx);
1608}
1609
1610void smb3_update_mnt_flags(struct cifs_sb_info *cifs_sb)
1611{
1612	struct smb3_fs_context *ctx = cifs_sb->ctx;
1613
1614	if (ctx->nodfs)
1615		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_DFS;
1616	else
1617		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NO_DFS;
1618
1619	if (ctx->noperm)
1620		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
1621	else
1622		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NO_PERM;
1623
1624	if (ctx->setuids)
1625		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
1626	else
1627		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_SET_UID;
1628
1629	if (ctx->setuidfromacl)
1630		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
1631	else
1632		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_UID_FROM_ACL;
1633
1634	if (ctx->server_ino)
1635		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
1636	else
1637		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_SERVER_INUM;
1638
1639	if (ctx->remap)
1640		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
1641	else
1642		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_MAP_SFM_CHR;
1643
1644	if (ctx->sfu_remap)
1645		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
1646	else
1647		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_MAP_SPECIAL_CHR;
1648
1649	if (ctx->no_xattr)
1650		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
1651	else
1652		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NO_XATTR;
1653
1654	if (ctx->sfu_emul)
1655		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
1656	else
1657		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_UNX_EMUL;
1658
1659	if (ctx->nobrl)
1660		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
1661	else
1662		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NO_BRL;
1663
1664	if (ctx->nohandlecache)
1665		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_HANDLE_CACHE;
1666	else
1667		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NO_HANDLE_CACHE;
1668
1669	if (ctx->nostrictsync)
1670		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
1671	else
1672		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NOSSYNC;
1673
1674	if (ctx->mand_lock)
1675		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
1676	else
1677		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NOPOSIXBRL;
1678
1679	if (ctx->rwpidforward)
1680		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
1681	else
1682		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_RWPIDFORWARD;
1683
1684	if (ctx->mode_ace)
1685		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MODE_FROM_SID;
1686	else
1687		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_MODE_FROM_SID;
1688
1689	if (ctx->cifs_acl)
1690		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
1691	else
1692		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_CIFS_ACL;
1693
1694	if (ctx->backupuid_specified)
1695		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
1696	else
1697		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_CIFS_BACKUPUID;
1698
1699	if (ctx->backupgid_specified)
1700		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
1701	else
1702		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_CIFS_BACKUPGID;
1703
1704	if (ctx->override_uid)
1705		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
1706	else
1707		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_OVERR_UID;
1708
1709	if (ctx->override_gid)
1710		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
1711	else
1712		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_OVERR_GID;
1713
1714	if (ctx->dynperm)
1715		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
1716	else
1717		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_DYNPERM;
1718
1719	if (ctx->fsc)
1720		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
1721	else
1722		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_FSCACHE;
1723
1724	if (ctx->multiuser)
1725		cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
1726					    CIFS_MOUNT_NO_PERM);
1727	else
1728		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_MULTIUSER;
1729
1730
1731	if (ctx->strict_io)
1732		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
1733	else
1734		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_STRICT_IO;
1735
1736	if (ctx->direct_io)
1737		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
1738	else
1739		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_DIRECT_IO;
1740
1741	if (ctx->mfsymlinks)
1742		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
1743	else
1744		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_MF_SYMLINKS;
1745	if (ctx->mfsymlinks) {
1746		if (ctx->sfu_emul) {
1747			/*
1748			 * Our SFU ("Services for Unix" emulation does not allow
1749			 * creating symlinks but does allow reading existing SFU
1750			 * symlinks (it does allow both creating and reading SFU
1751			 * style mknod and FIFOs though). When "mfsymlinks" and
1752			 * "sfu" are both enabled at the same time, it allows
1753			 * reading both types of symlinks, but will only create
1754			 * them with mfsymlinks format. This allows better
1755			 * Apple compatibility (probably better for Samba too)
1756			 * while still recognizing old Windows style symlinks.
1757			 */
1758			cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
1759		}
1760	}
1761	cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_SHUTDOWN;
1762
1763	return;
1764}
v5.14.15
   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
 
 
  40static 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
  54static 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_ntlm, "ntlm" },
  61	{ Opt_sec_ntlmi, "ntlmi" },
  62	{ Opt_sec_ntlmv2, "nontlm" },
  63	{ Opt_sec_ntlmv2, "ntlmv2" },
  64	{ Opt_sec_ntlmv2i, "ntlmv2i" },
  65	{ Opt_sec_lanman, "lanman" },
  66	{ Opt_sec_none, "none" },
  67
  68	{ Opt_sec_err, NULL }
  69};
  70
  71const struct fs_parameter_spec smb3_fs_parameters[] = {
  72	/* Mount options that take no arguments */
  73	fsparam_flag_no("user_xattr", Opt_user_xattr),
  74	fsparam_flag_no("forceuid", Opt_forceuid),
  75	fsparam_flag_no("multichannel", Opt_multichannel),
  76	fsparam_flag_no("forcegid", Opt_forcegid),
  77	fsparam_flag("noblocksend", Opt_noblocksend),
  78	fsparam_flag("noautotune", Opt_noautotune),
  79	fsparam_flag("nolease", Opt_nolease),
  80	fsparam_flag_no("hard", Opt_hard),
  81	fsparam_flag_no("soft", Opt_soft),
  82	fsparam_flag_no("perm", Opt_perm),
  83	fsparam_flag("nodelete", Opt_nodelete),
  84	fsparam_flag_no("mapposix", Opt_mapposix),
  85	fsparam_flag("mapchars", Opt_mapchars),
  86	fsparam_flag("nomapchars", Opt_nomapchars),
  87	fsparam_flag_no("sfu", Opt_sfu),
  88	fsparam_flag("nodfs", Opt_nodfs),
  89	fsparam_flag_no("posixpaths", Opt_posixpaths),
  90	fsparam_flag_no("unix", Opt_unix),
  91	fsparam_flag_no("linux", Opt_unix),
  92	fsparam_flag_no("posix", Opt_unix),
  93	fsparam_flag("nocase", Opt_nocase),
  94	fsparam_flag("ignorecase", Opt_nocase),
  95	fsparam_flag_no("brl", Opt_brl),
  96	fsparam_flag_no("handlecache", Opt_handlecache),
  97	fsparam_flag("forcemandatorylock", Opt_forcemandatorylock),
  98	fsparam_flag("forcemand", Opt_forcemandatorylock),
  99	fsparam_flag("setuidfromacl", Opt_setuidfromacl),
 100	fsparam_flag("idsfromsid", Opt_setuidfromacl),
 101	fsparam_flag_no("setuids", Opt_setuids),
 102	fsparam_flag_no("dynperm", Opt_dynperm),
 103	fsparam_flag_no("intr", Opt_intr),
 104	fsparam_flag_no("strictsync", Opt_strictsync),
 105	fsparam_flag_no("serverino", Opt_serverino),
 106	fsparam_flag("rwpidforward", Opt_rwpidforward),
 107	fsparam_flag("cifsacl", Opt_cifsacl),
 108	fsparam_flag_no("acl", Opt_acl),
 109	fsparam_flag("locallease", Opt_locallease),
 110	fsparam_flag("sign", Opt_sign),
 111	fsparam_flag("ignore_signature", Opt_ignore_signature),
 112	fsparam_flag("signloosely", Opt_ignore_signature),
 113	fsparam_flag("seal", Opt_seal),
 114	fsparam_flag("noac", Opt_noac),
 115	fsparam_flag("fsc", Opt_fsc),
 116	fsparam_flag("mfsymlinks", Opt_mfsymlinks),
 117	fsparam_flag("multiuser", Opt_multiuser),
 118	fsparam_flag("sloppy", Opt_sloppy),
 119	fsparam_flag("nosharesock", Opt_nosharesock),
 120	fsparam_flag_no("persistenthandles", Opt_persistent),
 121	fsparam_flag_no("resilienthandles", Opt_resilient),
 
 
 122	fsparam_flag("domainauto", Opt_domainauto),
 123	fsparam_flag("rdma", Opt_rdma),
 124	fsparam_flag("modesid", Opt_modesid),
 125	fsparam_flag("modefromsid", Opt_modesid),
 126	fsparam_flag("rootfs", Opt_rootfs),
 127	fsparam_flag("compress", Opt_compress),
 128	fsparam_flag("witness", Opt_witness),
 129
 130	/* Mount options which take numeric value */
 131	fsparam_u32("backupuid", Opt_backupuid),
 132	fsparam_u32("backupgid", Opt_backupgid),
 133	fsparam_u32("uid", Opt_uid),
 134	fsparam_u32("cruid", Opt_cruid),
 135	fsparam_u32("gid", Opt_gid),
 136	fsparam_u32("file_mode", Opt_file_mode),
 137	fsparam_u32("dirmode", Opt_dirmode),
 138	fsparam_u32("dir_mode", Opt_dirmode),
 139	fsparam_u32("port", Opt_port),
 140	fsparam_u32("min_enc_offload", Opt_min_enc_offload),
 141	fsparam_u32("esize", Opt_min_enc_offload),
 142	fsparam_u32("bsize", Opt_blocksize),
 143	fsparam_u32("rasize", Opt_rasize),
 144	fsparam_u32("rsize", Opt_rsize),
 145	fsparam_u32("wsize", Opt_wsize),
 146	fsparam_u32("actimeo", Opt_actimeo),
 147	fsparam_u32("acdirmax", Opt_acdirmax),
 148	fsparam_u32("acregmax", Opt_acregmax),
 
 149	fsparam_u32("echo_interval", Opt_echo_interval),
 150	fsparam_u32("max_credits", Opt_max_credits),
 151	fsparam_u32("handletimeout", Opt_handletimeout),
 152	fsparam_u32("snapshot", Opt_snapshot),
 153	fsparam_u32("max_channels", Opt_max_channels),
 154
 155	/* Mount options which take string value */
 156	fsparam_string("source", Opt_source),
 157	fsparam_string("user", Opt_user),
 158	fsparam_string("username", Opt_user),
 159	fsparam_string("pass", Opt_pass),
 160	fsparam_string("password", Opt_pass),
 161	fsparam_string("ip", Opt_ip),
 162	fsparam_string("addr", Opt_ip),
 163	fsparam_string("domain", Opt_domain),
 164	fsparam_string("dom", Opt_domain),
 165	fsparam_string("srcaddr", Opt_srcaddr),
 166	fsparam_string("iocharset", Opt_iocharset),
 167	fsparam_string("netbiosname", Opt_netbiosname),
 168	fsparam_string("servern", Opt_servern),
 169	fsparam_string("ver", Opt_ver),
 170	fsparam_string("vers", Opt_vers),
 171	fsparam_string("sec", Opt_sec),
 172	fsparam_string("cache", Opt_cache),
 173
 174	/* Arguments that should be ignored */
 175	fsparam_flag("guest", Opt_ignore),
 176	fsparam_flag("noatime", Opt_ignore),
 177	fsparam_flag("relatime", Opt_ignore),
 178	fsparam_flag("_netdev", Opt_ignore),
 179	fsparam_flag_no("suid", Opt_ignore),
 180	fsparam_flag_no("exec", Opt_ignore),
 181	fsparam_flag_no("dev", Opt_ignore),
 182	fsparam_flag_no("mand", Opt_ignore),
 183	fsparam_flag_no("auto", Opt_ignore),
 184	fsparam_string("cred", Opt_ignore),
 185	fsparam_string("credentials", Opt_ignore),
 186	/*
 187	 * UNC and prefixpath is now extracted from Opt_source
 188	 * in the new mount API so we can just ignore them going forward.
 189	 */
 190	fsparam_string("unc", Opt_ignore),
 191	fsparam_string("prefixpath", Opt_ignore),
 192	{}
 193};
 194
 195static int
 196cifs_parse_security_flavors(struct fs_context *fc, char *value, struct smb3_fs_context *ctx)
 197{
 198
 199	substring_t args[MAX_OPT_ARGS];
 200
 201	/*
 202	 * With mount options, the last one should win. Reset any existing
 203	 * settings back to default.
 204	 */
 205	ctx->sectype = Unspecified;
 206	ctx->sign = false;
 207
 208	switch (match_token(value, cifs_secflavor_tokens, args)) {
 209	case Opt_sec_krb5p:
 210		cifs_errorf(fc, "sec=krb5p is not supported!\n");
 211		return 1;
 212	case Opt_sec_krb5i:
 213		ctx->sign = true;
 214		fallthrough;
 215	case Opt_sec_krb5:
 216		ctx->sectype = Kerberos;
 217		break;
 218	case Opt_sec_ntlmsspi:
 219		ctx->sign = true;
 220		fallthrough;
 221	case Opt_sec_ntlmssp:
 222		ctx->sectype = RawNTLMSSP;
 223		break;
 224	case Opt_sec_ntlmi:
 225		ctx->sign = true;
 226		fallthrough;
 227	case Opt_ntlm:
 228		ctx->sectype = NTLM;
 229		break;
 230	case Opt_sec_ntlmv2i:
 231		ctx->sign = true;
 232		fallthrough;
 233	case Opt_sec_ntlmv2:
 234		ctx->sectype = NTLMv2;
 235		break;
 236#ifdef CONFIG_CIFS_WEAK_PW_HASH
 237	case Opt_sec_lanman:
 238		ctx->sectype = LANMAN;
 239		break;
 240#endif
 241	case Opt_sec_none:
 242		ctx->nullauth = 1;
 243		break;
 244	default:
 245		cifs_errorf(fc, "bad security option: %s\n", value);
 246		return 1;
 247	}
 248
 249	return 0;
 250}
 251
 252static const match_table_t cifs_cacheflavor_tokens = {
 253	{ Opt_cache_loose, "loose" },
 254	{ Opt_cache_strict, "strict" },
 255	{ Opt_cache_none, "none" },
 256	{ Opt_cache_ro, "ro" },
 257	{ Opt_cache_rw, "singleclient" },
 258	{ Opt_cache_err, NULL }
 259};
 260
 261static int
 262cifs_parse_cache_flavor(struct fs_context *fc, char *value, struct smb3_fs_context *ctx)
 263{
 264	substring_t args[MAX_OPT_ARGS];
 265
 266	switch (match_token(value, cifs_cacheflavor_tokens, args)) {
 267	case Opt_cache_loose:
 268		ctx->direct_io = false;
 269		ctx->strict_io = false;
 270		ctx->cache_ro = false;
 271		ctx->cache_rw = false;
 272		break;
 273	case Opt_cache_strict:
 274		ctx->direct_io = false;
 275		ctx->strict_io = true;
 276		ctx->cache_ro = false;
 277		ctx->cache_rw = false;
 278		break;
 279	case Opt_cache_none:
 280		ctx->direct_io = true;
 281		ctx->strict_io = false;
 282		ctx->cache_ro = false;
 283		ctx->cache_rw = false;
 284		break;
 285	case Opt_cache_ro:
 286		ctx->direct_io = false;
 287		ctx->strict_io = false;
 288		ctx->cache_ro = true;
 289		ctx->cache_rw = false;
 290		break;
 291	case Opt_cache_rw:
 292		ctx->direct_io = false;
 293		ctx->strict_io = false;
 294		ctx->cache_ro = false;
 295		ctx->cache_rw = true;
 296		break;
 297	default:
 298		cifs_errorf(fc, "bad cache= option: %s\n", value);
 299		return 1;
 300	}
 301	return 0;
 302}
 303
 304#define DUP_CTX_STR(field)						\
 305do {									\
 306	if (ctx->field) {						\
 307		new_ctx->field = kstrdup(ctx->field, GFP_ATOMIC);	\
 308		if (new_ctx->field == NULL) {				\
 309			smb3_cleanup_fs_context_contents(new_ctx);	\
 310			return -ENOMEM;					\
 311		}							\
 312	}								\
 313} while (0)
 314
 315int
 316smb3_fs_context_dup(struct smb3_fs_context *new_ctx, struct smb3_fs_context *ctx)
 317{
 318	memcpy(new_ctx, ctx, sizeof(*ctx));
 319	new_ctx->prepath = NULL;
 320	new_ctx->mount_options = NULL;
 321	new_ctx->nodename = NULL;
 322	new_ctx->username = NULL;
 323	new_ctx->password = NULL;
 
 324	new_ctx->domainname = NULL;
 325	new_ctx->UNC = NULL;
 326	new_ctx->source = NULL;
 327	new_ctx->iocharset = NULL;
 
 328	/*
 329	 * Make sure to stay in sync with smb3_cleanup_fs_context_contents()
 330	 */
 331	DUP_CTX_STR(prepath);
 332	DUP_CTX_STR(mount_options);
 333	DUP_CTX_STR(username);
 334	DUP_CTX_STR(password);
 
 335	DUP_CTX_STR(UNC);
 336	DUP_CTX_STR(source);
 337	DUP_CTX_STR(domainname);
 338	DUP_CTX_STR(nodename);
 339	DUP_CTX_STR(iocharset);
 
 340
 341	return 0;
 342}
 343
 344static int
 345cifs_parse_smb_version(struct fs_context *fc, char *value, struct smb3_fs_context *ctx, bool is_smb3)
 346{
 347	substring_t args[MAX_OPT_ARGS];
 348
 349	switch (match_token(value, cifs_smb_version_tokens, args)) {
 350#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
 351	case Smb_1:
 352		if (disable_legacy_dialects) {
 353			cifs_errorf(fc, "mount with legacy dialect disabled\n");
 354			return 1;
 355		}
 356		if (is_smb3) {
 357			cifs_errorf(fc, "vers=1.0 (cifs) not permitted when mounting with smb3\n");
 358			return 1;
 359		}
 360		cifs_errorf(fc, "Use of the less secure dialect vers=1.0 is not recommended unless required for access to very old servers\n");
 361		ctx->ops = &smb1_operations;
 362		ctx->vals = &smb1_values;
 363		break;
 364	case Smb_20:
 365		if (disable_legacy_dialects) {
 366			cifs_errorf(fc, "mount with legacy dialect disabled\n");
 367			return 1;
 368		}
 369		if (is_smb3) {
 370			cifs_errorf(fc, "vers=2.0 not permitted when mounting with smb3\n");
 371			return 1;
 372		}
 373		ctx->ops = &smb20_operations;
 374		ctx->vals = &smb20_values;
 375		break;
 376#else
 377	case Smb_1:
 378		cifs_errorf(fc, "vers=1.0 (cifs) mount not permitted when legacy dialects disabled\n");
 379		return 1;
 380	case Smb_20:
 381		cifs_errorf(fc, "vers=2.0 mount not permitted when legacy dialects disabled\n");
 382		return 1;
 383#endif /* CIFS_ALLOW_INSECURE_LEGACY */
 384	case Smb_21:
 385		ctx->ops = &smb21_operations;
 386		ctx->vals = &smb21_values;
 387		break;
 388	case Smb_30:
 389		ctx->ops = &smb30_operations;
 390		ctx->vals = &smb30_values;
 391		break;
 392	case Smb_302:
 393		ctx->ops = &smb30_operations; /* currently identical with 3.0 */
 394		ctx->vals = &smb302_values;
 395		break;
 396	case Smb_311:
 397		ctx->ops = &smb311_operations;
 398		ctx->vals = &smb311_values;
 399		break;
 400	case Smb_3any:
 401		ctx->ops = &smb30_operations; /* currently identical with 3.0 */
 402		ctx->vals = &smb3any_values;
 403		break;
 404	case Smb_default:
 405		ctx->ops = &smb30_operations;
 406		ctx->vals = &smbdefault_values;
 407		break;
 408	default:
 409		cifs_errorf(fc, "Unknown vers= option specified: %s\n", value);
 410		return 1;
 411	}
 412	return 0;
 413}
 414
 415int smb3_parse_opt(const char *options, const char *key, char **val)
 416{
 417	int rc = -ENOENT;
 418	char *opts, *orig, *p;
 419
 420	orig = opts = kstrdup(options, GFP_KERNEL);
 421	if (!opts)
 422		return -ENOMEM;
 423
 424	while ((p = strsep(&opts, ","))) {
 425		char *nval;
 426
 427		if (!*p)
 428			continue;
 429		if (strncasecmp(p, key, strlen(key)))
 430			continue;
 431		nval = strchr(p, '=');
 432		if (nval) {
 433			if (nval == p)
 434				continue;
 435			*nval++ = 0;
 436			*val = kstrdup(nval, GFP_KERNEL);
 437			rc = !*val ? -ENOMEM : 0;
 438			goto out;
 439		}
 440	}
 441out:
 442	kfree(orig);
 443	return rc;
 444}
 445
 446/*
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 447 * Parse a devname into substrings and populate the ctx->UNC and ctx->prepath
 448 * fields with the result. Returns 0 on success and an error otherwise
 449 * (e.g. ENOMEM or EINVAL)
 450 */
 451int
 452smb3_parse_devname(const char *devname, struct smb3_fs_context *ctx)
 453{
 454	char *pos;
 455	const char *delims = "/\\";
 456	size_t len;
 457
 458	if (unlikely(!devname || !*devname)) {
 459		cifs_dbg(VFS, "Device name not specified\n");
 460		return -EINVAL;
 461	}
 462
 463	/* make sure we have a valid UNC double delimiter prefix */
 464	len = strspn(devname, delims);
 465	if (len != 2)
 466		return -EINVAL;
 467
 468	/* find delimiter between host and sharename */
 469	pos = strpbrk(devname + 2, delims);
 470	if (!pos)
 471		return -EINVAL;
 472
 
 
 
 
 
 
 473	/* skip past delimiter */
 474	++pos;
 475
 476	/* now go until next delimiter or end of string */
 477	len = strcspn(pos, delims);
 478
 479	/* move "pos" up to delimiter or NULL */
 480	pos += len;
 481	kfree(ctx->UNC);
 482	ctx->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
 483	if (!ctx->UNC)
 484		return -ENOMEM;
 485
 486	convert_delimiter(ctx->UNC, '\\');
 487
 488	/* skip any delimiter */
 489	if (*pos == '/' || *pos == '\\')
 490		pos++;
 491
 492	kfree(ctx->prepath);
 493	ctx->prepath = NULL;
 494
 495	/* If pos is NULL then no prepath */
 496	if (!*pos)
 497		return 0;
 498
 499	ctx->prepath = kstrdup(pos, GFP_KERNEL);
 500	if (!ctx->prepath)
 501		return -ENOMEM;
 502
 503	return 0;
 504}
 505
 506static void smb3_fs_context_free(struct fs_context *fc);
 507static int smb3_fs_context_parse_param(struct fs_context *fc,
 508				       struct fs_parameter *param);
 509static int smb3_fs_context_parse_monolithic(struct fs_context *fc,
 510					    void *data);
 511static int smb3_get_tree(struct fs_context *fc);
 512static int smb3_reconfigure(struct fs_context *fc);
 513
 514static const struct fs_context_operations smb3_fs_context_ops = {
 515	.free			= smb3_fs_context_free,
 516	.parse_param		= smb3_fs_context_parse_param,
 517	.parse_monolithic	= smb3_fs_context_parse_monolithic,
 518	.get_tree		= smb3_get_tree,
 519	.reconfigure		= smb3_reconfigure,
 520};
 521
 522/*
 523 * Parse a monolithic block of data from sys_mount().
 524 * smb3_fs_context_parse_monolithic - Parse key[=val][,key[=val]]* mount data
 525 * @ctx: The superblock configuration to fill in.
 526 * @data: The data to parse
 527 *
 528 * Parse a blob of data that's in key[=val][,key[=val]]* form.  This can be
 529 * called from the ->monolithic_mount_data() fs_context operation.
 530 *
 531 * Returns 0 on success or the error returned by the ->parse_option() fs_context
 532 * operation on failure.
 533 */
 534static int smb3_fs_context_parse_monolithic(struct fs_context *fc,
 535					   void *data)
 536{
 537	struct smb3_fs_context *ctx = smb3_fc2context(fc);
 538	char *options = data, *key;
 539	int ret = 0;
 540
 541	if (!options)
 542		return 0;
 543
 544	ctx->mount_options = kstrdup(data, GFP_KERNEL);
 545	if (ctx->mount_options == NULL)
 546		return -ENOMEM;
 547
 548	ret = security_sb_eat_lsm_opts(options, &fc->security);
 549	if (ret)
 550		return ret;
 551
 552	/* BB Need to add support for sep= here TBD */
 553	while ((key = strsep(&options, ",")) != NULL) {
 554		size_t len;
 555		char *value;
 556
 557		if (*key == 0)
 558			break;
 559
 560		/* Check if following character is the deliminator If yes,
 561		 * we have encountered a double deliminator reset the NULL
 562		 * character to the deliminator
 563		 */
 564		while (options && options[0] == ',') {
 565			len = strlen(key);
 566			strcpy(key + len, options);
 567			options = strchr(options, ',');
 568			if (options)
 569				*options++ = 0;
 570		}
 571
 572
 573		len = 0;
 574		value = strchr(key, '=');
 575		if (value) {
 576			if (value == key)
 577				continue;
 578			*value++ = 0;
 579			len = strlen(value);
 580		}
 581
 582		ret = vfs_parse_fs_string(fc, key, value, len);
 583		if (ret < 0)
 584			break;
 585	}
 586
 587	return ret;
 588}
 589
 590/*
 591 * Validate the preparsed information in the config.
 592 */
 593static int smb3_fs_context_validate(struct fs_context *fc)
 594{
 595	struct smb3_fs_context *ctx = smb3_fc2context(fc);
 596
 597	if (ctx->rdma && ctx->vals->protocol_id < SMB30_PROT_ID) {
 598		cifs_errorf(fc, "SMB Direct requires Version >=3.0\n");
 599		return -EOPNOTSUPP;
 600	}
 601
 602#ifndef CONFIG_KEYS
 603	/* Muliuser mounts require CONFIG_KEYS support */
 604	if (ctx->multiuser) {
 605		cifs_errorf(fc, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
 606		return -1;
 607	}
 608#endif
 609
 610	if (ctx->got_version == false)
 611		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");
 612
 613
 614	if (!ctx->UNC) {
 615		cifs_errorf(fc, "CIFS mount error: No usable UNC path provided in device string!\n");
 616		return -1;
 617	}
 618
 619	/* make sure UNC has a share name */
 620	if (strlen(ctx->UNC) < 3 || !strchr(ctx->UNC + 3, '\\')) {
 621		cifs_errorf(fc, "Malformed UNC. Unable to find share name.\n");
 622		return -ENOENT;
 623	}
 624
 625	if (!ctx->got_ip) {
 626		int len;
 627		const char *slash;
 628
 629		/* No ip= option specified? Try to get it from UNC */
 630		/* Use the address part of the UNC. */
 631		slash = strchr(&ctx->UNC[2], '\\');
 632		len = slash - &ctx->UNC[2];
 633		if (!cifs_convert_address((struct sockaddr *)&ctx->dstaddr,
 634					  &ctx->UNC[2], len)) {
 635			pr_err("Unable to determine destination address\n");
 636			return -EHOSTUNREACH;
 637		}
 638	}
 639
 640	/* set the port that we got earlier */
 641	cifs_set_port((struct sockaddr *)&ctx->dstaddr, ctx->port);
 642
 643	if (ctx->override_uid && !ctx->uid_specified) {
 644		ctx->override_uid = 0;
 645		pr_notice("ignoring forceuid mount option specified with no uid= option\n");
 646	}
 647
 648	if (ctx->override_gid && !ctx->gid_specified) {
 649		ctx->override_gid = 0;
 650		pr_notice("ignoring forcegid mount option specified with no gid= option\n");
 651	}
 652
 653	return 0;
 654}
 655
 656static int smb3_get_tree_common(struct fs_context *fc)
 657{
 658	struct smb3_fs_context *ctx = smb3_fc2context(fc);
 659	struct dentry *root;
 660	int rc = 0;
 661
 662	root = cifs_smb3_do_mount(fc->fs_type, 0, ctx);
 663	if (IS_ERR(root))
 664		return PTR_ERR(root);
 665
 666	fc->root = root;
 667
 668	return rc;
 669}
 670
 671/*
 672 * Create an SMB3 superblock from the parameters passed.
 673 */
 674static int smb3_get_tree(struct fs_context *fc)
 675{
 676	int err = smb3_fs_context_validate(fc);
 
 677
 678	if (err)
 679		return err;
 680	return smb3_get_tree_common(fc);
 
 
 
 681}
 682
 683static void smb3_fs_context_free(struct fs_context *fc)
 684{
 685	struct smb3_fs_context *ctx = smb3_fc2context(fc);
 686
 687	smb3_cleanup_fs_context(ctx);
 688}
 689
 690/*
 691 * Compare the old and new proposed context during reconfigure
 692 * and check if the changes are compatible.
 693 */
 694static int smb3_verify_reconfigure_ctx(struct fs_context *fc,
 695				       struct smb3_fs_context *new_ctx,
 696				       struct smb3_fs_context *old_ctx)
 697{
 698	if (new_ctx->posix_paths != old_ctx->posix_paths) {
 699		cifs_errorf(fc, "can not change posixpaths during remount\n");
 700		return -EINVAL;
 701	}
 702	if (new_ctx->sectype != old_ctx->sectype) {
 703		cifs_errorf(fc, "can not change sec during remount\n");
 704		return -EINVAL;
 705	}
 706	if (new_ctx->multiuser != old_ctx->multiuser) {
 707		cifs_errorf(fc, "can not change multiuser during remount\n");
 708		return -EINVAL;
 709	}
 710	if (new_ctx->UNC &&
 711	    (!old_ctx->UNC || strcmp(new_ctx->UNC, old_ctx->UNC))) {
 712		cifs_errorf(fc, "can not change UNC during remount\n");
 713		return -EINVAL;
 714	}
 715	if (new_ctx->username &&
 716	    (!old_ctx->username || strcmp(new_ctx->username, old_ctx->username))) {
 717		cifs_errorf(fc, "can not change username during remount\n");
 718		return -EINVAL;
 719	}
 720	if (new_ctx->password &&
 721	    (!old_ctx->password || strcmp(new_ctx->password, old_ctx->password))) {
 722		cifs_errorf(fc, "can not change password during remount\n");
 723		return -EINVAL;
 724	}
 725	if (new_ctx->domainname &&
 726	    (!old_ctx->domainname || strcmp(new_ctx->domainname, old_ctx->domainname))) {
 727		cifs_errorf(fc, "can not change domainname during remount\n");
 728		return -EINVAL;
 729	}
 
 
 
 
 730	if (new_ctx->nodename &&
 731	    (!old_ctx->nodename || strcmp(new_ctx->nodename, old_ctx->nodename))) {
 732		cifs_errorf(fc, "can not change nodename during remount\n");
 733		return -EINVAL;
 734	}
 735	if (new_ctx->iocharset &&
 736	    (!old_ctx->iocharset || strcmp(new_ctx->iocharset, old_ctx->iocharset))) {
 737		cifs_errorf(fc, "can not change iocharset during remount\n");
 738		return -EINVAL;
 739	}
 740
 741	return 0;
 742}
 743
 744#define STEAL_STRING(cifs_sb, ctx, field)				\
 745do {									\
 746	kfree(ctx->field);						\
 747	ctx->field = cifs_sb->ctx->field;				\
 748	cifs_sb->ctx->field = NULL;					\
 749} while (0)
 750
 
 
 
 
 
 
 
 751static int smb3_reconfigure(struct fs_context *fc)
 752{
 753	struct smb3_fs_context *ctx = smb3_fc2context(fc);
 754	struct dentry *root = fc->root;
 755	struct cifs_sb_info *cifs_sb = CIFS_SB(root->d_sb);
 756	int rc;
 757
 758	rc = smb3_verify_reconfigure_ctx(fc, ctx, cifs_sb->ctx);
 759	if (rc)
 760		return rc;
 761
 762	/*
 763	 * We can not change UNC/username/password/domainname/nodename/iocharset
 
 764	 * during reconnect so ignore what we have in the new context and
 765	 * just use what we already have in cifs_sb->ctx.
 766	 */
 767	STEAL_STRING(cifs_sb, ctx, UNC);
 768	STEAL_STRING(cifs_sb, ctx, source);
 769	STEAL_STRING(cifs_sb, ctx, username);
 770	STEAL_STRING(cifs_sb, ctx, password);
 771	STEAL_STRING(cifs_sb, ctx, domainname);
 772	STEAL_STRING(cifs_sb, ctx, nodename);
 773	STEAL_STRING(cifs_sb, ctx, iocharset);
 774
 775	/* if rsize or wsize not passed in on remount, use previous values */
 776	if (ctx->rsize == 0)
 777		ctx->rsize = cifs_sb->ctx->rsize;
 778	if (ctx->wsize == 0)
 779		ctx->wsize = cifs_sb->ctx->wsize;
 780
 781
 782	smb3_cleanup_fs_context_contents(cifs_sb->ctx);
 783	rc = smb3_fs_context_dup(cifs_sb->ctx, ctx);
 784	smb3_update_mnt_flags(cifs_sb);
 785#ifdef CONFIG_CIFS_DFS_UPCALL
 786	if (!rc)
 787		rc = dfs_cache_remount_fs(cifs_sb);
 788#endif
 789
 790	return rc;
 791}
 792
 793static int smb3_fs_context_parse_param(struct fs_context *fc,
 794				      struct fs_parameter *param)
 795{
 796	struct fs_parse_result result;
 797	struct smb3_fs_context *ctx = smb3_fc2context(fc);
 798	int i, opt;
 799	bool is_smb3 = !strcmp(fc->fs_type->name, "smb3");
 800	bool skip_parsing = false;
 801	kuid_t uid;
 802	kgid_t gid;
 803
 804	cifs_dbg(FYI, "CIFS: parsing cifs mount option '%s'\n", param->key);
 805
 806	/*
 807	 * fs_parse can not handle string options with an empty value so
 808	 * we will need special handling of them.
 809	 */
 810	if (param->type == fs_value_is_string && param->string[0] == 0) {
 811		if (!strcmp("pass", param->key) || !strcmp("password", param->key)) {
 812			skip_parsing = true;
 813			opt = Opt_pass;
 814		} else if (!strcmp("user", param->key) || !strcmp("username", param->key)) {
 815			skip_parsing = true;
 816			opt = Opt_user;
 817		}
 818	}
 819
 820	if (!skip_parsing) {
 821		opt = fs_parse(fc, smb3_fs_parameters, param, &result);
 822		if (opt < 0)
 823			return ctx->sloppy ? 1 : opt;
 824	}
 825
 826	switch (opt) {
 827	case Opt_compress:
 828		ctx->compression = UNKNOWN_TYPE;
 829		cifs_dbg(VFS,
 830			"SMB3 compression support is experimental\n");
 831		break;
 832	case Opt_nodfs:
 833		ctx->nodfs = 1;
 834		break;
 835	case Opt_hard:
 836		if (result.negated)
 
 
 837			ctx->retry = 0;
 838		else
 839			ctx->retry = 1;
 840		break;
 841	case Opt_soft:
 842		if (result.negated)
 843			ctx->retry = 1;
 844		else
 
 
 845			ctx->retry = 0;
 
 846		break;
 847	case Opt_mapposix:
 848		if (result.negated)
 849			ctx->remap = false;
 850		else {
 851			ctx->remap = true;
 852			ctx->sfu_remap = false; /* disable SFU mapping */
 853		}
 854		break;
 855	case Opt_user_xattr:
 856		if (result.negated)
 857			ctx->no_xattr = 1;
 858		else
 859			ctx->no_xattr = 0;
 860		break;
 861	case Opt_forceuid:
 862		if (result.negated)
 863			ctx->override_uid = 0;
 864		else
 865			ctx->override_uid = 1;
 866		break;
 867	case Opt_forcegid:
 868		if (result.negated)
 869			ctx->override_gid = 0;
 870		else
 871			ctx->override_gid = 1;
 872		break;
 873	case Opt_perm:
 874		if (result.negated)
 875			ctx->noperm = 1;
 876		else
 877			ctx->noperm = 0;
 878		break;
 879	case Opt_dynperm:
 880		if (result.negated)
 881			ctx->dynperm = 0;
 882		else
 883			ctx->dynperm = 1;
 884		break;
 885	case Opt_sfu:
 886		if (result.negated)
 887			ctx->sfu_emul = 0;
 888		else
 889			ctx->sfu_emul = 1;
 890		break;
 891	case Opt_noblocksend:
 892		ctx->noblocksnd = 1;
 893		break;
 894	case Opt_noautotune:
 895		ctx->noautotune = 1;
 896		break;
 897	case Opt_nolease:
 898		ctx->no_lease = 1;
 899		break;
 
 
 
 900	case Opt_nodelete:
 901		ctx->nodelete = 1;
 902		break;
 903	case Opt_multichannel:
 904		if (result.negated) {
 905			ctx->multichannel = false;
 906			ctx->max_channels = 1;
 907		} else {
 908			ctx->multichannel = true;
 909			/* if number of channels not specified, default to 2 */
 910			if (ctx->max_channels < 2)
 911				ctx->max_channels = 2;
 912		}
 913		break;
 914	case Opt_uid:
 915		uid = make_kuid(current_user_ns(), result.uint_32);
 916		if (!uid_valid(uid))
 917			goto cifs_parse_mount_err;
 918		ctx->linux_uid = uid;
 919		ctx->uid_specified = true;
 920		break;
 921	case Opt_cruid:
 922		uid = make_kuid(current_user_ns(), result.uint_32);
 923		if (!uid_valid(uid))
 924			goto cifs_parse_mount_err;
 925		ctx->cred_uid = uid;
 926		ctx->cruid_specified = true;
 927		break;
 928	case Opt_backupuid:
 929		uid = make_kuid(current_user_ns(), result.uint_32);
 930		if (!uid_valid(uid))
 931			goto cifs_parse_mount_err;
 932		ctx->backupuid = uid;
 933		ctx->backupuid_specified = true;
 934		break;
 935	case Opt_backupgid:
 936		gid = make_kgid(current_user_ns(), result.uint_32);
 937		if (!gid_valid(gid))
 938			goto cifs_parse_mount_err;
 939		ctx->backupgid = gid;
 940		ctx->backupgid_specified = true;
 941		break;
 942	case Opt_gid:
 943		gid = make_kgid(current_user_ns(), result.uint_32);
 944		if (!gid_valid(gid))
 945			goto cifs_parse_mount_err;
 946		ctx->linux_gid = gid;
 947		ctx->gid_specified = true;
 948		break;
 949	case Opt_port:
 950		ctx->port = result.uint_32;
 951		break;
 952	case Opt_file_mode:
 953		ctx->file_mode = result.uint_32;
 954		break;
 955	case Opt_dirmode:
 956		ctx->dir_mode = result.uint_32;
 957		break;
 958	case Opt_min_enc_offload:
 959		ctx->min_offload = result.uint_32;
 960		break;
 961	case Opt_blocksize:
 962		/*
 963		 * inode blocksize realistically should never need to be
 964		 * less than 16K or greater than 16M and default is 1MB.
 965		 * Note that small inode block sizes (e.g. 64K) can lead
 966		 * to very poor performance of common tools like cp and scp
 967		 */
 968		if ((result.uint_32 < CIFS_MAX_MSGSIZE) ||
 969		   (result.uint_32 > (4 * SMB3_DEFAULT_IOSIZE))) {
 970			cifs_errorf(fc, "%s: Invalid blocksize\n",
 971				__func__);
 972			goto cifs_parse_mount_err;
 973		}
 974		ctx->bsize = result.uint_32;
 975		ctx->got_bsize = true;
 976		break;
 977	case Opt_rasize:
 978		/*
 979		 * readahead size realistically should never need to be
 980		 * less than 1M (CIFS_DEFAULT_IOSIZE) or greater than 32M
 981		 * (perhaps an exception should be considered in the
 982		 * for the case of a large number of channels
 983		 * when multichannel is negotiated) since that would lead
 984		 * to plenty of parallel I/O in flight to the server.
 985		 * Note that smaller read ahead sizes would
 986		 * hurt performance of common tools like cp and scp
 987		 * which often trigger sequential i/o with read ahead
 988		 */
 989		if ((result.uint_32 > (8 * SMB3_DEFAULT_IOSIZE)) ||
 990		    (result.uint_32 < CIFS_DEFAULT_IOSIZE)) {
 991			cifs_errorf(fc, "%s: Invalid rasize %d vs. %d\n",
 992				__func__, result.uint_32, SMB3_DEFAULT_IOSIZE);
 993			goto cifs_parse_mount_err;
 994		}
 995		ctx->rasize = result.uint_32;
 996		break;
 997	case Opt_rsize:
 998		ctx->rsize = result.uint_32;
 999		ctx->got_rsize = true;
1000		break;
1001	case Opt_wsize:
1002		ctx->wsize = result.uint_32;
1003		ctx->got_wsize = true;
1004		break;
1005	case Opt_acregmax:
1006		ctx->acregmax = HZ * result.uint_32;
1007		if (ctx->acregmax > CIFS_MAX_ACTIMEO) {
1008			cifs_errorf(fc, "acregmax too large\n");
1009			goto cifs_parse_mount_err;
1010		}
1011		break;
1012	case Opt_acdirmax:
1013		ctx->acdirmax = HZ * result.uint_32;
1014		if (ctx->acdirmax > CIFS_MAX_ACTIMEO) {
1015			cifs_errorf(fc, "acdirmax too large\n");
1016			goto cifs_parse_mount_err;
1017		}
1018		break;
1019	case Opt_actimeo:
1020		if (HZ * result.uint_32 > CIFS_MAX_ACTIMEO) {
1021			cifs_errorf(fc, "timeout too large\n");
1022			goto cifs_parse_mount_err;
1023		}
1024		if ((ctx->acdirmax != CIFS_DEF_ACTIMEO) ||
1025		    (ctx->acregmax != CIFS_DEF_ACTIMEO)) {
1026			cifs_errorf(fc, "actimeo ignored since acregmax or acdirmax specified\n");
1027			break;
1028		}
1029		ctx->acdirmax = ctx->acregmax = HZ * result.uint_32;
1030		break;
 
 
 
 
 
 
 
1031	case Opt_echo_interval:
1032		ctx->echo_interval = result.uint_32;
1033		break;
1034	case Opt_snapshot:
1035		ctx->snapshot_time = result.uint_32;
1036		break;
1037	case Opt_max_credits:
1038		if (result.uint_32 < 20 || result.uint_32 > 60000) {
1039			cifs_errorf(fc, "%s: Invalid max_credits value\n",
1040				 __func__);
1041			goto cifs_parse_mount_err;
1042		}
1043		ctx->max_credits = result.uint_32;
1044		break;
1045	case Opt_max_channels:
1046		if (result.uint_32 < 1 || result.uint_32 > CIFS_MAX_CHANNELS) {
1047			cifs_errorf(fc, "%s: Invalid max_channels value, needs to be 1-%d\n",
1048				 __func__, CIFS_MAX_CHANNELS);
1049			goto cifs_parse_mount_err;
1050		}
1051		ctx->max_channels = result.uint_32;
1052		/* If more than one channel requested ... they want multichan */
1053		if (result.uint_32 > 1)
1054			ctx->multichannel = true;
1055		break;
1056	case Opt_handletimeout:
1057		ctx->handle_timeout = result.uint_32;
1058		if (ctx->handle_timeout > SMB3_MAX_HANDLE_TIMEOUT) {
1059			cifs_errorf(fc, "Invalid handle cache timeout, longer than 16 minutes\n");
1060			goto cifs_parse_mount_err;
1061		}
1062		break;
1063	case Opt_source:
1064		kfree(ctx->UNC);
1065		ctx->UNC = NULL;
1066		switch (smb3_parse_devname(param->string, ctx)) {
1067		case 0:
1068			break;
1069		case -ENOMEM:
1070			cifs_errorf(fc, "Unable to allocate memory for devname\n");
1071			goto cifs_parse_mount_err;
1072		case -EINVAL:
1073			cifs_errorf(fc, "Malformed UNC in devname\n");
1074			goto cifs_parse_mount_err;
1075		default:
1076			cifs_errorf(fc, "Unknown error parsing devname\n");
1077			goto cifs_parse_mount_err;
1078		}
1079		ctx->source = kstrdup(param->string, GFP_KERNEL);
1080		if (ctx->source == NULL) {
1081			cifs_errorf(fc, "OOM when copying UNC string\n");
1082			goto cifs_parse_mount_err;
1083		}
1084		fc->source = kstrdup(param->string, GFP_KERNEL);
1085		if (fc->source == NULL) {
1086			cifs_errorf(fc, "OOM when copying UNC string\n");
1087			goto cifs_parse_mount_err;
1088		}
1089		break;
1090	case Opt_user:
1091		kfree(ctx->username);
1092		ctx->username = NULL;
1093		if (strlen(param->string) == 0) {
1094			/* null user, ie. anonymous authentication */
1095			ctx->nullauth = 1;
1096			break;
1097		}
1098
1099		if (strnlen(param->string, CIFS_MAX_USERNAME_LEN) >
1100		    CIFS_MAX_USERNAME_LEN) {
1101			pr_warn("username too long\n");
1102			goto cifs_parse_mount_err;
1103		}
1104		ctx->username = kstrdup(param->string, GFP_KERNEL);
1105		if (ctx->username == NULL) {
1106			cifs_errorf(fc, "OOM when copying username string\n");
1107			goto cifs_parse_mount_err;
1108		}
1109		break;
1110	case Opt_pass:
1111		kfree(ctx->password);
1112		ctx->password = NULL;
1113		if (strlen(param->string) == 0)
1114			break;
1115
1116		ctx->password = kstrdup(param->string, GFP_KERNEL);
1117		if (ctx->password == NULL) {
1118			cifs_errorf(fc, "OOM when copying password string\n");
1119			goto cifs_parse_mount_err;
1120		}
1121		break;
1122	case Opt_ip:
1123		if (strlen(param->string) == 0) {
1124			ctx->got_ip = false;
1125			break;
1126		}
1127		if (!cifs_convert_address((struct sockaddr *)&ctx->dstaddr,
1128					  param->string,
1129					  strlen(param->string))) {
1130			pr_err("bad ip= option (%s)\n", param->string);
1131			goto cifs_parse_mount_err;
1132		}
1133		ctx->got_ip = true;
1134		break;
1135	case Opt_domain:
1136		if (strnlen(param->string, CIFS_MAX_DOMAINNAME_LEN)
1137				== CIFS_MAX_DOMAINNAME_LEN) {
1138			pr_warn("domain name too long\n");
1139			goto cifs_parse_mount_err;
1140		}
1141
1142		kfree(ctx->domainname);
1143		ctx->domainname = kstrdup(param->string, GFP_KERNEL);
1144		if (ctx->domainname == NULL) {
1145			cifs_errorf(fc, "OOM when copying domainname string\n");
1146			goto cifs_parse_mount_err;
1147		}
1148		cifs_dbg(FYI, "Domain name set\n");
1149		break;
1150	case Opt_srcaddr:
1151		if (!cifs_convert_address(
1152				(struct sockaddr *)&ctx->srcaddr,
1153				param->string, strlen(param->string))) {
1154			pr_warn("Could not parse srcaddr: %s\n",
1155				param->string);
1156			goto cifs_parse_mount_err;
1157		}
1158		break;
1159	case Opt_iocharset:
1160		if (strnlen(param->string, 1024) >= 65) {
1161			pr_warn("iocharset name too long\n");
1162			goto cifs_parse_mount_err;
1163		}
1164
1165		if (strncasecmp(param->string, "default", 7) != 0) {
1166			kfree(ctx->iocharset);
1167			ctx->iocharset = kstrdup(param->string, GFP_KERNEL);
1168			if (ctx->iocharset == NULL) {
1169				cifs_errorf(fc, "OOM when copying iocharset string\n");
1170				goto cifs_parse_mount_err;
1171			}
1172		}
1173		/* if iocharset not set then load_nls_default
1174		 * is used by caller
1175		 */
1176		cifs_dbg(FYI, "iocharset set to %s\n", ctx->iocharset);
1177		break;
1178	case Opt_netbiosname:
1179		memset(ctx->source_rfc1001_name, 0x20,
1180			RFC1001_NAME_LEN);
1181		/*
1182		 * FIXME: are there cases in which a comma can
1183		 * be valid in workstation netbios name (and
1184		 * need special handling)?
1185		 */
1186		for (i = 0; i < RFC1001_NAME_LEN; i++) {
1187			/* don't ucase netbiosname for user */
1188			if (param->string[i] == 0)
1189				break;
1190			ctx->source_rfc1001_name[i] = param->string[i];
1191		}
1192		/* The string has 16th byte zero still from
1193		 * set at top of the function
1194		 */
1195		if (i == RFC1001_NAME_LEN && param->string[i] != 0)
1196			pr_warn("netbiosname longer than 15 truncated\n");
1197		break;
1198	case Opt_servern:
1199		/* last byte, type, is 0x20 for servr type */
1200		memset(ctx->target_rfc1001_name, 0x20,
1201			RFC1001_NAME_LEN_WITH_NULL);
1202		/*
1203		 * BB are there cases in which a comma can be valid in this
1204		 * workstation netbios name (and need special handling)?
1205		 */
1206
1207		/* user or mount helper must uppercase the netbios name */
1208		for (i = 0; i < 15; i++) {
1209			if (param->string[i] == 0)
1210				break;
1211			ctx->target_rfc1001_name[i] = param->string[i];
1212		}
1213
1214		/* The string has 16th byte zero still from set at top of function */
1215		if (i == RFC1001_NAME_LEN && param->string[i] != 0)
1216			pr_warn("server netbiosname longer than 15 truncated\n");
1217		break;
1218	case Opt_ver:
1219		/* version of mount userspace tools, not dialect */
1220		/* If interface changes in mount.cifs bump to new ver */
1221		if (strncasecmp(param->string, "1", 1) == 0) {
1222			if (strlen(param->string) > 1) {
1223				pr_warn("Bad mount helper ver=%s. Did you want SMB1 (CIFS) dialect and mean to type vers=1.0 instead?\n",
1224					param->string);
1225				goto cifs_parse_mount_err;
1226			}
1227			/* This is the default */
1228			break;
1229		}
1230		/* For all other value, error */
1231		pr_warn("Invalid mount helper version specified\n");
1232		goto cifs_parse_mount_err;
1233	case Opt_vers:
1234		/* protocol version (dialect) */
1235		if (cifs_parse_smb_version(fc, param->string, ctx, is_smb3) != 0)
1236			goto cifs_parse_mount_err;
1237		ctx->got_version = true;
1238		break;
1239	case Opt_sec:
1240		if (cifs_parse_security_flavors(fc, param->string, ctx) != 0)
1241			goto cifs_parse_mount_err;
1242		break;
1243	case Opt_cache:
1244		if (cifs_parse_cache_flavor(fc, param->string, ctx) != 0)
1245			goto cifs_parse_mount_err;
1246		break;
1247	case Opt_witness:
1248#ifndef CONFIG_CIFS_SWN_UPCALL
1249		cifs_errorf(fc, "Witness support needs CONFIG_CIFS_SWN_UPCALL config option\n");
1250			goto cifs_parse_mount_err;
1251#endif
1252		ctx->witness = true;
1253		pr_warn_once("Witness protocol support is experimental\n");
1254		break;
1255	case Opt_rootfs:
1256#ifndef CONFIG_CIFS_ROOT
1257		cifs_dbg(VFS, "rootfs support requires CONFIG_CIFS_ROOT config option\n");
1258		goto cifs_parse_mount_err;
1259#endif
1260		ctx->rootfs = true;
1261		break;
1262	case Opt_posixpaths:
1263		if (result.negated)
1264			ctx->posix_paths = 0;
1265		else
1266			ctx->posix_paths = 1;
1267		break;
1268	case Opt_unix:
1269		if (result.negated) {
1270			if (ctx->linux_ext == 1)
1271				pr_warn_once("conflicting posix mount options specified\n");
1272			ctx->linux_ext = 0;
1273			ctx->no_linux_ext = 1;
1274		} else {
1275			if (ctx->no_linux_ext == 1)
1276				pr_warn_once("conflicting posix mount options specified\n");
1277			ctx->linux_ext = 1;
1278			ctx->no_linux_ext = 0;
1279		}
1280		break;
1281	case Opt_nocase:
1282		ctx->nocase = 1;
1283		break;
1284	case Opt_brl:
1285		if (result.negated) {
1286			/*
1287			 * turn off mandatory locking in mode
1288			 * if remote locking is turned off since the
1289			 * local vfs will do advisory
1290			 */
1291			if (ctx->file_mode ==
1292				(S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1293				ctx->file_mode = S_IALLUGO;
1294			ctx->nobrl =  1;
1295		} else
1296			ctx->nobrl =  0;
1297		break;
1298	case Opt_handlecache:
1299		if (result.negated)
1300			ctx->nohandlecache = 1;
1301		else
1302			ctx->nohandlecache = 0;
1303		break;
1304	case Opt_forcemandatorylock:
1305		ctx->mand_lock = 1;
1306		break;
1307	case Opt_setuids:
1308		ctx->setuids = result.negated;
1309		break;
1310	case Opt_intr:
1311		ctx->intr = !result.negated;
1312		break;
1313	case Opt_setuidfromacl:
1314		ctx->setuidfromacl = 1;
1315		break;
1316	case Opt_strictsync:
1317		ctx->nostrictsync = result.negated;
1318		break;
1319	case Opt_serverino:
1320		ctx->server_ino = !result.negated;
1321		break;
1322	case Opt_rwpidforward:
1323		ctx->rwpidforward = 1;
1324		break;
1325	case Opt_modesid:
1326		ctx->mode_ace = 1;
1327		break;
1328	case Opt_cifsacl:
1329		ctx->cifs_acl = !result.negated;
1330		break;
1331	case Opt_acl:
1332		ctx->no_psx_acl = result.negated;
1333		break;
1334	case Opt_locallease:
1335		ctx->local_lease = 1;
1336		break;
1337	case Opt_sign:
1338		ctx->sign = true;
1339		break;
1340	case Opt_ignore_signature:
1341		ctx->sign = true;
1342		ctx->ignore_signature = true;
1343		break;
1344	case Opt_seal:
1345		/* we do not do the following in secFlags because seal
1346		 * is a per tree connection (mount) not a per socket
1347		 * or per-smb connection option in the protocol
1348		 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1349		 */
1350		ctx->seal = 1;
1351		break;
1352	case Opt_noac:
1353		pr_warn("Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1354		break;
1355	case Opt_fsc:
1356#ifndef CONFIG_CIFS_FSCACHE
1357		cifs_errorf(fc, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1358		goto cifs_parse_mount_err;
1359#endif
1360		ctx->fsc = true;
1361		break;
1362	case Opt_mfsymlinks:
1363		ctx->mfsymlinks = true;
1364		break;
1365	case Opt_multiuser:
1366		ctx->multiuser = true;
1367		break;
1368	case Opt_sloppy:
1369		ctx->sloppy = true;
1370		break;
1371	case Opt_nosharesock:
1372		ctx->nosharesock = true;
1373		break;
1374	case Opt_persistent:
1375		if (result.negated) {
1376			ctx->nopersistent = true;
1377			if (ctx->persistent) {
1378				cifs_errorf(fc, "persistenthandles mount options conflict\n");
1379				goto cifs_parse_mount_err;
1380			}
1381		} else {
1382			ctx->persistent = true;
1383			if ((ctx->nopersistent) || (ctx->resilient)) {
1384				cifs_errorf(fc, "persistenthandles mount options conflict\n");
1385				goto cifs_parse_mount_err;
1386			}
1387		}
1388		break;
1389	case Opt_resilient:
1390		if (result.negated) {
1391			ctx->resilient = false; /* already the default */
1392		} else {
1393			ctx->resilient = true;
1394			if (ctx->persistent) {
1395				cifs_errorf(fc, "persistenthandles mount options conflict\n");
1396				goto cifs_parse_mount_err;
1397			}
1398		}
1399		break;
 
 
 
 
 
 
 
1400	case Opt_domainauto:
1401		ctx->domainauto = true;
1402		break;
1403	case Opt_rdma:
1404		ctx->rdma = true;
1405		break;
1406	}
1407	/* case Opt_ignore: - is ignored as expected ... */
1408
1409	return 0;
1410
1411 cifs_parse_mount_err:
 
1412	return -EINVAL;
1413}
1414
1415int smb3_init_fs_context(struct fs_context *fc)
1416{
1417	struct smb3_fs_context *ctx;
1418	char *nodename = utsname()->nodename;
1419	int i;
1420
1421	ctx = kzalloc(sizeof(struct smb3_fs_context), GFP_KERNEL);
1422	if (unlikely(!ctx))
1423		return -ENOMEM;
1424
 
 
1425	/*
1426	 * does not have to be perfect mapping since field is
1427	 * informational, only used for servers that do not support
1428	 * port 445 and it can be overridden at mount time
1429	 */
1430	memset(ctx->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1431	for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1432		ctx->source_rfc1001_name[i] = toupper(nodename[i]);
1433
1434	ctx->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1435	/*
1436	 * null target name indicates to use *SMBSERVR default called name
1437	 *  if we end up sending RFC1001 session initialize
1438	 */
1439	ctx->target_rfc1001_name[0] = 0;
1440	ctx->cred_uid = current_uid();
1441	ctx->linux_uid = current_uid();
1442	ctx->linux_gid = current_gid();
1443	/* By default 4MB read ahead size, 1MB block size */
1444	ctx->bsize = CIFS_DEFAULT_IOSIZE; /* can improve cp performance significantly */
1445	ctx->rasize = 0; /* 0 = use default (ie negotiated rsize) for read ahead pages */
1446
1447	/*
1448	 * default to SFM style remapping of seven reserved characters
1449	 * unless user overrides it or we negotiate CIFS POSIX where
1450	 * it is unnecessary.  Can not simultaneously use more than one mapping
1451	 * since then readdir could list files that open could not open
1452	 */
1453	ctx->remap = true;
1454
1455	/* default to only allowing write access to owner of the mount */
1456	ctx->dir_mode = ctx->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1457
1458	/* ctx->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1459	/* default is always to request posix paths. */
1460	ctx->posix_paths = 1;
1461	/* default to using server inode numbers where available */
1462	ctx->server_ino = 1;
1463
1464	/* default is to use strict cifs caching semantics */
1465	ctx->strict_io = true;
1466
1467	ctx->acregmax = CIFS_DEF_ACTIMEO;
1468	ctx->acdirmax = CIFS_DEF_ACTIMEO;
 
1469
1470	/* Most clients set timeout to 0, allows server to use its default */
1471	ctx->handle_timeout = 0; /* See MS-SMB2 spec section 2.2.14.2.12 */
1472
1473	/* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1474	ctx->ops = &smb30_operations;
1475	ctx->vals = &smbdefault_values;
1476
1477	ctx->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1478
1479	/* default to no multichannel (single server connection) */
1480	ctx->multichannel = false;
1481	ctx->max_channels = 1;
1482
1483	ctx->backupuid_specified = false; /* no backup intent for a user */
1484	ctx->backupgid_specified = false; /* no backup intent for a group */
1485
1486/*
1487 *	short int override_uid = -1;
1488 *	short int override_gid = -1;
1489 *	char *nodename = strdup(utsname()->nodename);
1490 *	struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1491 */
1492
1493	fc->fs_private = ctx;
1494	fc->ops = &smb3_fs_context_ops;
1495	return 0;
1496}
1497
1498void
1499smb3_cleanup_fs_context_contents(struct smb3_fs_context *ctx)
1500{
1501	if (ctx == NULL)
1502		return;
1503
1504	/*
1505	 * Make sure this stays in sync with smb3_fs_context_dup()
1506	 */
1507	kfree(ctx->mount_options);
1508	ctx->mount_options = NULL;
1509	kfree(ctx->username);
1510	ctx->username = NULL;
1511	kfree_sensitive(ctx->password);
1512	ctx->password = NULL;
 
 
1513	kfree(ctx->UNC);
1514	ctx->UNC = NULL;
1515	kfree(ctx->source);
1516	ctx->source = NULL;
1517	kfree(ctx->domainname);
1518	ctx->domainname = NULL;
1519	kfree(ctx->nodename);
1520	ctx->nodename = NULL;
1521	kfree(ctx->iocharset);
1522	ctx->iocharset = NULL;
1523	kfree(ctx->prepath);
1524	ctx->prepath = NULL;
 
 
1525}
1526
1527void
1528smb3_cleanup_fs_context(struct smb3_fs_context *ctx)
1529{
1530	if (!ctx)
1531		return;
1532	smb3_cleanup_fs_context_contents(ctx);
1533	kfree(ctx);
1534}
1535
1536void smb3_update_mnt_flags(struct cifs_sb_info *cifs_sb)
1537{
1538	struct smb3_fs_context *ctx = cifs_sb->ctx;
1539
1540	if (ctx->nodfs)
1541		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_DFS;
1542	else
1543		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NO_DFS;
1544
1545	if (ctx->noperm)
1546		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
1547	else
1548		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NO_PERM;
1549
1550	if (ctx->setuids)
1551		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
1552	else
1553		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_SET_UID;
1554
1555	if (ctx->setuidfromacl)
1556		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
1557	else
1558		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_UID_FROM_ACL;
1559
1560	if (ctx->server_ino)
1561		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
1562	else
1563		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_SERVER_INUM;
1564
1565	if (ctx->remap)
1566		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
1567	else
1568		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_MAP_SFM_CHR;
1569
1570	if (ctx->sfu_remap)
1571		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
1572	else
1573		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_MAP_SPECIAL_CHR;
1574
1575	if (ctx->no_xattr)
1576		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
1577	else
1578		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NO_XATTR;
1579
1580	if (ctx->sfu_emul)
1581		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
1582	else
1583		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_UNX_EMUL;
1584
1585	if (ctx->nobrl)
1586		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
1587	else
1588		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NO_BRL;
1589
1590	if (ctx->nohandlecache)
1591		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_HANDLE_CACHE;
1592	else
1593		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NO_HANDLE_CACHE;
1594
1595	if (ctx->nostrictsync)
1596		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
1597	else
1598		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NOSSYNC;
1599
1600	if (ctx->mand_lock)
1601		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
1602	else
1603		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_NOPOSIXBRL;
1604
1605	if (ctx->rwpidforward)
1606		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
1607	else
1608		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_RWPIDFORWARD;
1609
1610	if (ctx->mode_ace)
1611		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MODE_FROM_SID;
1612	else
1613		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_MODE_FROM_SID;
1614
1615	if (ctx->cifs_acl)
1616		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
1617	else
1618		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_CIFS_ACL;
1619
1620	if (ctx->backupuid_specified)
1621		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
1622	else
1623		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_CIFS_BACKUPUID;
1624
1625	if (ctx->backupgid_specified)
1626		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
1627	else
1628		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_CIFS_BACKUPGID;
1629
1630	if (ctx->override_uid)
1631		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
1632	else
1633		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_OVERR_UID;
1634
1635	if (ctx->override_gid)
1636		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
1637	else
1638		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_OVERR_GID;
1639
1640	if (ctx->dynperm)
1641		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
1642	else
1643		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_DYNPERM;
1644
1645	if (ctx->fsc)
1646		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
1647	else
1648		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_FSCACHE;
1649
1650	if (ctx->multiuser)
1651		cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
1652					    CIFS_MOUNT_NO_PERM);
1653	else
1654		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_MULTIUSER;
1655
1656
1657	if (ctx->strict_io)
1658		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
1659	else
1660		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_STRICT_IO;
1661
1662	if (ctx->direct_io)
1663		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
1664	else
1665		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_DIRECT_IO;
1666
1667	if (ctx->mfsymlinks)
1668		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
1669	else
1670		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_MF_SYMLINKS;
1671	if (ctx->mfsymlinks) {
1672		if (ctx->sfu_emul) {
1673			/*
1674			 * Our SFU ("Services for Unix" emulation does not allow
1675			 * creating symlinks but does allow reading existing SFU
1676			 * symlinks (it does allow both creating and reading SFU
1677			 * style mknod and FIFOs though). When "mfsymlinks" and
1678			 * "sfu" are both enabled at the same time, it allows
1679			 * reading both types of symlinks, but will only create
1680			 * them with mfsymlinks format. This allows better
1681			 * Apple compatibility (probably better for Samba too)
1682			 * while still recognizing old Windows style symlinks.
1683			 */
1684			cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
1685		}
1686	}
1687	cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_SHUTDOWN;
1688
1689	return;
1690}