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