Linux Audio

Check our new training course

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