Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.13.7.
   1/*
   2 *   fs/cifs/connect.c
   3 *
   4 *   Copyright (C) International Business Machines  Corp., 2002,2011
   5 *   Author(s): Steve French (sfrench@us.ibm.com)
   6 *
   7 *   This library is free software; you can redistribute it and/or modify
   8 *   it under the terms of the GNU Lesser General Public License as published
   9 *   by the Free Software Foundation; either version 2.1 of the License, or
  10 *   (at your option) any later version.
  11 *
  12 *   This library is distributed in the hope that it will be useful,
  13 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
  15 *   the GNU Lesser General Public License for more details.
  16 *
  17 *   You should have received a copy of the GNU Lesser General Public License
  18 *   along with this library; if not, write to the Free Software
  19 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  20 */
  21#include <linux/fs.h>
  22#include <linux/net.h>
  23#include <linux/string.h>
  24#include <linux/list.h>
  25#include <linux/wait.h>
  26#include <linux/slab.h>
  27#include <linux/pagemap.h>
  28#include <linux/ctype.h>
  29#include <linux/utsname.h>
  30#include <linux/mempool.h>
  31#include <linux/delay.h>
  32#include <linux/completion.h>
  33#include <linux/kthread.h>
  34#include <linux/pagevec.h>
  35#include <linux/freezer.h>
  36#include <linux/namei.h>
  37#include <asm/uaccess.h>
  38#include <asm/processor.h>
  39#include <linux/inet.h>
  40#include <linux/module.h>
  41#include <keys/user-type.h>
  42#include <net/ipv6.h>
  43#include <linux/parser.h>
  44
  45#include "cifspdu.h"
  46#include "cifsglob.h"
  47#include "cifsproto.h"
  48#include "cifs_unicode.h"
  49#include "cifs_debug.h"
  50#include "cifs_fs_sb.h"
  51#include "ntlmssp.h"
  52#include "nterr.h"
  53#include "rfc1002pdu.h"
  54#include "fscache.h"
  55
  56#define CIFS_PORT 445
  57#define RFC1001_PORT 139
  58
  59extern mempool_t *cifs_req_poolp;
  60
  61/* FIXME: should these be tunable? */
  62#define TLINK_ERROR_EXPIRE	(1 * HZ)
  63#define TLINK_IDLE_EXPIRE	(600 * HZ)
  64
  65enum {
  66
  67	/* Mount options that take no arguments */
  68	Opt_user_xattr, Opt_nouser_xattr,
  69	Opt_forceuid, Opt_noforceuid,
  70	Opt_forcegid, Opt_noforcegid,
  71	Opt_noblocksend, Opt_noautotune,
  72	Opt_hard, Opt_soft, Opt_perm, Opt_noperm,
  73	Opt_mapposix, Opt_nomapposix,
  74	Opt_mapchars, Opt_nomapchars, Opt_sfu,
  75	Opt_nosfu, Opt_nodfs, Opt_posixpaths,
  76	Opt_noposixpaths, Opt_nounix,
  77	Opt_nocase,
  78	Opt_brl, Opt_nobrl,
  79	Opt_forcemandatorylock, Opt_setuids,
  80	Opt_nosetuids, Opt_dynperm, Opt_nodynperm,
  81	Opt_nohard, Opt_nosoft,
  82	Opt_nointr, Opt_intr,
  83	Opt_nostrictsync, Opt_strictsync,
  84	Opt_serverino, Opt_noserverino,
  85	Opt_rwpidforward, Opt_cifsacl, Opt_nocifsacl,
  86	Opt_acl, Opt_noacl, Opt_locallease,
  87	Opt_sign, Opt_seal, Opt_noac,
  88	Opt_fsc, Opt_mfsymlinks,
  89	Opt_multiuser, Opt_sloppy, Opt_nosharesock,
  90	Opt_persistent, Opt_nopersistent,
  91	Opt_resilient, Opt_noresilient,
  92
  93	/* Mount options which take numeric value */
  94	Opt_backupuid, Opt_backupgid, Opt_uid,
  95	Opt_cruid, Opt_gid, Opt_file_mode,
  96	Opt_dirmode, Opt_port,
  97	Opt_rsize, Opt_wsize, Opt_actimeo,
  98	Opt_echo_interval,
  99
 100	/* Mount options which take string value */
 101	Opt_user, Opt_pass, Opt_ip,
 102	Opt_domain, Opt_srcaddr, Opt_iocharset,
 103	Opt_netbiosname, Opt_servern,
 104	Opt_ver, Opt_vers, Opt_sec, Opt_cache,
 105
 106	/* Mount options to be ignored */
 107	Opt_ignore,
 108
 109	/* Options which could be blank */
 110	Opt_blank_pass,
 111	Opt_blank_user,
 112	Opt_blank_ip,
 113
 114	Opt_err
 115};
 116
 117static const match_table_t cifs_mount_option_tokens = {
 118
 119	{ Opt_user_xattr, "user_xattr" },
 120	{ Opt_nouser_xattr, "nouser_xattr" },
 121	{ Opt_forceuid, "forceuid" },
 122	{ Opt_noforceuid, "noforceuid" },
 123	{ Opt_forcegid, "forcegid" },
 124	{ Opt_noforcegid, "noforcegid" },
 125	{ Opt_noblocksend, "noblocksend" },
 126	{ Opt_noautotune, "noautotune" },
 127	{ Opt_hard, "hard" },
 128	{ Opt_soft, "soft" },
 129	{ Opt_perm, "perm" },
 130	{ Opt_noperm, "noperm" },
 131	{ Opt_mapchars, "mapchars" }, /* SFU style */
 132	{ Opt_nomapchars, "nomapchars" },
 133	{ Opt_mapposix, "mapposix" }, /* SFM style */
 134	{ Opt_nomapposix, "nomapposix" },
 135	{ Opt_sfu, "sfu" },
 136	{ Opt_nosfu, "nosfu" },
 137	{ Opt_nodfs, "nodfs" },
 138	{ Opt_posixpaths, "posixpaths" },
 139	{ Opt_noposixpaths, "noposixpaths" },
 140	{ Opt_nounix, "nounix" },
 141	{ Opt_nounix, "nolinux" },
 142	{ Opt_nocase, "nocase" },
 143	{ Opt_nocase, "ignorecase" },
 144	{ Opt_brl, "brl" },
 145	{ Opt_nobrl, "nobrl" },
 146	{ Opt_nobrl, "nolock" },
 147	{ Opt_forcemandatorylock, "forcemandatorylock" },
 148	{ Opt_forcemandatorylock, "forcemand" },
 149	{ Opt_setuids, "setuids" },
 150	{ Opt_nosetuids, "nosetuids" },
 151	{ Opt_dynperm, "dynperm" },
 152	{ Opt_nodynperm, "nodynperm" },
 153	{ Opt_nohard, "nohard" },
 154	{ Opt_nosoft, "nosoft" },
 155	{ Opt_nointr, "nointr" },
 156	{ Opt_intr, "intr" },
 157	{ Opt_nostrictsync, "nostrictsync" },
 158	{ Opt_strictsync, "strictsync" },
 159	{ Opt_serverino, "serverino" },
 160	{ Opt_noserverino, "noserverino" },
 161	{ Opt_rwpidforward, "rwpidforward" },
 162	{ Opt_cifsacl, "cifsacl" },
 163	{ Opt_nocifsacl, "nocifsacl" },
 164	{ Opt_acl, "acl" },
 165	{ Opt_noacl, "noacl" },
 166	{ Opt_locallease, "locallease" },
 167	{ Opt_sign, "sign" },
 168	{ Opt_seal, "seal" },
 169	{ Opt_noac, "noac" },
 170	{ Opt_fsc, "fsc" },
 171	{ Opt_mfsymlinks, "mfsymlinks" },
 172	{ Opt_multiuser, "multiuser" },
 173	{ Opt_sloppy, "sloppy" },
 174	{ Opt_nosharesock, "nosharesock" },
 175	{ Opt_persistent, "persistenthandles"},
 176	{ Opt_nopersistent, "nopersistenthandles"},
 177	{ Opt_resilient, "resilienthandles"},
 178	{ Opt_noresilient, "noresilienthandles"},
 179
 180	{ Opt_backupuid, "backupuid=%s" },
 181	{ Opt_backupgid, "backupgid=%s" },
 182	{ Opt_uid, "uid=%s" },
 183	{ Opt_cruid, "cruid=%s" },
 184	{ Opt_gid, "gid=%s" },
 185	{ Opt_file_mode, "file_mode=%s" },
 186	{ Opt_dirmode, "dirmode=%s" },
 187	{ Opt_dirmode, "dir_mode=%s" },
 188	{ Opt_port, "port=%s" },
 189	{ Opt_rsize, "rsize=%s" },
 190	{ Opt_wsize, "wsize=%s" },
 191	{ Opt_actimeo, "actimeo=%s" },
 192	{ Opt_echo_interval, "echo_interval=%s" },
 193
 194	{ Opt_blank_user, "user=" },
 195	{ Opt_blank_user, "username=" },
 196	{ Opt_user, "user=%s" },
 197	{ Opt_user, "username=%s" },
 198	{ Opt_blank_pass, "pass=" },
 199	{ Opt_blank_pass, "password=" },
 200	{ Opt_pass, "pass=%s" },
 201	{ Opt_pass, "password=%s" },
 202	{ Opt_blank_ip, "ip=" },
 203	{ Opt_blank_ip, "addr=" },
 204	{ Opt_ip, "ip=%s" },
 205	{ Opt_ip, "addr=%s" },
 206	{ Opt_ignore, "unc=%s" },
 207	{ Opt_ignore, "target=%s" },
 208	{ Opt_ignore, "path=%s" },
 209	{ Opt_domain, "dom=%s" },
 210	{ Opt_domain, "domain=%s" },
 211	{ Opt_domain, "workgroup=%s" },
 212	{ Opt_srcaddr, "srcaddr=%s" },
 213	{ Opt_ignore, "prefixpath=%s" },
 214	{ Opt_iocharset, "iocharset=%s" },
 215	{ Opt_netbiosname, "netbiosname=%s" },
 216	{ Opt_servern, "servern=%s" },
 217	{ Opt_ver, "ver=%s" },
 218	{ Opt_vers, "vers=%s" },
 219	{ Opt_sec, "sec=%s" },
 220	{ Opt_cache, "cache=%s" },
 221
 222	{ Opt_ignore, "cred" },
 223	{ Opt_ignore, "credentials" },
 224	{ Opt_ignore, "cred=%s" },
 225	{ Opt_ignore, "credentials=%s" },
 226	{ Opt_ignore, "guest" },
 227	{ Opt_ignore, "rw" },
 228	{ Opt_ignore, "ro" },
 229	{ Opt_ignore, "suid" },
 230	{ Opt_ignore, "nosuid" },
 231	{ Opt_ignore, "exec" },
 232	{ Opt_ignore, "noexec" },
 233	{ Opt_ignore, "nodev" },
 234	{ Opt_ignore, "noauto" },
 235	{ Opt_ignore, "dev" },
 236	{ Opt_ignore, "mand" },
 237	{ Opt_ignore, "nomand" },
 238	{ Opt_ignore, "_netdev" },
 239
 240	{ Opt_err, NULL }
 241};
 242
 243enum {
 244	Opt_sec_krb5, Opt_sec_krb5i, Opt_sec_krb5p,
 245	Opt_sec_ntlmsspi, Opt_sec_ntlmssp,
 246	Opt_ntlm, Opt_sec_ntlmi, Opt_sec_ntlmv2,
 247	Opt_sec_ntlmv2i, Opt_sec_lanman,
 248	Opt_sec_none,
 249
 250	Opt_sec_err
 251};
 252
 253static const match_table_t cifs_secflavor_tokens = {
 254	{ Opt_sec_krb5, "krb5" },
 255	{ Opt_sec_krb5i, "krb5i" },
 256	{ Opt_sec_krb5p, "krb5p" },
 257	{ Opt_sec_ntlmsspi, "ntlmsspi" },
 258	{ Opt_sec_ntlmssp, "ntlmssp" },
 259	{ Opt_ntlm, "ntlm" },
 260	{ Opt_sec_ntlmi, "ntlmi" },
 261	{ Opt_sec_ntlmv2, "nontlm" },
 262	{ Opt_sec_ntlmv2, "ntlmv2" },
 263	{ Opt_sec_ntlmv2i, "ntlmv2i" },
 264	{ Opt_sec_lanman, "lanman" },
 265	{ Opt_sec_none, "none" },
 266
 267	{ Opt_sec_err, NULL }
 268};
 269
 270/* cache flavors */
 271enum {
 272	Opt_cache_loose,
 273	Opt_cache_strict,
 274	Opt_cache_none,
 275	Opt_cache_err
 276};
 277
 278static const match_table_t cifs_cacheflavor_tokens = {
 279	{ Opt_cache_loose, "loose" },
 280	{ Opt_cache_strict, "strict" },
 281	{ Opt_cache_none, "none" },
 282	{ Opt_cache_err, NULL }
 283};
 284
 285static const match_table_t cifs_smb_version_tokens = {
 286	{ Smb_1, SMB1_VERSION_STRING },
 287	{ Smb_20, SMB20_VERSION_STRING},
 288	{ Smb_21, SMB21_VERSION_STRING },
 289	{ Smb_30, SMB30_VERSION_STRING },
 290	{ Smb_302, SMB302_VERSION_STRING },
 291#ifdef CONFIG_CIFS_SMB311
 292	{ Smb_311, SMB311_VERSION_STRING },
 293	{ Smb_311, ALT_SMB311_VERSION_STRING },
 294#endif /* SMB311 */
 295	{ Smb_version_err, NULL }
 296};
 297
 298static int ip_connect(struct TCP_Server_Info *server);
 299static int generic_ip_connect(struct TCP_Server_Info *server);
 300static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
 301static void cifs_prune_tlinks(struct work_struct *work);
 302static int cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
 303					const char *devname);
 304
 305/*
 306 * cifs tcp session reconnection
 307 *
 308 * mark tcp session as reconnecting so temporarily locked
 309 * mark all smb sessions as reconnecting for tcp session
 310 * reconnect tcp session
 311 * wake up waiters on reconnection? - (not needed currently)
 312 */
 313int
 314cifs_reconnect(struct TCP_Server_Info *server)
 315{
 316	int rc = 0;
 317	struct list_head *tmp, *tmp2;
 318	struct cifs_ses *ses;
 319	struct cifs_tcon *tcon;
 320	struct mid_q_entry *mid_entry;
 321	struct list_head retry_list;
 322
 323	spin_lock(&GlobalMid_Lock);
 324	if (server->tcpStatus == CifsExiting) {
 325		/* the demux thread will exit normally
 326		next time through the loop */
 327		spin_unlock(&GlobalMid_Lock);
 328		return rc;
 329	} else
 330		server->tcpStatus = CifsNeedReconnect;
 331	spin_unlock(&GlobalMid_Lock);
 332	server->maxBuf = 0;
 333#ifdef CONFIG_CIFS_SMB2
 334	server->max_read = 0;
 335#endif
 336
 337	cifs_dbg(FYI, "Reconnecting tcp session\n");
 338
 339	/* before reconnecting the tcp session, mark the smb session (uid)
 340		and the tid bad so they are not used until reconnected */
 341	cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
 342		 __func__);
 343	spin_lock(&cifs_tcp_ses_lock);
 344	list_for_each(tmp, &server->smb_ses_list) {
 345		ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
 346		ses->need_reconnect = true;
 347		ses->ipc_tid = 0;
 348		list_for_each(tmp2, &ses->tcon_list) {
 349			tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
 350			tcon->need_reconnect = true;
 351		}
 352	}
 353	spin_unlock(&cifs_tcp_ses_lock);
 354
 355	/* do not want to be sending data on a socket we are freeing */
 356	cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
 357	mutex_lock(&server->srv_mutex);
 358	if (server->ssocket) {
 359		cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
 360			 server->ssocket->state, server->ssocket->flags);
 361		kernel_sock_shutdown(server->ssocket, SHUT_WR);
 362		cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
 363			 server->ssocket->state, server->ssocket->flags);
 364		sock_release(server->ssocket);
 365		server->ssocket = NULL;
 366	}
 367	server->sequence_number = 0;
 368	server->session_estab = false;
 369	kfree(server->session_key.response);
 370	server->session_key.response = NULL;
 371	server->session_key.len = 0;
 372	server->lstrp = jiffies;
 373
 374	/* mark submitted MIDs for retry and issue callback */
 375	INIT_LIST_HEAD(&retry_list);
 376	cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
 377	spin_lock(&GlobalMid_Lock);
 378	list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
 379		mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
 380		if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
 381			mid_entry->mid_state = MID_RETRY_NEEDED;
 382		list_move(&mid_entry->qhead, &retry_list);
 383	}
 384	spin_unlock(&GlobalMid_Lock);
 385	mutex_unlock(&server->srv_mutex);
 386
 387	cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
 388	list_for_each_safe(tmp, tmp2, &retry_list) {
 389		mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
 390		list_del_init(&mid_entry->qhead);
 391		mid_entry->callback(mid_entry);
 392	}
 393
 394	do {
 395		try_to_freeze();
 396
 397		/* we should try only the port we connected to before */
 398		mutex_lock(&server->srv_mutex);
 399		rc = generic_ip_connect(server);
 400		if (rc) {
 401			cifs_dbg(FYI, "reconnect error %d\n", rc);
 402			mutex_unlock(&server->srv_mutex);
 403			msleep(3000);
 404		} else {
 405			atomic_inc(&tcpSesReconnectCount);
 406			spin_lock(&GlobalMid_Lock);
 407			if (server->tcpStatus != CifsExiting)
 408				server->tcpStatus = CifsNeedNegotiate;
 409			spin_unlock(&GlobalMid_Lock);
 410			mutex_unlock(&server->srv_mutex);
 411		}
 412	} while (server->tcpStatus == CifsNeedReconnect);
 413
 414	return rc;
 415}
 416
 417static void
 418cifs_echo_request(struct work_struct *work)
 419{
 420	int rc;
 421	struct TCP_Server_Info *server = container_of(work,
 422					struct TCP_Server_Info, echo.work);
 423	unsigned long echo_interval = server->echo_interval;
 424
 425	/*
 426	 * We cannot send an echo if it is disabled or until the
 427	 * NEGOTIATE_PROTOCOL request is done, which is indicated by
 428	 * server->ops->need_neg() == true. Also, no need to ping if
 429	 * we got a response recently.
 430	 */
 431	if (!server->ops->need_neg || server->ops->need_neg(server) ||
 432	    (server->ops->can_echo && !server->ops->can_echo(server)) ||
 433	    time_before(jiffies, server->lstrp + echo_interval - HZ))
 434		goto requeue_echo;
 435
 436	rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
 437	if (rc)
 438		cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
 439			 server->hostname);
 440
 441requeue_echo:
 442	queue_delayed_work(cifsiod_wq, &server->echo, echo_interval);
 443}
 444
 445static bool
 446allocate_buffers(struct TCP_Server_Info *server)
 447{
 448	if (!server->bigbuf) {
 449		server->bigbuf = (char *)cifs_buf_get();
 450		if (!server->bigbuf) {
 451			cifs_dbg(VFS, "No memory for large SMB response\n");
 452			msleep(3000);
 453			/* retry will check if exiting */
 454			return false;
 455		}
 456	} else if (server->large_buf) {
 457		/* we are reusing a dirty large buf, clear its start */
 458		memset(server->bigbuf, 0, HEADER_SIZE(server));
 459	}
 460
 461	if (!server->smallbuf) {
 462		server->smallbuf = (char *)cifs_small_buf_get();
 463		if (!server->smallbuf) {
 464			cifs_dbg(VFS, "No memory for SMB response\n");
 465			msleep(1000);
 466			/* retry will check if exiting */
 467			return false;
 468		}
 469		/* beginning of smb buffer is cleared in our buf_get */
 470	} else {
 471		/* if existing small buf clear beginning */
 472		memset(server->smallbuf, 0, HEADER_SIZE(server));
 473	}
 474
 475	return true;
 476}
 477
 478static bool
 479server_unresponsive(struct TCP_Server_Info *server)
 480{
 481	/*
 482	 * We need to wait 2 echo intervals to make sure we handle such
 483	 * situations right:
 484	 * 1s  client sends a normal SMB request
 485	 * 2s  client gets a response
 486	 * 30s echo workqueue job pops, and decides we got a response recently
 487	 *     and don't need to send another
 488	 * ...
 489	 * 65s kernel_recvmsg times out, and we see that we haven't gotten
 490	 *     a response in >60s.
 491	 */
 492	if (server->tcpStatus == CifsGood &&
 493	    time_after(jiffies, server->lstrp + 2 * server->echo_interval)) {
 494		cifs_dbg(VFS, "Server %s has not responded in %lu seconds. Reconnecting...\n",
 495			 server->hostname, (2 * server->echo_interval) / HZ);
 496		cifs_reconnect(server);
 497		wake_up(&server->response_q);
 498		return true;
 499	}
 500
 501	return false;
 502}
 503
 504/*
 505 * kvec_array_init - clone a kvec array, and advance into it
 506 * @new:	pointer to memory for cloned array
 507 * @iov:	pointer to original array
 508 * @nr_segs:	number of members in original array
 509 * @bytes:	number of bytes to advance into the cloned array
 510 *
 511 * This function will copy the array provided in iov to a section of memory
 512 * and advance the specified number of bytes into the new array. It returns
 513 * the number of segments in the new array. "new" must be at least as big as
 514 * the original iov array.
 515 */
 516static unsigned int
 517kvec_array_init(struct kvec *new, struct kvec *iov, unsigned int nr_segs,
 518		size_t bytes)
 519{
 520	size_t base = 0;
 521
 522	while (bytes || !iov->iov_len) {
 523		int copy = min(bytes, iov->iov_len);
 524
 525		bytes -= copy;
 526		base += copy;
 527		if (iov->iov_len == base) {
 528			iov++;
 529			nr_segs--;
 530			base = 0;
 531		}
 532	}
 533	memcpy(new, iov, sizeof(*iov) * nr_segs);
 534	new->iov_base += base;
 535	new->iov_len -= base;
 536	return nr_segs;
 537}
 538
 539static struct kvec *
 540get_server_iovec(struct TCP_Server_Info *server, unsigned int nr_segs)
 541{
 542	struct kvec *new_iov;
 543
 544	if (server->iov && nr_segs <= server->nr_iov)
 545		return server->iov;
 546
 547	/* not big enough -- allocate a new one and release the old */
 548	new_iov = kmalloc(sizeof(*new_iov) * nr_segs, GFP_NOFS);
 549	if (new_iov) {
 550		kfree(server->iov);
 551		server->iov = new_iov;
 552		server->nr_iov = nr_segs;
 553	}
 554	return new_iov;
 555}
 556
 557int
 558cifs_readv_from_socket(struct TCP_Server_Info *server, struct kvec *iov_orig,
 559		       unsigned int nr_segs, unsigned int to_read)
 560{
 561	int length = 0;
 562	int total_read;
 563	unsigned int segs;
 564	struct msghdr smb_msg;
 565	struct kvec *iov;
 566
 567	iov = get_server_iovec(server, nr_segs);
 568	if (!iov)
 569		return -ENOMEM;
 570
 571	smb_msg.msg_control = NULL;
 572	smb_msg.msg_controllen = 0;
 573
 574	for (total_read = 0; to_read; total_read += length, to_read -= length) {
 575		try_to_freeze();
 576
 577		if (server_unresponsive(server)) {
 578			total_read = -ECONNABORTED;
 579			break;
 580		}
 581
 582		segs = kvec_array_init(iov, iov_orig, nr_segs, total_read);
 583
 584		length = kernel_recvmsg(server->ssocket, &smb_msg,
 585					iov, segs, to_read, 0);
 586
 587		if (server->tcpStatus == CifsExiting) {
 588			total_read = -ESHUTDOWN;
 589			break;
 590		} else if (server->tcpStatus == CifsNeedReconnect) {
 591			cifs_reconnect(server);
 592			total_read = -ECONNABORTED;
 593			break;
 594		} else if (length == -ERESTARTSYS ||
 595			   length == -EAGAIN ||
 596			   length == -EINTR) {
 597			/*
 598			 * Minimum sleep to prevent looping, allowing socket
 599			 * to clear and app threads to set tcpStatus
 600			 * CifsNeedReconnect if server hung.
 601			 */
 602			usleep_range(1000, 2000);
 603			length = 0;
 604			continue;
 605		} else if (length <= 0) {
 606			cifs_dbg(FYI, "Received no data or error: expecting %d\n"
 607				 "got %d", to_read, length);
 608			cifs_reconnect(server);
 609			total_read = -ECONNABORTED;
 610			break;
 611		}
 612	}
 613	return total_read;
 614}
 615
 616int
 617cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
 618		      unsigned int to_read)
 619{
 620	struct kvec iov;
 621
 622	iov.iov_base = buf;
 623	iov.iov_len = to_read;
 624
 625	return cifs_readv_from_socket(server, &iov, 1, to_read);
 626}
 627
 628static bool
 629is_smb_response(struct TCP_Server_Info *server, unsigned char type)
 630{
 631	/*
 632	 * The first byte big endian of the length field,
 633	 * is actually not part of the length but the type
 634	 * with the most common, zero, as regular data.
 635	 */
 636	switch (type) {
 637	case RFC1002_SESSION_MESSAGE:
 638		/* Regular SMB response */
 639		return true;
 640	case RFC1002_SESSION_KEEP_ALIVE:
 641		cifs_dbg(FYI, "RFC 1002 session keep alive\n");
 642		break;
 643	case RFC1002_POSITIVE_SESSION_RESPONSE:
 644		cifs_dbg(FYI, "RFC 1002 positive session response\n");
 645		break;
 646	case RFC1002_NEGATIVE_SESSION_RESPONSE:
 647		/*
 648		 * We get this from Windows 98 instead of an error on
 649		 * SMB negprot response.
 650		 */
 651		cifs_dbg(FYI, "RFC 1002 negative session response\n");
 652		/* give server a second to clean up */
 653		msleep(1000);
 654		/*
 655		 * Always try 445 first on reconnect since we get NACK
 656		 * on some if we ever connected to port 139 (the NACK
 657		 * is since we do not begin with RFC1001 session
 658		 * initialize frame).
 659		 */
 660		cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
 661		cifs_reconnect(server);
 662		wake_up(&server->response_q);
 663		break;
 664	default:
 665		cifs_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
 666		cifs_reconnect(server);
 667	}
 668
 669	return false;
 670}
 671
 672void
 673dequeue_mid(struct mid_q_entry *mid, bool malformed)
 674{
 675#ifdef CONFIG_CIFS_STATS2
 676	mid->when_received = jiffies;
 677#endif
 678	spin_lock(&GlobalMid_Lock);
 679	if (!malformed)
 680		mid->mid_state = MID_RESPONSE_RECEIVED;
 681	else
 682		mid->mid_state = MID_RESPONSE_MALFORMED;
 683	list_del_init(&mid->qhead);
 684	spin_unlock(&GlobalMid_Lock);
 685}
 686
 687static void
 688handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
 689	   char *buf, int malformed)
 690{
 691	if (server->ops->check_trans2 &&
 692	    server->ops->check_trans2(mid, server, buf, malformed))
 693		return;
 694	mid->resp_buf = buf;
 695	mid->large_buf = server->large_buf;
 696	/* Was previous buf put in mpx struct for multi-rsp? */
 697	if (!mid->multiRsp) {
 698		/* smb buffer will be freed by user thread */
 699		if (server->large_buf)
 700			server->bigbuf = NULL;
 701		else
 702			server->smallbuf = NULL;
 703	}
 704	dequeue_mid(mid, malformed);
 705}
 706
 707static void clean_demultiplex_info(struct TCP_Server_Info *server)
 708{
 709	int length;
 710
 711	/* take it off the list, if it's not already */
 712	spin_lock(&cifs_tcp_ses_lock);
 713	list_del_init(&server->tcp_ses_list);
 714	spin_unlock(&cifs_tcp_ses_lock);
 715
 716	spin_lock(&GlobalMid_Lock);
 717	server->tcpStatus = CifsExiting;
 718	spin_unlock(&GlobalMid_Lock);
 719	wake_up_all(&server->response_q);
 720
 721	/* check if we have blocked requests that need to free */
 722	spin_lock(&server->req_lock);
 723	if (server->credits <= 0)
 724		server->credits = 1;
 725	spin_unlock(&server->req_lock);
 726	/*
 727	 * Although there should not be any requests blocked on this queue it
 728	 * can not hurt to be paranoid and try to wake up requests that may
 729	 * haven been blocked when more than 50 at time were on the wire to the
 730	 * same server - they now will see the session is in exit state and get
 731	 * out of SendReceive.
 732	 */
 733	wake_up_all(&server->request_q);
 734	/* give those requests time to exit */
 735	msleep(125);
 736
 737	if (server->ssocket) {
 738		sock_release(server->ssocket);
 739		server->ssocket = NULL;
 740	}
 741
 742	if (!list_empty(&server->pending_mid_q)) {
 743		struct list_head dispose_list;
 744		struct mid_q_entry *mid_entry;
 745		struct list_head *tmp, *tmp2;
 746
 747		INIT_LIST_HEAD(&dispose_list);
 748		spin_lock(&GlobalMid_Lock);
 749		list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
 750			mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
 751			cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
 752			mid_entry->mid_state = MID_SHUTDOWN;
 753			list_move(&mid_entry->qhead, &dispose_list);
 754		}
 755		spin_unlock(&GlobalMid_Lock);
 756
 757		/* now walk dispose list and issue callbacks */
 758		list_for_each_safe(tmp, tmp2, &dispose_list) {
 759			mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
 760			cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
 761			list_del_init(&mid_entry->qhead);
 762			mid_entry->callback(mid_entry);
 763		}
 764		/* 1/8th of sec is more than enough time for them to exit */
 765		msleep(125);
 766	}
 767
 768	if (!list_empty(&server->pending_mid_q)) {
 769		/*
 770		 * mpx threads have not exited yet give them at least the smb
 771		 * send timeout time for long ops.
 772		 *
 773		 * Due to delays on oplock break requests, we need to wait at
 774		 * least 45 seconds before giving up on a request getting a
 775		 * response and going ahead and killing cifsd.
 776		 */
 777		cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
 778		msleep(46000);
 779		/*
 780		 * If threads still have not exited they are probably never
 781		 * coming home not much else we can do but free the memory.
 782		 */
 783	}
 784
 785	kfree(server->hostname);
 786	kfree(server->iov);
 787	kfree(server);
 788
 789	length = atomic_dec_return(&tcpSesAllocCount);
 790	if (length > 0)
 791		mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
 792}
 793
 794static int
 795standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
 796{
 797	int length;
 798	char *buf = server->smallbuf;
 799	unsigned int pdu_length = get_rfc1002_length(buf);
 800
 801	/* make sure this will fit in a large buffer */
 802	if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) - 4) {
 803		cifs_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
 804		cifs_reconnect(server);
 805		wake_up(&server->response_q);
 806		return -ECONNABORTED;
 807	}
 808
 809	/* switch to large buffer if too big for a small one */
 810	if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
 811		server->large_buf = true;
 812		memcpy(server->bigbuf, buf, server->total_read);
 813		buf = server->bigbuf;
 814	}
 815
 816	/* now read the rest */
 817	length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
 818				pdu_length - HEADER_SIZE(server) + 1 + 4);
 819	if (length < 0)
 820		return length;
 821	server->total_read += length;
 822
 823	dump_smb(buf, server->total_read);
 824
 825	/*
 826	 * We know that we received enough to get to the MID as we
 827	 * checked the pdu_length earlier. Now check to see
 828	 * if the rest of the header is OK. We borrow the length
 829	 * var for the rest of the loop to avoid a new stack var.
 830	 *
 831	 * 48 bytes is enough to display the header and a little bit
 832	 * into the payload for debugging purposes.
 833	 */
 834	length = server->ops->check_message(buf, server->total_read, server);
 835	if (length != 0)
 836		cifs_dump_mem("Bad SMB: ", buf,
 837			min_t(unsigned int, server->total_read, 48));
 838
 839	if (server->ops->is_status_pending &&
 840	    server->ops->is_status_pending(buf, server, length))
 841		return -1;
 842
 843	if (!mid)
 844		return length;
 845
 846	handle_mid(mid, server, buf, length);
 847	return 0;
 848}
 849
 850static int
 851cifs_demultiplex_thread(void *p)
 852{
 853	int length;
 854	struct TCP_Server_Info *server = p;
 855	unsigned int pdu_length;
 856	char *buf = NULL;
 857	struct task_struct *task_to_wake = NULL;
 858	struct mid_q_entry *mid_entry;
 859
 860	current->flags |= PF_MEMALLOC;
 861	cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
 862
 863	length = atomic_inc_return(&tcpSesAllocCount);
 864	if (length > 1)
 865		mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
 866
 867	set_freezable();
 868	while (server->tcpStatus != CifsExiting) {
 869		if (try_to_freeze())
 870			continue;
 871
 872		if (!allocate_buffers(server))
 873			continue;
 874
 875		server->large_buf = false;
 876		buf = server->smallbuf;
 877		pdu_length = 4; /* enough to get RFC1001 header */
 878
 879		length = cifs_read_from_socket(server, buf, pdu_length);
 880		if (length < 0)
 881			continue;
 882		server->total_read = length;
 883
 884		/*
 885		 * The right amount was read from socket - 4 bytes,
 886		 * so we can now interpret the length field.
 887		 */
 888		pdu_length = get_rfc1002_length(buf);
 889
 890		cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
 891		if (!is_smb_response(server, buf[0]))
 892			continue;
 893
 894		/* make sure we have enough to get to the MID */
 895		if (pdu_length < HEADER_SIZE(server) - 1 - 4) {
 896			cifs_dbg(VFS, "SMB response too short (%u bytes)\n",
 897				 pdu_length);
 898			cifs_reconnect(server);
 899			wake_up(&server->response_q);
 900			continue;
 901		}
 902
 903		/* read down to the MID */
 904		length = cifs_read_from_socket(server, buf + 4,
 905					       HEADER_SIZE(server) - 1 - 4);
 906		if (length < 0)
 907			continue;
 908		server->total_read += length;
 909
 910		mid_entry = server->ops->find_mid(server, buf);
 911
 912		if (!mid_entry || !mid_entry->receive)
 913			length = standard_receive3(server, mid_entry);
 914		else
 915			length = mid_entry->receive(server, mid_entry);
 916
 917		if (length < 0)
 918			continue;
 919
 920		if (server->large_buf)
 921			buf = server->bigbuf;
 922
 923		server->lstrp = jiffies;
 924		if (mid_entry != NULL) {
 925			if (!mid_entry->multiRsp || mid_entry->multiEnd)
 926				mid_entry->callback(mid_entry);
 927		} else if (!server->ops->is_oplock_break ||
 928			   !server->ops->is_oplock_break(buf, server)) {
 929			cifs_dbg(VFS, "No task to wake, unknown frame received! NumMids %d\n",
 930				 atomic_read(&midCount));
 931			cifs_dump_mem("Received Data is: ", buf,
 932				      HEADER_SIZE(server));
 933#ifdef CONFIG_CIFS_DEBUG2
 934			if (server->ops->dump_detail)
 935				server->ops->dump_detail(buf);
 936			cifs_dump_mids(server);
 937#endif /* CIFS_DEBUG2 */
 938
 939		}
 940	} /* end while !EXITING */
 941
 942	/* buffer usually freed in free_mid - need to free it here on exit */
 943	cifs_buf_release(server->bigbuf);
 944	if (server->smallbuf) /* no sense logging a debug message if NULL */
 945		cifs_small_buf_release(server->smallbuf);
 946
 947	task_to_wake = xchg(&server->tsk, NULL);
 948	clean_demultiplex_info(server);
 949
 950	/* if server->tsk was NULL then wait for a signal before exiting */
 951	if (!task_to_wake) {
 952		set_current_state(TASK_INTERRUPTIBLE);
 953		while (!signal_pending(current)) {
 954			schedule();
 955			set_current_state(TASK_INTERRUPTIBLE);
 956		}
 957		set_current_state(TASK_RUNNING);
 958	}
 959
 960	module_put_and_exit(0);
 961}
 962
 963/* extract the host portion of the UNC string */
 964static char *
 965extract_hostname(const char *unc)
 966{
 967	const char *src;
 968	char *dst, *delim;
 969	unsigned int len;
 970
 971	/* skip double chars at beginning of string */
 972	/* BB: check validity of these bytes? */
 973	src = unc + 2;
 974
 975	/* delimiter between hostname and sharename is always '\\' now */
 976	delim = strchr(src, '\\');
 977	if (!delim)
 978		return ERR_PTR(-EINVAL);
 979
 980	len = delim - src;
 981	dst = kmalloc((len + 1), GFP_KERNEL);
 982	if (dst == NULL)
 983		return ERR_PTR(-ENOMEM);
 984
 985	memcpy(dst, src, len);
 986	dst[len] = '\0';
 987
 988	return dst;
 989}
 990
 991static int get_option_ul(substring_t args[], unsigned long *option)
 992{
 993	int rc;
 994	char *string;
 995
 996	string = match_strdup(args);
 997	if (string == NULL)
 998		return -ENOMEM;
 999	rc = kstrtoul(string, 0, option);
1000	kfree(string);
1001
1002	return rc;
1003}
1004
1005static int get_option_uid(substring_t args[], kuid_t *result)
1006{
1007	unsigned long value;
1008	kuid_t uid;
1009	int rc;
1010
1011	rc = get_option_ul(args, &value);
1012	if (rc)
1013		return rc;
1014
1015	uid = make_kuid(current_user_ns(), value);
1016	if (!uid_valid(uid))
1017		return -EINVAL;
1018
1019	*result = uid;
1020	return 0;
1021}
1022
1023static int get_option_gid(substring_t args[], kgid_t *result)
1024{
1025	unsigned long value;
1026	kgid_t gid;
1027	int rc;
1028
1029	rc = get_option_ul(args, &value);
1030	if (rc)
1031		return rc;
1032
1033	gid = make_kgid(current_user_ns(), value);
1034	if (!gid_valid(gid))
1035		return -EINVAL;
1036
1037	*result = gid;
1038	return 0;
1039}
1040
1041static int cifs_parse_security_flavors(char *value,
1042				       struct smb_vol *vol)
1043{
1044
1045	substring_t args[MAX_OPT_ARGS];
1046
1047	/*
1048	 * With mount options, the last one should win. Reset any existing
1049	 * settings back to default.
1050	 */
1051	vol->sectype = Unspecified;
1052	vol->sign = false;
1053
1054	switch (match_token(value, cifs_secflavor_tokens, args)) {
1055	case Opt_sec_krb5p:
1056		cifs_dbg(VFS, "sec=krb5p is not supported!\n");
1057		return 1;
1058	case Opt_sec_krb5i:
1059		vol->sign = true;
1060		/* Fallthrough */
1061	case Opt_sec_krb5:
1062		vol->sectype = Kerberos;
1063		break;
1064	case Opt_sec_ntlmsspi:
1065		vol->sign = true;
1066		/* Fallthrough */
1067	case Opt_sec_ntlmssp:
1068		vol->sectype = RawNTLMSSP;
1069		break;
1070	case Opt_sec_ntlmi:
1071		vol->sign = true;
1072		/* Fallthrough */
1073	case Opt_ntlm:
1074		vol->sectype = NTLM;
1075		break;
1076	case Opt_sec_ntlmv2i:
1077		vol->sign = true;
1078		/* Fallthrough */
1079	case Opt_sec_ntlmv2:
1080		vol->sectype = NTLMv2;
1081		break;
1082#ifdef CONFIG_CIFS_WEAK_PW_HASH
1083	case Opt_sec_lanman:
1084		vol->sectype = LANMAN;
1085		break;
1086#endif
1087	case Opt_sec_none:
1088		vol->nullauth = 1;
1089		break;
1090	default:
1091		cifs_dbg(VFS, "bad security option: %s\n", value);
1092		return 1;
1093	}
1094
1095	return 0;
1096}
1097
1098static int
1099cifs_parse_cache_flavor(char *value, struct smb_vol *vol)
1100{
1101	substring_t args[MAX_OPT_ARGS];
1102
1103	switch (match_token(value, cifs_cacheflavor_tokens, args)) {
1104	case Opt_cache_loose:
1105		vol->direct_io = false;
1106		vol->strict_io = false;
1107		break;
1108	case Opt_cache_strict:
1109		vol->direct_io = false;
1110		vol->strict_io = true;
1111		break;
1112	case Opt_cache_none:
1113		vol->direct_io = true;
1114		vol->strict_io = false;
1115		break;
1116	default:
1117		cifs_dbg(VFS, "bad cache= option: %s\n", value);
1118		return 1;
1119	}
1120	return 0;
1121}
1122
1123static int
1124cifs_parse_smb_version(char *value, struct smb_vol *vol)
1125{
1126	substring_t args[MAX_OPT_ARGS];
1127
1128	switch (match_token(value, cifs_smb_version_tokens, args)) {
1129	case Smb_1:
1130		vol->ops = &smb1_operations;
1131		vol->vals = &smb1_values;
1132		break;
1133#ifdef CONFIG_CIFS_SMB2
1134	case Smb_20:
1135		vol->ops = &smb20_operations;
1136		vol->vals = &smb20_values;
1137		break;
1138	case Smb_21:
1139		vol->ops = &smb21_operations;
1140		vol->vals = &smb21_values;
1141		break;
1142	case Smb_30:
1143		vol->ops = &smb30_operations;
1144		vol->vals = &smb30_values;
1145		break;
1146	case Smb_302:
1147		vol->ops = &smb30_operations; /* currently identical with 3.0 */
1148		vol->vals = &smb302_values;
1149		break;
1150#ifdef CONFIG_CIFS_SMB311
1151	case Smb_311:
1152		vol->ops = &smb311_operations;
1153		vol->vals = &smb311_values;
1154		break;
1155#endif /* SMB311 */
1156#endif
1157	default:
1158		cifs_dbg(VFS, "Unknown vers= option specified: %s\n", value);
1159		return 1;
1160	}
1161	return 0;
1162}
1163
1164/*
1165 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1166 * fields with the result. Returns 0 on success and an error otherwise.
1167 */
1168static int
1169cifs_parse_devname(const char *devname, struct smb_vol *vol)
1170{
1171	char *pos;
1172	const char *delims = "/\\";
1173	size_t len;
1174
1175	/* make sure we have a valid UNC double delimiter prefix */
1176	len = strspn(devname, delims);
1177	if (len != 2)
1178		return -EINVAL;
1179
1180	/* find delimiter between host and sharename */
1181	pos = strpbrk(devname + 2, delims);
1182	if (!pos)
1183		return -EINVAL;
1184
1185	/* skip past delimiter */
1186	++pos;
1187
1188	/* now go until next delimiter or end of string */
1189	len = strcspn(pos, delims);
1190
1191	/* move "pos" up to delimiter or NULL */
1192	pos += len;
1193	vol->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
1194	if (!vol->UNC)
1195		return -ENOMEM;
1196
1197	convert_delimiter(vol->UNC, '\\');
1198
1199	/* If pos is NULL, or is a bogus trailing delimiter then no prepath */
1200	if (!*pos++ || !*pos)
1201		return 0;
1202
1203	vol->prepath = kstrdup(pos, GFP_KERNEL);
1204	if (!vol->prepath)
1205		return -ENOMEM;
1206
1207	return 0;
1208}
1209
1210static int
1211cifs_parse_mount_options(const char *mountdata, const char *devname,
1212			 struct smb_vol *vol)
1213{
1214	char *data, *end;
1215	char *mountdata_copy = NULL, *options;
1216	unsigned int  temp_len, i, j;
1217	char separator[2];
1218	short int override_uid = -1;
1219	short int override_gid = -1;
1220	bool uid_specified = false;
1221	bool gid_specified = false;
1222	bool sloppy = false;
1223	char *invalid = NULL;
1224	char *nodename = utsname()->nodename;
1225	char *string = NULL;
1226	char *tmp_end, *value;
1227	char delim;
1228	bool got_ip = false;
1229	unsigned short port = 0;
1230	struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1231
1232	separator[0] = ',';
1233	separator[1] = 0;
1234	delim = separator[0];
1235
1236	/* ensure we always start with zeroed-out smb_vol */
1237	memset(vol, 0, sizeof(*vol));
1238
1239	/*
1240	 * does not have to be perfect mapping since field is
1241	 * informational, only used for servers that do not support
1242	 * port 445 and it can be overridden at mount time
1243	 */
1244	memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1245	for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1246		vol->source_rfc1001_name[i] = toupper(nodename[i]);
1247
1248	vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1249	/* null target name indicates to use *SMBSERVR default called name
1250	   if we end up sending RFC1001 session initialize */
1251	vol->target_rfc1001_name[0] = 0;
1252	vol->cred_uid = current_uid();
1253	vol->linux_uid = current_uid();
1254	vol->linux_gid = current_gid();
1255
1256	/*
1257	 * default to SFM style remapping of seven reserved characters
1258	 * unless user overrides it or we negotiate CIFS POSIX where
1259	 * it is unnecessary.  Can not simultaneously use more than one mapping
1260	 * since then readdir could list files that open could not open
1261	 */
1262	vol->remap = true;
1263
1264	/* default to only allowing write access to owner of the mount */
1265	vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1266
1267	/* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1268	/* default is always to request posix paths. */
1269	vol->posix_paths = 1;
1270	/* default to using server inode numbers where available */
1271	vol->server_ino = 1;
1272
1273	/* default is to use strict cifs caching semantics */
1274	vol->strict_io = true;
1275
1276	vol->actimeo = CIFS_DEF_ACTIMEO;
1277
1278	/* FIXME: add autonegotiation -- for now, SMB1 is default */
1279	vol->ops = &smb1_operations;
1280	vol->vals = &smb1_values;
1281
1282	if (!mountdata)
1283		goto cifs_parse_mount_err;
1284
1285	mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1286	if (!mountdata_copy)
1287		goto cifs_parse_mount_err;
1288
1289	options = mountdata_copy;
1290	end = options + strlen(options);
1291
1292	if (strncmp(options, "sep=", 4) == 0) {
1293		if (options[4] != 0) {
1294			separator[0] = options[4];
1295			options += 5;
1296		} else {
1297			cifs_dbg(FYI, "Null separator not allowed\n");
1298		}
1299	}
1300	vol->backupuid_specified = false; /* no backup intent for a user */
1301	vol->backupgid_specified = false; /* no backup intent for a group */
1302
1303	switch (cifs_parse_devname(devname, vol)) {
1304	case 0:
1305		break;
1306	case -ENOMEM:
1307		cifs_dbg(VFS, "Unable to allocate memory for devname.\n");
1308		goto cifs_parse_mount_err;
1309	case -EINVAL:
1310		cifs_dbg(VFS, "Malformed UNC in devname.\n");
1311		goto cifs_parse_mount_err;
1312	default:
1313		cifs_dbg(VFS, "Unknown error parsing devname.\n");
1314		goto cifs_parse_mount_err;
1315	}
1316
1317	while ((data = strsep(&options, separator)) != NULL) {
1318		substring_t args[MAX_OPT_ARGS];
1319		unsigned long option;
1320		int token;
1321
1322		if (!*data)
1323			continue;
1324
1325		token = match_token(data, cifs_mount_option_tokens, args);
1326
1327		switch (token) {
1328
1329		/* Ingnore the following */
1330		case Opt_ignore:
1331			break;
1332
1333		/* Boolean values */
1334		case Opt_user_xattr:
1335			vol->no_xattr = 0;
1336			break;
1337		case Opt_nouser_xattr:
1338			vol->no_xattr = 1;
1339			break;
1340		case Opt_forceuid:
1341			override_uid = 1;
1342			break;
1343		case Opt_noforceuid:
1344			override_uid = 0;
1345			break;
1346		case Opt_forcegid:
1347			override_gid = 1;
1348			break;
1349		case Opt_noforcegid:
1350			override_gid = 0;
1351			break;
1352		case Opt_noblocksend:
1353			vol->noblocksnd = 1;
1354			break;
1355		case Opt_noautotune:
1356			vol->noautotune = 1;
1357			break;
1358		case Opt_hard:
1359			vol->retry = 1;
1360			break;
1361		case Opt_soft:
1362			vol->retry = 0;
1363			break;
1364		case Opt_perm:
1365			vol->noperm = 0;
1366			break;
1367		case Opt_noperm:
1368			vol->noperm = 1;
1369			break;
1370		case Opt_mapchars:
1371			vol->sfu_remap = true;
1372			vol->remap = false; /* disable SFM mapping */
1373			break;
1374		case Opt_nomapchars:
1375			vol->sfu_remap = false;
1376			break;
1377		case Opt_mapposix:
1378			vol->remap = true;
1379			vol->sfu_remap = false; /* disable SFU mapping */
1380			break;
1381		case Opt_nomapposix:
1382			vol->remap = false;
1383			break;
1384		case Opt_sfu:
1385			vol->sfu_emul = 1;
1386			break;
1387		case Opt_nosfu:
1388			vol->sfu_emul = 0;
1389			break;
1390		case Opt_nodfs:
1391			vol->nodfs = 1;
1392			break;
1393		case Opt_posixpaths:
1394			vol->posix_paths = 1;
1395			break;
1396		case Opt_noposixpaths:
1397			vol->posix_paths = 0;
1398			break;
1399		case Opt_nounix:
1400			vol->no_linux_ext = 1;
1401			break;
1402		case Opt_nocase:
1403			vol->nocase = 1;
1404			break;
1405		case Opt_brl:
1406			vol->nobrl =  0;
1407			break;
1408		case Opt_nobrl:
1409			vol->nobrl =  1;
1410			/*
1411			 * turn off mandatory locking in mode
1412			 * if remote locking is turned off since the
1413			 * local vfs will do advisory
1414			 */
1415			if (vol->file_mode ==
1416				(S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1417				vol->file_mode = S_IALLUGO;
1418			break;
1419		case Opt_forcemandatorylock:
1420			vol->mand_lock = 1;
1421			break;
1422		case Opt_setuids:
1423			vol->setuids = 1;
1424			break;
1425		case Opt_nosetuids:
1426			vol->setuids = 0;
1427			break;
1428		case Opt_dynperm:
1429			vol->dynperm = true;
1430			break;
1431		case Opt_nodynperm:
1432			vol->dynperm = false;
1433			break;
1434		case Opt_nohard:
1435			vol->retry = 0;
1436			break;
1437		case Opt_nosoft:
1438			vol->retry = 1;
1439			break;
1440		case Opt_nointr:
1441			vol->intr = 0;
1442			break;
1443		case Opt_intr:
1444			vol->intr = 1;
1445			break;
1446		case Opt_nostrictsync:
1447			vol->nostrictsync = 1;
1448			break;
1449		case Opt_strictsync:
1450			vol->nostrictsync = 0;
1451			break;
1452		case Opt_serverino:
1453			vol->server_ino = 1;
1454			break;
1455		case Opt_noserverino:
1456			vol->server_ino = 0;
1457			break;
1458		case Opt_rwpidforward:
1459			vol->rwpidforward = 1;
1460			break;
1461		case Opt_cifsacl:
1462			vol->cifs_acl = 1;
1463			break;
1464		case Opt_nocifsacl:
1465			vol->cifs_acl = 0;
1466			break;
1467		case Opt_acl:
1468			vol->no_psx_acl = 0;
1469			break;
1470		case Opt_noacl:
1471			vol->no_psx_acl = 1;
1472			break;
1473		case Opt_locallease:
1474			vol->local_lease = 1;
1475			break;
1476		case Opt_sign:
1477			vol->sign = true;
1478			break;
1479		case Opt_seal:
1480			/* we do not do the following in secFlags because seal
1481			 * is a per tree connection (mount) not a per socket
1482			 * or per-smb connection option in the protocol
1483			 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1484			 */
1485			vol->seal = 1;
1486			break;
1487		case Opt_noac:
1488			pr_warn("CIFS: Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1489			break;
1490		case Opt_fsc:
1491#ifndef CONFIG_CIFS_FSCACHE
1492			cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1493			goto cifs_parse_mount_err;
1494#endif
1495			vol->fsc = true;
1496			break;
1497		case Opt_mfsymlinks:
1498			vol->mfsymlinks = true;
1499			break;
1500		case Opt_multiuser:
1501			vol->multiuser = true;
1502			break;
1503		case Opt_sloppy:
1504			sloppy = true;
1505			break;
1506		case Opt_nosharesock:
1507			vol->nosharesock = true;
1508			break;
1509		case Opt_nopersistent:
1510			vol->nopersistent = true;
1511			if (vol->persistent) {
1512				cifs_dbg(VFS,
1513				  "persistenthandles mount options conflict\n");
1514				goto cifs_parse_mount_err;
1515			}
1516			break;
1517		case Opt_persistent:
1518			vol->persistent = true;
1519			if ((vol->nopersistent) || (vol->resilient)) {
1520				cifs_dbg(VFS,
1521				  "persistenthandles mount options conflict\n");
1522				goto cifs_parse_mount_err;
1523			}
1524			break;
1525		case Opt_resilient:
1526			vol->resilient = true;
1527			if (vol->persistent) {
1528				cifs_dbg(VFS,
1529				  "persistenthandles mount options conflict\n");
1530				goto cifs_parse_mount_err;
1531			}
1532			break;
1533		case Opt_noresilient:
1534			vol->resilient = false; /* already the default */
1535			break;
1536
1537		/* Numeric Values */
1538		case Opt_backupuid:
1539			if (get_option_uid(args, &vol->backupuid)) {
1540				cifs_dbg(VFS, "%s: Invalid backupuid value\n",
1541					 __func__);
1542				goto cifs_parse_mount_err;
1543			}
1544			vol->backupuid_specified = true;
1545			break;
1546		case Opt_backupgid:
1547			if (get_option_gid(args, &vol->backupgid)) {
1548				cifs_dbg(VFS, "%s: Invalid backupgid value\n",
1549					 __func__);
1550				goto cifs_parse_mount_err;
1551			}
1552			vol->backupgid_specified = true;
1553			break;
1554		case Opt_uid:
1555			if (get_option_uid(args, &vol->linux_uid)) {
1556				cifs_dbg(VFS, "%s: Invalid uid value\n",
1557					 __func__);
1558				goto cifs_parse_mount_err;
1559			}
1560			uid_specified = true;
1561			break;
1562		case Opt_cruid:
1563			if (get_option_uid(args, &vol->cred_uid)) {
1564				cifs_dbg(VFS, "%s: Invalid cruid value\n",
1565					 __func__);
1566				goto cifs_parse_mount_err;
1567			}
1568			break;
1569		case Opt_gid:
1570			if (get_option_gid(args, &vol->linux_gid)) {
1571				cifs_dbg(VFS, "%s: Invalid gid value\n",
1572					 __func__);
1573				goto cifs_parse_mount_err;
1574			}
1575			gid_specified = true;
1576			break;
1577		case Opt_file_mode:
1578			if (get_option_ul(args, &option)) {
1579				cifs_dbg(VFS, "%s: Invalid file_mode value\n",
1580					 __func__);
1581				goto cifs_parse_mount_err;
1582			}
1583			vol->file_mode = option;
1584			break;
1585		case Opt_dirmode:
1586			if (get_option_ul(args, &option)) {
1587				cifs_dbg(VFS, "%s: Invalid dir_mode value\n",
1588					 __func__);
1589				goto cifs_parse_mount_err;
1590			}
1591			vol->dir_mode = option;
1592			break;
1593		case Opt_port:
1594			if (get_option_ul(args, &option) ||
1595			    option > USHRT_MAX) {
1596				cifs_dbg(VFS, "%s: Invalid port value\n",
1597					 __func__);
1598				goto cifs_parse_mount_err;
1599			}
1600			port = (unsigned short)option;
1601			break;
1602		case Opt_rsize:
1603			if (get_option_ul(args, &option)) {
1604				cifs_dbg(VFS, "%s: Invalid rsize value\n",
1605					 __func__);
1606				goto cifs_parse_mount_err;
1607			}
1608			vol->rsize = option;
1609			break;
1610		case Opt_wsize:
1611			if (get_option_ul(args, &option)) {
1612				cifs_dbg(VFS, "%s: Invalid wsize value\n",
1613					 __func__);
1614				goto cifs_parse_mount_err;
1615			}
1616			vol->wsize = option;
1617			break;
1618		case Opt_actimeo:
1619			if (get_option_ul(args, &option)) {
1620				cifs_dbg(VFS, "%s: Invalid actimeo value\n",
1621					 __func__);
1622				goto cifs_parse_mount_err;
1623			}
1624			vol->actimeo = HZ * option;
1625			if (vol->actimeo > CIFS_MAX_ACTIMEO) {
1626				cifs_dbg(VFS, "attribute cache timeout too large\n");
1627				goto cifs_parse_mount_err;
1628			}
1629			break;
1630		case Opt_echo_interval:
1631			if (get_option_ul(args, &option)) {
1632				cifs_dbg(VFS, "%s: Invalid echo interval value\n",
1633					 __func__);
1634				goto cifs_parse_mount_err;
1635			}
1636			vol->echo_interval = option;
1637			break;
1638
1639		/* String Arguments */
1640
1641		case Opt_blank_user:
1642			/* null user, ie. anonymous authentication */
1643			vol->nullauth = 1;
1644			vol->username = NULL;
1645			break;
1646		case Opt_user:
1647			string = match_strdup(args);
1648			if (string == NULL)
1649				goto out_nomem;
1650
1651			if (strnlen(string, CIFS_MAX_USERNAME_LEN) >
1652							CIFS_MAX_USERNAME_LEN) {
1653				pr_warn("CIFS: username too long\n");
1654				goto cifs_parse_mount_err;
1655			}
1656
1657			kfree(vol->username);
1658			vol->username = kstrdup(string, GFP_KERNEL);
1659			if (!vol->username)
1660				goto cifs_parse_mount_err;
1661			break;
1662		case Opt_blank_pass:
1663			/* passwords have to be handled differently
1664			 * to allow the character used for deliminator
1665			 * to be passed within them
1666			 */
1667
1668			/*
1669			 * Check if this is a case where the  password
1670			 * starts with a delimiter
1671			 */
1672			tmp_end = strchr(data, '=');
1673			tmp_end++;
1674			if (!(tmp_end < end && tmp_end[1] == delim)) {
1675				/* No it is not. Set the password to NULL */
1676				kfree(vol->password);
1677				vol->password = NULL;
1678				break;
1679			}
1680			/* Yes it is. Drop down to Opt_pass below.*/
1681		case Opt_pass:
1682			/* Obtain the value string */
1683			value = strchr(data, '=');
1684			value++;
1685
1686			/* Set tmp_end to end of the string */
1687			tmp_end = (char *) value + strlen(value);
1688
1689			/* Check if following character is the deliminator
1690			 * If yes, we have encountered a double deliminator
1691			 * reset the NULL character to the deliminator
1692			 */
1693			if (tmp_end < end && tmp_end[1] == delim) {
1694				tmp_end[0] = delim;
1695
1696				/* Keep iterating until we get to a single
1697				 * deliminator OR the end
1698				 */
1699				while ((tmp_end = strchr(tmp_end, delim))
1700					!= NULL && (tmp_end[1] == delim)) {
1701						tmp_end = (char *) &tmp_end[2];
1702				}
1703
1704				/* Reset var options to point to next element */
1705				if (tmp_end) {
1706					tmp_end[0] = '\0';
1707					options = (char *) &tmp_end[1];
1708				} else
1709					/* Reached the end of the mount option
1710					 * string */
1711					options = end;
1712			}
1713
1714			kfree(vol->password);
1715			/* Now build new password string */
1716			temp_len = strlen(value);
1717			vol->password = kzalloc(temp_len+1, GFP_KERNEL);
1718			if (vol->password == NULL) {
1719				pr_warn("CIFS: no memory for password\n");
1720				goto cifs_parse_mount_err;
1721			}
1722
1723			for (i = 0, j = 0; i < temp_len; i++, j++) {
1724				vol->password[j] = value[i];
1725				if ((value[i] == delim) &&
1726				     value[i+1] == delim)
1727					/* skip the second deliminator */
1728					i++;
1729			}
1730			vol->password[j] = '\0';
1731			break;
1732		case Opt_blank_ip:
1733			/* FIXME: should this be an error instead? */
1734			got_ip = false;
1735			break;
1736		case Opt_ip:
1737			string = match_strdup(args);
1738			if (string == NULL)
1739				goto out_nomem;
1740
1741			if (!cifs_convert_address(dstaddr, string,
1742					strlen(string))) {
1743				pr_err("CIFS: bad ip= option (%s).\n", string);
1744				goto cifs_parse_mount_err;
1745			}
1746			got_ip = true;
1747			break;
1748		case Opt_domain:
1749			string = match_strdup(args);
1750			if (string == NULL)
1751				goto out_nomem;
1752
1753			if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
1754					== CIFS_MAX_DOMAINNAME_LEN) {
1755				pr_warn("CIFS: domain name too long\n");
1756				goto cifs_parse_mount_err;
1757			}
1758
1759			kfree(vol->domainname);
1760			vol->domainname = kstrdup(string, GFP_KERNEL);
1761			if (!vol->domainname) {
1762				pr_warn("CIFS: no memory for domainname\n");
1763				goto cifs_parse_mount_err;
1764			}
1765			cifs_dbg(FYI, "Domain name set\n");
1766			break;
1767		case Opt_srcaddr:
1768			string = match_strdup(args);
1769			if (string == NULL)
1770				goto out_nomem;
1771
1772			if (!cifs_convert_address(
1773					(struct sockaddr *)&vol->srcaddr,
1774					string, strlen(string))) {
1775				pr_warn("CIFS: Could not parse srcaddr: %s\n",
1776					string);
1777				goto cifs_parse_mount_err;
1778			}
1779			break;
1780		case Opt_iocharset:
1781			string = match_strdup(args);
1782			if (string == NULL)
1783				goto out_nomem;
1784
1785			if (strnlen(string, 1024) >= 65) {
1786				pr_warn("CIFS: iocharset name too long.\n");
1787				goto cifs_parse_mount_err;
1788			}
1789
1790			 if (strncasecmp(string, "default", 7) != 0) {
1791				kfree(vol->iocharset);
1792				vol->iocharset = kstrdup(string,
1793							 GFP_KERNEL);
1794				if (!vol->iocharset) {
1795					pr_warn("CIFS: no memory for charset\n");
1796					goto cifs_parse_mount_err;
1797				}
1798			}
1799			/* if iocharset not set then load_nls_default
1800			 * is used by caller
1801			 */
1802			 cifs_dbg(FYI, "iocharset set to %s\n", string);
1803			break;
1804		case Opt_netbiosname:
1805			string = match_strdup(args);
1806			if (string == NULL)
1807				goto out_nomem;
1808
1809			memset(vol->source_rfc1001_name, 0x20,
1810				RFC1001_NAME_LEN);
1811			/*
1812			 * FIXME: are there cases in which a comma can
1813			 * be valid in workstation netbios name (and
1814			 * need special handling)?
1815			 */
1816			for (i = 0; i < RFC1001_NAME_LEN; i++) {
1817				/* don't ucase netbiosname for user */
1818				if (string[i] == 0)
1819					break;
1820				vol->source_rfc1001_name[i] = string[i];
1821			}
1822			/* The string has 16th byte zero still from
1823			 * set at top of the function
1824			 */
1825			if (i == RFC1001_NAME_LEN && string[i] != 0)
1826				pr_warn("CIFS: netbiosname longer than 15 truncated.\n");
1827			break;
1828		case Opt_servern:
1829			/* servernetbiosname specified override *SMBSERVER */
1830			string = match_strdup(args);
1831			if (string == NULL)
1832				goto out_nomem;
1833
1834			/* last byte, type, is 0x20 for servr type */
1835			memset(vol->target_rfc1001_name, 0x20,
1836				RFC1001_NAME_LEN_WITH_NULL);
1837
1838			/* BB are there cases in which a comma can be
1839			   valid in this workstation netbios name
1840			   (and need special handling)? */
1841
1842			/* user or mount helper must uppercase the
1843			   netbios name */
1844			for (i = 0; i < 15; i++) {
1845				if (string[i] == 0)
1846					break;
1847				vol->target_rfc1001_name[i] = string[i];
1848			}
1849			/* The string has 16th byte zero still from
1850			   set at top of the function  */
1851			if (i == RFC1001_NAME_LEN && string[i] != 0)
1852				pr_warn("CIFS: server netbiosname longer than 15 truncated.\n");
1853			break;
1854		case Opt_ver:
1855			string = match_strdup(args);
1856			if (string == NULL)
1857				goto out_nomem;
1858
1859			if (strncasecmp(string, "1", 1) == 0) {
1860				/* This is the default */
1861				break;
1862			}
1863			/* For all other value, error */
1864			pr_warn("CIFS: Invalid version specified\n");
1865			goto cifs_parse_mount_err;
1866		case Opt_vers:
1867			string = match_strdup(args);
1868			if (string == NULL)
1869				goto out_nomem;
1870
1871			if (cifs_parse_smb_version(string, vol) != 0)
1872				goto cifs_parse_mount_err;
1873			break;
1874		case Opt_sec:
1875			string = match_strdup(args);
1876			if (string == NULL)
1877				goto out_nomem;
1878
1879			if (cifs_parse_security_flavors(string, vol) != 0)
1880				goto cifs_parse_mount_err;
1881			break;
1882		case Opt_cache:
1883			string = match_strdup(args);
1884			if (string == NULL)
1885				goto out_nomem;
1886
1887			if (cifs_parse_cache_flavor(string, vol) != 0)
1888				goto cifs_parse_mount_err;
1889			break;
1890		default:
1891			/*
1892			 * An option we don't recognize. Save it off for later
1893			 * if we haven't already found one
1894			 */
1895			if (!invalid)
1896				invalid = data;
1897			break;
1898		}
1899		/* Free up any allocated string */
1900		kfree(string);
1901		string = NULL;
1902	}
1903
1904	if (!sloppy && invalid) {
1905		pr_err("CIFS: Unknown mount option \"%s\"\n", invalid);
1906		goto cifs_parse_mount_err;
1907	}
1908
1909#ifndef CONFIG_KEYS
1910	/* Muliuser mounts require CONFIG_KEYS support */
1911	if (vol->multiuser) {
1912		cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
1913		goto cifs_parse_mount_err;
1914	}
1915#endif
1916	if (!vol->UNC) {
1917		cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
1918		goto cifs_parse_mount_err;
1919	}
1920
1921	/* make sure UNC has a share name */
1922	if (!strchr(vol->UNC + 3, '\\')) {
1923		cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
1924		goto cifs_parse_mount_err;
1925	}
1926
1927	if (!got_ip) {
1928		/* No ip= option specified? Try to get it from UNC */
1929		if (!cifs_convert_address(dstaddr, &vol->UNC[2],
1930						strlen(&vol->UNC[2]))) {
1931			pr_err("Unable to determine destination address.\n");
1932			goto cifs_parse_mount_err;
1933		}
1934	}
1935
1936	/* set the port that we got earlier */
1937	cifs_set_port(dstaddr, port);
1938
1939	if (uid_specified)
1940		vol->override_uid = override_uid;
1941	else if (override_uid == 1)
1942		pr_notice("CIFS: ignoring forceuid mount option specified with no uid= option.\n");
1943
1944	if (gid_specified)
1945		vol->override_gid = override_gid;
1946	else if (override_gid == 1)
1947		pr_notice("CIFS: ignoring forcegid mount option specified with no gid= option.\n");
1948
1949	kfree(mountdata_copy);
1950	return 0;
1951
1952out_nomem:
1953	pr_warn("Could not allocate temporary buffer\n");
1954cifs_parse_mount_err:
1955	kfree(string);
1956	kfree(mountdata_copy);
1957	return 1;
1958}
1959
1960/** Returns true if srcaddr isn't specified and rhs isn't
1961 * specified, or if srcaddr is specified and
1962 * matches the IP address of the rhs argument.
1963 */
1964static bool
1965srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
1966{
1967	switch (srcaddr->sa_family) {
1968	case AF_UNSPEC:
1969		return (rhs->sa_family == AF_UNSPEC);
1970	case AF_INET: {
1971		struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
1972		struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
1973		return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
1974	}
1975	case AF_INET6: {
1976		struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
1977		struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
1978		return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
1979	}
1980	default:
1981		WARN_ON(1);
1982		return false; /* don't expect to be here */
1983	}
1984}
1985
1986/*
1987 * If no port is specified in addr structure, we try to match with 445 port
1988 * and if it fails - with 139 ports. It should be called only if address
1989 * families of server and addr are equal.
1990 */
1991static bool
1992match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
1993{
1994	__be16 port, *sport;
1995
1996	switch (addr->sa_family) {
1997	case AF_INET:
1998		sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
1999		port = ((struct sockaddr_in *) addr)->sin_port;
2000		break;
2001	case AF_INET6:
2002		sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
2003		port = ((struct sockaddr_in6 *) addr)->sin6_port;
2004		break;
2005	default:
2006		WARN_ON(1);
2007		return false;
2008	}
2009
2010	if (!port) {
2011		port = htons(CIFS_PORT);
2012		if (port == *sport)
2013			return true;
2014
2015		port = htons(RFC1001_PORT);
2016	}
2017
2018	return port == *sport;
2019}
2020
2021static bool
2022match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
2023	      struct sockaddr *srcaddr)
2024{
2025	switch (addr->sa_family) {
2026	case AF_INET: {
2027		struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
2028		struct sockaddr_in *srv_addr4 =
2029					(struct sockaddr_in *)&server->dstaddr;
2030
2031		if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
2032			return false;
2033		break;
2034	}
2035	case AF_INET6: {
2036		struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
2037		struct sockaddr_in6 *srv_addr6 =
2038					(struct sockaddr_in6 *)&server->dstaddr;
2039
2040		if (!ipv6_addr_equal(&addr6->sin6_addr,
2041				     &srv_addr6->sin6_addr))
2042			return false;
2043		if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
2044			return false;
2045		break;
2046	}
2047	default:
2048		WARN_ON(1);
2049		return false; /* don't expect to be here */
2050	}
2051
2052	if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
2053		return false;
2054
2055	return true;
2056}
2057
2058static bool
2059match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2060{
2061	/*
2062	 * The select_sectype function should either return the vol->sectype
2063	 * that was specified, or "Unspecified" if that sectype was not
2064	 * compatible with the given NEGOTIATE request.
2065	 */
2066	if (select_sectype(server, vol->sectype) == Unspecified)
2067		return false;
2068
2069	/*
2070	 * Now check if signing mode is acceptable. No need to check
2071	 * global_secflags at this point since if MUST_SIGN is set then
2072	 * the server->sign had better be too.
2073	 */
2074	if (vol->sign && !server->sign)
2075		return false;
2076
2077	return true;
2078}
2079
2080static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
2081{
2082	struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2083
2084	if (vol->nosharesock)
2085		return 0;
2086
2087	if ((server->vals != vol->vals) || (server->ops != vol->ops))
2088		return 0;
2089
2090	if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2091		return 0;
2092
2093	if (!match_address(server, addr,
2094			   (struct sockaddr *)&vol->srcaddr))
2095		return 0;
2096
2097	if (!match_port(server, addr))
2098		return 0;
2099
2100	if (!match_security(server, vol))
2101		return 0;
2102
2103	if (server->echo_interval != vol->echo_interval)
2104		return 0;
2105
2106	return 1;
2107}
2108
2109static struct TCP_Server_Info *
2110cifs_find_tcp_session(struct smb_vol *vol)
2111{
2112	struct TCP_Server_Info *server;
2113
2114	spin_lock(&cifs_tcp_ses_lock);
2115	list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
2116		if (!match_server(server, vol))
2117			continue;
2118
2119		++server->srv_count;
2120		spin_unlock(&cifs_tcp_ses_lock);
2121		cifs_dbg(FYI, "Existing tcp session with server found\n");
2122		return server;
2123	}
2124	spin_unlock(&cifs_tcp_ses_lock);
2125	return NULL;
2126}
2127
2128static void
2129cifs_put_tcp_session(struct TCP_Server_Info *server)
2130{
2131	struct task_struct *task;
2132
2133	spin_lock(&cifs_tcp_ses_lock);
2134	if (--server->srv_count > 0) {
2135		spin_unlock(&cifs_tcp_ses_lock);
2136		return;
2137	}
2138
2139	put_net(cifs_net_ns(server));
2140
2141	list_del_init(&server->tcp_ses_list);
2142	spin_unlock(&cifs_tcp_ses_lock);
2143
2144	cancel_delayed_work_sync(&server->echo);
2145
2146	spin_lock(&GlobalMid_Lock);
2147	server->tcpStatus = CifsExiting;
2148	spin_unlock(&GlobalMid_Lock);
2149
2150	cifs_crypto_shash_release(server);
2151	cifs_fscache_release_client_cookie(server);
2152
2153	kfree(server->session_key.response);
2154	server->session_key.response = NULL;
2155	server->session_key.len = 0;
2156
2157	task = xchg(&server->tsk, NULL);
2158	if (task)
2159		force_sig(SIGKILL, task);
2160}
2161
2162static struct TCP_Server_Info *
2163cifs_get_tcp_session(struct smb_vol *volume_info)
2164{
2165	struct TCP_Server_Info *tcp_ses = NULL;
2166	int rc;
2167
2168	cifs_dbg(FYI, "UNC: %s\n", volume_info->UNC);
2169
2170	/* see if we already have a matching tcp_ses */
2171	tcp_ses = cifs_find_tcp_session(volume_info);
2172	if (tcp_ses)
2173		return tcp_ses;
2174
2175	tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2176	if (!tcp_ses) {
2177		rc = -ENOMEM;
2178		goto out_err;
2179	}
2180
2181	tcp_ses->ops = volume_info->ops;
2182	tcp_ses->vals = volume_info->vals;
2183	cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2184	tcp_ses->hostname = extract_hostname(volume_info->UNC);
2185	if (IS_ERR(tcp_ses->hostname)) {
2186		rc = PTR_ERR(tcp_ses->hostname);
2187		goto out_err_crypto_release;
2188	}
2189
2190	tcp_ses->noblocksnd = volume_info->noblocksnd;
2191	tcp_ses->noautotune = volume_info->noautotune;
2192	tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2193	tcp_ses->in_flight = 0;
2194	tcp_ses->credits = 1;
2195	init_waitqueue_head(&tcp_ses->response_q);
2196	init_waitqueue_head(&tcp_ses->request_q);
2197	INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2198	mutex_init(&tcp_ses->srv_mutex);
2199	memcpy(tcp_ses->workstation_RFC1001_name,
2200		volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2201	memcpy(tcp_ses->server_RFC1001_name,
2202		volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2203	tcp_ses->session_estab = false;
2204	tcp_ses->sequence_number = 0;
2205	tcp_ses->lstrp = jiffies;
2206	spin_lock_init(&tcp_ses->req_lock);
2207	INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2208	INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2209	INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2210	memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2211	       sizeof(tcp_ses->srcaddr));
2212	memcpy(&tcp_ses->dstaddr, &volume_info->dstaddr,
2213		sizeof(tcp_ses->dstaddr));
2214#ifdef CONFIG_CIFS_SMB2
2215	get_random_bytes(tcp_ses->client_guid, SMB2_CLIENT_GUID_SIZE);
2216#endif
2217	/*
2218	 * at this point we are the only ones with the pointer
2219	 * to the struct since the kernel thread not created yet
2220	 * no need to spinlock this init of tcpStatus or srv_count
2221	 */
2222	tcp_ses->tcpStatus = CifsNew;
2223	++tcp_ses->srv_count;
2224
2225	if (volume_info->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
2226		volume_info->echo_interval <= SMB_ECHO_INTERVAL_MAX)
2227		tcp_ses->echo_interval = volume_info->echo_interval * HZ;
2228	else
2229		tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
2230
2231	rc = ip_connect(tcp_ses);
2232	if (rc < 0) {
2233		cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
2234		goto out_err_crypto_release;
2235	}
2236
2237	/*
2238	 * since we're in a cifs function already, we know that
2239	 * this will succeed. No need for try_module_get().
2240	 */
2241	__module_get(THIS_MODULE);
2242	tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2243				  tcp_ses, "cifsd");
2244	if (IS_ERR(tcp_ses->tsk)) {
2245		rc = PTR_ERR(tcp_ses->tsk);
2246		cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
2247		module_put(THIS_MODULE);
2248		goto out_err_crypto_release;
2249	}
2250	tcp_ses->tcpStatus = CifsNeedNegotiate;
2251
2252	/* thread spawned, put it on the list */
2253	spin_lock(&cifs_tcp_ses_lock);
2254	list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2255	spin_unlock(&cifs_tcp_ses_lock);
2256
2257	cifs_fscache_get_client_cookie(tcp_ses);
2258
2259	/* queue echo request delayed work */
2260	queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
2261
2262	return tcp_ses;
2263
2264out_err_crypto_release:
2265	cifs_crypto_shash_release(tcp_ses);
2266
2267	put_net(cifs_net_ns(tcp_ses));
2268
2269out_err:
2270	if (tcp_ses) {
2271		if (!IS_ERR(tcp_ses->hostname))
2272			kfree(tcp_ses->hostname);
2273		if (tcp_ses->ssocket)
2274			sock_release(tcp_ses->ssocket);
2275		kfree(tcp_ses);
2276	}
2277	return ERR_PTR(rc);
2278}
2279
2280static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2281{
2282	if (vol->sectype != Unspecified &&
2283	    vol->sectype != ses->sectype)
2284		return 0;
2285
2286	switch (ses->sectype) {
2287	case Kerberos:
2288		if (!uid_eq(vol->cred_uid, ses->cred_uid))
2289			return 0;
2290		break;
2291	default:
2292		/* NULL username means anonymous session */
2293		if (ses->user_name == NULL) {
2294			if (!vol->nullauth)
2295				return 0;
2296			break;
2297		}
2298
2299		/* anything else takes username/password */
2300		if (strncmp(ses->user_name,
2301			    vol->username ? vol->username : "",
2302			    CIFS_MAX_USERNAME_LEN))
2303			return 0;
2304		if ((vol->username && strlen(vol->username) != 0) &&
2305		    ses->password != NULL &&
2306		    strncmp(ses->password,
2307			    vol->password ? vol->password : "",
2308			    CIFS_MAX_PASSWORD_LEN))
2309			return 0;
2310	}
2311	return 1;
2312}
2313
2314static struct cifs_ses *
2315cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
2316{
2317	struct cifs_ses *ses;
2318
2319	spin_lock(&cifs_tcp_ses_lock);
2320	list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
2321		if (ses->status == CifsExiting)
2322			continue;
2323		if (!match_session(ses, vol))
2324			continue;
2325		++ses->ses_count;
2326		spin_unlock(&cifs_tcp_ses_lock);
2327		return ses;
2328	}
2329	spin_unlock(&cifs_tcp_ses_lock);
2330	return NULL;
2331}
2332
2333static void
2334cifs_put_smb_ses(struct cifs_ses *ses)
2335{
2336	unsigned int rc, xid;
2337	struct TCP_Server_Info *server = ses->server;
2338
2339	cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
2340
2341	spin_lock(&cifs_tcp_ses_lock);
2342	if (ses->status == CifsExiting) {
2343		spin_unlock(&cifs_tcp_ses_lock);
2344		return;
2345	}
2346	if (--ses->ses_count > 0) {
2347		spin_unlock(&cifs_tcp_ses_lock);
2348		return;
2349	}
2350	if (ses->status == CifsGood)
2351		ses->status = CifsExiting;
2352	spin_unlock(&cifs_tcp_ses_lock);
2353
2354	if (ses->status == CifsExiting && server->ops->logoff) {
2355		xid = get_xid();
2356		rc = server->ops->logoff(xid, ses);
2357		if (rc)
2358			cifs_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
2359				__func__, rc);
2360		_free_xid(xid);
2361	}
2362
2363	spin_lock(&cifs_tcp_ses_lock);
2364	list_del_init(&ses->smb_ses_list);
2365	spin_unlock(&cifs_tcp_ses_lock);
2366
2367	sesInfoFree(ses);
2368	cifs_put_tcp_session(server);
2369}
2370
2371#ifdef CONFIG_KEYS
2372
2373/* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
2374#define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
2375
2376/* Populate username and pw fields from keyring if possible */
2377static int
2378cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
2379{
2380	int rc = 0;
2381	const char *delim, *payload;
2382	char *desc;
2383	ssize_t len;
2384	struct key *key;
2385	struct TCP_Server_Info *server = ses->server;
2386	struct sockaddr_in *sa;
2387	struct sockaddr_in6 *sa6;
2388	const struct user_key_payload *upayload;
2389
2390	desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
2391	if (!desc)
2392		return -ENOMEM;
2393
2394	/* try to find an address key first */
2395	switch (server->dstaddr.ss_family) {
2396	case AF_INET:
2397		sa = (struct sockaddr_in *)&server->dstaddr;
2398		sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
2399		break;
2400	case AF_INET6:
2401		sa6 = (struct sockaddr_in6 *)&server->dstaddr;
2402		sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
2403		break;
2404	default:
2405		cifs_dbg(FYI, "Bad ss_family (%hu)\n",
2406			 server->dstaddr.ss_family);
2407		rc = -EINVAL;
2408		goto out_err;
2409	}
2410
2411	cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2412	key = request_key(&key_type_logon, desc, "");
2413	if (IS_ERR(key)) {
2414		if (!ses->domainName) {
2415			cifs_dbg(FYI, "domainName is NULL\n");
2416			rc = PTR_ERR(key);
2417			goto out_err;
2418		}
2419
2420		/* didn't work, try to find a domain key */
2421		sprintf(desc, "cifs:d:%s", ses->domainName);
2422		cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2423		key = request_key(&key_type_logon, desc, "");
2424		if (IS_ERR(key)) {
2425			rc = PTR_ERR(key);
2426			goto out_err;
2427		}
2428	}
2429
2430	down_read(&key->sem);
2431	upayload = user_key_payload(key);
2432	if (IS_ERR_OR_NULL(upayload)) {
2433		rc = upayload ? PTR_ERR(upayload) : -EINVAL;
2434		goto out_key_put;
2435	}
2436
2437	/* find first : in payload */
2438	payload = upayload->data;
2439	delim = strnchr(payload, upayload->datalen, ':');
2440	cifs_dbg(FYI, "payload=%s\n", payload);
2441	if (!delim) {
2442		cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
2443			 upayload->datalen);
2444		rc = -EINVAL;
2445		goto out_key_put;
2446	}
2447
2448	len = delim - payload;
2449	if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
2450		cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
2451			 len);
2452		rc = -EINVAL;
2453		goto out_key_put;
2454	}
2455
2456	vol->username = kstrndup(payload, len, GFP_KERNEL);
2457	if (!vol->username) {
2458		cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
2459			 len);
2460		rc = -ENOMEM;
2461		goto out_key_put;
2462	}
2463	cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
2464
2465	len = key->datalen - (len + 1);
2466	if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
2467		cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
2468		rc = -EINVAL;
2469		kfree(vol->username);
2470		vol->username = NULL;
2471		goto out_key_put;
2472	}
2473
2474	++delim;
2475	vol->password = kstrndup(delim, len, GFP_KERNEL);
2476	if (!vol->password) {
2477		cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
2478			 len);
2479		rc = -ENOMEM;
2480		kfree(vol->username);
2481		vol->username = NULL;
2482		goto out_key_put;
2483	}
2484
2485out_key_put:
2486	up_read(&key->sem);
2487	key_put(key);
2488out_err:
2489	kfree(desc);
2490	cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
2491	return rc;
2492}
2493#else /* ! CONFIG_KEYS */
2494static inline int
2495cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
2496		   struct cifs_ses *ses __attribute__((unused)))
2497{
2498	return -ENOSYS;
2499}
2500#endif /* CONFIG_KEYS */
2501
2502static struct cifs_ses *
2503cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
2504{
2505	int rc = -ENOMEM;
2506	unsigned int xid;
2507	struct cifs_ses *ses;
2508	struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2509	struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2510
2511	xid = get_xid();
2512
2513	ses = cifs_find_smb_ses(server, volume_info);
2514	if (ses) {
2515		cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
2516			 ses->status);
2517
2518		mutex_lock(&ses->session_mutex);
2519		rc = cifs_negotiate_protocol(xid, ses);
2520		if (rc) {
2521			mutex_unlock(&ses->session_mutex);
2522			/* problem -- put our ses reference */
2523			cifs_put_smb_ses(ses);
2524			free_xid(xid);
2525			return ERR_PTR(rc);
2526		}
2527		if (ses->need_reconnect) {
2528			cifs_dbg(FYI, "Session needs reconnect\n");
2529			rc = cifs_setup_session(xid, ses,
2530						volume_info->local_nls);
2531			if (rc) {
2532				mutex_unlock(&ses->session_mutex);
2533				/* problem -- put our reference */
2534				cifs_put_smb_ses(ses);
2535				free_xid(xid);
2536				return ERR_PTR(rc);
2537			}
2538		}
2539		mutex_unlock(&ses->session_mutex);
2540
2541		/* existing SMB ses has a server reference already */
2542		cifs_put_tcp_session(server);
2543		free_xid(xid);
2544		return ses;
2545	}
2546
2547	cifs_dbg(FYI, "Existing smb sess not found\n");
2548	ses = sesInfoAlloc();
2549	if (ses == NULL)
2550		goto get_ses_fail;
2551
2552	/* new SMB session uses our server ref */
2553	ses->server = server;
2554	if (server->dstaddr.ss_family == AF_INET6)
2555		sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
2556	else
2557		sprintf(ses->serverName, "%pI4", &addr->sin_addr);
2558
2559	if (volume_info->username) {
2560		ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
2561		if (!ses->user_name)
2562			goto get_ses_fail;
2563	}
2564
2565	/* volume_info->password freed at unmount */
2566	if (volume_info->password) {
2567		ses->password = kstrdup(volume_info->password, GFP_KERNEL);
2568		if (!ses->password)
2569			goto get_ses_fail;
2570	}
2571	if (volume_info->domainname) {
2572		ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
2573		if (!ses->domainName)
2574			goto get_ses_fail;
2575	}
2576	ses->cred_uid = volume_info->cred_uid;
2577	ses->linux_uid = volume_info->linux_uid;
2578
2579	ses->sectype = volume_info->sectype;
2580	ses->sign = volume_info->sign;
2581
2582	mutex_lock(&ses->session_mutex);
2583	rc = cifs_negotiate_protocol(xid, ses);
2584	if (!rc)
2585		rc = cifs_setup_session(xid, ses, volume_info->local_nls);
2586	mutex_unlock(&ses->session_mutex);
2587	if (rc)
2588		goto get_ses_fail;
2589
2590	/* success, put it on the list */
2591	spin_lock(&cifs_tcp_ses_lock);
2592	list_add(&ses->smb_ses_list, &server->smb_ses_list);
2593	spin_unlock(&cifs_tcp_ses_lock);
2594
2595	free_xid(xid);
2596	return ses;
2597
2598get_ses_fail:
2599	sesInfoFree(ses);
2600	free_xid(xid);
2601	return ERR_PTR(rc);
2602}
2603
2604static int match_tcon(struct cifs_tcon *tcon, const char *unc)
2605{
2606	if (tcon->tidStatus == CifsExiting)
2607		return 0;
2608	if (strncmp(tcon->treeName, unc, MAX_TREE_SIZE))
2609		return 0;
2610	return 1;
2611}
2612
2613static struct cifs_tcon *
2614cifs_find_tcon(struct cifs_ses *ses, const char *unc)
2615{
2616	struct list_head *tmp;
2617	struct cifs_tcon *tcon;
2618
2619	spin_lock(&cifs_tcp_ses_lock);
2620	list_for_each(tmp, &ses->tcon_list) {
2621		tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
2622		if (!match_tcon(tcon, unc))
2623			continue;
2624		++tcon->tc_count;
2625		spin_unlock(&cifs_tcp_ses_lock);
2626		return tcon;
2627	}
2628	spin_unlock(&cifs_tcp_ses_lock);
2629	return NULL;
2630}
2631
2632static void
2633cifs_put_tcon(struct cifs_tcon *tcon)
2634{
2635	unsigned int xid;
2636	struct cifs_ses *ses = tcon->ses;
2637
2638	cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
2639	spin_lock(&cifs_tcp_ses_lock);
2640	if (--tcon->tc_count > 0) {
2641		spin_unlock(&cifs_tcp_ses_lock);
2642		return;
2643	}
2644
2645	list_del_init(&tcon->tcon_list);
2646	spin_unlock(&cifs_tcp_ses_lock);
2647
2648	xid = get_xid();
2649	if (ses->server->ops->tree_disconnect)
2650		ses->server->ops->tree_disconnect(xid, tcon);
2651	_free_xid(xid);
2652
2653	cifs_fscache_release_super_cookie(tcon);
2654	tconInfoFree(tcon);
2655	cifs_put_smb_ses(ses);
2656}
2657
2658static struct cifs_tcon *
2659cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
2660{
2661	int rc, xid;
2662	struct cifs_tcon *tcon;
2663
2664	tcon = cifs_find_tcon(ses, volume_info->UNC);
2665	if (tcon) {
2666		cifs_dbg(FYI, "Found match on UNC path\n");
2667		/* existing tcon already has a reference */
2668		cifs_put_smb_ses(ses);
2669		if (tcon->seal != volume_info->seal)
2670			cifs_dbg(VFS, "transport encryption setting conflicts with existing tid\n");
2671		return tcon;
2672	}
2673
2674	if (!ses->server->ops->tree_connect) {
2675		rc = -ENOSYS;
2676		goto out_fail;
2677	}
2678
2679	tcon = tconInfoAlloc();
2680	if (tcon == NULL) {
2681		rc = -ENOMEM;
2682		goto out_fail;
2683	}
2684
2685	tcon->ses = ses;
2686	if (volume_info->password) {
2687		tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
2688		if (!tcon->password) {
2689			rc = -ENOMEM;
2690			goto out_fail;
2691		}
2692	}
2693
2694	/*
2695	 * BB Do we need to wrap session_mutex around this TCon call and Unix
2696	 * SetFS as we do on SessSetup and reconnect?
2697	 */
2698	xid = get_xid();
2699	rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
2700					    volume_info->local_nls);
2701	free_xid(xid);
2702	cifs_dbg(FYI, "Tcon rc = %d\n", rc);
2703	if (rc)
2704		goto out_fail;
2705
2706	if (volume_info->nodfs) {
2707		tcon->Flags &= ~SMB_SHARE_IS_IN_DFS;
2708		cifs_dbg(FYI, "DFS disabled (%d)\n", tcon->Flags);
2709	}
2710	tcon->seal = volume_info->seal;
2711	tcon->use_persistent = false;
2712	/* check if SMB2 or later, CIFS does not support persistent handles */
2713	if (volume_info->persistent) {
2714		if (ses->server->vals->protocol_id == 0) {
2715			cifs_dbg(VFS,
2716			     "SMB3 or later required for persistent handles\n");
2717			rc = -EOPNOTSUPP;
2718			goto out_fail;
2719#ifdef CONFIG_CIFS_SMB2
2720		} else if (ses->server->capabilities &
2721			   SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
2722			tcon->use_persistent = true;
2723		else /* persistent handles requested but not supported */ {
2724			cifs_dbg(VFS,
2725				"Persistent handles not supported on share\n");
2726			rc = -EOPNOTSUPP;
2727			goto out_fail;
2728#endif /* CONFIG_CIFS_SMB2 */
2729		}
2730#ifdef CONFIG_CIFS_SMB2
2731	} else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
2732	     && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
2733	     && (volume_info->nopersistent == false)) {
2734		cifs_dbg(FYI, "enabling persistent handles\n");
2735		tcon->use_persistent = true;
2736#endif /* CONFIG_CIFS_SMB2 */
2737	} else if (volume_info->resilient) {
2738		if (ses->server->vals->protocol_id == 0) {
2739			cifs_dbg(VFS,
2740			     "SMB2.1 or later required for resilient handles\n");
2741			rc = -EOPNOTSUPP;
2742			goto out_fail;
2743		}
2744		tcon->use_resilient = true;
2745	}
2746
2747	/*
2748	 * We can have only one retry value for a connection to a share so for
2749	 * resources mounted more than once to the same server share the last
2750	 * value passed in for the retry flag is used.
2751	 */
2752	tcon->retry = volume_info->retry;
2753	tcon->nocase = volume_info->nocase;
2754	tcon->local_lease = volume_info->local_lease;
2755	INIT_LIST_HEAD(&tcon->pending_opens);
2756
2757	spin_lock(&cifs_tcp_ses_lock);
2758	list_add(&tcon->tcon_list, &ses->tcon_list);
2759	spin_unlock(&cifs_tcp_ses_lock);
2760
2761	cifs_fscache_get_super_cookie(tcon);
2762
2763	return tcon;
2764
2765out_fail:
2766	tconInfoFree(tcon);
2767	return ERR_PTR(rc);
2768}
2769
2770void
2771cifs_put_tlink(struct tcon_link *tlink)
2772{
2773	if (!tlink || IS_ERR(tlink))
2774		return;
2775
2776	if (!atomic_dec_and_test(&tlink->tl_count) ||
2777	    test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
2778		tlink->tl_time = jiffies;
2779		return;
2780	}
2781
2782	if (!IS_ERR(tlink_tcon(tlink)))
2783		cifs_put_tcon(tlink_tcon(tlink));
2784	kfree(tlink);
2785	return;
2786}
2787
2788static inline struct tcon_link *
2789cifs_sb_master_tlink(struct cifs_sb_info *cifs_sb)
2790{
2791	return cifs_sb->master_tlink;
2792}
2793
2794static int
2795compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2796{
2797	struct cifs_sb_info *old = CIFS_SB(sb);
2798	struct cifs_sb_info *new = mnt_data->cifs_sb;
2799
2800	if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
2801		return 0;
2802
2803	if ((old->mnt_cifs_flags & CIFS_MOUNT_MASK) !=
2804	    (new->mnt_cifs_flags & CIFS_MOUNT_MASK))
2805		return 0;
2806
2807	/*
2808	 * We want to share sb only if we don't specify an r/wsize or
2809	 * specified r/wsize is greater than or equal to existing one.
2810	 */
2811	if (new->wsize && new->wsize < old->wsize)
2812		return 0;
2813
2814	if (new->rsize && new->rsize < old->rsize)
2815		return 0;
2816
2817	if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))
2818		return 0;
2819
2820	if (old->mnt_file_mode != new->mnt_file_mode ||
2821	    old->mnt_dir_mode != new->mnt_dir_mode)
2822		return 0;
2823
2824	if (strcmp(old->local_nls->charset, new->local_nls->charset))
2825		return 0;
2826
2827	if (old->actimeo != new->actimeo)
2828		return 0;
2829
2830	return 1;
2831}
2832
2833int
2834cifs_match_super(struct super_block *sb, void *data)
2835{
2836	struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
2837	struct smb_vol *volume_info;
2838	struct cifs_sb_info *cifs_sb;
2839	struct TCP_Server_Info *tcp_srv;
2840	struct cifs_ses *ses;
2841	struct cifs_tcon *tcon;
2842	struct tcon_link *tlink;
2843	int rc = 0;
2844
2845	spin_lock(&cifs_tcp_ses_lock);
2846	cifs_sb = CIFS_SB(sb);
2847	tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
2848	if (IS_ERR(tlink)) {
2849		spin_unlock(&cifs_tcp_ses_lock);
2850		return rc;
2851	}
2852	tcon = tlink_tcon(tlink);
2853	ses = tcon->ses;
2854	tcp_srv = ses->server;
2855
2856	volume_info = mnt_data->vol;
2857
2858	if (!match_server(tcp_srv, volume_info) ||
2859	    !match_session(ses, volume_info) ||
2860	    !match_tcon(tcon, volume_info->UNC)) {
2861		rc = 0;
2862		goto out;
2863	}
2864
2865	rc = compare_mount_options(sb, mnt_data);
2866out:
2867	spin_unlock(&cifs_tcp_ses_lock);
2868	cifs_put_tlink(tlink);
2869	return rc;
2870}
2871
2872int
2873get_dfs_path(const unsigned int xid, struct cifs_ses *ses, const char *old_path,
2874	     const struct nls_table *nls_codepage, unsigned int *num_referrals,
2875	     struct dfs_info3_param **referrals, int remap)
2876{
2877	char *temp_unc;
2878	int rc = 0;
2879
2880	if (!ses->server->ops->tree_connect || !ses->server->ops->get_dfs_refer)
2881		return -ENOSYS;
2882
2883	*num_referrals = 0;
2884	*referrals = NULL;
2885
2886	if (ses->ipc_tid == 0) {
2887		temp_unc = kmalloc(2 /* for slashes */ +
2888			strnlen(ses->serverName, SERVER_NAME_LEN_WITH_NULL * 2)
2889				+ 1 + 4 /* slash IPC$ */ + 2, GFP_KERNEL);
2890		if (temp_unc == NULL)
2891			return -ENOMEM;
2892		temp_unc[0] = '\\';
2893		temp_unc[1] = '\\';
2894		strcpy(temp_unc + 2, ses->serverName);
2895		strcpy(temp_unc + 2 + strlen(ses->serverName), "\\IPC$");
2896		rc = ses->server->ops->tree_connect(xid, ses, temp_unc, NULL,
2897						    nls_codepage);
2898		cifs_dbg(FYI, "Tcon rc = %d ipc_tid = %d\n", rc, ses->ipc_tid);
2899		kfree(temp_unc);
2900	}
2901	if (rc == 0)
2902		rc = ses->server->ops->get_dfs_refer(xid, ses, old_path,
2903						     referrals, num_referrals,
2904						     nls_codepage, remap);
2905	/*
2906	 * BB - map targetUNCs to dfs_info3 structures, here or in
2907	 * ses->server->ops->get_dfs_refer.
2908	 */
2909
2910	return rc;
2911}
2912
2913#ifdef CONFIG_DEBUG_LOCK_ALLOC
2914static struct lock_class_key cifs_key[2];
2915static struct lock_class_key cifs_slock_key[2];
2916
2917static inline void
2918cifs_reclassify_socket4(struct socket *sock)
2919{
2920	struct sock *sk = sock->sk;
2921	BUG_ON(sock_owned_by_user(sk));
2922	sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
2923		&cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
2924}
2925
2926static inline void
2927cifs_reclassify_socket6(struct socket *sock)
2928{
2929	struct sock *sk = sock->sk;
2930	BUG_ON(sock_owned_by_user(sk));
2931	sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
2932		&cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
2933}
2934#else
2935static inline void
2936cifs_reclassify_socket4(struct socket *sock)
2937{
2938}
2939
2940static inline void
2941cifs_reclassify_socket6(struct socket *sock)
2942{
2943}
2944#endif
2945
2946/* See RFC1001 section 14 on representation of Netbios names */
2947static void rfc1002mangle(char *target, char *source, unsigned int length)
2948{
2949	unsigned int i, j;
2950
2951	for (i = 0, j = 0; i < (length); i++) {
2952		/* mask a nibble at a time and encode */
2953		target[j] = 'A' + (0x0F & (source[i] >> 4));
2954		target[j+1] = 'A' + (0x0F & source[i]);
2955		j += 2;
2956	}
2957
2958}
2959
2960static int
2961bind_socket(struct TCP_Server_Info *server)
2962{
2963	int rc = 0;
2964	if (server->srcaddr.ss_family != AF_UNSPEC) {
2965		/* Bind to the specified local IP address */
2966		struct socket *socket = server->ssocket;
2967		rc = socket->ops->bind(socket,
2968				       (struct sockaddr *) &server->srcaddr,
2969				       sizeof(server->srcaddr));
2970		if (rc < 0) {
2971			struct sockaddr_in *saddr4;
2972			struct sockaddr_in6 *saddr6;
2973			saddr4 = (struct sockaddr_in *)&server->srcaddr;
2974			saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
2975			if (saddr6->sin6_family == AF_INET6)
2976				cifs_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
2977					 &saddr6->sin6_addr, rc);
2978			else
2979				cifs_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
2980					 &saddr4->sin_addr.s_addr, rc);
2981		}
2982	}
2983	return rc;
2984}
2985
2986static int
2987ip_rfc1001_connect(struct TCP_Server_Info *server)
2988{
2989	int rc = 0;
2990	/*
2991	 * some servers require RFC1001 sessinit before sending
2992	 * negprot - BB check reconnection in case where second
2993	 * sessinit is sent but no second negprot
2994	 */
2995	struct rfc1002_session_packet *ses_init_buf;
2996	struct smb_hdr *smb_buf;
2997	ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
2998			       GFP_KERNEL);
2999	if (ses_init_buf) {
3000		ses_init_buf->trailer.session_req.called_len = 32;
3001
3002		if (server->server_RFC1001_name[0] != 0)
3003			rfc1002mangle(ses_init_buf->trailer.
3004				      session_req.called_name,
3005				      server->server_RFC1001_name,
3006				      RFC1001_NAME_LEN_WITH_NULL);
3007		else
3008			rfc1002mangle(ses_init_buf->trailer.
3009				      session_req.called_name,
3010				      DEFAULT_CIFS_CALLED_NAME,
3011				      RFC1001_NAME_LEN_WITH_NULL);
3012
3013		ses_init_buf->trailer.session_req.calling_len = 32;
3014
3015		/*
3016		 * calling name ends in null (byte 16) from old smb
3017		 * convention.
3018		 */
3019		if (server->workstation_RFC1001_name[0] != 0)
3020			rfc1002mangle(ses_init_buf->trailer.
3021				      session_req.calling_name,
3022				      server->workstation_RFC1001_name,
3023				      RFC1001_NAME_LEN_WITH_NULL);
3024		else
3025			rfc1002mangle(ses_init_buf->trailer.
3026				      session_req.calling_name,
3027				      "LINUX_CIFS_CLNT",
3028				      RFC1001_NAME_LEN_WITH_NULL);
3029
3030		ses_init_buf->trailer.session_req.scope1 = 0;
3031		ses_init_buf->trailer.session_req.scope2 = 0;
3032		smb_buf = (struct smb_hdr *)ses_init_buf;
3033
3034		/* sizeof RFC1002_SESSION_REQUEST with no scope */
3035		smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
3036		rc = smb_send(server, smb_buf, 0x44);
3037		kfree(ses_init_buf);
3038		/*
3039		 * RFC1001 layer in at least one server
3040		 * requires very short break before negprot
3041		 * presumably because not expecting negprot
3042		 * to follow so fast.  This is a simple
3043		 * solution that works without
3044		 * complicating the code and causes no
3045		 * significant slowing down on mount
3046		 * for everyone else
3047		 */
3048		usleep_range(1000, 2000);
3049	}
3050	/*
3051	 * else the negprot may still work without this
3052	 * even though malloc failed
3053	 */
3054
3055	return rc;
3056}
3057
3058static int
3059generic_ip_connect(struct TCP_Server_Info *server)
3060{
3061	int rc = 0;
3062	__be16 sport;
3063	int slen, sfamily;
3064	struct socket *socket = server->ssocket;
3065	struct sockaddr *saddr;
3066
3067	saddr = (struct sockaddr *) &server->dstaddr;
3068
3069	if (server->dstaddr.ss_family == AF_INET6) {
3070		sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
3071		slen = sizeof(struct sockaddr_in6);
3072		sfamily = AF_INET6;
3073	} else {
3074		sport = ((struct sockaddr_in *) saddr)->sin_port;
3075		slen = sizeof(struct sockaddr_in);
3076		sfamily = AF_INET;
3077	}
3078
3079	if (socket == NULL) {
3080		rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3081				   IPPROTO_TCP, &socket, 1);
3082		if (rc < 0) {
3083			cifs_dbg(VFS, "Error %d creating socket\n", rc);
3084			server->ssocket = NULL;
3085			return rc;
3086		}
3087
3088		/* BB other socket options to set KEEPALIVE, NODELAY? */
3089		cifs_dbg(FYI, "Socket created\n");
3090		server->ssocket = socket;
3091		socket->sk->sk_allocation = GFP_NOFS;
3092		if (sfamily == AF_INET6)
3093			cifs_reclassify_socket6(socket);
3094		else
3095			cifs_reclassify_socket4(socket);
3096	}
3097
3098	rc = bind_socket(server);
3099	if (rc < 0)
3100		return rc;
3101
3102	/*
3103	 * Eventually check for other socket options to change from
3104	 * the default. sock_setsockopt not used because it expects
3105	 * user space buffer
3106	 */
3107	socket->sk->sk_rcvtimeo = 7 * HZ;
3108	socket->sk->sk_sndtimeo = 5 * HZ;
3109
3110	/* make the bufsizes depend on wsize/rsize and max requests */
3111	if (server->noautotune) {
3112		if (socket->sk->sk_sndbuf < (200 * 1024))
3113			socket->sk->sk_sndbuf = 200 * 1024;
3114		if (socket->sk->sk_rcvbuf < (140 * 1024))
3115			socket->sk->sk_rcvbuf = 140 * 1024;
3116	}
3117
3118	if (server->tcp_nodelay) {
3119		int val = 1;
3120		rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
3121				(char *)&val, sizeof(val));
3122		if (rc)
3123			cifs_dbg(FYI, "set TCP_NODELAY socket option error %d\n",
3124				 rc);
3125	}
3126
3127	cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3128		 socket->sk->sk_sndbuf,
3129		 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3130
3131	rc = socket->ops->connect(socket, saddr, slen, 0);
3132	if (rc < 0) {
3133		cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3134		sock_release(socket);
3135		server->ssocket = NULL;
3136		return rc;
3137	}
3138
3139	if (sport == htons(RFC1001_PORT))
3140		rc = ip_rfc1001_connect(server);
3141
3142	return rc;
3143}
3144
3145static int
3146ip_connect(struct TCP_Server_Info *server)
3147{
3148	__be16 *sport;
3149	struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3150	struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3151
3152	if (server->dstaddr.ss_family == AF_INET6)
3153		sport = &addr6->sin6_port;
3154	else
3155		sport = &addr->sin_port;
3156
3157	if (*sport == 0) {
3158		int rc;
3159
3160		/* try with 445 port at first */
3161		*sport = htons(CIFS_PORT);
3162
3163		rc = generic_ip_connect(server);
3164		if (rc >= 0)
3165			return rc;
3166
3167		/* if it failed, try with 139 port */
3168		*sport = htons(RFC1001_PORT);
3169	}
3170
3171	return generic_ip_connect(server);
3172}
3173
3174void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
3175			  struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
3176{
3177	/* if we are reconnecting then should we check to see if
3178	 * any requested capabilities changed locally e.g. via
3179	 * remount but we can not do much about it here
3180	 * if they have (even if we could detect it by the following)
3181	 * Perhaps we could add a backpointer to array of sb from tcon
3182	 * or if we change to make all sb to same share the same
3183	 * sb as NFS - then we only have one backpointer to sb.
3184	 * What if we wanted to mount the server share twice once with
3185	 * and once without posixacls or posix paths? */
3186	__u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3187
3188	if (vol_info && vol_info->no_linux_ext) {
3189		tcon->fsUnixInfo.Capability = 0;
3190		tcon->unix_ext = 0; /* Unix Extensions disabled */
3191		cifs_dbg(FYI, "Linux protocol extensions disabled\n");
3192		return;
3193	} else if (vol_info)
3194		tcon->unix_ext = 1; /* Unix Extensions supported */
3195
3196	if (tcon->unix_ext == 0) {
3197		cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
3198		return;
3199	}
3200
3201	if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
3202		__u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3203		cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
3204		/* check for reconnect case in which we do not
3205		   want to change the mount behavior if we can avoid it */
3206		if (vol_info == NULL) {
3207			/* turn off POSIX ACL and PATHNAMES if not set
3208			   originally at mount time */
3209			if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
3210				cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3211			if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3212				if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3213					cifs_dbg(VFS, "POSIXPATH support change\n");
3214				cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3215			} else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3216				cifs_dbg(VFS, "possible reconnect error\n");
3217				cifs_dbg(VFS, "server disabled POSIX path support\n");
3218			}
3219		}
3220
3221		if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3222			cifs_dbg(VFS, "per-share encryption not supported yet\n");
3223
3224		cap &= CIFS_UNIX_CAP_MASK;
3225		if (vol_info && vol_info->no_psx_acl)
3226			cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3227		else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
3228			cifs_dbg(FYI, "negotiated posix acl support\n");
3229			if (cifs_sb)
3230				cifs_sb->mnt_cifs_flags |=
3231					CIFS_MOUNT_POSIXACL;
3232		}
3233
3234		if (vol_info && vol_info->posix_paths == 0)
3235			cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3236		else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
3237			cifs_dbg(FYI, "negotiate posix pathnames\n");
3238			if (cifs_sb)
3239				cifs_sb->mnt_cifs_flags |=
3240					CIFS_MOUNT_POSIX_PATHS;
3241		}
3242
3243		cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
3244#ifdef CONFIG_CIFS_DEBUG2
3245		if (cap & CIFS_UNIX_FCNTL_CAP)
3246			cifs_dbg(FYI, "FCNTL cap\n");
3247		if (cap & CIFS_UNIX_EXTATTR_CAP)
3248			cifs_dbg(FYI, "EXTATTR cap\n");
3249		if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3250			cifs_dbg(FYI, "POSIX path cap\n");
3251		if (cap & CIFS_UNIX_XATTR_CAP)
3252			cifs_dbg(FYI, "XATTR cap\n");
3253		if (cap & CIFS_UNIX_POSIX_ACL_CAP)
3254			cifs_dbg(FYI, "POSIX ACL cap\n");
3255		if (cap & CIFS_UNIX_LARGE_READ_CAP)
3256			cifs_dbg(FYI, "very large read cap\n");
3257		if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
3258			cifs_dbg(FYI, "very large write cap\n");
3259		if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
3260			cifs_dbg(FYI, "transport encryption cap\n");
3261		if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3262			cifs_dbg(FYI, "mandatory transport encryption cap\n");
3263#endif /* CIFS_DEBUG2 */
3264		if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
3265			if (vol_info == NULL) {
3266				cifs_dbg(FYI, "resetting capabilities failed\n");
3267			} else
3268				cifs_dbg(VFS, "Negotiating Unix capabilities with the server failed. Consider mounting with the Unix Extensions disabled if problems are found by specifying the nounix mount option.\n");
3269
3270		}
3271	}
3272}
3273
3274void cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
3275			struct cifs_sb_info *cifs_sb)
3276{
3277	INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
3278
3279	spin_lock_init(&cifs_sb->tlink_tree_lock);
3280	cifs_sb->tlink_tree = RB_ROOT;
3281
3282	/*
3283	 * Temporarily set r/wsize for matching superblock. If we end up using
3284	 * new sb then client will later negotiate it downward if needed.
3285	 */
3286	cifs_sb->rsize = pvolume_info->rsize;
3287	cifs_sb->wsize = pvolume_info->wsize;
3288
3289	cifs_sb->mnt_uid = pvolume_info->linux_uid;
3290	cifs_sb->mnt_gid = pvolume_info->linux_gid;
3291	cifs_sb->mnt_file_mode = pvolume_info->file_mode;
3292	cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
3293	cifs_dbg(FYI, "file mode: 0x%hx  dir mode: 0x%hx\n",
3294		 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
3295
3296	cifs_sb->actimeo = pvolume_info->actimeo;
3297	cifs_sb->local_nls = pvolume_info->local_nls;
3298
3299	if (pvolume_info->noperm)
3300		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
3301	if (pvolume_info->setuids)
3302		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
3303	if (pvolume_info->server_ino)
3304		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
3305	if (pvolume_info->remap)
3306		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
3307	if (pvolume_info->sfu_remap)
3308		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
3309	if (pvolume_info->no_xattr)
3310		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
3311	if (pvolume_info->sfu_emul)
3312		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
3313	if (pvolume_info->nobrl)
3314		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
3315	if (pvolume_info->nostrictsync)
3316		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
3317	if (pvolume_info->mand_lock)
3318		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
3319	if (pvolume_info->rwpidforward)
3320		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
3321	if (pvolume_info->cifs_acl)
3322		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
3323	if (pvolume_info->backupuid_specified) {
3324		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
3325		cifs_sb->mnt_backupuid = pvolume_info->backupuid;
3326	}
3327	if (pvolume_info->backupgid_specified) {
3328		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
3329		cifs_sb->mnt_backupgid = pvolume_info->backupgid;
3330	}
3331	if (pvolume_info->override_uid)
3332		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
3333	if (pvolume_info->override_gid)
3334		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
3335	if (pvolume_info->dynperm)
3336		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
3337	if (pvolume_info->fsc)
3338		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
3339	if (pvolume_info->multiuser)
3340		cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
3341					    CIFS_MOUNT_NO_PERM);
3342	if (pvolume_info->strict_io)
3343		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
3344	if (pvolume_info->direct_io) {
3345		cifs_dbg(FYI, "mounting share using direct i/o\n");
3346		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
3347	}
3348	if (pvolume_info->mfsymlinks) {
3349		if (pvolume_info->sfu_emul) {
3350			/*
3351			 * Our SFU ("Services for Unix" emulation does not allow
3352			 * creating symlinks but does allow reading existing SFU
3353			 * symlinks (it does allow both creating and reading SFU
3354			 * style mknod and FIFOs though). When "mfsymlinks" and
3355			 * "sfu" are both enabled at the same time, it allows
3356			 * reading both types of symlinks, but will only create
3357			 * them with mfsymlinks format. This allows better
3358			 * Apple compatibility (probably better for Samba too)
3359			 * while still recognizing old Windows style symlinks.
3360			 */
3361			cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
3362		}
3363		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
3364	}
3365
3366	if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
3367		cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
3368}
3369
3370static void
3371cleanup_volume_info_contents(struct smb_vol *volume_info)
3372{
3373	kfree(volume_info->username);
3374	kzfree(volume_info->password);
3375	kfree(volume_info->UNC);
3376	kfree(volume_info->domainname);
3377	kfree(volume_info->iocharset);
3378	kfree(volume_info->prepath);
3379}
3380
3381void
3382cifs_cleanup_volume_info(struct smb_vol *volume_info)
3383{
3384	if (!volume_info)
3385		return;
3386	cleanup_volume_info_contents(volume_info);
3387	kfree(volume_info);
3388}
3389
3390
3391#ifdef CONFIG_CIFS_DFS_UPCALL
3392/*
3393 * cifs_build_path_to_root returns full path to root when we do not have an
3394 * exiting connection (tcon)
3395 */
3396static char *
3397build_unc_path_to_root(const struct smb_vol *vol,
3398		const struct cifs_sb_info *cifs_sb)
3399{
3400	char *full_path, *pos;
3401	unsigned int pplen = vol->prepath ? strlen(vol->prepath) + 1 : 0;
3402	unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
3403
3404	full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
3405	if (full_path == NULL)
3406		return ERR_PTR(-ENOMEM);
3407
3408	strncpy(full_path, vol->UNC, unc_len);
3409	pos = full_path + unc_len;
3410
3411	if (pplen) {
3412		*pos = CIFS_DIR_SEP(cifs_sb);
3413		strncpy(pos + 1, vol->prepath, pplen);
3414		pos += pplen;
3415	}
3416
3417	*pos = '\0'; /* add trailing null */
3418	convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
3419	cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
3420	return full_path;
3421}
3422
3423/*
3424 * Perform a dfs referral query for a share and (optionally) prefix
3425 *
3426 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
3427 * to a string containing updated options for the submount.  Otherwise it
3428 * will be left untouched.
3429 *
3430 * Returns the rc from get_dfs_path to the caller, which can be used to
3431 * determine whether there were referrals.
3432 */
3433static int
3434expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
3435		    struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
3436		    int check_prefix)
3437{
3438	int rc;
3439	unsigned int num_referrals = 0;
3440	struct dfs_info3_param *referrals = NULL;
3441	char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
3442
3443	full_path = build_unc_path_to_root(volume_info, cifs_sb);
3444	if (IS_ERR(full_path))
3445		return PTR_ERR(full_path);
3446
3447	/* For DFS paths, skip the first '\' of the UNC */
3448	ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
3449
3450	rc = get_dfs_path(xid, ses, ref_path, cifs_sb->local_nls,
3451			  &num_referrals, &referrals, cifs_remap(cifs_sb));
3452
3453	if (!rc && num_referrals > 0) {
3454		char *fake_devname = NULL;
3455
3456		mdata = cifs_compose_mount_options(cifs_sb->mountdata,
3457						   full_path + 1, referrals,
3458						   &fake_devname);
3459
3460		free_dfs_info_array(referrals, num_referrals);
3461
3462		if (IS_ERR(mdata)) {
3463			rc = PTR_ERR(mdata);
3464			mdata = NULL;
3465		} else {
3466			cleanup_volume_info_contents(volume_info);
3467			rc = cifs_setup_volume_info(volume_info, mdata,
3468							fake_devname);
3469		}
3470		kfree(fake_devname);
3471		kfree(cifs_sb->mountdata);
3472		cifs_sb->mountdata = mdata;
3473	}
3474	kfree(full_path);
3475	return rc;
3476}
3477#endif
3478
3479static int
3480cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
3481			const char *devname)
3482{
3483	int rc = 0;
3484
3485	if (cifs_parse_mount_options(mount_data, devname, volume_info))
3486		return -EINVAL;
3487
3488	if (volume_info->nullauth) {
3489		cifs_dbg(FYI, "Anonymous login\n");
3490		kfree(volume_info->username);
3491		volume_info->username = NULL;
3492	} else if (volume_info->username) {
3493		/* BB fixme parse for domain name here */
3494		cifs_dbg(FYI, "Username: %s\n", volume_info->username);
3495	} else {
3496		cifs_dbg(VFS, "No username specified\n");
3497	/* In userspace mount helper we can get user name from alternate
3498	   locations such as env variables and files on disk */
3499		return -EINVAL;
3500	}
3501
3502	/* this is needed for ASCII cp to Unicode converts */
3503	if (volume_info->iocharset == NULL) {
3504		/* load_nls_default cannot return null */
3505		volume_info->local_nls = load_nls_default();
3506	} else {
3507		volume_info->local_nls = load_nls(volume_info->iocharset);
3508		if (volume_info->local_nls == NULL) {
3509			cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
3510				 volume_info->iocharset);
3511			return -ELIBACC;
3512		}
3513	}
3514
3515	return rc;
3516}
3517
3518struct smb_vol *
3519cifs_get_volume_info(char *mount_data, const char *devname)
3520{
3521	int rc;
3522	struct smb_vol *volume_info;
3523
3524	volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
3525	if (!volume_info)
3526		return ERR_PTR(-ENOMEM);
3527
3528	rc = cifs_setup_volume_info(volume_info, mount_data, devname);
3529	if (rc) {
3530		cifs_cleanup_volume_info(volume_info);
3531		volume_info = ERR_PTR(rc);
3532	}
3533
3534	return volume_info;
3535}
3536
3537int
3538cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
3539{
3540	int rc;
3541	unsigned int xid;
3542	struct cifs_ses *ses;
3543	struct cifs_tcon *tcon;
3544	struct TCP_Server_Info *server;
3545	char   *full_path;
3546	struct tcon_link *tlink;
3547#ifdef CONFIG_CIFS_DFS_UPCALL
3548	int referral_walks_count = 0;
3549#endif
3550
3551	rc = bdi_setup_and_register(&cifs_sb->bdi, "cifs");
3552	if (rc)
3553		return rc;
3554
3555#ifdef CONFIG_CIFS_DFS_UPCALL
3556try_mount_again:
3557	/* cleanup activities if we're chasing a referral */
3558	if (referral_walks_count) {
3559		if (tcon)
3560			cifs_put_tcon(tcon);
3561		else if (ses)
3562			cifs_put_smb_ses(ses);
3563
3564		cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
3565
3566		free_xid(xid);
3567	}
3568#endif
3569	rc = 0;
3570	tcon = NULL;
3571	ses = NULL;
3572	server = NULL;
3573	full_path = NULL;
3574	tlink = NULL;
3575
3576	xid = get_xid();
3577
3578	/* get a reference to a tcp session */
3579	server = cifs_get_tcp_session(volume_info);
3580	if (IS_ERR(server)) {
3581		rc = PTR_ERR(server);
3582		bdi_destroy(&cifs_sb->bdi);
3583		goto out;
3584	}
3585
3586	/* get a reference to a SMB session */
3587	ses = cifs_get_smb_ses(server, volume_info);
3588	if (IS_ERR(ses)) {
3589		rc = PTR_ERR(ses);
3590		ses = NULL;
3591		goto mount_fail_check;
3592	}
3593
3594#ifdef CONFIG_CIFS_SMB2
3595	if ((volume_info->persistent == true) && ((ses->server->capabilities &
3596		SMB2_GLOBAL_CAP_PERSISTENT_HANDLES) == 0)) {
3597		cifs_dbg(VFS, "persistent handles not supported by server\n");
3598		rc = -EOPNOTSUPP;
3599		goto mount_fail_check;
3600	}
3601#endif /* CONFIG_CIFS_SMB2*/
3602
3603	/* search for existing tcon to this server share */
3604	tcon = cifs_get_tcon(ses, volume_info);
3605	if (IS_ERR(tcon)) {
3606		rc = PTR_ERR(tcon);
3607		tcon = NULL;
3608		goto remote_path_check;
3609	}
3610
3611	/* tell server which Unix caps we support */
3612	if (cap_unix(tcon->ses)) {
3613		/* reset of caps checks mount to see if unix extensions
3614		   disabled for just this mount */
3615		reset_cifs_unix_caps(xid, tcon, cifs_sb, volume_info);
3616		if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
3617		    (le64_to_cpu(tcon->fsUnixInfo.Capability) &
3618		     CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)) {
3619			rc = -EACCES;
3620			goto mount_fail_check;
3621		}
3622	} else
3623		tcon->unix_ext = 0; /* server does not support them */
3624
3625	/* do not care if a following call succeed - informational */
3626	if (!tcon->ipc && server->ops->qfs_tcon)
3627		server->ops->qfs_tcon(xid, tcon);
3628
3629	cifs_sb->wsize = server->ops->negotiate_wsize(tcon, volume_info);
3630	cifs_sb->rsize = server->ops->negotiate_rsize(tcon, volume_info);
3631
3632	/* tune readahead according to rsize */
3633	cifs_sb->bdi.ra_pages = cifs_sb->rsize / PAGE_SIZE;
3634
3635remote_path_check:
3636#ifdef CONFIG_CIFS_DFS_UPCALL
3637	/*
3638	 * Perform an unconditional check for whether there are DFS
3639	 * referrals for this path without prefix, to provide support
3640	 * for DFS referrals from w2k8 servers which don't seem to respond
3641	 * with PATH_NOT_COVERED to requests that include the prefix.
3642	 * Chase the referral if found, otherwise continue normally.
3643	 */
3644	if (referral_walks_count == 0) {
3645		int refrc = expand_dfs_referral(xid, ses, volume_info, cifs_sb,
3646						false);
3647		if (!refrc) {
3648			referral_walks_count++;
3649			goto try_mount_again;
3650		}
3651	}
3652#endif
3653
3654	/* check if a whole path is not remote */
3655	if (!rc && tcon) {
3656		if (!server->ops->is_path_accessible) {
3657			rc = -ENOSYS;
3658			goto mount_fail_check;
3659		}
3660		/*
3661		 * cifs_build_path_to_root works only when we have a valid tcon
3662		 */
3663		full_path = cifs_build_path_to_root(volume_info, cifs_sb, tcon);
3664		if (full_path == NULL) {
3665			rc = -ENOMEM;
3666			goto mount_fail_check;
3667		}
3668		rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3669						     full_path);
3670		if (rc != 0 && rc != -EREMOTE) {
3671			kfree(full_path);
3672			goto mount_fail_check;
3673		}
3674		kfree(full_path);
3675	}
3676
3677	/* get referral if needed */
3678	if (rc == -EREMOTE) {
3679#ifdef CONFIG_CIFS_DFS_UPCALL
3680		if (referral_walks_count > MAX_NESTED_LINKS) {
3681			/*
3682			 * BB: when we implement proper loop detection,
3683			 *     we will remove this check. But now we need it
3684			 *     to prevent an indefinite loop if 'DFS tree' is
3685			 *     misconfigured (i.e. has loops).
3686			 */
3687			rc = -ELOOP;
3688			goto mount_fail_check;
3689		}
3690
3691		rc = expand_dfs_referral(xid, ses, volume_info, cifs_sb, true);
3692
3693		if (!rc) {
3694			referral_walks_count++;
3695			goto try_mount_again;
3696		}
3697		goto mount_fail_check;
3698#else /* No DFS support, return error on mount */
3699		rc = -EOPNOTSUPP;
3700#endif
3701	}
3702
3703	if (rc)
3704		goto mount_fail_check;
3705
3706	/* now, hang the tcon off of the superblock */
3707	tlink = kzalloc(sizeof *tlink, GFP_KERNEL);
3708	if (tlink == NULL) {
3709		rc = -ENOMEM;
3710		goto mount_fail_check;
3711	}
3712
3713	tlink->tl_uid = ses->linux_uid;
3714	tlink->tl_tcon = tcon;
3715	tlink->tl_time = jiffies;
3716	set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
3717	set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3718
3719	cifs_sb->master_tlink = tlink;
3720	spin_lock(&cifs_sb->tlink_tree_lock);
3721	tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
3722	spin_unlock(&cifs_sb->tlink_tree_lock);
3723
3724	queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
3725				TLINK_IDLE_EXPIRE);
3726
3727mount_fail_check:
3728	/* on error free sesinfo and tcon struct if needed */
3729	if (rc) {
3730		/* If find_unc succeeded then rc == 0 so we can not end */
3731		/* up accidentally freeing someone elses tcon struct */
3732		if (tcon)
3733			cifs_put_tcon(tcon);
3734		else if (ses)
3735			cifs_put_smb_ses(ses);
3736		else
3737			cifs_put_tcp_session(server);
3738		bdi_destroy(&cifs_sb->bdi);
3739	}
3740
3741out:
3742	free_xid(xid);
3743	return rc;
3744}
3745
3746/*
3747 * Issue a TREE_CONNECT request. Note that for IPC$ shares, that the tcon
3748 * pointer may be NULL.
3749 */
3750int
3751CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
3752	 const char *tree, struct cifs_tcon *tcon,
3753	 const struct nls_table *nls_codepage)
3754{
3755	struct smb_hdr *smb_buffer;
3756	struct smb_hdr *smb_buffer_response;
3757	TCONX_REQ *pSMB;
3758	TCONX_RSP *pSMBr;
3759	unsigned char *bcc_ptr;
3760	int rc = 0;
3761	int length;
3762	__u16 bytes_left, count;
3763
3764	if (ses == NULL)
3765		return -EIO;
3766
3767	smb_buffer = cifs_buf_get();
3768	if (smb_buffer == NULL)
3769		return -ENOMEM;
3770
3771	smb_buffer_response = smb_buffer;
3772
3773	header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
3774			NULL /*no tid */ , 4 /*wct */ );
3775
3776	smb_buffer->Mid = get_next_mid(ses->server);
3777	smb_buffer->Uid = ses->Suid;
3778	pSMB = (TCONX_REQ *) smb_buffer;
3779	pSMBr = (TCONX_RSP *) smb_buffer_response;
3780
3781	pSMB->AndXCommand = 0xFF;
3782	pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
3783	bcc_ptr = &pSMB->Password[0];
3784	if (!tcon || (ses->server->sec_mode & SECMODE_USER)) {
3785		pSMB->PasswordLength = cpu_to_le16(1);	/* minimum */
3786		*bcc_ptr = 0; /* password is null byte */
3787		bcc_ptr++;              /* skip password */
3788		/* already aligned so no need to do it below */
3789	} else {
3790		pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
3791		/* BB FIXME add code to fail this if NTLMv2 or Kerberos
3792		   specified as required (when that support is added to
3793		   the vfs in the future) as only NTLM or the much
3794		   weaker LANMAN (which we do not send by default) is accepted
3795		   by Samba (not sure whether other servers allow
3796		   NTLMv2 password here) */
3797#ifdef CONFIG_CIFS_WEAK_PW_HASH
3798		if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
3799		    (ses->sectype == LANMAN))
3800			calc_lanman_hash(tcon->password, ses->server->cryptkey,
3801					 ses->server->sec_mode &
3802					    SECMODE_PW_ENCRYPT ? true : false,
3803					 bcc_ptr);
3804		else
3805#endif /* CIFS_WEAK_PW_HASH */
3806		rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
3807					bcc_ptr, nls_codepage);
3808		if (rc) {
3809			cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
3810				 __func__, rc);
3811			cifs_buf_release(smb_buffer);
3812			return rc;
3813		}
3814
3815		bcc_ptr += CIFS_AUTH_RESP_SIZE;
3816		if (ses->capabilities & CAP_UNICODE) {
3817			/* must align unicode strings */
3818			*bcc_ptr = 0; /* null byte password */
3819			bcc_ptr++;
3820		}
3821	}
3822
3823	if (ses->server->sign)
3824		smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
3825
3826	if (ses->capabilities & CAP_STATUS32) {
3827		smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
3828	}
3829	if (ses->capabilities & CAP_DFS) {
3830		smb_buffer->Flags2 |= SMBFLG2_DFS;
3831	}
3832	if (ses->capabilities & CAP_UNICODE) {
3833		smb_buffer->Flags2 |= SMBFLG2_UNICODE;
3834		length =
3835		    cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
3836			6 /* max utf8 char length in bytes */ *
3837			(/* server len*/ + 256 /* share len */), nls_codepage);
3838		bcc_ptr += 2 * length;	/* convert num 16 bit words to bytes */
3839		bcc_ptr += 2;	/* skip trailing null */
3840	} else {		/* ASCII */
3841		strcpy(bcc_ptr, tree);
3842		bcc_ptr += strlen(tree) + 1;
3843	}
3844	strcpy(bcc_ptr, "?????");
3845	bcc_ptr += strlen("?????");
3846	bcc_ptr += 1;
3847	count = bcc_ptr - &pSMB->Password[0];
3848	pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
3849					pSMB->hdr.smb_buf_length) + count);
3850	pSMB->ByteCount = cpu_to_le16(count);
3851
3852	rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
3853			 0);
3854
3855	/* above now done in SendReceive */
3856	if ((rc == 0) && (tcon != NULL)) {
3857		bool is_unicode;
3858
3859		tcon->tidStatus = CifsGood;
3860		tcon->need_reconnect = false;
3861		tcon->tid = smb_buffer_response->Tid;
3862		bcc_ptr = pByteArea(smb_buffer_response);
3863		bytes_left = get_bcc(smb_buffer_response);
3864		length = strnlen(bcc_ptr, bytes_left - 2);
3865		if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
3866			is_unicode = true;
3867		else
3868			is_unicode = false;
3869
3870
3871		/* skip service field (NB: this field is always ASCII) */
3872		if (length == 3) {
3873			if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
3874			    (bcc_ptr[2] == 'C')) {
3875				cifs_dbg(FYI, "IPC connection\n");
3876				tcon->ipc = 1;
3877			}
3878		} else if (length == 2) {
3879			if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
3880				/* the most common case */
3881				cifs_dbg(FYI, "disk share connection\n");
3882			}
3883		}
3884		bcc_ptr += length + 1;
3885		bytes_left -= (length + 1);
3886		strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
3887
3888		/* mostly informational -- no need to fail on error here */
3889		kfree(tcon->nativeFileSystem);
3890		tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
3891						      bytes_left, is_unicode,
3892						      nls_codepage);
3893
3894		cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
3895
3896		if ((smb_buffer_response->WordCount == 3) ||
3897			 (smb_buffer_response->WordCount == 7))
3898			/* field is in same location */
3899			tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
3900		else
3901			tcon->Flags = 0;
3902		cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
3903	} else if ((rc == 0) && tcon == NULL) {
3904		/* all we need to save for IPC$ connection */
3905		ses->ipc_tid = smb_buffer_response->Tid;
3906	}
3907
3908	cifs_buf_release(smb_buffer);
3909	return rc;
3910}
3911
3912static void delayed_free(struct rcu_head *p)
3913{
3914	struct cifs_sb_info *sbi = container_of(p, struct cifs_sb_info, rcu);
3915	unload_nls(sbi->local_nls);
3916	kfree(sbi);
3917}
3918
3919void
3920cifs_umount(struct cifs_sb_info *cifs_sb)
3921{
3922	struct rb_root *root = &cifs_sb->tlink_tree;
3923	struct rb_node *node;
3924	struct tcon_link *tlink;
3925
3926	cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
3927
3928	spin_lock(&cifs_sb->tlink_tree_lock);
3929	while ((node = rb_first(root))) {
3930		tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3931		cifs_get_tlink(tlink);
3932		clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3933		rb_erase(node, root);
3934
3935		spin_unlock(&cifs_sb->tlink_tree_lock);
3936		cifs_put_tlink(tlink);
3937		spin_lock(&cifs_sb->tlink_tree_lock);
3938	}
3939	spin_unlock(&cifs_sb->tlink_tree_lock);
3940
3941	bdi_destroy(&cifs_sb->bdi);
3942	kfree(cifs_sb->mountdata);
3943	call_rcu(&cifs_sb->rcu, delayed_free);
3944}
3945
3946int
3947cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
3948{
3949	int rc = 0;
3950	struct TCP_Server_Info *server = ses->server;
3951
3952	if (!server->ops->need_neg || !server->ops->negotiate)
3953		return -ENOSYS;
3954
3955	/* only send once per connect */
3956	if (!server->ops->need_neg(server))
3957		return 0;
3958
3959	set_credits(server, 1);
3960
3961	rc = server->ops->negotiate(xid, ses);
3962	if (rc == 0) {
3963		spin_lock(&GlobalMid_Lock);
3964		if (server->tcpStatus == CifsNeedNegotiate)
3965			server->tcpStatus = CifsGood;
3966		else
3967			rc = -EHOSTDOWN;
3968		spin_unlock(&GlobalMid_Lock);
3969	}
3970
3971	return rc;
3972}
3973
3974int
3975cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
3976		   struct nls_table *nls_info)
3977{
3978	int rc = -ENOSYS;
3979	struct TCP_Server_Info *server = ses->server;
3980
3981	ses->capabilities = server->capabilities;
3982	if (linuxExtEnabled == 0)
3983		ses->capabilities &= (~server->vals->cap_unix);
3984
3985	cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
3986		 server->sec_mode, server->capabilities, server->timeAdj);
3987
3988	if (server->ops->sess_setup)
3989		rc = server->ops->sess_setup(xid, ses, nls_info);
3990
3991	if (rc)
3992		cifs_dbg(VFS, "Send error in SessSetup = %d\n", rc);
3993
3994	return rc;
3995}
3996
3997static int
3998cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
3999{
4000	vol->sectype = ses->sectype;
4001
4002	/* krb5 is special, since we don't need username or pw */
4003	if (vol->sectype == Kerberos)
4004		return 0;
4005
4006	return cifs_set_cifscreds(vol, ses);
4007}
4008
4009static struct cifs_tcon *
4010cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
4011{
4012	int rc;
4013	struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
4014	struct cifs_ses *ses;
4015	struct cifs_tcon *tcon = NULL;
4016	struct smb_vol *vol_info;
4017
4018	vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
4019	if (vol_info == NULL)
4020		return ERR_PTR(-ENOMEM);
4021
4022	vol_info->local_nls = cifs_sb->local_nls;
4023	vol_info->linux_uid = fsuid;
4024	vol_info->cred_uid = fsuid;
4025	vol_info->UNC = master_tcon->treeName;
4026	vol_info->retry = master_tcon->retry;
4027	vol_info->nocase = master_tcon->nocase;
4028	vol_info->local_lease = master_tcon->local_lease;
4029	vol_info->no_linux_ext = !master_tcon->unix_ext;
4030	vol_info->sectype = master_tcon->ses->sectype;
4031	vol_info->sign = master_tcon->ses->sign;
4032
4033	rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
4034	if (rc) {
4035		tcon = ERR_PTR(rc);
4036		goto out;
4037	}
4038
4039	/* get a reference for the same TCP session */
4040	spin_lock(&cifs_tcp_ses_lock);
4041	++master_tcon->ses->server->srv_count;
4042	spin_unlock(&cifs_tcp_ses_lock);
4043
4044	ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
4045	if (IS_ERR(ses)) {
4046		tcon = (struct cifs_tcon *)ses;
4047		cifs_put_tcp_session(master_tcon->ses->server);
4048		goto out;
4049	}
4050
4051	tcon = cifs_get_tcon(ses, vol_info);
4052	if (IS_ERR(tcon)) {
4053		cifs_put_smb_ses(ses);
4054		goto out;
4055	}
4056
4057	if (cap_unix(ses))
4058		reset_cifs_unix_caps(0, tcon, NULL, vol_info);
4059out:
4060	kfree(vol_info->username);
4061	kfree(vol_info->password);
4062	kfree(vol_info);
4063
4064	return tcon;
4065}
4066
4067struct cifs_tcon *
4068cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
4069{
4070	return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
4071}
4072
4073/* find and return a tlink with given uid */
4074static struct tcon_link *
4075tlink_rb_search(struct rb_root *root, kuid_t uid)
4076{
4077	struct rb_node *node = root->rb_node;
4078	struct tcon_link *tlink;
4079
4080	while (node) {
4081		tlink = rb_entry(node, struct tcon_link, tl_rbnode);
4082
4083		if (uid_gt(tlink->tl_uid, uid))
4084			node = node->rb_left;
4085		else if (uid_lt(tlink->tl_uid, uid))
4086			node = node->rb_right;
4087		else
4088			return tlink;
4089	}
4090	return NULL;
4091}
4092
4093/* insert a tcon_link into the tree */
4094static void
4095tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
4096{
4097	struct rb_node **new = &(root->rb_node), *parent = NULL;
4098	struct tcon_link *tlink;
4099
4100	while (*new) {
4101		tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
4102		parent = *new;
4103
4104		if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
4105			new = &((*new)->rb_left);
4106		else
4107			new = &((*new)->rb_right);
4108	}
4109
4110	rb_link_node(&new_tlink->tl_rbnode, parent, new);
4111	rb_insert_color(&new_tlink->tl_rbnode, root);
4112}
4113
4114/*
4115 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
4116 * current task.
4117 *
4118 * If the superblock doesn't refer to a multiuser mount, then just return
4119 * the master tcon for the mount.
4120 *
4121 * First, search the rbtree for an existing tcon for this fsuid. If one
4122 * exists, then check to see if it's pending construction. If it is then wait
4123 * for construction to complete. Once it's no longer pending, check to see if
4124 * it failed and either return an error or retry construction, depending on
4125 * the timeout.
4126 *
4127 * If one doesn't exist then insert a new tcon_link struct into the tree and
4128 * try to construct a new one.
4129 */
4130struct tcon_link *
4131cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
4132{
4133	int ret;
4134	kuid_t fsuid = current_fsuid();
4135	struct tcon_link *tlink, *newtlink;
4136
4137	if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
4138		return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
4139
4140	spin_lock(&cifs_sb->tlink_tree_lock);
4141	tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4142	if (tlink)
4143		cifs_get_tlink(tlink);
4144	spin_unlock(&cifs_sb->tlink_tree_lock);
4145
4146	if (tlink == NULL) {
4147		newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4148		if (newtlink == NULL)
4149			return ERR_PTR(-ENOMEM);
4150		newtlink->tl_uid = fsuid;
4151		newtlink->tl_tcon = ERR_PTR(-EACCES);
4152		set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
4153		set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
4154		cifs_get_tlink(newtlink);
4155
4156		spin_lock(&cifs_sb->tlink_tree_lock);
4157		/* was one inserted after previous search? */
4158		tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4159		if (tlink) {
4160			cifs_get_tlink(tlink);
4161			spin_unlock(&cifs_sb->tlink_tree_lock);
4162			kfree(newtlink);
4163			goto wait_for_construction;
4164		}
4165		tlink = newtlink;
4166		tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4167		spin_unlock(&cifs_sb->tlink_tree_lock);
4168	} else {
4169wait_for_construction:
4170		ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
4171				  TASK_INTERRUPTIBLE);
4172		if (ret) {
4173			cifs_put_tlink(tlink);
4174			return ERR_PTR(-ERESTARTSYS);
4175		}
4176
4177		/* if it's good, return it */
4178		if (!IS_ERR(tlink->tl_tcon))
4179			return tlink;
4180
4181		/* return error if we tried this already recently */
4182		if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
4183			cifs_put_tlink(tlink);
4184			return ERR_PTR(-EACCES);
4185		}
4186
4187		if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
4188			goto wait_for_construction;
4189	}
4190
4191	tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
4192	clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
4193	wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
4194
4195	if (IS_ERR(tlink->tl_tcon)) {
4196		cifs_put_tlink(tlink);
4197		return ERR_PTR(-EACCES);
4198	}
4199
4200	return tlink;
4201}
4202
4203/*
4204 * periodic workqueue job that scans tcon_tree for a superblock and closes
4205 * out tcons.
4206 */
4207static void
4208cifs_prune_tlinks(struct work_struct *work)
4209{
4210	struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
4211						    prune_tlinks.work);
4212	struct rb_root *root = &cifs_sb->tlink_tree;
4213	struct rb_node *node = rb_first(root);
4214	struct rb_node *tmp;
4215	struct tcon_link *tlink;
4216
4217	/*
4218	 * Because we drop the spinlock in the loop in order to put the tlink
4219	 * it's not guarded against removal of links from the tree. The only
4220	 * places that remove entries from the tree are this function and
4221	 * umounts. Because this function is non-reentrant and is canceled
4222	 * before umount can proceed, this is safe.
4223	 */
4224	spin_lock(&cifs_sb->tlink_tree_lock);
4225	node = rb_first(root);
4226	while (node != NULL) {
4227		tmp = node;
4228		node = rb_next(tmp);
4229		tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
4230
4231		if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
4232		    atomic_read(&tlink->tl_count) != 0 ||
4233		    time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
4234			continue;
4235
4236		cifs_get_tlink(tlink);
4237		clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4238		rb_erase(tmp, root);
4239
4240		spin_unlock(&cifs_sb->tlink_tree_lock);
4241		cifs_put_tlink(tlink);
4242		spin_lock(&cifs_sb->tlink_tree_lock);
4243	}
4244	spin_unlock(&cifs_sb->tlink_tree_lock);
4245
4246	queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4247				TLINK_IDLE_EXPIRE);
4248}