Linux Audio

Check our new training course

Linux kernel drivers training

Mar 31-Apr 9, 2025, special US time zones
Register
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.9
 
   1/*
   2 *   fs/cifs/connect.c
   3 *
   4 *   Copyright (C) International Business Machines  Corp., 2002,2011
   5 *   Author(s): Steve French (sfrench@us.ibm.com)
   6 *
   7 *   This library is free software; you can redistribute it and/or modify
   8 *   it under the terms of the GNU Lesser General Public License as published
   9 *   by the Free Software Foundation; either version 2.1 of the License, or
  10 *   (at your option) any later version.
  11 *
  12 *   This library is distributed in the hope that it will be useful,
  13 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
  15 *   the GNU Lesser General Public License for more details.
  16 *
  17 *   You should have received a copy of the GNU Lesser General Public License
  18 *   along with this library; if not, write to the Free Software
  19 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  20 */
  21#include <linux/fs.h>
  22#include <linux/net.h>
  23#include <linux/string.h>
  24#include <linux/sched/mm.h>
  25#include <linux/sched/signal.h>
  26#include <linux/list.h>
  27#include <linux/wait.h>
  28#include <linux/slab.h>
  29#include <linux/pagemap.h>
  30#include <linux/ctype.h>
  31#include <linux/utsname.h>
  32#include <linux/mempool.h>
  33#include <linux/delay.h>
  34#include <linux/completion.h>
  35#include <linux/kthread.h>
  36#include <linux/pagevec.h>
  37#include <linux/freezer.h>
  38#include <linux/namei.h>
  39#include <linux/uuid.h>
  40#include <linux/uaccess.h>
  41#include <asm/processor.h>
  42#include <linux/inet.h>
  43#include <linux/module.h>
  44#include <keys/user-type.h>
  45#include <net/ipv6.h>
  46#include <linux/parser.h>
  47#include <linux/bvec.h>
  48#include "cifspdu.h"
  49#include "cifsglob.h"
  50#include "cifsproto.h"
  51#include "cifs_unicode.h"
  52#include "cifs_debug.h"
  53#include "cifs_fs_sb.h"
  54#include "ntlmssp.h"
  55#include "nterr.h"
  56#include "rfc1002pdu.h"
  57#include "fscache.h"
  58#include "smb2proto.h"
  59#include "smbdirect.h"
  60#include "dns_resolve.h"
  61#ifdef CONFIG_CIFS_DFS_UPCALL
 
  62#include "dfs_cache.h"
  63#endif
 
 
  64
  65extern mempool_t *cifs_req_poolp;
  66extern bool disable_legacy_dialects;
  67
  68/* FIXME: should these be tunable? */
  69#define TLINK_ERROR_EXPIRE	(1 * HZ)
  70#define TLINK_IDLE_EXPIRE	(600 * HZ)
  71
  72enum {
  73	/* Mount options that take no arguments */
  74	Opt_user_xattr, Opt_nouser_xattr,
  75	Opt_forceuid, Opt_noforceuid,
  76	Opt_forcegid, Opt_noforcegid,
  77	Opt_noblocksend, Opt_noautotune, Opt_nolease,
  78	Opt_hard, Opt_soft, Opt_perm, Opt_noperm, Opt_nodelete,
  79	Opt_mapposix, Opt_nomapposix,
  80	Opt_mapchars, Opt_nomapchars, Opt_sfu,
  81	Opt_nosfu, Opt_nodfs, Opt_posixpaths,
  82	Opt_noposixpaths, Opt_nounix, Opt_unix,
  83	Opt_nocase,
  84	Opt_brl, Opt_nobrl,
  85	Opt_handlecache, Opt_nohandlecache,
  86	Opt_forcemandatorylock, Opt_setuidfromacl, Opt_setuids,
  87	Opt_nosetuids, Opt_dynperm, Opt_nodynperm,
  88	Opt_nohard, Opt_nosoft,
  89	Opt_nointr, Opt_intr,
  90	Opt_nostrictsync, Opt_strictsync,
  91	Opt_serverino, Opt_noserverino,
  92	Opt_rwpidforward, Opt_cifsacl, Opt_nocifsacl,
  93	Opt_acl, Opt_noacl, Opt_locallease,
  94	Opt_sign, Opt_ignore_signature, Opt_seal, Opt_noac,
  95	Opt_fsc, Opt_mfsymlinks,
  96	Opt_multiuser, Opt_sloppy, Opt_nosharesock,
  97	Opt_persistent, Opt_nopersistent,
  98	Opt_resilient, Opt_noresilient,
  99	Opt_domainauto, Opt_rdma, Opt_modesid, Opt_rootfs,
 100	Opt_multichannel, Opt_nomultichannel,
 101	Opt_compress,
 102
 103	/* Mount options which take numeric value */
 104	Opt_backupuid, Opt_backupgid, Opt_uid,
 105	Opt_cruid, Opt_gid, Opt_file_mode,
 106	Opt_dirmode, Opt_port,
 107	Opt_min_enc_offload,
 108	Opt_blocksize, Opt_rsize, Opt_wsize, Opt_actimeo,
 109	Opt_echo_interval, Opt_max_credits, Opt_handletimeout,
 110	Opt_snapshot, Opt_max_channels,
 111
 112	/* Mount options which take string value */
 113	Opt_user, Opt_pass, Opt_ip,
 114	Opt_domain, Opt_srcaddr, Opt_iocharset,
 115	Opt_netbiosname, Opt_servern,
 116	Opt_ver, Opt_vers, Opt_sec, Opt_cache,
 117
 118	/* Mount options to be ignored */
 119	Opt_ignore,
 120
 121	/* Options which could be blank */
 122	Opt_blank_pass,
 123	Opt_blank_user,
 124	Opt_blank_ip,
 125
 126	Opt_err
 127};
 128
 129static const match_table_t cifs_mount_option_tokens = {
 130
 131	{ Opt_user_xattr, "user_xattr" },
 132	{ Opt_nouser_xattr, "nouser_xattr" },
 133	{ Opt_forceuid, "forceuid" },
 134	{ Opt_noforceuid, "noforceuid" },
 135	{ Opt_forcegid, "forcegid" },
 136	{ Opt_noforcegid, "noforcegid" },
 137	{ Opt_noblocksend, "noblocksend" },
 138	{ Opt_noautotune, "noautotune" },
 139	{ Opt_nolease, "nolease" },
 140	{ Opt_hard, "hard" },
 141	{ Opt_soft, "soft" },
 142	{ Opt_perm, "perm" },
 143	{ Opt_noperm, "noperm" },
 144	{ Opt_nodelete, "nodelete" },
 145	{ Opt_mapchars, "mapchars" }, /* SFU style */
 146	{ Opt_nomapchars, "nomapchars" },
 147	{ Opt_mapposix, "mapposix" }, /* SFM style */
 148	{ Opt_nomapposix, "nomapposix" },
 149	{ Opt_sfu, "sfu" },
 150	{ Opt_nosfu, "nosfu" },
 151	{ Opt_nodfs, "nodfs" },
 152	{ Opt_posixpaths, "posixpaths" },
 153	{ Opt_noposixpaths, "noposixpaths" },
 154	{ Opt_nounix, "nounix" },
 155	{ Opt_nounix, "nolinux" },
 156	{ Opt_nounix, "noposix" },
 157	{ Opt_unix, "unix" },
 158	{ Opt_unix, "linux" },
 159	{ Opt_unix, "posix" },
 160	{ Opt_nocase, "nocase" },
 161	{ Opt_nocase, "ignorecase" },
 162	{ Opt_brl, "brl" },
 163	{ Opt_nobrl, "nobrl" },
 164	{ Opt_handlecache, "handlecache" },
 165	{ Opt_nohandlecache, "nohandlecache" },
 166	{ Opt_nobrl, "nolock" },
 167	{ Opt_forcemandatorylock, "forcemandatorylock" },
 168	{ Opt_forcemandatorylock, "forcemand" },
 169	{ Opt_setuids, "setuids" },
 170	{ Opt_nosetuids, "nosetuids" },
 171	{ Opt_setuidfromacl, "idsfromsid" },
 172	{ Opt_dynperm, "dynperm" },
 173	{ Opt_nodynperm, "nodynperm" },
 174	{ Opt_nohard, "nohard" },
 175	{ Opt_nosoft, "nosoft" },
 176	{ Opt_nointr, "nointr" },
 177	{ Opt_intr, "intr" },
 178	{ Opt_nostrictsync, "nostrictsync" },
 179	{ Opt_strictsync, "strictsync" },
 180	{ Opt_serverino, "serverino" },
 181	{ Opt_noserverino, "noserverino" },
 182	{ Opt_rwpidforward, "rwpidforward" },
 183	{ Opt_modesid, "modefromsid" },
 184	{ Opt_cifsacl, "cifsacl" },
 185	{ Opt_nocifsacl, "nocifsacl" },
 186	{ Opt_acl, "acl" },
 187	{ Opt_noacl, "noacl" },
 188	{ Opt_locallease, "locallease" },
 189	{ Opt_sign, "sign" },
 190	{ Opt_ignore_signature, "signloosely" },
 191	{ Opt_seal, "seal" },
 192	{ Opt_noac, "noac" },
 193	{ Opt_fsc, "fsc" },
 194	{ Opt_mfsymlinks, "mfsymlinks" },
 195	{ Opt_multiuser, "multiuser" },
 196	{ Opt_sloppy, "sloppy" },
 197	{ Opt_nosharesock, "nosharesock" },
 198	{ Opt_persistent, "persistenthandles"},
 199	{ Opt_nopersistent, "nopersistenthandles"},
 200	{ Opt_resilient, "resilienthandles"},
 201	{ Opt_noresilient, "noresilienthandles"},
 202	{ Opt_domainauto, "domainauto"},
 203	{ Opt_rdma, "rdma"},
 204	{ Opt_multichannel, "multichannel" },
 205	{ Opt_nomultichannel, "nomultichannel" },
 206
 207	{ Opt_backupuid, "backupuid=%s" },
 208	{ Opt_backupgid, "backupgid=%s" },
 209	{ Opt_uid, "uid=%s" },
 210	{ Opt_cruid, "cruid=%s" },
 211	{ Opt_gid, "gid=%s" },
 212	{ Opt_file_mode, "file_mode=%s" },
 213	{ Opt_dirmode, "dirmode=%s" },
 214	{ Opt_dirmode, "dir_mode=%s" },
 215	{ Opt_port, "port=%s" },
 216	{ Opt_min_enc_offload, "esize=%s" },
 217	{ Opt_blocksize, "bsize=%s" },
 218	{ Opt_rsize, "rsize=%s" },
 219	{ Opt_wsize, "wsize=%s" },
 220	{ Opt_actimeo, "actimeo=%s" },
 221	{ Opt_handletimeout, "handletimeout=%s" },
 222	{ Opt_echo_interval, "echo_interval=%s" },
 223	{ Opt_max_credits, "max_credits=%s" },
 224	{ Opt_snapshot, "snapshot=%s" },
 225	{ Opt_max_channels, "max_channels=%s" },
 226	{ Opt_compress, "compress=%s" },
 227
 228	{ Opt_blank_user, "user=" },
 229	{ Opt_blank_user, "username=" },
 230	{ Opt_user, "user=%s" },
 231	{ Opt_user, "username=%s" },
 232	{ Opt_blank_pass, "pass=" },
 233	{ Opt_blank_pass, "password=" },
 234	{ Opt_pass, "pass=%s" },
 235	{ Opt_pass, "password=%s" },
 236	{ Opt_blank_ip, "ip=" },
 237	{ Opt_blank_ip, "addr=" },
 238	{ Opt_ip, "ip=%s" },
 239	{ Opt_ip, "addr=%s" },
 240	{ Opt_ignore, "unc=%s" },
 241	{ Opt_ignore, "target=%s" },
 242	{ Opt_ignore, "path=%s" },
 243	{ Opt_domain, "dom=%s" },
 244	{ Opt_domain, "domain=%s" },
 245	{ Opt_domain, "workgroup=%s" },
 246	{ Opt_srcaddr, "srcaddr=%s" },
 247	{ Opt_ignore, "prefixpath=%s" },
 248	{ Opt_iocharset, "iocharset=%s" },
 249	{ Opt_netbiosname, "netbiosname=%s" },
 250	{ Opt_servern, "servern=%s" },
 251	{ Opt_ver, "ver=%s" },
 252	{ Opt_vers, "vers=%s" },
 253	{ Opt_sec, "sec=%s" },
 254	{ Opt_cache, "cache=%s" },
 255
 256	{ Opt_ignore, "cred" },
 257	{ Opt_ignore, "credentials" },
 258	{ Opt_ignore, "cred=%s" },
 259	{ Opt_ignore, "credentials=%s" },
 260	{ Opt_ignore, "guest" },
 261	{ Opt_ignore, "rw" },
 262	{ Opt_ignore, "ro" },
 263	{ Opt_ignore, "suid" },
 264	{ Opt_ignore, "nosuid" },
 265	{ Opt_ignore, "exec" },
 266	{ Opt_ignore, "noexec" },
 267	{ Opt_ignore, "nodev" },
 268	{ Opt_ignore, "noauto" },
 269	{ Opt_ignore, "dev" },
 270	{ Opt_ignore, "mand" },
 271	{ Opt_ignore, "nomand" },
 272	{ Opt_ignore, "relatime" },
 273	{ Opt_ignore, "_netdev" },
 274	{ Opt_rootfs, "rootfs" },
 275
 276	{ Opt_err, NULL }
 277};
 278
 279enum {
 280	Opt_sec_krb5, Opt_sec_krb5i, Opt_sec_krb5p,
 281	Opt_sec_ntlmsspi, Opt_sec_ntlmssp,
 282	Opt_ntlm, Opt_sec_ntlmi, Opt_sec_ntlmv2,
 283	Opt_sec_ntlmv2i, Opt_sec_lanman,
 284	Opt_sec_none,
 285
 286	Opt_sec_err
 287};
 288
 289static const match_table_t cifs_secflavor_tokens = {
 290	{ Opt_sec_krb5, "krb5" },
 291	{ Opt_sec_krb5i, "krb5i" },
 292	{ Opt_sec_krb5p, "krb5p" },
 293	{ Opt_sec_ntlmsspi, "ntlmsspi" },
 294	{ Opt_sec_ntlmssp, "ntlmssp" },
 295	{ Opt_ntlm, "ntlm" },
 296	{ Opt_sec_ntlmi, "ntlmi" },
 297	{ Opt_sec_ntlmv2, "nontlm" },
 298	{ Opt_sec_ntlmv2, "ntlmv2" },
 299	{ Opt_sec_ntlmv2i, "ntlmv2i" },
 300	{ Opt_sec_lanman, "lanman" },
 301	{ Opt_sec_none, "none" },
 302
 303	{ Opt_sec_err, NULL }
 304};
 305
 306/* cache flavors */
 307enum {
 308	Opt_cache_loose,
 309	Opt_cache_strict,
 310	Opt_cache_none,
 311	Opt_cache_ro,
 312	Opt_cache_rw,
 313	Opt_cache_err
 314};
 315
 316static const match_table_t cifs_cacheflavor_tokens = {
 317	{ Opt_cache_loose, "loose" },
 318	{ Opt_cache_strict, "strict" },
 319	{ Opt_cache_none, "none" },
 320	{ Opt_cache_ro, "ro" },
 321	{ Opt_cache_rw, "singleclient" },
 322	{ Opt_cache_err, NULL }
 323};
 324
 325static const match_table_t cifs_smb_version_tokens = {
 326	{ Smb_1, SMB1_VERSION_STRING },
 327	{ Smb_20, SMB20_VERSION_STRING},
 328	{ Smb_21, SMB21_VERSION_STRING },
 329	{ Smb_30, SMB30_VERSION_STRING },
 330	{ Smb_302, SMB302_VERSION_STRING },
 331	{ Smb_302, ALT_SMB302_VERSION_STRING },
 332	{ Smb_311, SMB311_VERSION_STRING },
 333	{ Smb_311, ALT_SMB311_VERSION_STRING },
 334	{ Smb_3any, SMB3ANY_VERSION_STRING },
 335	{ Smb_default, SMBDEFAULT_VERSION_STRING },
 336	{ Smb_version_err, NULL }
 337};
 338
 339static int ip_connect(struct TCP_Server_Info *server);
 340static int generic_ip_connect(struct TCP_Server_Info *server);
 341static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
 342static void cifs_prune_tlinks(struct work_struct *work);
 343static char *extract_hostname(const char *unc);
 344
 345/*
 346 * Resolve hostname and set ip addr in tcp ses. Useful for hostnames that may
 347 * get their ip addresses changed at some point.
 348 *
 349 * This should be called with server->srv_mutex held.
 350 */
 351#ifdef CONFIG_CIFS_DFS_UPCALL
 352static int reconn_set_ipaddr(struct TCP_Server_Info *server)
 353{
 354	int rc;
 355	int len;
 356	char *unc, *ipaddr = NULL;
 
 
 
 357
 358	if (!server->hostname)
 359		return -EINVAL;
 360
 
 
 
 
 361	len = strlen(server->hostname) + 3;
 362
 363	unc = kmalloc(len, GFP_KERNEL);
 364	if (!unc) {
 365		cifs_dbg(FYI, "%s: failed to create UNC path\n", __func__);
 366		return -ENOMEM;
 367	}
 368	scnprintf(unc, len, "\\\\%s", server->hostname);
 369
 370	rc = dns_resolve_server_name_to_ip(unc, &ipaddr);
 
 
 
 
 371	kfree(unc);
 372
 373	if (rc < 0) {
 374		cifs_dbg(FYI, "%s: failed to resolve server part of %s to IP: %d\n",
 375			 __func__, server->hostname, rc);
 376		return rc;
 377	}
 378
 379	spin_lock(&cifs_tcp_ses_lock);
 380	rc = cifs_convert_address((struct sockaddr *)&server->dstaddr, ipaddr,
 381				  strlen(ipaddr));
 382	spin_unlock(&cifs_tcp_ses_lock);
 383	kfree(ipaddr);
 
 
 
 
 
 
 
 
 384
 385	return !rc ? -1 : 0;
 386}
 387#else
 388static inline int reconn_set_ipaddr(struct TCP_Server_Info *server)
 389{
 390	return 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 391}
 392#endif
 393
 394#ifdef CONFIG_CIFS_DFS_UPCALL
 395/* These functions must be called with server->srv_mutex held */
 396static void reconn_set_next_dfs_target(struct TCP_Server_Info *server,
 397				       struct cifs_sb_info *cifs_sb,
 398				       struct dfs_cache_tgt_list *tgt_list,
 399				       struct dfs_cache_tgt_iterator **tgt_it)
 400{
 401	const char *name;
 
 
 402
 403	if (!cifs_sb || !cifs_sb->origin_fullpath)
 404		return;
 405
 406	if (!*tgt_it) {
 407		*tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
 408	} else {
 409		*tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
 410		if (!*tgt_it)
 411			*tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
 
 412	}
 413
 414	cifs_dbg(FYI, "%s: UNC: %s\n", __func__, cifs_sb->origin_fullpath);
 
 415
 416	name = dfs_cache_get_tgt_name(*tgt_it);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 417
 418	kfree(server->hostname);
 
 419
 420	server->hostname = extract_hostname(name);
 421	if (IS_ERR(server->hostname)) {
 422		cifs_dbg(FYI,
 423			 "%s: failed to extract hostname from target: %ld\n",
 424			 __func__, PTR_ERR(server->hostname));
 425	}
 426}
 427
 428static inline int reconn_setup_dfs_targets(struct cifs_sb_info *cifs_sb,
 429					   struct dfs_cache_tgt_list *tl)
 430{
 431	if (!cifs_sb->origin_fullpath)
 432		return -EOPNOTSUPP;
 433	return dfs_cache_noreq_find(cifs_sb->origin_fullpath + 1, NULL, tl);
 
 
 
 
 
 434}
 435#endif
 436
 437/*
 438 * cifs tcp session reconnection
 
 
 
 439 *
 440 * mark tcp session as reconnecting so temporarily locked
 441 * mark all smb sessions as reconnecting for tcp session
 442 * reconnect tcp session
 443 * wake up waiters on reconnection? - (not needed currently)
 444 */
 445int
 446cifs_reconnect(struct TCP_Server_Info *server)
 
 447{
 448	int rc = 0;
 449	struct list_head *tmp, *tmp2;
 450	struct cifs_ses *ses;
 451	struct cifs_tcon *tcon;
 452	struct mid_q_entry *mid_entry;
 453	struct list_head retry_list;
 454#ifdef CONFIG_CIFS_DFS_UPCALL
 455	struct super_block *sb = NULL;
 456	struct cifs_sb_info *cifs_sb = NULL;
 457	struct dfs_cache_tgt_list tgt_list = {0};
 458	struct dfs_cache_tgt_iterator *tgt_it = NULL;
 459#endif
 460
 461	spin_lock(&GlobalMid_Lock);
 462	server->nr_targets = 1;
 463#ifdef CONFIG_CIFS_DFS_UPCALL
 464	spin_unlock(&GlobalMid_Lock);
 465	sb = cifs_get_tcp_super(server);
 466	if (IS_ERR(sb)) {
 467		rc = PTR_ERR(sb);
 468		cifs_dbg(FYI, "%s: will not do DFS failover: rc = %d\n",
 469			 __func__, rc);
 470		sb = NULL;
 471	} else {
 472		cifs_sb = CIFS_SB(sb);
 473		rc = reconn_setup_dfs_targets(cifs_sb, &tgt_list);
 474		if (rc) {
 475			cifs_sb = NULL;
 476			if (rc != -EOPNOTSUPP) {
 477				cifs_server_dbg(VFS, "%s: no target servers for DFS failover\n",
 478						__func__);
 479			}
 480		} else {
 481			server->nr_targets = dfs_cache_get_nr_tgts(&tgt_list);
 482		}
 483	}
 484	cifs_dbg(FYI, "%s: will retry %d target(s)\n", __func__,
 485		 server->nr_targets);
 486	spin_lock(&GlobalMid_Lock);
 487#endif
 488	if (server->tcpStatus == CifsExiting) {
 489		/* the demux thread will exit normally
 490		next time through the loop */
 491		spin_unlock(&GlobalMid_Lock);
 492#ifdef CONFIG_CIFS_DFS_UPCALL
 493		dfs_cache_free_tgts(&tgt_list);
 494		cifs_put_tcp_super(sb);
 495#endif
 496		wake_up(&server->response_q);
 497		return rc;
 498	} else
 499		server->tcpStatus = CifsNeedReconnect;
 500	spin_unlock(&GlobalMid_Lock);
 501	server->maxBuf = 0;
 502	server->max_read = 0;
 503
 504	cifs_dbg(FYI, "Mark tcp session as need reconnect\n");
 505	trace_smb3_reconnect(server->CurrentMid, server->hostname);
 506
 507	/* before reconnecting the tcp session, mark the smb session (uid)
 508		and the tid bad so they are not used until reconnected */
 509	cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
 510		 __func__);
 511	spin_lock(&cifs_tcp_ses_lock);
 512	list_for_each(tmp, &server->smb_ses_list) {
 513		ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
 514		ses->need_reconnect = true;
 515		list_for_each(tmp2, &ses->tcon_list) {
 516			tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 517			tcon->need_reconnect = true;
 
 518		}
 519		if (ses->tcon_ipc)
 520			ses->tcon_ipc->need_reconnect = true;
 
 
 
 
 
 521	}
 522	spin_unlock(&cifs_tcp_ses_lock);
 
 
 
 
 
 
 
 
 
 
 523
 524	/* do not want to be sending data on a socket we are freeing */
 525	cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
 526	mutex_lock(&server->srv_mutex);
 527	if (server->ssocket) {
 528		cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
 529			 server->ssocket->state, server->ssocket->flags);
 530		kernel_sock_shutdown(server->ssocket, SHUT_WR);
 531		cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
 532			 server->ssocket->state, server->ssocket->flags);
 533		sock_release(server->ssocket);
 534		server->ssocket = NULL;
 535	}
 536	server->sequence_number = 0;
 537	server->session_estab = false;
 538	kfree(server->session_key.response);
 539	server->session_key.response = NULL;
 540	server->session_key.len = 0;
 541	server->lstrp = jiffies;
 542
 543	/* mark submitted MIDs for retry and issue callback */
 544	INIT_LIST_HEAD(&retry_list);
 545	cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
 546	spin_lock(&GlobalMid_Lock);
 547	list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
 548		mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
 549		kref_get(&mid_entry->refcount);
 550		if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
 551			mid_entry->mid_state = MID_RETRY_NEEDED;
 552		list_move(&mid_entry->qhead, &retry_list);
 553		mid_entry->mid_flags |= MID_DELETED;
 554	}
 555	spin_unlock(&GlobalMid_Lock);
 556	mutex_unlock(&server->srv_mutex);
 557
 558	cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
 559	list_for_each_safe(tmp, tmp2, &retry_list) {
 560		mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
 561		list_del_init(&mid_entry->qhead);
 562		mid_entry->callback(mid_entry);
 563		cifs_mid_q_entry_release(mid_entry);
 564	}
 565
 566	if (cifs_rdma_enabled(server)) {
 567		mutex_lock(&server->srv_mutex);
 568		smbd_destroy(server);
 569		mutex_unlock(&server->srv_mutex);
 
 
 
 
 
 
 
 
 
 
 
 
 570	}
 571
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 572	do {
 573		try_to_freeze();
 
 574
 575		mutex_lock(&server->srv_mutex);
 576#ifdef CONFIG_CIFS_DFS_UPCALL
 577		/*
 578		 * Set up next DFS target server (if any) for reconnect. If DFS
 579		 * feature is disabled, then we will retry last server we
 580		 * connected to before.
 581		 */
 582		reconn_set_next_dfs_target(server, cifs_sb, &tgt_list, &tgt_it);
 583#endif
 584		rc = reconn_set_ipaddr(server);
 585		if (rc) {
 586			cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
 587				 __func__, rc);
 588		}
 589
 590		if (cifs_rdma_enabled(server))
 591			rc = smbd_reconnect(server);
 592		else
 593			rc = generic_ip_connect(server);
 594		if (rc) {
 595			cifs_dbg(FYI, "reconnect error %d\n", rc);
 596			mutex_unlock(&server->srv_mutex);
 597			msleep(3000);
 598		} else {
 599			atomic_inc(&tcpSesReconnectCount);
 600			set_credits(server, 1);
 601			spin_lock(&GlobalMid_Lock);
 602			if (server->tcpStatus != CifsExiting)
 603				server->tcpStatus = CifsNeedNegotiate;
 604			spin_unlock(&GlobalMid_Lock);
 605			mutex_unlock(&server->srv_mutex);
 
 
 606		}
 607	} while (server->tcpStatus == CifsNeedReconnect);
 608
 
 
 
 
 
 
 
 
 
 609#ifdef CONFIG_CIFS_DFS_UPCALL
 610	if (tgt_it) {
 611		rc = dfs_cache_noreq_update_tgthint(cifs_sb->origin_fullpath + 1,
 612						    tgt_it);
 613		if (rc) {
 614			cifs_server_dbg(VFS, "%s: failed to update DFS target hint: rc = %d\n",
 615				 __func__, rc);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 616		}
 617		rc = dfs_cache_update_vol(cifs_sb->origin_fullpath, server);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 618		if (rc) {
 619			cifs_server_dbg(VFS, "%s: failed to update vol info in DFS cache: rc = %d\n",
 620				 __func__, rc);
 
 
 
 621		}
 622		dfs_cache_free_tgts(&tgt_list);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 623
 624	}
 
 625
 626	cifs_put_tcp_super(sb);
 627#endif
 628	if (server->tcpStatus == CifsNeedNegotiate)
 629		mod_delayed_work(cifsiod_wq, &server->echo, 0);
 
 630
 631	wake_up(&server->response_q);
 632	return rc;
 633}
 634
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 635static void
 636cifs_echo_request(struct work_struct *work)
 637{
 638	int rc;
 639	struct TCP_Server_Info *server = container_of(work,
 640					struct TCP_Server_Info, echo.work);
 641	unsigned long echo_interval;
 642
 643	/*
 644	 * If we need to renegotiate, set echo interval to zero to
 645	 * immediately call echo service where we can renegotiate.
 646	 */
 647	if (server->tcpStatus == CifsNeedNegotiate)
 648		echo_interval = 0;
 649	else
 650		echo_interval = server->echo_interval;
 651
 652	/*
 653	 * We cannot send an echo if it is disabled.
 654	 * Also, no need to ping if we got a response recently.
 655	 */
 656
 657	if (server->tcpStatus == CifsNeedReconnect ||
 658	    server->tcpStatus == CifsExiting ||
 659	    server->tcpStatus == CifsNew ||
 660	    (server->ops->can_echo && !server->ops->can_echo(server)) ||
 661	    time_before(jiffies, server->lstrp + echo_interval - HZ))
 662		goto requeue_echo;
 663
 664	rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
 665	if (rc)
 666		cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
 667			 server->hostname);
 668
 
 
 
 669requeue_echo:
 670	queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
 671}
 672
 673static bool
 674allocate_buffers(struct TCP_Server_Info *server)
 675{
 676	if (!server->bigbuf) {
 677		server->bigbuf = (char *)cifs_buf_get();
 678		if (!server->bigbuf) {
 679			cifs_server_dbg(VFS, "No memory for large SMB response\n");
 680			msleep(3000);
 681			/* retry will check if exiting */
 682			return false;
 683		}
 684	} else if (server->large_buf) {
 685		/* we are reusing a dirty large buf, clear its start */
 686		memset(server->bigbuf, 0, HEADER_SIZE(server));
 687	}
 688
 689	if (!server->smallbuf) {
 690		server->smallbuf = (char *)cifs_small_buf_get();
 691		if (!server->smallbuf) {
 692			cifs_server_dbg(VFS, "No memory for SMB response\n");
 693			msleep(1000);
 694			/* retry will check if exiting */
 695			return false;
 696		}
 697		/* beginning of smb buffer is cleared in our buf_get */
 698	} else {
 699		/* if existing small buf clear beginning */
 700		memset(server->smallbuf, 0, HEADER_SIZE(server));
 701	}
 702
 703	return true;
 704}
 705
 706static bool
 707server_unresponsive(struct TCP_Server_Info *server)
 708{
 709	/*
 710	 * We need to wait 3 echo intervals to make sure we handle such
 711	 * situations right:
 712	 * 1s  client sends a normal SMB request
 713	 * 2s  client gets a response
 714	 * 30s echo workqueue job pops, and decides we got a response recently
 715	 *     and don't need to send another
 716	 * ...
 717	 * 65s kernel_recvmsg times out, and we see that we haven't gotten
 718	 *     a response in >60s.
 719	 */
 
 720	if ((server->tcpStatus == CifsGood ||
 721	    server->tcpStatus == CifsNeedNegotiate) &&
 
 722	    time_after(jiffies, server->lstrp + 3 * server->echo_interval)) {
 
 723		cifs_server_dbg(VFS, "has not responded in %lu seconds. Reconnecting...\n",
 724			 (3 * server->echo_interval) / HZ);
 725		cifs_reconnect(server);
 726		return true;
 727	}
 
 728
 729	return false;
 730}
 731
 732static inline bool
 733zero_credits(struct TCP_Server_Info *server)
 734{
 735	int val;
 736
 737	spin_lock(&server->req_lock);
 738	val = server->credits + server->echo_credits + server->oplock_credits;
 739	if (server->in_flight == 0 && val == 0) {
 740		spin_unlock(&server->req_lock);
 741		return true;
 742	}
 743	spin_unlock(&server->req_lock);
 744	return false;
 745}
 746
 747static int
 748cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
 749{
 750	int length = 0;
 751	int total_read;
 752
 753	smb_msg->msg_control = NULL;
 754	smb_msg->msg_controllen = 0;
 755
 756	for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
 757		try_to_freeze();
 758
 759		/* reconnect if no credits and no requests in flight */
 760		if (zero_credits(server)) {
 761			cifs_reconnect(server);
 762			return -ECONNABORTED;
 763		}
 764
 765		if (server_unresponsive(server))
 766			return -ECONNABORTED;
 767		if (cifs_rdma_enabled(server) && server->smbd_conn)
 768			length = smbd_recv(server->smbd_conn, smb_msg);
 769		else
 770			length = sock_recvmsg(server->ssocket, smb_msg, 0);
 771
 772		if (server->tcpStatus == CifsExiting)
 
 
 773			return -ESHUTDOWN;
 
 774
 775		if (server->tcpStatus == CifsNeedReconnect) {
 776			cifs_reconnect(server);
 
 777			return -ECONNABORTED;
 778		}
 
 779
 780		if (length == -ERESTARTSYS ||
 781		    length == -EAGAIN ||
 782		    length == -EINTR) {
 783			/*
 784			 * Minimum sleep to prevent looping, allowing socket
 785			 * to clear and app threads to set tcpStatus
 786			 * CifsNeedReconnect if server hung.
 787			 */
 788			usleep_range(1000, 2000);
 789			length = 0;
 790			continue;
 791		}
 792
 793		if (length <= 0) {
 794			cifs_dbg(FYI, "Received no data or error: %d\n", length);
 795			cifs_reconnect(server);
 796			return -ECONNABORTED;
 797		}
 798	}
 799	return total_read;
 800}
 801
 802int
 803cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
 804		      unsigned int to_read)
 805{
 806	struct msghdr smb_msg;
 807	struct kvec iov = {.iov_base = buf, .iov_len = to_read};
 808	iov_iter_kvec(&smb_msg.msg_iter, READ, &iov, 1, to_read);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 809
 810	return cifs_readv_from_socket(server, &smb_msg);
 811}
 812
 813int
 814cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
 815	unsigned int page_offset, unsigned int to_read)
 816{
 817	struct msghdr smb_msg;
 818	struct bio_vec bv = {
 819		.bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
 820	iov_iter_bvec(&smb_msg.msg_iter, READ, &bv, 1, to_read);
 821	return cifs_readv_from_socket(server, &smb_msg);
 822}
 823
 824static bool
 825is_smb_response(struct TCP_Server_Info *server, unsigned char type)
 826{
 827	/*
 828	 * The first byte big endian of the length field,
 829	 * is actually not part of the length but the type
 830	 * with the most common, zero, as regular data.
 831	 */
 832	switch (type) {
 833	case RFC1002_SESSION_MESSAGE:
 834		/* Regular SMB response */
 835		return true;
 836	case RFC1002_SESSION_KEEP_ALIVE:
 837		cifs_dbg(FYI, "RFC 1002 session keep alive\n");
 838		break;
 839	case RFC1002_POSITIVE_SESSION_RESPONSE:
 840		cifs_dbg(FYI, "RFC 1002 positive session response\n");
 841		break;
 842	case RFC1002_NEGATIVE_SESSION_RESPONSE:
 843		/*
 844		 * We get this from Windows 98 instead of an error on
 845		 * SMB negprot response.
 846		 */
 847		cifs_dbg(FYI, "RFC 1002 negative session response\n");
 848		/* give server a second to clean up */
 849		msleep(1000);
 850		/*
 851		 * Always try 445 first on reconnect since we get NACK
 852		 * on some if we ever connected to port 139 (the NACK
 853		 * is since we do not begin with RFC1001 session
 854		 * initialize frame).
 855		 */
 856		cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
 857		cifs_reconnect(server);
 858		break;
 859	default:
 860		cifs_server_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
 861		cifs_reconnect(server);
 862	}
 863
 864	return false;
 865}
 866
 867void
 868dequeue_mid(struct mid_q_entry *mid, bool malformed)
 869{
 870#ifdef CONFIG_CIFS_STATS2
 871	mid->when_received = jiffies;
 872#endif
 873	spin_lock(&GlobalMid_Lock);
 874	if (!malformed)
 875		mid->mid_state = MID_RESPONSE_RECEIVED;
 876	else
 877		mid->mid_state = MID_RESPONSE_MALFORMED;
 878	/*
 879	 * Trying to handle/dequeue a mid after the send_recv()
 880	 * function has finished processing it is a bug.
 881	 */
 882	if (mid->mid_flags & MID_DELETED)
 
 883		pr_warn_once("trying to dequeue a deleted mid\n");
 884	else {
 885		list_del_init(&mid->qhead);
 886		mid->mid_flags |= MID_DELETED;
 
 887	}
 888	spin_unlock(&GlobalMid_Lock);
 889}
 890
 891static unsigned int
 892smb2_get_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
 893{
 894	struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
 895
 896	/*
 897	 * SMB1 does not use credits.
 898	 */
 899	if (server->vals->header_preamble_size)
 900		return 0;
 901
 902	return le16_to_cpu(shdr->CreditRequest);
 903}
 904
 905static void
 906handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
 907	   char *buf, int malformed)
 908{
 909	if (server->ops->check_trans2 &&
 910	    server->ops->check_trans2(mid, server, buf, malformed))
 911		return;
 912	mid->credits_received = smb2_get_credits_from_hdr(buf, server);
 913	mid->resp_buf = buf;
 914	mid->large_buf = server->large_buf;
 915	/* Was previous buf put in mpx struct for multi-rsp? */
 916	if (!mid->multiRsp) {
 917		/* smb buffer will be freed by user thread */
 918		if (server->large_buf)
 919			server->bigbuf = NULL;
 920		else
 921			server->smallbuf = NULL;
 922	}
 923	dequeue_mid(mid, malformed);
 924}
 925
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 926static void clean_demultiplex_info(struct TCP_Server_Info *server)
 927{
 928	int length;
 929
 930	/* take it off the list, if it's not already */
 931	spin_lock(&cifs_tcp_ses_lock);
 932	list_del_init(&server->tcp_ses_list);
 933	spin_unlock(&cifs_tcp_ses_lock);
 
 
 
 934
 935	spin_lock(&GlobalMid_Lock);
 936	server->tcpStatus = CifsExiting;
 937	spin_unlock(&GlobalMid_Lock);
 938	wake_up_all(&server->response_q);
 939
 940	/* check if we have blocked requests that need to free */
 941	spin_lock(&server->req_lock);
 942	if (server->credits <= 0)
 943		server->credits = 1;
 944	spin_unlock(&server->req_lock);
 945	/*
 946	 * Although there should not be any requests blocked on this queue it
 947	 * can not hurt to be paranoid and try to wake up requests that may
 948	 * haven been blocked when more than 50 at time were on the wire to the
 949	 * same server - they now will see the session is in exit state and get
 950	 * out of SendReceive.
 951	 */
 952	wake_up_all(&server->request_q);
 953	/* give those requests time to exit */
 954	msleep(125);
 955	if (cifs_rdma_enabled(server))
 956		smbd_destroy(server);
 957	if (server->ssocket) {
 958		sock_release(server->ssocket);
 959		server->ssocket = NULL;
 960	}
 961
 962	if (!list_empty(&server->pending_mid_q)) {
 963		struct list_head dispose_list;
 964		struct mid_q_entry *mid_entry;
 965		struct list_head *tmp, *tmp2;
 966
 967		INIT_LIST_HEAD(&dispose_list);
 968		spin_lock(&GlobalMid_Lock);
 969		list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
 970			mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
 971			cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
 972			kref_get(&mid_entry->refcount);
 973			mid_entry->mid_state = MID_SHUTDOWN;
 974			list_move(&mid_entry->qhead, &dispose_list);
 975			mid_entry->mid_flags |= MID_DELETED;
 976		}
 977		spin_unlock(&GlobalMid_Lock);
 978
 979		/* now walk dispose list and issue callbacks */
 980		list_for_each_safe(tmp, tmp2, &dispose_list) {
 981			mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
 982			cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
 983			list_del_init(&mid_entry->qhead);
 984			mid_entry->callback(mid_entry);
 985			cifs_mid_q_entry_release(mid_entry);
 986		}
 987		/* 1/8th of sec is more than enough time for them to exit */
 988		msleep(125);
 989	}
 990
 991	if (!list_empty(&server->pending_mid_q)) {
 992		/*
 993		 * mpx threads have not exited yet give them at least the smb
 994		 * send timeout time for long ops.
 995		 *
 996		 * Due to delays on oplock break requests, we need to wait at
 997		 * least 45 seconds before giving up on a request getting a
 998		 * response and going ahead and killing cifsd.
 999		 */
1000		cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
1001		msleep(46000);
1002		/*
1003		 * If threads still have not exited they are probably never
1004		 * coming home not much else we can do but free the memory.
1005		 */
1006	}
1007
1008	kfree(server->hostname);
 
 
 
1009	kfree(server);
1010
1011	length = atomic_dec_return(&tcpSesAllocCount);
1012	if (length > 0)
1013		mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
1014}
1015
1016static int
1017standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1018{
1019	int length;
1020	char *buf = server->smallbuf;
1021	unsigned int pdu_length = server->pdu_size;
1022
1023	/* make sure this will fit in a large buffer */
1024	if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
1025		server->vals->header_preamble_size) {
1026		cifs_server_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
1027		cifs_reconnect(server);
1028		return -ECONNABORTED;
1029	}
1030
1031	/* switch to large buffer if too big for a small one */
1032	if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
1033		server->large_buf = true;
1034		memcpy(server->bigbuf, buf, server->total_read);
1035		buf = server->bigbuf;
1036	}
1037
1038	/* now read the rest */
1039	length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
1040				       pdu_length - HEADER_SIZE(server) + 1
1041				       + server->vals->header_preamble_size);
1042
1043	if (length < 0)
1044		return length;
1045	server->total_read += length;
1046
1047	dump_smb(buf, server->total_read);
1048
1049	return cifs_handle_standard(server, mid);
1050}
1051
1052int
1053cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1054{
1055	char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
1056	int length;
1057
1058	/*
1059	 * We know that we received enough to get to the MID as we
1060	 * checked the pdu_length earlier. Now check to see
1061	 * if the rest of the header is OK. We borrow the length
1062	 * var for the rest of the loop to avoid a new stack var.
1063	 *
1064	 * 48 bytes is enough to display the header and a little bit
1065	 * into the payload for debugging purposes.
1066	 */
1067	length = server->ops->check_message(buf, server->total_read, server);
1068	if (length != 0)
1069		cifs_dump_mem("Bad SMB: ", buf,
1070			min_t(unsigned int, server->total_read, 48));
1071
1072	if (server->ops->is_session_expired &&
1073	    server->ops->is_session_expired(buf)) {
1074		cifs_reconnect(server);
1075		return -1;
1076	}
1077
1078	if (server->ops->is_status_pending &&
1079	    server->ops->is_status_pending(buf, server))
1080		return -1;
1081
1082	if (!mid)
1083		return length;
1084
1085	handle_mid(mid, server, buf, length);
1086	return 0;
1087}
1088
1089static void
1090smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
1091{
1092	struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
 
1093
1094	/*
1095	 * SMB1 does not use credits.
1096	 */
1097	if (server->vals->header_preamble_size)
1098		return;
1099
1100	if (shdr->CreditRequest) {
1101		spin_lock(&server->req_lock);
1102		server->credits += le16_to_cpu(shdr->CreditRequest);
 
 
1103		spin_unlock(&server->req_lock);
1104		wake_up(&server->request_q);
 
 
 
 
 
 
 
1105	}
1106}
1107
1108
1109static int
1110cifs_demultiplex_thread(void *p)
1111{
1112	int i, num_mids, length;
1113	struct TCP_Server_Info *server = p;
1114	unsigned int pdu_length;
1115	unsigned int next_offset;
1116	char *buf = NULL;
1117	struct task_struct *task_to_wake = NULL;
1118	struct mid_q_entry *mids[MAX_COMPOUND];
1119	char *bufs[MAX_COMPOUND];
1120	unsigned int noreclaim_flag;
1121
1122	noreclaim_flag = memalloc_noreclaim_save();
1123	cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
1124
1125	length = atomic_inc_return(&tcpSesAllocCount);
1126	if (length > 1)
1127		mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
1128
1129	set_freezable();
1130	allow_kernel_signal(SIGKILL);
1131	while (server->tcpStatus != CifsExiting) {
1132		if (try_to_freeze())
1133			continue;
1134
1135		if (!allocate_buffers(server))
1136			continue;
1137
1138		server->large_buf = false;
1139		buf = server->smallbuf;
1140		pdu_length = 4; /* enough to get RFC1001 header */
1141
1142		length = cifs_read_from_socket(server, buf, pdu_length);
1143		if (length < 0)
1144			continue;
1145
1146		if (server->vals->header_preamble_size == 0)
 
 
1147			server->total_read = 0;
1148		else
1149			server->total_read = length;
1150
1151		/*
1152		 * The right amount was read from socket - 4 bytes,
1153		 * so we can now interpret the length field.
1154		 */
1155		pdu_length = get_rfc1002_length(buf);
1156
1157		cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
1158		if (!is_smb_response(server, buf[0]))
1159			continue;
1160next_pdu:
1161		server->pdu_size = pdu_length;
1162
1163		/* make sure we have enough to get to the MID */
1164		if (server->pdu_size < HEADER_SIZE(server) - 1 -
1165		    server->vals->header_preamble_size) {
1166			cifs_server_dbg(VFS, "SMB response too short (%u bytes)\n",
1167				 server->pdu_size);
1168			cifs_reconnect(server);
1169			continue;
1170		}
1171
1172		/* read down to the MID */
1173		length = cifs_read_from_socket(server,
1174			     buf + server->vals->header_preamble_size,
1175			     HEADER_SIZE(server) - 1
1176			     - server->vals->header_preamble_size);
1177		if (length < 0)
1178			continue;
1179		server->total_read += length;
1180
1181		if (server->ops->next_header) {
1182			next_offset = server->ops->next_header(buf);
1183			if (next_offset)
1184				server->pdu_size = next_offset;
1185		}
1186
1187		memset(mids, 0, sizeof(mids));
1188		memset(bufs, 0, sizeof(bufs));
1189		num_mids = 0;
1190
1191		if (server->ops->is_transform_hdr &&
1192		    server->ops->receive_transform &&
1193		    server->ops->is_transform_hdr(buf)) {
1194			length = server->ops->receive_transform(server,
1195								mids,
1196								bufs,
1197								&num_mids);
1198		} else {
1199			mids[0] = server->ops->find_mid(server, buf);
1200			bufs[0] = buf;
1201			num_mids = 1;
1202
1203			if (!mids[0] || !mids[0]->receive)
1204				length = standard_receive3(server, mids[0]);
1205			else
1206				length = mids[0]->receive(server, mids[0]);
1207		}
1208
1209		if (length < 0) {
1210			for (i = 0; i < num_mids; i++)
1211				if (mids[i])
1212					cifs_mid_q_entry_release(mids[i]);
1213			continue;
1214		}
1215
 
 
 
 
 
 
 
 
 
 
1216		server->lstrp = jiffies;
1217
1218		for (i = 0; i < num_mids; i++) {
1219			if (mids[i] != NULL) {
1220				mids[i]->resp_buf_size = server->pdu_size;
1221
 
 
 
 
1222				if (!mids[i]->multiRsp || mids[i]->multiEnd)
1223					mids[i]->callback(mids[i]);
1224
1225				cifs_mid_q_entry_release(mids[i]);
1226			} else if (server->ops->is_oplock_break &&
1227				   server->ops->is_oplock_break(bufs[i],
1228								server)) {
1229				smb2_add_credits_from_hdr(bufs[i], server);
1230				cifs_dbg(FYI, "Received oplock break\n");
1231			} else {
1232				cifs_server_dbg(VFS, "No task to wake, unknown frame received! NumMids %d\n",
1233						atomic_read(&midCount));
1234				cifs_dump_mem("Received Data is: ", bufs[i],
1235					      HEADER_SIZE(server));
1236				smb2_add_credits_from_hdr(bufs[i], server);
1237#ifdef CONFIG_CIFS_DEBUG2
1238				if (server->ops->dump_detail)
1239					server->ops->dump_detail(bufs[i],
1240								 server);
1241				cifs_dump_mids(server);
1242#endif /* CIFS_DEBUG2 */
1243			}
1244		}
1245
1246		if (pdu_length > server->pdu_size) {
1247			if (!allocate_buffers(server))
1248				continue;
1249			pdu_length -= server->pdu_size;
1250			server->total_read = 0;
1251			server->large_buf = false;
1252			buf = server->smallbuf;
1253			goto next_pdu;
1254		}
1255	} /* end while !EXITING */
1256
1257	/* buffer usually freed in free_mid - need to free it here on exit */
1258	cifs_buf_release(server->bigbuf);
1259	if (server->smallbuf) /* no sense logging a debug message if NULL */
1260		cifs_small_buf_release(server->smallbuf);
1261
1262	task_to_wake = xchg(&server->tsk, NULL);
1263	clean_demultiplex_info(server);
1264
1265	/* if server->tsk was NULL then wait for a signal before exiting */
1266	if (!task_to_wake) {
1267		set_current_state(TASK_INTERRUPTIBLE);
1268		while (!signal_pending(current)) {
1269			schedule();
1270			set_current_state(TASK_INTERRUPTIBLE);
1271		}
1272		set_current_state(TASK_RUNNING);
1273	}
1274
1275	memalloc_noreclaim_restore(noreclaim_flag);
1276	module_put_and_exit(0);
1277}
1278
1279/* extract the host portion of the UNC string */
1280static char *
1281extract_hostname(const char *unc)
1282{
1283	const char *src;
1284	char *dst, *delim;
1285	unsigned int len;
1286
1287	/* skip double chars at beginning of string */
1288	/* BB: check validity of these bytes? */
1289	if (strlen(unc) < 3)
1290		return ERR_PTR(-EINVAL);
1291	for (src = unc; *src && *src == '\\'; src++)
1292		;
1293	if (!*src)
1294		return ERR_PTR(-EINVAL);
1295
1296	/* delimiter between hostname and sharename is always '\\' now */
1297	delim = strchr(src, '\\');
1298	if (!delim)
1299		return ERR_PTR(-EINVAL);
1300
1301	len = delim - src;
1302	dst = kmalloc((len + 1), GFP_KERNEL);
1303	if (dst == NULL)
1304		return ERR_PTR(-ENOMEM);
1305
1306	memcpy(dst, src, len);
1307	dst[len] = '\0';
1308
1309	return dst;
1310}
1311
1312static int get_option_ul(substring_t args[], unsigned long *option)
1313{
1314	int rc;
1315	char *string;
1316
1317	string = match_strdup(args);
1318	if (string == NULL)
1319		return -ENOMEM;
1320	rc = kstrtoul(string, 0, option);
1321	kfree(string);
1322
1323	return rc;
1324}
1325
1326static int get_option_uid(substring_t args[], kuid_t *result)
1327{
1328	unsigned long value;
1329	kuid_t uid;
1330	int rc;
1331
1332	rc = get_option_ul(args, &value);
1333	if (rc)
1334		return rc;
1335
1336	uid = make_kuid(current_user_ns(), value);
1337	if (!uid_valid(uid))
1338		return -EINVAL;
1339
1340	*result = uid;
1341	return 0;
1342}
1343
1344static int get_option_gid(substring_t args[], kgid_t *result)
1345{
1346	unsigned long value;
1347	kgid_t gid;
1348	int rc;
1349
1350	rc = get_option_ul(args, &value);
1351	if (rc)
1352		return rc;
1353
1354	gid = make_kgid(current_user_ns(), value);
1355	if (!gid_valid(gid))
1356		return -EINVAL;
1357
1358	*result = gid;
1359	return 0;
1360}
1361
1362static int cifs_parse_security_flavors(char *value,
1363				       struct smb_vol *vol)
1364{
1365
1366	substring_t args[MAX_OPT_ARGS];
1367
1368	/*
1369	 * With mount options, the last one should win. Reset any existing
1370	 * settings back to default.
1371	 */
1372	vol->sectype = Unspecified;
1373	vol->sign = false;
1374
1375	switch (match_token(value, cifs_secflavor_tokens, args)) {
1376	case Opt_sec_krb5p:
1377		cifs_dbg(VFS, "sec=krb5p is not supported!\n");
1378		return 1;
1379	case Opt_sec_krb5i:
1380		vol->sign = true;
1381		fallthrough;
1382	case Opt_sec_krb5:
1383		vol->sectype = Kerberos;
1384		break;
1385	case Opt_sec_ntlmsspi:
1386		vol->sign = true;
1387		fallthrough;
1388	case Opt_sec_ntlmssp:
1389		vol->sectype = RawNTLMSSP;
1390		break;
1391	case Opt_sec_ntlmi:
1392		vol->sign = true;
1393		fallthrough;
1394	case Opt_ntlm:
1395		vol->sectype = NTLM;
1396		break;
1397	case Opt_sec_ntlmv2i:
1398		vol->sign = true;
1399		fallthrough;
1400	case Opt_sec_ntlmv2:
1401		vol->sectype = NTLMv2;
1402		break;
1403#ifdef CONFIG_CIFS_WEAK_PW_HASH
1404	case Opt_sec_lanman:
1405		vol->sectype = LANMAN;
1406		break;
1407#endif
1408	case Opt_sec_none:
1409		vol->nullauth = 1;
1410		break;
1411	default:
1412		cifs_dbg(VFS, "bad security option: %s\n", value);
1413		return 1;
1414	}
1415
1416	return 0;
1417}
1418
1419static int
1420cifs_parse_cache_flavor(char *value, struct smb_vol *vol)
1421{
1422	substring_t args[MAX_OPT_ARGS];
1423
1424	switch (match_token(value, cifs_cacheflavor_tokens, args)) {
1425	case Opt_cache_loose:
1426		vol->direct_io = false;
1427		vol->strict_io = false;
1428		vol->cache_ro = false;
1429		vol->cache_rw = false;
1430		break;
1431	case Opt_cache_strict:
1432		vol->direct_io = false;
1433		vol->strict_io = true;
1434		vol->cache_ro = false;
1435		vol->cache_rw = false;
1436		break;
1437	case Opt_cache_none:
1438		vol->direct_io = true;
1439		vol->strict_io = false;
1440		vol->cache_ro = false;
1441		vol->cache_rw = false;
1442		break;
1443	case Opt_cache_ro:
1444		vol->direct_io = false;
1445		vol->strict_io = false;
1446		vol->cache_ro = true;
1447		vol->cache_rw = false;
1448		break;
1449	case Opt_cache_rw:
1450		vol->direct_io = false;
1451		vol->strict_io = false;
1452		vol->cache_ro = false;
1453		vol->cache_rw = true;
1454		break;
1455	default:
1456		cifs_dbg(VFS, "bad cache= option: %s\n", value);
1457		return 1;
1458	}
1459	return 0;
1460}
1461
1462static int
1463cifs_parse_smb_version(char *value, struct smb_vol *vol, bool is_smb3)
1464{
1465	substring_t args[MAX_OPT_ARGS];
1466
1467	switch (match_token(value, cifs_smb_version_tokens, args)) {
1468#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1469	case Smb_1:
1470		if (disable_legacy_dialects) {
1471			cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1472			return 1;
1473		}
1474		if (is_smb3) {
1475			cifs_dbg(VFS, "vers=1.0 (cifs) not permitted when mounting with smb3\n");
1476			return 1;
1477		}
1478		cifs_dbg(VFS, "Use of the less secure dialect vers=1.0 is not recommended unless required for access to very old servers\n");
1479		vol->ops = &smb1_operations;
1480		vol->vals = &smb1_values;
1481		break;
1482	case Smb_20:
1483		if (disable_legacy_dialects) {
1484			cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1485			return 1;
1486		}
1487		if (is_smb3) {
1488			cifs_dbg(VFS, "vers=2.0 not permitted when mounting with smb3\n");
1489			return 1;
1490		}
1491		vol->ops = &smb20_operations;
1492		vol->vals = &smb20_values;
1493		break;
1494#else
1495	case Smb_1:
1496		cifs_dbg(VFS, "vers=1.0 (cifs) mount not permitted when legacy dialects disabled\n");
1497		return 1;
1498	case Smb_20:
1499		cifs_dbg(VFS, "vers=2.0 mount not permitted when legacy dialects disabled\n");
1500		return 1;
1501#endif /* CIFS_ALLOW_INSECURE_LEGACY */
1502	case Smb_21:
1503		vol->ops = &smb21_operations;
1504		vol->vals = &smb21_values;
1505		break;
1506	case Smb_30:
1507		vol->ops = &smb30_operations;
1508		vol->vals = &smb30_values;
1509		break;
1510	case Smb_302:
1511		vol->ops = &smb30_operations; /* currently identical with 3.0 */
1512		vol->vals = &smb302_values;
1513		break;
1514	case Smb_311:
1515		vol->ops = &smb311_operations;
1516		vol->vals = &smb311_values;
1517		break;
1518	case Smb_3any:
1519		vol->ops = &smb30_operations; /* currently identical with 3.0 */
1520		vol->vals = &smb3any_values;
1521		break;
1522	case Smb_default:
1523		vol->ops = &smb30_operations; /* currently identical with 3.0 */
1524		vol->vals = &smbdefault_values;
1525		break;
1526	default:
1527		cifs_dbg(VFS, "Unknown vers= option specified: %s\n", value);
1528		return 1;
1529	}
1530	return 0;
1531}
1532
1533/*
1534 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1535 * fields with the result. Returns 0 on success and an error otherwise.
1536 */
1537static int
1538cifs_parse_devname(const char *devname, struct smb_vol *vol)
1539{
1540	char *pos;
1541	const char *delims = "/\\";
1542	size_t len;
1543
1544	if (unlikely(!devname || !*devname)) {
1545		cifs_dbg(VFS, "Device name not specified\n");
1546		return -EINVAL;
1547	}
1548
1549	/* make sure we have a valid UNC double delimiter prefix */
1550	len = strspn(devname, delims);
1551	if (len != 2)
1552		return -EINVAL;
1553
1554	/* find delimiter between host and sharename */
1555	pos = strpbrk(devname + 2, delims);
1556	if (!pos)
1557		return -EINVAL;
1558
1559	/* skip past delimiter */
1560	++pos;
1561
1562	/* now go until next delimiter or end of string */
1563	len = strcspn(pos, delims);
1564
1565	/* move "pos" up to delimiter or NULL */
1566	pos += len;
1567	vol->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
1568	if (!vol->UNC)
1569		return -ENOMEM;
1570
1571	convert_delimiter(vol->UNC, '\\');
1572
1573	/* skip any delimiter */
1574	if (*pos == '/' || *pos == '\\')
1575		pos++;
1576
1577	/* If pos is NULL then no prepath */
1578	if (!*pos)
1579		return 0;
1580
1581	vol->prepath = kstrdup(pos, GFP_KERNEL);
1582	if (!vol->prepath)
1583		return -ENOMEM;
1584
1585	return 0;
1586}
1587
1588static int
1589cifs_parse_mount_options(const char *mountdata, const char *devname,
1590			 struct smb_vol *vol, bool is_smb3)
1591{
1592	char *data, *end;
1593	char *mountdata_copy = NULL, *options;
1594	unsigned int  temp_len, i, j;
1595	char separator[2];
1596	short int override_uid = -1;
1597	short int override_gid = -1;
1598	bool uid_specified = false;
1599	bool gid_specified = false;
1600	bool sloppy = false;
1601	char *invalid = NULL;
1602	char *nodename = utsname()->nodename;
1603	char *string = NULL;
1604	char *tmp_end, *value;
1605	char delim;
1606	bool got_ip = false;
1607	bool got_version = false;
1608	unsigned short port = 0;
1609	struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1610
1611	separator[0] = ',';
1612	separator[1] = 0;
1613	delim = separator[0];
1614
1615	/* ensure we always start with zeroed-out smb_vol */
1616	memset(vol, 0, sizeof(*vol));
1617
1618	/*
1619	 * does not have to be perfect mapping since field is
1620	 * informational, only used for servers that do not support
1621	 * port 445 and it can be overridden at mount time
1622	 */
1623	memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1624	for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1625		vol->source_rfc1001_name[i] = toupper(nodename[i]);
1626
1627	vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1628	/* null target name indicates to use *SMBSERVR default called name
1629	   if we end up sending RFC1001 session initialize */
1630	vol->target_rfc1001_name[0] = 0;
1631	vol->cred_uid = current_uid();
1632	vol->linux_uid = current_uid();
1633	vol->linux_gid = current_gid();
1634	vol->bsize = 1024 * 1024; /* can improve cp performance significantly */
1635	/*
1636	 * default to SFM style remapping of seven reserved characters
1637	 * unless user overrides it or we negotiate CIFS POSIX where
1638	 * it is unnecessary.  Can not simultaneously use more than one mapping
1639	 * since then readdir could list files that open could not open
1640	 */
1641	vol->remap = true;
1642
1643	/* default to only allowing write access to owner of the mount */
1644	vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1645
1646	/* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1647	/* default is always to request posix paths. */
1648	vol->posix_paths = 1;
1649	/* default to using server inode numbers where available */
1650	vol->server_ino = 1;
1651
1652	/* default is to use strict cifs caching semantics */
1653	vol->strict_io = true;
1654
1655	vol->actimeo = CIFS_DEF_ACTIMEO;
1656
1657	/* Most clients set timeout to 0, allows server to use its default */
1658	vol->handle_timeout = 0; /* See MS-SMB2 spec section 2.2.14.2.12 */
1659
1660	/* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1661	vol->ops = &smb30_operations;
1662	vol->vals = &smbdefault_values;
1663
1664	vol->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1665
1666	/* default to no multichannel (single server connection) */
1667	vol->multichannel = false;
1668	vol->max_channels = 1;
1669
1670	if (!mountdata)
1671		goto cifs_parse_mount_err;
1672
1673	mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1674	if (!mountdata_copy)
1675		goto cifs_parse_mount_err;
1676
1677	options = mountdata_copy;
1678	end = options + strlen(options);
1679
1680	if (strncmp(options, "sep=", 4) == 0) {
1681		if (options[4] != 0) {
1682			separator[0] = options[4];
1683			options += 5;
1684		} else {
1685			cifs_dbg(FYI, "Null separator not allowed\n");
1686		}
1687	}
1688	vol->backupuid_specified = false; /* no backup intent for a user */
1689	vol->backupgid_specified = false; /* no backup intent for a group */
1690
1691	switch (cifs_parse_devname(devname, vol)) {
1692	case 0:
1693		break;
1694	case -ENOMEM:
1695		cifs_dbg(VFS, "Unable to allocate memory for devname\n");
1696		goto cifs_parse_mount_err;
1697	case -EINVAL:
1698		cifs_dbg(VFS, "Malformed UNC in devname\n");
1699		goto cifs_parse_mount_err;
1700	default:
1701		cifs_dbg(VFS, "Unknown error parsing devname\n");
1702		goto cifs_parse_mount_err;
1703	}
1704
1705	while ((data = strsep(&options, separator)) != NULL) {
1706		substring_t args[MAX_OPT_ARGS];
1707		unsigned long option;
1708		int token;
1709
1710		if (!*data)
1711			continue;
1712
1713		token = match_token(data, cifs_mount_option_tokens, args);
1714
1715		switch (token) {
1716
1717		/* Ingnore the following */
1718		case Opt_ignore:
1719			break;
1720
1721		/* Boolean values */
1722		case Opt_user_xattr:
1723			vol->no_xattr = 0;
1724			break;
1725		case Opt_nouser_xattr:
1726			vol->no_xattr = 1;
1727			break;
1728		case Opt_forceuid:
1729			override_uid = 1;
1730			break;
1731		case Opt_noforceuid:
1732			override_uid = 0;
1733			break;
1734		case Opt_forcegid:
1735			override_gid = 1;
1736			break;
1737		case Opt_noforcegid:
1738			override_gid = 0;
1739			break;
1740		case Opt_noblocksend:
1741			vol->noblocksnd = 1;
1742			break;
1743		case Opt_noautotune:
1744			vol->noautotune = 1;
1745			break;
1746		case Opt_nolease:
1747			vol->no_lease = 1;
1748			break;
1749		case Opt_hard:
1750			vol->retry = 1;
1751			break;
1752		case Opt_soft:
1753			vol->retry = 0;
1754			break;
1755		case Opt_perm:
1756			vol->noperm = 0;
1757			break;
1758		case Opt_noperm:
1759			vol->noperm = 1;
1760			break;
1761		case Opt_nodelete:
1762			vol->nodelete = 1;
1763			break;
1764		case Opt_mapchars:
1765			vol->sfu_remap = true;
1766			vol->remap = false; /* disable SFM mapping */
1767			break;
1768		case Opt_nomapchars:
1769			vol->sfu_remap = false;
1770			break;
1771		case Opt_mapposix:
1772			vol->remap = true;
1773			vol->sfu_remap = false; /* disable SFU mapping */
1774			break;
1775		case Opt_nomapposix:
1776			vol->remap = false;
1777			break;
1778		case Opt_sfu:
1779			vol->sfu_emul = 1;
1780			break;
1781		case Opt_nosfu:
1782			vol->sfu_emul = 0;
1783			break;
1784		case Opt_nodfs:
1785			vol->nodfs = 1;
1786			break;
1787		case Opt_rootfs:
1788#ifdef CONFIG_CIFS_ROOT
1789			vol->rootfs = true;
1790#endif
1791			break;
1792		case Opt_posixpaths:
1793			vol->posix_paths = 1;
1794			break;
1795		case Opt_noposixpaths:
1796			vol->posix_paths = 0;
1797			break;
1798		case Opt_nounix:
1799			if (vol->linux_ext)
1800				cifs_dbg(VFS,
1801					"conflicting unix mount options\n");
1802			vol->no_linux_ext = 1;
1803			break;
1804		case Opt_unix:
1805			if (vol->no_linux_ext)
1806				cifs_dbg(VFS,
1807					"conflicting unix mount options\n");
1808			vol->linux_ext = 1;
1809			break;
1810		case Opt_nocase:
1811			vol->nocase = 1;
1812			break;
1813		case Opt_brl:
1814			vol->nobrl =  0;
1815			break;
1816		case Opt_nobrl:
1817			vol->nobrl =  1;
1818			/*
1819			 * turn off mandatory locking in mode
1820			 * if remote locking is turned off since the
1821			 * local vfs will do advisory
1822			 */
1823			if (vol->file_mode ==
1824				(S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1825				vol->file_mode = S_IALLUGO;
1826			break;
1827		case Opt_nohandlecache:
1828			vol->nohandlecache = 1;
1829			break;
1830		case Opt_handlecache:
1831			vol->nohandlecache = 0;
1832			break;
1833		case Opt_forcemandatorylock:
1834			vol->mand_lock = 1;
1835			break;
1836		case Opt_setuids:
1837			vol->setuids = 1;
1838			break;
1839		case Opt_nosetuids:
1840			vol->setuids = 0;
1841			break;
1842		case Opt_setuidfromacl:
1843			vol->setuidfromacl = 1;
1844			break;
1845		case Opt_dynperm:
1846			vol->dynperm = true;
1847			break;
1848		case Opt_nodynperm:
1849			vol->dynperm = false;
1850			break;
1851		case Opt_nohard:
1852			vol->retry = 0;
1853			break;
1854		case Opt_nosoft:
1855			vol->retry = 1;
1856			break;
1857		case Opt_nointr:
1858			vol->intr = 0;
1859			break;
1860		case Opt_intr:
1861			vol->intr = 1;
1862			break;
1863		case Opt_nostrictsync:
1864			vol->nostrictsync = 1;
1865			break;
1866		case Opt_strictsync:
1867			vol->nostrictsync = 0;
1868			break;
1869		case Opt_serverino:
1870			vol->server_ino = 1;
1871			break;
1872		case Opt_noserverino:
1873			vol->server_ino = 0;
1874			break;
1875		case Opt_rwpidforward:
1876			vol->rwpidforward = 1;
1877			break;
1878		case Opt_modesid:
1879			vol->mode_ace = 1;
1880			break;
1881		case Opt_cifsacl:
1882			vol->cifs_acl = 1;
1883			break;
1884		case Opt_nocifsacl:
1885			vol->cifs_acl = 0;
1886			break;
1887		case Opt_acl:
1888			vol->no_psx_acl = 0;
1889			break;
1890		case Opt_noacl:
1891			vol->no_psx_acl = 1;
1892			break;
1893		case Opt_locallease:
1894			vol->local_lease = 1;
1895			break;
1896		case Opt_sign:
1897			vol->sign = true;
1898			break;
1899		case Opt_ignore_signature:
1900			vol->sign = true;
1901			vol->ignore_signature = true;
1902			break;
1903		case Opt_seal:
1904			/* we do not do the following in secFlags because seal
1905			 * is a per tree connection (mount) not a per socket
1906			 * or per-smb connection option in the protocol
1907			 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1908			 */
1909			vol->seal = 1;
1910			break;
1911		case Opt_noac:
1912			pr_warn("Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1913			break;
1914		case Opt_fsc:
1915#ifndef CONFIG_CIFS_FSCACHE
1916			cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1917			goto cifs_parse_mount_err;
1918#endif
1919			vol->fsc = true;
1920			break;
1921		case Opt_mfsymlinks:
1922			vol->mfsymlinks = true;
1923			break;
1924		case Opt_multiuser:
1925			vol->multiuser = true;
1926			break;
1927		case Opt_sloppy:
1928			sloppy = true;
1929			break;
1930		case Opt_nosharesock:
1931			vol->nosharesock = true;
1932			break;
1933		case Opt_nopersistent:
1934			vol->nopersistent = true;
1935			if (vol->persistent) {
1936				cifs_dbg(VFS,
1937				  "persistenthandles mount options conflict\n");
1938				goto cifs_parse_mount_err;
1939			}
1940			break;
1941		case Opt_persistent:
1942			vol->persistent = true;
1943			if ((vol->nopersistent) || (vol->resilient)) {
1944				cifs_dbg(VFS,
1945				  "persistenthandles mount options conflict\n");
1946				goto cifs_parse_mount_err;
1947			}
1948			break;
1949		case Opt_resilient:
1950			vol->resilient = true;
1951			if (vol->persistent) {
1952				cifs_dbg(VFS,
1953				  "persistenthandles mount options conflict\n");
1954				goto cifs_parse_mount_err;
1955			}
1956			break;
1957		case Opt_noresilient:
1958			vol->resilient = false; /* already the default */
1959			break;
1960		case Opt_domainauto:
1961			vol->domainauto = true;
1962			break;
1963		case Opt_rdma:
1964			vol->rdma = true;
1965			break;
1966		case Opt_multichannel:
1967			vol->multichannel = true;
1968			/* if number of channels not specified, default to 2 */
1969			if (vol->max_channels < 2)
1970				vol->max_channels = 2;
1971			break;
1972		case Opt_nomultichannel:
1973			vol->multichannel = false;
1974			vol->max_channels = 1;
1975			break;
1976		case Opt_compress:
1977			vol->compression = UNKNOWN_TYPE;
1978			cifs_dbg(VFS,
1979				"SMB3 compression support is experimental\n");
1980			break;
1981
1982		/* Numeric Values */
1983		case Opt_backupuid:
1984			if (get_option_uid(args, &vol->backupuid)) {
1985				cifs_dbg(VFS, "%s: Invalid backupuid value\n",
1986					 __func__);
1987				goto cifs_parse_mount_err;
1988			}
1989			vol->backupuid_specified = true;
1990			break;
1991		case Opt_backupgid:
1992			if (get_option_gid(args, &vol->backupgid)) {
1993				cifs_dbg(VFS, "%s: Invalid backupgid value\n",
1994					 __func__);
1995				goto cifs_parse_mount_err;
1996			}
1997			vol->backupgid_specified = true;
1998			break;
1999		case Opt_uid:
2000			if (get_option_uid(args, &vol->linux_uid)) {
2001				cifs_dbg(VFS, "%s: Invalid uid value\n",
2002					 __func__);
2003				goto cifs_parse_mount_err;
2004			}
2005			uid_specified = true;
2006			break;
2007		case Opt_cruid:
2008			if (get_option_uid(args, &vol->cred_uid)) {
2009				cifs_dbg(VFS, "%s: Invalid cruid value\n",
2010					 __func__);
2011				goto cifs_parse_mount_err;
2012			}
2013			break;
2014		case Opt_gid:
2015			if (get_option_gid(args, &vol->linux_gid)) {
2016				cifs_dbg(VFS, "%s: Invalid gid value\n",
2017					 __func__);
2018				goto cifs_parse_mount_err;
2019			}
2020			gid_specified = true;
2021			break;
2022		case Opt_file_mode:
2023			if (get_option_ul(args, &option)) {
2024				cifs_dbg(VFS, "%s: Invalid file_mode value\n",
2025					 __func__);
2026				goto cifs_parse_mount_err;
2027			}
2028			vol->file_mode = option;
2029			break;
2030		case Opt_dirmode:
2031			if (get_option_ul(args, &option)) {
2032				cifs_dbg(VFS, "%s: Invalid dir_mode value\n",
2033					 __func__);
2034				goto cifs_parse_mount_err;
2035			}
2036			vol->dir_mode = option;
2037			break;
2038		case Opt_port:
2039			if (get_option_ul(args, &option) ||
2040			    option > USHRT_MAX) {
2041				cifs_dbg(VFS, "%s: Invalid port value\n",
2042					 __func__);
2043				goto cifs_parse_mount_err;
2044			}
2045			port = (unsigned short)option;
2046			break;
2047		case Opt_min_enc_offload:
2048			if (get_option_ul(args, &option)) {
2049				cifs_dbg(VFS, "Invalid minimum encrypted read offload size (esize)\n");
2050				goto cifs_parse_mount_err;
2051			}
2052			vol->min_offload = option;
2053			break;
2054		case Opt_blocksize:
2055			if (get_option_ul(args, &option)) {
2056				cifs_dbg(VFS, "%s: Invalid blocksize value\n",
2057					__func__);
2058				goto cifs_parse_mount_err;
2059			}
2060			/*
2061			 * inode blocksize realistically should never need to be
2062			 * less than 16K or greater than 16M and default is 1MB.
2063			 * Note that small inode block sizes (e.g. 64K) can lead
2064			 * to very poor performance of common tools like cp and scp
2065			 */
2066			if ((option < CIFS_MAX_MSGSIZE) ||
2067			   (option > (4 * SMB3_DEFAULT_IOSIZE))) {
2068				cifs_dbg(VFS, "%s: Invalid blocksize\n",
2069					__func__);
2070				goto cifs_parse_mount_err;
2071			}
2072			vol->bsize = option;
2073			break;
2074		case Opt_rsize:
2075			if (get_option_ul(args, &option)) {
2076				cifs_dbg(VFS, "%s: Invalid rsize value\n",
2077					 __func__);
2078				goto cifs_parse_mount_err;
2079			}
2080			vol->rsize = option;
2081			break;
2082		case Opt_wsize:
2083			if (get_option_ul(args, &option)) {
2084				cifs_dbg(VFS, "%s: Invalid wsize value\n",
2085					 __func__);
2086				goto cifs_parse_mount_err;
2087			}
2088			vol->wsize = option;
2089			break;
2090		case Opt_actimeo:
2091			if (get_option_ul(args, &option)) {
2092				cifs_dbg(VFS, "%s: Invalid actimeo value\n",
2093					 __func__);
2094				goto cifs_parse_mount_err;
2095			}
2096			vol->actimeo = HZ * option;
2097			if (vol->actimeo > CIFS_MAX_ACTIMEO) {
2098				cifs_dbg(VFS, "attribute cache timeout too large\n");
2099				goto cifs_parse_mount_err;
2100			}
2101			break;
2102		case Opt_handletimeout:
2103			if (get_option_ul(args, &option)) {
2104				cifs_dbg(VFS, "%s: Invalid handletimeout value\n",
2105					 __func__);
2106				goto cifs_parse_mount_err;
2107			}
2108			vol->handle_timeout = option;
2109			if (vol->handle_timeout > SMB3_MAX_HANDLE_TIMEOUT) {
2110				cifs_dbg(VFS, "Invalid handle cache timeout, longer than 16 minutes\n");
2111				goto cifs_parse_mount_err;
2112			}
2113			break;
2114		case Opt_echo_interval:
2115			if (get_option_ul(args, &option)) {
2116				cifs_dbg(VFS, "%s: Invalid echo interval value\n",
2117					 __func__);
2118				goto cifs_parse_mount_err;
2119			}
2120			vol->echo_interval = option;
2121			break;
2122		case Opt_snapshot:
2123			if (get_option_ul(args, &option)) {
2124				cifs_dbg(VFS, "%s: Invalid snapshot time\n",
2125					 __func__);
2126				goto cifs_parse_mount_err;
2127			}
2128			vol->snapshot_time = option;
2129			break;
2130		case Opt_max_credits:
2131			if (get_option_ul(args, &option) || (option < 20) ||
2132			    (option > 60000)) {
2133				cifs_dbg(VFS, "%s: Invalid max_credits value\n",
2134					 __func__);
2135				goto cifs_parse_mount_err;
2136			}
2137			vol->max_credits = option;
2138			break;
2139		case Opt_max_channels:
2140			if (get_option_ul(args, &option) || option < 1 ||
2141				option > CIFS_MAX_CHANNELS) {
2142				cifs_dbg(VFS, "%s: Invalid max_channels value, needs to be 1-%d\n",
2143					 __func__, CIFS_MAX_CHANNELS);
2144				goto cifs_parse_mount_err;
2145			}
2146			vol->max_channels = option;
2147			break;
2148
2149		/* String Arguments */
2150
2151		case Opt_blank_user:
2152			/* null user, ie. anonymous authentication */
2153			vol->nullauth = 1;
2154			vol->username = NULL;
2155			break;
2156		case Opt_user:
2157			string = match_strdup(args);
2158			if (string == NULL)
2159				goto out_nomem;
2160
2161			if (strnlen(string, CIFS_MAX_USERNAME_LEN) >
2162							CIFS_MAX_USERNAME_LEN) {
2163				pr_warn("username too long\n");
2164				goto cifs_parse_mount_err;
2165			}
2166
2167			kfree(vol->username);
2168			vol->username = kstrdup(string, GFP_KERNEL);
2169			if (!vol->username)
2170				goto cifs_parse_mount_err;
2171			break;
2172		case Opt_blank_pass:
2173			/* passwords have to be handled differently
2174			 * to allow the character used for deliminator
2175			 * to be passed within them
2176			 */
2177
2178			/*
2179			 * Check if this is a case where the  password
2180			 * starts with a delimiter
2181			 */
2182			tmp_end = strchr(data, '=');
2183			tmp_end++;
2184			if (!(tmp_end < end && tmp_end[1] == delim)) {
2185				/* No it is not. Set the password to NULL */
2186				kfree_sensitive(vol->password);
2187				vol->password = NULL;
2188				break;
2189			}
2190			fallthrough;	/* to Opt_pass below */
2191		case Opt_pass:
2192			/* Obtain the value string */
2193			value = strchr(data, '=');
2194			value++;
2195
2196			/* Set tmp_end to end of the string */
2197			tmp_end = (char *) value + strlen(value);
2198
2199			/* Check if following character is the deliminator
2200			 * If yes, we have encountered a double deliminator
2201			 * reset the NULL character to the deliminator
2202			 */
2203			if (tmp_end < end && tmp_end[1] == delim) {
2204				tmp_end[0] = delim;
2205
2206				/* Keep iterating until we get to a single
2207				 * deliminator OR the end
2208				 */
2209				while ((tmp_end = strchr(tmp_end, delim))
2210					!= NULL && (tmp_end[1] == delim)) {
2211						tmp_end = (char *) &tmp_end[2];
2212				}
2213
2214				/* Reset var options to point to next element */
2215				if (tmp_end) {
2216					tmp_end[0] = '\0';
2217					options = (char *) &tmp_end[1];
2218				} else
2219					/* Reached the end of the mount option
2220					 * string */
2221					options = end;
2222			}
2223
2224			kfree_sensitive(vol->password);
2225			/* Now build new password string */
2226			temp_len = strlen(value);
2227			vol->password = kzalloc(temp_len+1, GFP_KERNEL);
2228			if (vol->password == NULL) {
2229				pr_warn("no memory for password\n");
2230				goto cifs_parse_mount_err;
2231			}
2232
2233			for (i = 0, j = 0; i < temp_len; i++, j++) {
2234				vol->password[j] = value[i];
2235				if ((value[i] == delim) &&
2236				     value[i+1] == delim)
2237					/* skip the second deliminator */
2238					i++;
2239			}
2240			vol->password[j] = '\0';
2241			break;
2242		case Opt_blank_ip:
2243			/* FIXME: should this be an error instead? */
2244			got_ip = false;
2245			break;
2246		case Opt_ip:
2247			string = match_strdup(args);
2248			if (string == NULL)
2249				goto out_nomem;
2250
2251			if (!cifs_convert_address(dstaddr, string,
2252					strlen(string))) {
2253				pr_err("bad ip= option (%s)\n", string);
2254				goto cifs_parse_mount_err;
2255			}
2256			got_ip = true;
2257			break;
2258		case Opt_domain:
2259			string = match_strdup(args);
2260			if (string == NULL)
2261				goto out_nomem;
2262
2263			if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
2264					== CIFS_MAX_DOMAINNAME_LEN) {
2265				pr_warn("domain name too long\n");
2266				goto cifs_parse_mount_err;
2267			}
2268
2269			kfree(vol->domainname);
2270			vol->domainname = kstrdup(string, GFP_KERNEL);
2271			if (!vol->domainname) {
2272				pr_warn("no memory for domainname\n");
2273				goto cifs_parse_mount_err;
2274			}
2275			cifs_dbg(FYI, "Domain name set\n");
2276			break;
2277		case Opt_srcaddr:
2278			string = match_strdup(args);
2279			if (string == NULL)
2280				goto out_nomem;
2281
2282			if (!cifs_convert_address(
2283					(struct sockaddr *)&vol->srcaddr,
2284					string, strlen(string))) {
2285				pr_warn("Could not parse srcaddr: %s\n",
2286					string);
2287				goto cifs_parse_mount_err;
2288			}
2289			break;
2290		case Opt_iocharset:
2291			string = match_strdup(args);
2292			if (string == NULL)
2293				goto out_nomem;
2294
2295			if (strnlen(string, 1024) >= 65) {
2296				pr_warn("iocharset name too long\n");
2297				goto cifs_parse_mount_err;
2298			}
2299
2300			 if (strncasecmp(string, "default", 7) != 0) {
2301				kfree(vol->iocharset);
2302				vol->iocharset = kstrdup(string,
2303							 GFP_KERNEL);
2304				if (!vol->iocharset) {
2305					pr_warn("no memory for charset\n");
2306					goto cifs_parse_mount_err;
2307				}
2308			}
2309			/* if iocharset not set then load_nls_default
2310			 * is used by caller
2311			 */
2312			 cifs_dbg(FYI, "iocharset set to %s\n", string);
2313			break;
2314		case Opt_netbiosname:
2315			string = match_strdup(args);
2316			if (string == NULL)
2317				goto out_nomem;
2318
2319			memset(vol->source_rfc1001_name, 0x20,
2320				RFC1001_NAME_LEN);
2321			/*
2322			 * FIXME: are there cases in which a comma can
2323			 * be valid in workstation netbios name (and
2324			 * need special handling)?
2325			 */
2326			for (i = 0; i < RFC1001_NAME_LEN; i++) {
2327				/* don't ucase netbiosname for user */
2328				if (string[i] == 0)
2329					break;
2330				vol->source_rfc1001_name[i] = string[i];
2331			}
2332			/* The string has 16th byte zero still from
2333			 * set at top of the function
2334			 */
2335			if (i == RFC1001_NAME_LEN && string[i] != 0)
2336				pr_warn("netbiosname longer than 15 truncated\n");
2337			break;
2338		case Opt_servern:
2339			/* servernetbiosname specified override *SMBSERVER */
2340			string = match_strdup(args);
2341			if (string == NULL)
2342				goto out_nomem;
2343
2344			/* last byte, type, is 0x20 for servr type */
2345			memset(vol->target_rfc1001_name, 0x20,
2346				RFC1001_NAME_LEN_WITH_NULL);
2347
2348			/* BB are there cases in which a comma can be
2349			   valid in this workstation netbios name
2350			   (and need special handling)? */
2351
2352			/* user or mount helper must uppercase the
2353			   netbios name */
2354			for (i = 0; i < 15; i++) {
2355				if (string[i] == 0)
2356					break;
2357				vol->target_rfc1001_name[i] = string[i];
2358			}
2359			/* The string has 16th byte zero still from
2360			   set at top of the function  */
2361			if (i == RFC1001_NAME_LEN && string[i] != 0)
2362				pr_warn("server netbiosname longer than 15 truncated\n");
2363			break;
2364		case Opt_ver:
2365			/* version of mount userspace tools, not dialect */
2366			string = match_strdup(args);
2367			if (string == NULL)
2368				goto out_nomem;
2369
2370			/* If interface changes in mount.cifs bump to new ver */
2371			if (strncasecmp(string, "1", 1) == 0) {
2372				if (strlen(string) > 1) {
2373					pr_warn("Bad mount helper ver=%s. Did you want SMB1 (CIFS) dialect and mean to type vers=1.0 instead?\n",
2374						string);
2375					goto cifs_parse_mount_err;
2376				}
2377				/* This is the default */
2378				break;
2379			}
2380			/* For all other value, error */
2381			pr_warn("Invalid mount helper version specified\n");
2382			goto cifs_parse_mount_err;
2383		case Opt_vers:
2384			/* protocol version (dialect) */
2385			string = match_strdup(args);
2386			if (string == NULL)
2387				goto out_nomem;
2388
2389			if (cifs_parse_smb_version(string, vol, is_smb3) != 0)
2390				goto cifs_parse_mount_err;
2391			got_version = true;
2392			break;
2393		case Opt_sec:
2394			string = match_strdup(args);
2395			if (string == NULL)
2396				goto out_nomem;
2397
2398			if (cifs_parse_security_flavors(string, vol) != 0)
2399				goto cifs_parse_mount_err;
2400			break;
2401		case Opt_cache:
2402			string = match_strdup(args);
2403			if (string == NULL)
2404				goto out_nomem;
2405
2406			if (cifs_parse_cache_flavor(string, vol) != 0)
2407				goto cifs_parse_mount_err;
2408			break;
2409		default:
2410			/*
2411			 * An option we don't recognize. Save it off for later
2412			 * if we haven't already found one
2413			 */
2414			if (!invalid)
2415				invalid = data;
2416			break;
2417		}
2418		/* Free up any allocated string */
2419		kfree(string);
2420		string = NULL;
2421	}
2422
2423	if (!sloppy && invalid) {
2424		pr_err("Unknown mount option \"%s\"\n", invalid);
2425		goto cifs_parse_mount_err;
2426	}
2427
2428	if (vol->rdma && vol->vals->protocol_id < SMB30_PROT_ID) {
2429		cifs_dbg(VFS, "SMB Direct requires Version >=3.0\n");
2430		goto cifs_parse_mount_err;
2431	}
2432
2433#ifndef CONFIG_KEYS
2434	/* Muliuser mounts require CONFIG_KEYS support */
2435	if (vol->multiuser) {
2436		cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
2437		goto cifs_parse_mount_err;
2438	}
2439#endif
2440	if (!vol->UNC) {
2441		cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
2442		goto cifs_parse_mount_err;
2443	}
2444
2445	/* make sure UNC has a share name */
2446	if (!strchr(vol->UNC + 3, '\\')) {
2447		cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
2448		goto cifs_parse_mount_err;
2449	}
2450
2451	if (!got_ip) {
2452		int len;
2453		const char *slash;
2454
2455		/* No ip= option specified? Try to get it from UNC */
2456		/* Use the address part of the UNC. */
2457		slash = strchr(&vol->UNC[2], '\\');
2458		len = slash - &vol->UNC[2];
2459		if (!cifs_convert_address(dstaddr, &vol->UNC[2], len)) {
2460			pr_err("Unable to determine destination address\n");
2461			goto cifs_parse_mount_err;
2462		}
2463	}
2464
2465	/* set the port that we got earlier */
2466	cifs_set_port(dstaddr, port);
2467
2468	if (uid_specified)
2469		vol->override_uid = override_uid;
2470	else if (override_uid == 1)
2471		pr_notice("ignoring forceuid mount option specified with no uid= option\n");
2472
2473	if (gid_specified)
2474		vol->override_gid = override_gid;
2475	else if (override_gid == 1)
2476		pr_notice("ignoring forcegid mount option specified with no gid= option\n");
2477
2478	if (got_version == false)
2479		pr_warn_once("No dialect specified on mount. Default has changed to a more secure dialect, SMB2.1 or later (e.g. SMB3.1.1), from CIFS (SMB1). To use the less secure SMB1 dialect to access old servers which do not support SMB3.1.1 (or even SMB3 or SMB2.1) specify vers=1.0 on mount.\n");
2480
2481	kfree(mountdata_copy);
2482	return 0;
2483
2484out_nomem:
2485	pr_warn("Could not allocate temporary buffer\n");
2486cifs_parse_mount_err:
2487	kfree(string);
2488	kfree(mountdata_copy);
2489	return 1;
2490}
2491
2492/** Returns true if srcaddr isn't specified and rhs isn't
2493 * specified, or if srcaddr is specified and
2494 * matches the IP address of the rhs argument.
2495 */
2496bool
2497cifs_match_ipaddr(struct sockaddr *srcaddr, struct sockaddr *rhs)
2498{
2499	switch (srcaddr->sa_family) {
2500	case AF_UNSPEC:
2501		return (rhs->sa_family == AF_UNSPEC);
2502	case AF_INET: {
2503		struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
2504		struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
2505		return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
2506	}
2507	case AF_INET6: {
2508		struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
2509		struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
2510		return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
2511	}
2512	default:
2513		WARN_ON(1);
2514		return false; /* don't expect to be here */
2515	}
2516}
2517
2518/*
2519 * If no port is specified in addr structure, we try to match with 445 port
2520 * and if it fails - with 139 ports. It should be called only if address
2521 * families of server and addr are equal.
2522 */
2523static bool
2524match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
2525{
2526	__be16 port, *sport;
2527
2528	/* SMBDirect manages its own ports, don't match it here */
2529	if (server->rdma)
2530		return true;
2531
2532	switch (addr->sa_family) {
2533	case AF_INET:
2534		sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
2535		port = ((struct sockaddr_in *) addr)->sin_port;
2536		break;
2537	case AF_INET6:
2538		sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
2539		port = ((struct sockaddr_in6 *) addr)->sin6_port;
2540		break;
2541	default:
2542		WARN_ON(1);
2543		return false;
2544	}
2545
2546	if (!port) {
2547		port = htons(CIFS_PORT);
2548		if (port == *sport)
2549			return true;
2550
2551		port = htons(RFC1001_PORT);
2552	}
2553
2554	return port == *sport;
2555}
2556
2557static bool
2558match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
2559	      struct sockaddr *srcaddr)
2560{
2561	switch (addr->sa_family) {
2562	case AF_INET: {
2563		struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
2564		struct sockaddr_in *srv_addr4 =
2565					(struct sockaddr_in *)&server->dstaddr;
2566
2567		if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
2568			return false;
2569		break;
2570	}
2571	case AF_INET6: {
2572		struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
2573		struct sockaddr_in6 *srv_addr6 =
2574					(struct sockaddr_in6 *)&server->dstaddr;
2575
2576		if (!ipv6_addr_equal(&addr6->sin6_addr,
2577				     &srv_addr6->sin6_addr))
2578			return false;
2579		if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
2580			return false;
2581		break;
2582	}
2583	default:
2584		WARN_ON(1);
2585		return false; /* don't expect to be here */
2586	}
2587
2588	if (!cifs_match_ipaddr(srcaddr, (struct sockaddr *)&server->srcaddr))
2589		return false;
2590
2591	return true;
2592}
2593
2594static bool
2595match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2596{
2597	/*
2598	 * The select_sectype function should either return the vol->sectype
2599	 * that was specified, or "Unspecified" if that sectype was not
2600	 * compatible with the given NEGOTIATE request.
2601	 */
2602	if (server->ops->select_sectype(server, vol->sectype)
2603	     == Unspecified)
2604		return false;
2605
2606	/*
2607	 * Now check if signing mode is acceptable. No need to check
2608	 * global_secflags at this point since if MUST_SIGN is set then
2609	 * the server->sign had better be too.
2610	 */
2611	if (vol->sign && !server->sign)
2612		return false;
2613
2614	return true;
2615}
2616
2617static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2618{
2619	struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2620
2621	if (vol->nosharesock)
 
 
 
 
2622		return 0;
2623
2624	/* If multidialect negotiation see if existing sessions match one */
2625	if (strcmp(vol->vals->version_string, SMB3ANY_VERSION_STRING) == 0) {
2626		if (server->vals->protocol_id < SMB30_PROT_ID)
2627			return 0;
2628	} else if (strcmp(vol->vals->version_string,
2629		   SMBDEFAULT_VERSION_STRING) == 0) {
2630		if (server->vals->protocol_id < SMB21_PROT_ID)
2631			return 0;
2632	} else if ((server->vals != vol->vals) || (server->ops != vol->ops))
2633		return 0;
2634
2635	if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2636		return 0;
2637
2638	if (!match_address(server, addr,
2639			   (struct sockaddr *)&vol->srcaddr))
2640		return 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2641
2642	if (!match_port(server, addr))
2643		return 0;
2644
2645	if (!match_security(server, vol))
2646		return 0;
2647
2648	if (server->echo_interval != vol->echo_interval * HZ)
2649		return 0;
2650
2651	if (server->rdma != vol->rdma)
2652		return 0;
2653
2654	if (server->ignore_signature != vol->ignore_signature)
2655		return 0;
2656
2657	if (server->min_offload != vol->min_offload)
2658		return 0;
2659
2660	return 1;
2661}
2662
2663struct TCP_Server_Info *
2664cifs_find_tcp_session(struct smb_vol *vol)
2665{
2666	struct TCP_Server_Info *server;
2667
2668	spin_lock(&cifs_tcp_ses_lock);
2669	list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
 
2670		/*
2671		 * Skip ses channels since they're only handled in lower layers
2672		 * (e.g. cifs_send_recv).
2673		 */
2674		if (server->is_channel || !match_server(server, vol))
 
2675			continue;
 
 
2676
2677		++server->srv_count;
2678		spin_unlock(&cifs_tcp_ses_lock);
2679		cifs_dbg(FYI, "Existing tcp session with server found\n");
2680		return server;
2681	}
2682	spin_unlock(&cifs_tcp_ses_lock);
2683	return NULL;
2684}
2685
2686void
2687cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
2688{
2689	struct task_struct *task;
2690
2691	spin_lock(&cifs_tcp_ses_lock);
2692	if (--server->srv_count > 0) {
2693		spin_unlock(&cifs_tcp_ses_lock);
2694		return;
2695	}
2696
 
 
 
2697	put_net(cifs_net_ns(server));
2698
2699	list_del_init(&server->tcp_ses_list);
2700	spin_unlock(&cifs_tcp_ses_lock);
2701
 
 
 
 
2702	cancel_delayed_work_sync(&server->echo);
 
2703
2704	if (from_reconnect)
2705		/*
2706		 * Avoid deadlock here: reconnect work calls
2707		 * cifs_put_tcp_session() at its end. Need to be sure
2708		 * that reconnect work does nothing with server pointer after
2709		 * that step.
2710		 */
2711		cancel_delayed_work(&server->reconnect);
2712	else
2713		cancel_delayed_work_sync(&server->reconnect);
2714
2715	spin_lock(&GlobalMid_Lock);
2716	server->tcpStatus = CifsExiting;
2717	spin_unlock(&GlobalMid_Lock);
2718
2719	cifs_crypto_secmech_release(server);
2720	cifs_fscache_release_client_cookie(server);
2721
2722	kfree(server->session_key.response);
2723	server->session_key.response = NULL;
2724	server->session_key.len = 0;
 
 
2725
2726	task = xchg(&server->tsk, NULL);
2727	if (task)
2728		send_sig(SIGKILL, task, 1);
2729}
2730
2731struct TCP_Server_Info *
2732cifs_get_tcp_session(struct smb_vol *volume_info)
 
2733{
2734	struct TCP_Server_Info *tcp_ses = NULL;
2735	int rc;
2736
2737	cifs_dbg(FYI, "UNC: %s\n", volume_info->UNC);
2738
2739	/* see if we already have a matching tcp_ses */
2740	tcp_ses = cifs_find_tcp_session(volume_info);
2741	if (tcp_ses)
2742		return tcp_ses;
2743
2744	tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2745	if (!tcp_ses) {
2746		rc = -ENOMEM;
2747		goto out_err;
2748	}
2749
2750	tcp_ses->ops = volume_info->ops;
2751	tcp_ses->vals = volume_info->vals;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2752	cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2753	tcp_ses->hostname = extract_hostname(volume_info->UNC);
2754	if (IS_ERR(tcp_ses->hostname)) {
2755		rc = PTR_ERR(tcp_ses->hostname);
2756		goto out_err_crypto_release;
2757	}
2758
2759	tcp_ses->noblockcnt = volume_info->rootfs;
2760	tcp_ses->noblocksnd = volume_info->noblocksnd || volume_info->rootfs;
2761	tcp_ses->noautotune = volume_info->noautotune;
2762	tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2763	tcp_ses->rdma = volume_info->rdma;
 
2764	tcp_ses->in_flight = 0;
2765	tcp_ses->max_in_flight = 0;
2766	tcp_ses->credits = 1;
 
 
 
 
 
 
2767	init_waitqueue_head(&tcp_ses->response_q);
2768	init_waitqueue_head(&tcp_ses->request_q);
2769	INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2770	mutex_init(&tcp_ses->srv_mutex);
2771	memcpy(tcp_ses->workstation_RFC1001_name,
2772		volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2773	memcpy(tcp_ses->server_RFC1001_name,
2774		volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2775	tcp_ses->session_estab = false;
2776	tcp_ses->sequence_number = 0;
2777	tcp_ses->reconnect_instance = 1;
2778	tcp_ses->lstrp = jiffies;
2779	tcp_ses->compress_algorithm = cpu_to_le16(volume_info->compression);
2780	spin_lock_init(&tcp_ses->req_lock);
 
 
2781	INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2782	INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2783	INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
 
2784	INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
2785	mutex_init(&tcp_ses->reconnect_mutex);
2786	memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
 
 
 
2787	       sizeof(tcp_ses->srcaddr));
2788	memcpy(&tcp_ses->dstaddr, &volume_info->dstaddr,
2789		sizeof(tcp_ses->dstaddr));
2790	if (volume_info->use_client_guid)
2791		memcpy(tcp_ses->client_guid, volume_info->client_guid,
2792		       SMB2_CLIENT_GUID_SIZE);
2793	else
2794		generate_random_uuid(tcp_ses->client_guid);
2795	/*
2796	 * at this point we are the only ones with the pointer
2797	 * to the struct since the kernel thread not created yet
2798	 * no need to spinlock this init of tcpStatus or srv_count
2799	 */
2800	tcp_ses->tcpStatus = CifsNew;
2801	++tcp_ses->srv_count;
2802
2803	if (volume_info->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
2804		volume_info->echo_interval <= SMB_ECHO_INTERVAL_MAX)
2805		tcp_ses->echo_interval = volume_info->echo_interval * HZ;
2806	else
2807		tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
2808	if (tcp_ses->rdma) {
2809#ifndef CONFIG_CIFS_SMB_DIRECT
2810		cifs_dbg(VFS, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
2811		rc = -ENOENT;
2812		goto out_err_crypto_release;
2813#endif
2814		tcp_ses->smbd_conn = smbd_get_connection(
2815			tcp_ses, (struct sockaddr *)&volume_info->dstaddr);
2816		if (tcp_ses->smbd_conn) {
2817			cifs_dbg(VFS, "RDMA transport established\n");
2818			rc = 0;
2819			goto smbd_connected;
2820		} else {
2821			rc = -ENOENT;
2822			goto out_err_crypto_release;
2823		}
2824	}
2825	rc = ip_connect(tcp_ses);
2826	if (rc < 0) {
2827		cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
2828		goto out_err_crypto_release;
2829	}
2830smbd_connected:
2831	/*
2832	 * since we're in a cifs function already, we know that
2833	 * this will succeed. No need for try_module_get().
2834	 */
2835	__module_get(THIS_MODULE);
2836	tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2837				  tcp_ses, "cifsd");
2838	if (IS_ERR(tcp_ses->tsk)) {
2839		rc = PTR_ERR(tcp_ses->tsk);
2840		cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
2841		module_put(THIS_MODULE);
2842		goto out_err_crypto_release;
2843	}
2844	tcp_ses->min_offload = volume_info->min_offload;
 
 
 
 
 
 
2845	tcp_ses->tcpStatus = CifsNeedNegotiate;
 
 
 
 
 
 
2846
2847	tcp_ses->nr_targets = 1;
2848	tcp_ses->ignore_signature = volume_info->ignore_signature;
2849	/* thread spawned, put it on the list */
2850	spin_lock(&cifs_tcp_ses_lock);
2851	list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2852	spin_unlock(&cifs_tcp_ses_lock);
2853
2854	cifs_fscache_get_client_cookie(tcp_ses);
2855
2856	/* queue echo request delayed work */
2857	queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
2858
 
 
 
 
 
 
2859	return tcp_ses;
2860
2861out_err_crypto_release:
2862	cifs_crypto_secmech_release(tcp_ses);
2863
2864	put_net(cifs_net_ns(tcp_ses));
2865
2866out_err:
2867	if (tcp_ses) {
2868		if (!IS_ERR(tcp_ses->hostname))
2869			kfree(tcp_ses->hostname);
 
 
2870		if (tcp_ses->ssocket)
2871			sock_release(tcp_ses->ssocket);
2872		kfree(tcp_ses);
2873	}
2874	return ERR_PTR(rc);
2875}
2876
2877static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
 
2878{
2879	if (vol->sectype != Unspecified &&
2880	    vol->sectype != ses->sectype)
2881		return 0;
2882
2883	/*
2884	 * If an existing session is limited to less channels than
2885	 * requested, it should not be reused
2886	 */
2887	if (ses->chan_max < vol->max_channels)
 
 
2888		return 0;
 
 
2889
2890	switch (ses->sectype) {
2891	case Kerberos:
2892		if (!uid_eq(vol->cred_uid, ses->cred_uid))
2893			return 0;
2894		break;
2895	default:
2896		/* NULL username means anonymous session */
2897		if (ses->user_name == NULL) {
2898			if (!vol->nullauth)
2899				return 0;
2900			break;
2901		}
2902
2903		/* anything else takes username/password */
2904		if (strncmp(ses->user_name,
2905			    vol->username ? vol->username : "",
2906			    CIFS_MAX_USERNAME_LEN))
2907			return 0;
2908		if ((vol->username && strlen(vol->username) != 0) &&
2909		    ses->password != NULL &&
2910		    strncmp(ses->password,
2911			    vol->password ? vol->password : "",
2912			    CIFS_MAX_PASSWORD_LEN))
2913			return 0;
2914	}
2915	return 1;
2916}
2917
2918/**
2919 * cifs_setup_ipc - helper to setup the IPC tcon for the session
 
 
 
2920 *
2921 * A new IPC connection is made and stored in the session
2922 * tcon_ipc. The IPC tcon has the same lifetime as the session.
2923 */
2924static int
2925cifs_setup_ipc(struct cifs_ses *ses, struct smb_vol *volume_info)
2926{
2927	int rc = 0, xid;
2928	struct cifs_tcon *tcon;
2929	struct nls_table *nls_codepage;
2930	char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0};
2931	bool seal = false;
2932	struct TCP_Server_Info *server = ses->server;
2933
2934	/*
2935	 * If the mount request that resulted in the creation of the
2936	 * session requires encryption, force IPC to be encrypted too.
2937	 */
2938	if (volume_info->seal) {
2939		if (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
2940			seal = true;
2941		else {
2942			cifs_server_dbg(VFS,
2943				 "IPC: server doesn't support encryption\n");
2944			return -EOPNOTSUPP;
2945		}
2946	}
2947
2948	tcon = tconInfoAlloc();
2949	if (tcon == NULL)
2950		return -ENOMEM;
2951
2952	scnprintf(unc, sizeof(unc), "\\\\%s\\IPC$", server->hostname);
2953
2954	/* cannot fail */
2955	nls_codepage = load_nls_default();
2956
2957	xid = get_xid();
2958	tcon->ses = ses;
2959	tcon->ipc = true;
2960	tcon->seal = seal;
2961	rc = server->ops->tree_connect(xid, ses, unc, tcon, nls_codepage);
2962	free_xid(xid);
2963
2964	if (rc) {
2965		cifs_server_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
2966		tconInfoFree(tcon);
2967		goto out;
2968	}
2969
2970	cifs_dbg(FYI, "IPC tcon rc = %d ipc tid = %d\n", rc, tcon->tid);
2971
 
 
 
2972	ses->tcon_ipc = tcon;
2973out:
2974	unload_nls(nls_codepage);
2975	return rc;
2976}
2977
2978/**
2979 * cifs_free_ipc - helper to release the session IPC tcon
 
 
 
 
 
 
2980 *
2981 * Needs to be called everytime a session is destroyed
 
2982 */
2983static int
2984cifs_free_ipc(struct cifs_ses *ses)
2985{
2986	int rc = 0, xid;
2987	struct cifs_tcon *tcon = ses->tcon_ipc;
2988
2989	if (tcon == NULL)
2990		return 0;
2991
2992	if (ses->server->ops->tree_disconnect) {
2993		xid = get_xid();
2994		rc = ses->server->ops->tree_disconnect(xid, tcon);
2995		free_xid(xid);
2996	}
2997
2998	if (rc)
2999		cifs_dbg(FYI, "failed to disconnect IPC tcon (rc=%d)\n", rc);
3000
3001	tconInfoFree(tcon);
3002	ses->tcon_ipc = NULL;
3003	return rc;
3004}
3005
3006static struct cifs_ses *
3007cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
3008{
3009	struct cifs_ses *ses;
3010
3011	spin_lock(&cifs_tcp_ses_lock);
3012	list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
3013		if (ses->status == CifsExiting)
 
 
3014			continue;
3015		if (!match_session(ses, vol))
 
 
3016			continue;
 
 
 
3017		++ses->ses_count;
3018		spin_unlock(&cifs_tcp_ses_lock);
3019		return ses;
3020	}
3021	spin_unlock(&cifs_tcp_ses_lock);
3022	return NULL;
3023}
3024
3025void cifs_put_smb_ses(struct cifs_ses *ses)
3026{
3027	unsigned int rc, xid;
 
3028	struct TCP_Server_Info *server = ses->server;
3029
 
 
 
 
 
 
 
3030	cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
 
 
3031
3032	spin_lock(&cifs_tcp_ses_lock);
3033	if (ses->status == CifsExiting) {
3034		spin_unlock(&cifs_tcp_ses_lock);
3035		return;
3036	}
3037	if (--ses->ses_count > 0) {
3038		spin_unlock(&cifs_tcp_ses_lock);
3039		return;
3040	}
3041	if (ses->status == CifsGood)
3042		ses->status = CifsExiting;
3043	spin_unlock(&cifs_tcp_ses_lock);
3044
 
 
 
 
 
 
3045	cifs_free_ipc(ses);
3046
3047	if (ses->status == CifsExiting && server->ops->logoff) {
3048		xid = get_xid();
3049		rc = server->ops->logoff(xid, ses);
3050		if (rc)
3051			cifs_server_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
3052				__func__, rc);
3053		_free_xid(xid);
3054	}
3055
3056	spin_lock(&cifs_tcp_ses_lock);
3057	list_del_init(&ses->smb_ses_list);
3058	spin_unlock(&cifs_tcp_ses_lock);
3059
 
 
3060	/* close any extra channels */
3061	if (ses->chan_count > 1) {
3062		int i;
3063
3064		for (i = 1; i < ses->chan_count; i++)
 
 
 
 
3065			cifs_put_tcp_session(ses->chans[i].server, 0);
 
 
3066	}
3067
3068	sesInfoFree(ses);
3069	cifs_put_tcp_session(server, 0);
3070}
3071
3072#ifdef CONFIG_KEYS
3073
3074/* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
3075#define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
3076
3077/* Populate username and pw fields from keyring if possible */
3078static int
3079cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
3080{
3081	int rc = 0;
3082	int is_domain = 0;
3083	const char *delim, *payload;
3084	char *desc;
3085	ssize_t len;
3086	struct key *key;
3087	struct TCP_Server_Info *server = ses->server;
3088	struct sockaddr_in *sa;
3089	struct sockaddr_in6 *sa6;
3090	const struct user_key_payload *upayload;
3091
3092	desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
3093	if (!desc)
3094		return -ENOMEM;
3095
3096	/* try to find an address key first */
3097	switch (server->dstaddr.ss_family) {
3098	case AF_INET:
3099		sa = (struct sockaddr_in *)&server->dstaddr;
3100		sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
3101		break;
3102	case AF_INET6:
3103		sa6 = (struct sockaddr_in6 *)&server->dstaddr;
3104		sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
3105		break;
3106	default:
3107		cifs_dbg(FYI, "Bad ss_family (%hu)\n",
3108			 server->dstaddr.ss_family);
3109		rc = -EINVAL;
3110		goto out_err;
3111	}
3112
3113	cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
3114	key = request_key(&key_type_logon, desc, "");
3115	if (IS_ERR(key)) {
3116		if (!ses->domainName) {
3117			cifs_dbg(FYI, "domainName is NULL\n");
3118			rc = PTR_ERR(key);
3119			goto out_err;
3120		}
3121
3122		/* didn't work, try to find a domain key */
3123		sprintf(desc, "cifs:d:%s", ses->domainName);
3124		cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
3125		key = request_key(&key_type_logon, desc, "");
3126		if (IS_ERR(key)) {
3127			rc = PTR_ERR(key);
3128			goto out_err;
3129		}
3130		is_domain = 1;
3131	}
3132
3133	down_read(&key->sem);
3134	upayload = user_key_payload_locked(key);
3135	if (IS_ERR_OR_NULL(upayload)) {
3136		rc = upayload ? PTR_ERR(upayload) : -EINVAL;
3137		goto out_key_put;
3138	}
3139
3140	/* find first : in payload */
3141	payload = upayload->data;
3142	delim = strnchr(payload, upayload->datalen, ':');
3143	cifs_dbg(FYI, "payload=%s\n", payload);
3144	if (!delim) {
3145		cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
3146			 upayload->datalen);
3147		rc = -EINVAL;
3148		goto out_key_put;
3149	}
3150
3151	len = delim - payload;
3152	if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
3153		cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
3154			 len);
3155		rc = -EINVAL;
3156		goto out_key_put;
3157	}
3158
3159	vol->username = kstrndup(payload, len, GFP_KERNEL);
3160	if (!vol->username) {
3161		cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
3162			 len);
3163		rc = -ENOMEM;
3164		goto out_key_put;
3165	}
3166	cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
3167
3168	len = key->datalen - (len + 1);
3169	if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
3170		cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
3171		rc = -EINVAL;
3172		kfree(vol->username);
3173		vol->username = NULL;
3174		goto out_key_put;
3175	}
3176
3177	++delim;
3178	vol->password = kstrndup(delim, len, GFP_KERNEL);
3179	if (!vol->password) {
3180		cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
3181			 len);
3182		rc = -ENOMEM;
3183		kfree(vol->username);
3184		vol->username = NULL;
3185		goto out_key_put;
3186	}
3187
3188	/*
3189	 * If we have a domain key then we must set the domainName in the
3190	 * for the request.
3191	 */
3192	if (is_domain && ses->domainName) {
3193		vol->domainname = kstrndup(ses->domainName,
3194					   strlen(ses->domainName),
3195					   GFP_KERNEL);
3196		if (!vol->domainname) {
3197			cifs_dbg(FYI, "Unable to allocate %zd bytes for domain\n",
3198				 len);
3199			rc = -ENOMEM;
3200			kfree(vol->username);
3201			vol->username = NULL;
3202			kfree_sensitive(vol->password);
3203			vol->password = NULL;
3204			goto out_key_put;
3205		}
3206	}
3207
 
 
3208out_key_put:
3209	up_read(&key->sem);
3210	key_put(key);
3211out_err:
3212	kfree(desc);
3213	cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
3214	return rc;
3215}
3216#else /* ! CONFIG_KEYS */
3217static inline int
3218cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
3219		   struct cifs_ses *ses __attribute__((unused)))
3220{
3221	return -ENOSYS;
3222}
3223#endif /* CONFIG_KEYS */
3224
3225/**
3226 * cifs_get_smb_ses - get a session matching @volume_info data from @server
 
 
3227 *
3228 * This function assumes it is being called from cifs_mount() where we
3229 * already got a server reference (server refcount +1). See
3230 * cifs_get_tcon() for refcount explanations.
3231 */
3232struct cifs_ses *
3233cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
3234{
3235	int rc = -ENOMEM;
3236	unsigned int xid;
3237	struct cifs_ses *ses;
3238	struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3239	struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3240
3241	xid = get_xid();
3242
3243	ses = cifs_find_smb_ses(server, volume_info);
3244	if (ses) {
3245		cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
3246			 ses->status);
3247
3248		mutex_lock(&ses->session_mutex);
3249		rc = cifs_negotiate_protocol(xid, ses);
3250		if (rc) {
3251			mutex_unlock(&ses->session_mutex);
3252			/* problem -- put our ses reference */
3253			cifs_put_smb_ses(ses);
3254			free_xid(xid);
3255			return ERR_PTR(rc);
3256		}
3257		if (ses->need_reconnect) {
3258			cifs_dbg(FYI, "Session needs reconnect\n");
3259			rc = cifs_setup_session(xid, ses,
3260						volume_info->local_nls);
 
 
 
 
 
 
 
 
 
 
 
3261			if (rc) {
3262				mutex_unlock(&ses->session_mutex);
3263				/* problem -- put our reference */
3264				cifs_put_smb_ses(ses);
3265				free_xid(xid);
3266				return ERR_PTR(rc);
3267			}
 
 
 
3268		}
3269		mutex_unlock(&ses->session_mutex);
3270
3271		/* existing SMB ses has a server reference already */
3272		cifs_put_tcp_session(server, 0);
3273		free_xid(xid);
3274		return ses;
3275	}
3276
 
 
3277	cifs_dbg(FYI, "Existing smb sess not found\n");
3278	ses = sesInfoAlloc();
3279	if (ses == NULL)
3280		goto get_ses_fail;
3281
3282	/* new SMB session uses our server ref */
3283	ses->server = server;
3284	if (server->dstaddr.ss_family == AF_INET6)
3285		sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
3286	else
3287		sprintf(ses->serverName, "%pI4", &addr->sin_addr);
3288
3289	if (volume_info->username) {
3290		ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
3291		if (!ses->user_name)
3292			goto get_ses_fail;
3293	}
3294
3295	/* volume_info->password freed at unmount */
3296	if (volume_info->password) {
3297		ses->password = kstrdup(volume_info->password, GFP_KERNEL);
3298		if (!ses->password)
3299			goto get_ses_fail;
3300	}
3301	if (volume_info->domainname) {
3302		ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
3303		if (!ses->domainName)
3304			goto get_ses_fail;
3305	}
3306	if (volume_info->domainauto)
3307		ses->domainAuto = volume_info->domainauto;
3308	ses->cred_uid = volume_info->cred_uid;
3309	ses->linux_uid = volume_info->linux_uid;
3310
3311	ses->sectype = volume_info->sectype;
3312	ses->sign = volume_info->sign;
3313	mutex_lock(&ses->session_mutex);
 
 
 
 
 
 
3314
3315	/* add server as first channel */
 
3316	ses->chans[0].server = server;
3317	ses->chan_count = 1;
3318	ses->chan_max = volume_info->multichannel ? volume_info->max_channels:1;
 
 
3319
3320	rc = cifs_negotiate_protocol(xid, ses);
 
3321	if (!rc)
3322		rc = cifs_setup_session(xid, ses, volume_info->local_nls);
 
3323
3324	/* each channel uses a different signing key */
 
3325	memcpy(ses->chans[0].signkey, ses->smb3signingkey,
3326	       sizeof(ses->smb3signingkey));
 
3327
3328	mutex_unlock(&ses->session_mutex);
3329	if (rc)
3330		goto get_ses_fail;
3331
3332	/* success, put it on the list and add it as first channel */
 
 
 
 
3333	spin_lock(&cifs_tcp_ses_lock);
3334	list_add(&ses->smb_ses_list, &server->smb_ses_list);
3335	spin_unlock(&cifs_tcp_ses_lock);
3336
 
 
3337	free_xid(xid);
3338
3339	cifs_setup_ipc(ses, volume_info);
3340
3341	return ses;
3342
3343get_ses_fail:
3344	sesInfoFree(ses);
3345	free_xid(xid);
3346	return ERR_PTR(rc);
3347}
3348
3349static int match_tcon(struct cifs_tcon *tcon, struct smb_vol *volume_info)
 
3350{
3351	if (tcon->tidStatus == CifsExiting)
3352		return 0;
3353	if (strncmp(tcon->treeName, volume_info->UNC, MAX_TREE_SIZE))
 
3354		return 0;
3355	if (tcon->seal != volume_info->seal)
3356		return 0;
3357	if (tcon->snapshot_time != volume_info->snapshot_time)
3358		return 0;
3359	if (tcon->handle_timeout != volume_info->handle_timeout)
3360		return 0;
3361	if (tcon->no_lease != volume_info->no_lease)
3362		return 0;
3363	if (tcon->nodelete != volume_info->nodelete)
3364		return 0;
3365	return 1;
3366}
3367
3368static struct cifs_tcon *
3369cifs_find_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3370{
3371	struct list_head *tmp;
3372	struct cifs_tcon *tcon;
3373
3374	spin_lock(&cifs_tcp_ses_lock);
3375	list_for_each(tmp, &ses->tcon_list) {
3376		tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
3377#ifdef CONFIG_CIFS_DFS_UPCALL
3378		if (tcon->dfs_path)
3379			continue;
3380#endif
3381		if (!match_tcon(tcon, volume_info))
3382			continue;
 
3383		++tcon->tc_count;
 
3384		spin_unlock(&cifs_tcp_ses_lock);
3385		return tcon;
3386	}
3387	spin_unlock(&cifs_tcp_ses_lock);
3388	return NULL;
3389}
3390
3391void
3392cifs_put_tcon(struct cifs_tcon *tcon)
3393{
3394	unsigned int xid;
3395	struct cifs_ses *ses;
3396
3397	/*
3398	 * IPC tcon share the lifetime of their session and are
3399	 * destroyed in the session put function
3400	 */
3401	if (tcon == NULL || tcon->ipc)
3402		return;
3403
3404	ses = tcon->ses;
3405	cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
3406	spin_lock(&cifs_tcp_ses_lock);
 
3407	if (--tcon->tc_count > 0) {
 
3408		spin_unlock(&cifs_tcp_ses_lock);
3409		return;
3410	}
3411
 
 
 
3412	list_del_init(&tcon->tcon_list);
 
3413	spin_unlock(&cifs_tcp_ses_lock);
3414
 
 
 
 
 
 
 
 
 
 
 
 
 
3415	xid = get_xid();
3416	if (ses->server->ops->tree_disconnect)
3417		ses->server->ops->tree_disconnect(xid, tcon);
3418	_free_xid(xid);
3419
3420	cifs_fscache_release_super_cookie(tcon);
3421	tconInfoFree(tcon);
3422	cifs_put_smb_ses(ses);
3423}
3424
3425/**
3426 * cifs_get_tcon - get a tcon matching @volume_info data from @ses
 
 
3427 *
3428 * - tcon refcount is the number of mount points using the tcon.
3429 * - ses refcount is the number of tcon using the session.
3430 *
3431 * 1. This function assumes it is being called from cifs_mount() where
3432 *    we already got a session reference (ses refcount +1).
3433 *
3434 * 2. Since we're in the context of adding a mount point, the end
3435 *    result should be either:
3436 *
3437 * a) a new tcon already allocated with refcount=1 (1 mount point) and
3438 *    its session refcount incremented (1 new tcon). This +1 was
3439 *    already done in (1).
3440 *
3441 * b) an existing tcon with refcount+1 (add a mount point to it) and
3442 *    identical ses refcount (no new tcon). Because of (1) we need to
3443 *    decrement the ses refcount.
3444 */
3445static struct cifs_tcon *
3446cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3447{
3448	int rc, xid;
3449	struct cifs_tcon *tcon;
3450
3451	tcon = cifs_find_tcon(ses, volume_info);
3452	if (tcon) {
3453		/*
3454		 * tcon has refcount already incremented but we need to
3455		 * decrement extra ses reference gotten by caller (case b)
3456		 */
3457		cifs_dbg(FYI, "Found match on UNC path\n");
3458		cifs_put_smb_ses(ses);
3459		return tcon;
3460	}
3461
3462	if (!ses->server->ops->tree_connect) {
3463		rc = -ENOSYS;
3464		goto out_fail;
3465	}
3466
3467	tcon = tconInfoAlloc();
3468	if (tcon == NULL) {
3469		rc = -ENOMEM;
3470		goto out_fail;
3471	}
3472
3473	if (volume_info->snapshot_time) {
3474		if (ses->server->vals->protocol_id == 0) {
3475			cifs_dbg(VFS,
3476			     "Use SMB2 or later for snapshot mount option\n");
3477			rc = -EOPNOTSUPP;
3478			goto out_fail;
3479		} else
3480			tcon->snapshot_time = volume_info->snapshot_time;
3481	}
3482
3483	if (volume_info->handle_timeout) {
3484		if (ses->server->vals->protocol_id == 0) {
3485			cifs_dbg(VFS,
3486			     "Use SMB2.1 or later for handle timeout option\n");
3487			rc = -EOPNOTSUPP;
3488			goto out_fail;
3489		} else
3490			tcon->handle_timeout = volume_info->handle_timeout;
3491	}
3492
3493	tcon->ses = ses;
3494	if (volume_info->password) {
3495		tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
3496		if (!tcon->password) {
3497			rc = -ENOMEM;
3498			goto out_fail;
3499		}
3500	}
3501
3502	if (volume_info->seal) {
3503		if (ses->server->vals->protocol_id == 0) {
3504			cifs_dbg(VFS,
3505				 "SMB3 or later required for encryption\n");
3506			rc = -EOPNOTSUPP;
3507			goto out_fail;
3508		} else if (tcon->ses->server->capabilities &
3509					SMB2_GLOBAL_CAP_ENCRYPTION)
3510			tcon->seal = true;
3511		else {
3512			cifs_dbg(VFS, "Encryption is not supported on share\n");
3513			rc = -EOPNOTSUPP;
3514			goto out_fail;
3515		}
3516	}
3517
3518	if (volume_info->linux_ext) {
3519		if (ses->server->posix_ext_supported) {
3520			tcon->posix_extensions = true;
3521			pr_warn_once("SMB3.11 POSIX Extensions are experimental\n");
 
 
 
 
 
 
 
 
3522		} else {
3523			cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions\n");
 
3524			rc = -EOPNOTSUPP;
3525			goto out_fail;
3526		}
3527	}
3528
3529	/*
3530	 * BB Do we need to wrap session_mutex around this TCon call and Unix
3531	 * SetFS as we do on SessSetup and reconnect?
3532	 */
3533	xid = get_xid();
3534	rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
3535					    volume_info->local_nls);
3536	free_xid(xid);
3537	cifs_dbg(FYI, "Tcon rc = %d\n", rc);
3538	if (rc)
3539		goto out_fail;
3540
3541	tcon->use_persistent = false;
3542	/* check if SMB2 or later, CIFS does not support persistent handles */
3543	if (volume_info->persistent) {
3544		if (ses->server->vals->protocol_id == 0) {
3545			cifs_dbg(VFS,
3546			     "SMB3 or later required for persistent handles\n");
3547			rc = -EOPNOTSUPP;
3548			goto out_fail;
3549		} else if (ses->server->capabilities &
3550			   SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3551			tcon->use_persistent = true;
3552		else /* persistent handles requested but not supported */ {
3553			cifs_dbg(VFS,
3554				"Persistent handles not supported on share\n");
3555			rc = -EOPNOTSUPP;
3556			goto out_fail;
3557		}
3558	} else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
3559	     && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3560	     && (volume_info->nopersistent == false)) {
3561		cifs_dbg(FYI, "enabling persistent handles\n");
3562		tcon->use_persistent = true;
3563	} else if (volume_info->resilient) {
3564		if (ses->server->vals->protocol_id == 0) {
3565			cifs_dbg(VFS,
3566			     "SMB2.1 or later required for resilient handles\n");
3567			rc = -EOPNOTSUPP;
3568			goto out_fail;
3569		}
3570		tcon->use_resilient = true;
3571	}
3572
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3573	/* If the user really knows what they are doing they can override */
3574	if (tcon->share_flags & SMB2_SHAREFLAG_NO_CACHING) {
3575		if (volume_info->cache_ro)
3576			cifs_dbg(VFS, "cache=ro requested on mount but NO_CACHING flag set on share\n");
3577		else if (volume_info->cache_rw)
3578			cifs_dbg(VFS, "cache=singleclient requested on mount but NO_CACHING flag set on share\n");
3579	}
3580
3581	if (volume_info->no_lease) {
3582		if (ses->server->vals->protocol_id == 0) {
3583			cifs_dbg(VFS,
3584				"SMB2 or later required for nolease option\n");
3585			rc = -EOPNOTSUPP;
3586			goto out_fail;
3587		} else
3588			tcon->no_lease = volume_info->no_lease;
3589	}
3590
3591	/*
3592	 * We can have only one retry value for a connection to a share so for
3593	 * resources mounted more than once to the same server share the last
3594	 * value passed in for the retry flag is used.
3595	 */
3596	tcon->retry = volume_info->retry;
3597	tcon->nocase = volume_info->nocase;
3598	tcon->nohandlecache = volume_info->nohandlecache;
3599	tcon->nodelete = volume_info->nodelete;
3600	tcon->local_lease = volume_info->local_lease;
 
 
 
 
3601	INIT_LIST_HEAD(&tcon->pending_opens);
 
 
 
 
 
 
 
 
 
 
3602
3603	spin_lock(&cifs_tcp_ses_lock);
3604	list_add(&tcon->tcon_list, &ses->tcon_list);
3605	spin_unlock(&cifs_tcp_ses_lock);
3606
3607	cifs_fscache_get_super_cookie(tcon);
3608
3609	return tcon;
3610
3611out_fail:
3612	tconInfoFree(tcon);
3613	return ERR_PTR(rc);
3614}
3615
3616void
3617cifs_put_tlink(struct tcon_link *tlink)
3618{
3619	if (!tlink || IS_ERR(tlink))
3620		return;
3621
3622	if (!atomic_dec_and_test(&tlink->tl_count) ||
3623	    test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
3624		tlink->tl_time = jiffies;
3625		return;
3626	}
3627
3628	if (!IS_ERR(tlink_tcon(tlink)))
3629		cifs_put_tcon(tlink_tcon(tlink));
3630	kfree(tlink);
3631	return;
3632}
3633
3634static int
3635compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3636{
3637	struct cifs_sb_info *old = CIFS_SB(sb);
3638	struct cifs_sb_info *new = mnt_data->cifs_sb;
3639	unsigned int oldflags = old->mnt_cifs_flags & CIFS_MOUNT_MASK;
3640	unsigned int newflags = new->mnt_cifs_flags & CIFS_MOUNT_MASK;
3641
3642	if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
3643		return 0;
3644
3645	if (old->mnt_cifs_serverino_autodisabled)
3646		newflags &= ~CIFS_MOUNT_SERVER_INUM;
3647
3648	if (oldflags != newflags)
3649		return 0;
3650
3651	/*
3652	 * We want to share sb only if we don't specify an r/wsize or
3653	 * specified r/wsize is greater than or equal to existing one.
3654	 */
3655	if (new->wsize && new->wsize < old->wsize)
3656		return 0;
3657
3658	if (new->rsize && new->rsize < old->rsize)
3659		return 0;
3660
3661	if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))
 
3662		return 0;
3663
3664	if (old->mnt_file_mode != new->mnt_file_mode ||
3665	    old->mnt_dir_mode != new->mnt_dir_mode)
3666		return 0;
3667
3668	if (strcmp(old->local_nls->charset, new->local_nls->charset))
3669		return 0;
3670
3671	if (old->actimeo != new->actimeo)
 
 
 
 
3672		return 0;
3673
3674	return 1;
3675}
3676
3677static int
3678match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3679{
3680	struct cifs_sb_info *old = CIFS_SB(sb);
3681	struct cifs_sb_info *new = mnt_data->cifs_sb;
3682	bool old_set = (old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
3683		old->prepath;
3684	bool new_set = (new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
3685		new->prepath;
3686
3687	if (old_set && new_set && !strcmp(new->prepath, old->prepath))
3688		return 1;
3689	else if (!old_set && !new_set)
3690		return 1;
3691
3692	return 0;
3693}
3694
3695int
3696cifs_match_super(struct super_block *sb, void *data)
3697{
3698	struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
3699	struct smb_vol *volume_info;
3700	struct cifs_sb_info *cifs_sb;
3701	struct TCP_Server_Info *tcp_srv;
3702	struct cifs_ses *ses;
3703	struct cifs_tcon *tcon;
3704	struct tcon_link *tlink;
 
3705	int rc = 0;
3706
3707	spin_lock(&cifs_tcp_ses_lock);
3708	cifs_sb = CIFS_SB(sb);
3709	tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3710	if (IS_ERR(tlink)) {
 
3711		spin_unlock(&cifs_tcp_ses_lock);
3712		return rc;
3713	}
3714	tcon = tlink_tcon(tlink);
3715	ses = tcon->ses;
3716	tcp_srv = ses->server;
3717
3718	volume_info = mnt_data->vol;
 
 
3719
3720	if (!match_server(tcp_srv, volume_info) ||
3721	    !match_session(ses, volume_info) ||
3722	    !match_tcon(tcon, volume_info) ||
 
 
 
3723	    !match_prepath(sb, mnt_data)) {
3724		rc = 0;
3725		goto out;
3726	}
3727
3728	rc = compare_mount_options(sb, mnt_data);
3729out:
 
 
 
 
3730	spin_unlock(&cifs_tcp_ses_lock);
3731	cifs_put_tlink(tlink);
3732	return rc;
3733}
3734
3735#ifdef CONFIG_DEBUG_LOCK_ALLOC
3736static struct lock_class_key cifs_key[2];
3737static struct lock_class_key cifs_slock_key[2];
3738
3739static inline void
3740cifs_reclassify_socket4(struct socket *sock)
3741{
3742	struct sock *sk = sock->sk;
3743	BUG_ON(!sock_allow_reclassification(sk));
3744	sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
3745		&cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
3746}
3747
3748static inline void
3749cifs_reclassify_socket6(struct socket *sock)
3750{
3751	struct sock *sk = sock->sk;
3752	BUG_ON(!sock_allow_reclassification(sk));
3753	sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
3754		&cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
3755}
3756#else
3757static inline void
3758cifs_reclassify_socket4(struct socket *sock)
3759{
3760}
3761
3762static inline void
3763cifs_reclassify_socket6(struct socket *sock)
3764{
3765}
3766#endif
3767
3768/* See RFC1001 section 14 on representation of Netbios names */
3769static void rfc1002mangle(char *target, char *source, unsigned int length)
3770{
3771	unsigned int i, j;
3772
3773	for (i = 0, j = 0; i < (length); i++) {
3774		/* mask a nibble at a time and encode */
3775		target[j] = 'A' + (0x0F & (source[i] >> 4));
3776		target[j+1] = 'A' + (0x0F & source[i]);
3777		j += 2;
3778	}
3779
3780}
3781
3782static int
3783bind_socket(struct TCP_Server_Info *server)
3784{
3785	int rc = 0;
3786	if (server->srcaddr.ss_family != AF_UNSPEC) {
3787		/* Bind to the specified local IP address */
3788		struct socket *socket = server->ssocket;
3789		rc = socket->ops->bind(socket,
3790				       (struct sockaddr *) &server->srcaddr,
3791				       sizeof(server->srcaddr));
3792		if (rc < 0) {
3793			struct sockaddr_in *saddr4;
3794			struct sockaddr_in6 *saddr6;
3795			saddr4 = (struct sockaddr_in *)&server->srcaddr;
3796			saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
3797			if (saddr6->sin6_family == AF_INET6)
3798				cifs_server_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
3799					 &saddr6->sin6_addr, rc);
3800			else
3801				cifs_server_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
3802					 &saddr4->sin_addr.s_addr, rc);
3803		}
3804	}
3805	return rc;
3806}
3807
3808static int
3809ip_rfc1001_connect(struct TCP_Server_Info *server)
3810{
3811	int rc = 0;
3812	/*
3813	 * some servers require RFC1001 sessinit before sending
3814	 * negprot - BB check reconnection in case where second
3815	 * sessinit is sent but no second negprot
3816	 */
3817	struct rfc1002_session_packet *ses_init_buf;
 
3818	struct smb_hdr *smb_buf;
 
3819	ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
3820			       GFP_KERNEL);
 
3821	if (ses_init_buf) {
3822		ses_init_buf->trailer.session_req.called_len = 32;
3823
3824		if (server->server_RFC1001_name[0] != 0)
3825			rfc1002mangle(ses_init_buf->trailer.
3826				      session_req.called_name,
3827				      server->server_RFC1001_name,
3828				      RFC1001_NAME_LEN_WITH_NULL);
3829		else
3830			rfc1002mangle(ses_init_buf->trailer.
3831				      session_req.called_name,
3832				      DEFAULT_CIFS_CALLED_NAME,
3833				      RFC1001_NAME_LEN_WITH_NULL);
3834
3835		ses_init_buf->trailer.session_req.calling_len = 32;
3836
3837		/*
3838		 * calling name ends in null (byte 16) from old smb
3839		 * convention.
3840		 */
3841		if (server->workstation_RFC1001_name[0] != 0)
3842			rfc1002mangle(ses_init_buf->trailer.
3843				      session_req.calling_name,
3844				      server->workstation_RFC1001_name,
3845				      RFC1001_NAME_LEN_WITH_NULL);
3846		else
3847			rfc1002mangle(ses_init_buf->trailer.
3848				      session_req.calling_name,
3849				      "LINUX_CIFS_CLNT",
3850				      RFC1001_NAME_LEN_WITH_NULL);
3851
3852		ses_init_buf->trailer.session_req.scope1 = 0;
3853		ses_init_buf->trailer.session_req.scope2 = 0;
3854		smb_buf = (struct smb_hdr *)ses_init_buf;
3855
3856		/* sizeof RFC1002_SESSION_REQUEST with no scope */
3857		smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
 
 
 
 
3858		rc = smb_send(server, smb_buf, 0x44);
3859		kfree(ses_init_buf);
3860		/*
3861		 * RFC1001 layer in at least one server
3862		 * requires very short break before negprot
3863		 * presumably because not expecting negprot
3864		 * to follow so fast.  This is a simple
3865		 * solution that works without
3866		 * complicating the code and causes no
3867		 * significant slowing down on mount
3868		 * for everyone else
3869		 */
3870		usleep_range(1000, 2000);
3871	}
3872	/*
3873	 * else the negprot may still work without this
3874	 * even though malloc failed
3875	 */
3876
3877	return rc;
3878}
3879
3880static int
3881generic_ip_connect(struct TCP_Server_Info *server)
3882{
3883	int rc = 0;
3884	__be16 sport;
3885	int slen, sfamily;
3886	struct socket *socket = server->ssocket;
3887	struct sockaddr *saddr;
3888
3889	saddr = (struct sockaddr *) &server->dstaddr;
3890
3891	if (server->dstaddr.ss_family == AF_INET6) {
3892		sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
 
 
3893		slen = sizeof(struct sockaddr_in6);
3894		sfamily = AF_INET6;
 
 
3895	} else {
3896		sport = ((struct sockaddr_in *) saddr)->sin_port;
 
 
3897		slen = sizeof(struct sockaddr_in);
3898		sfamily = AF_INET;
 
 
3899	}
3900
3901	if (socket == NULL) {
3902		rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3903				   IPPROTO_TCP, &socket, 1);
3904		if (rc < 0) {
3905			cifs_server_dbg(VFS, "Error %d creating socket\n", rc);
3906			server->ssocket = NULL;
3907			return rc;
3908		}
3909
3910		/* BB other socket options to set KEEPALIVE, NODELAY? */
3911		cifs_dbg(FYI, "Socket created\n");
3912		server->ssocket = socket;
3913		socket->sk->sk_allocation = GFP_NOFS;
 
3914		if (sfamily == AF_INET6)
3915			cifs_reclassify_socket6(socket);
3916		else
3917			cifs_reclassify_socket4(socket);
3918	}
3919
3920	rc = bind_socket(server);
3921	if (rc < 0)
3922		return rc;
3923
3924	/*
3925	 * Eventually check for other socket options to change from
3926	 * the default. sock_setsockopt not used because it expects
3927	 * user space buffer
3928	 */
3929	socket->sk->sk_rcvtimeo = 7 * HZ;
3930	socket->sk->sk_sndtimeo = 5 * HZ;
3931
3932	/* make the bufsizes depend on wsize/rsize and max requests */
3933	if (server->noautotune) {
3934		if (socket->sk->sk_sndbuf < (200 * 1024))
3935			socket->sk->sk_sndbuf = 200 * 1024;
3936		if (socket->sk->sk_rcvbuf < (140 * 1024))
3937			socket->sk->sk_rcvbuf = 140 * 1024;
3938	}
3939
3940	if (server->tcp_nodelay)
3941		tcp_sock_set_nodelay(socket->sk);
3942
3943	cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3944		 socket->sk->sk_sndbuf,
3945		 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3946
3947	rc = socket->ops->connect(socket, saddr, slen,
3948				  server->noblockcnt ? O_NONBLOCK : 0);
3949	/*
3950	 * When mounting SMB root file systems, we do not want to block in
3951	 * connect. Otherwise bail out and then let cifs_reconnect() perform
3952	 * reconnect failover - if possible.
3953	 */
3954	if (server->noblockcnt && rc == -EINPROGRESS)
3955		rc = 0;
3956	if (rc < 0) {
3957		cifs_dbg(FYI, "Error %d connecting to server\n", rc);
 
3958		sock_release(socket);
3959		server->ssocket = NULL;
3960		return rc;
3961	}
3962
3963	if (sport == htons(RFC1001_PORT))
3964		rc = ip_rfc1001_connect(server);
3965
3966	return rc;
3967}
3968
3969static int
3970ip_connect(struct TCP_Server_Info *server)
3971{
3972	__be16 *sport;
3973	struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3974	struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3975
3976	if (server->dstaddr.ss_family == AF_INET6)
3977		sport = &addr6->sin6_port;
3978	else
3979		sport = &addr->sin_port;
3980
3981	if (*sport == 0) {
3982		int rc;
3983
3984		/* try with 445 port at first */
3985		*sport = htons(CIFS_PORT);
3986
3987		rc = generic_ip_connect(server);
3988		if (rc >= 0)
3989			return rc;
3990
3991		/* if it failed, try with 139 port */
3992		*sport = htons(RFC1001_PORT);
3993	}
3994
3995	return generic_ip_connect(server);
3996}
3997
 
3998void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
3999			  struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
4000{
4001	/* if we are reconnecting then should we check to see if
 
4002	 * any requested capabilities changed locally e.g. via
4003	 * remount but we can not do much about it here
4004	 * if they have (even if we could detect it by the following)
4005	 * Perhaps we could add a backpointer to array of sb from tcon
4006	 * or if we change to make all sb to same share the same
4007	 * sb as NFS - then we only have one backpointer to sb.
4008	 * What if we wanted to mount the server share twice once with
4009	 * and once without posixacls or posix paths? */
 
4010	__u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
4011
4012	if (vol_info && vol_info->no_linux_ext) {
4013		tcon->fsUnixInfo.Capability = 0;
4014		tcon->unix_ext = 0; /* Unix Extensions disabled */
4015		cifs_dbg(FYI, "Linux protocol extensions disabled\n");
4016		return;
4017	} else if (vol_info)
4018		tcon->unix_ext = 1; /* Unix Extensions supported */
4019
4020	if (tcon->unix_ext == 0) {
4021		cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
4022		return;
4023	}
4024
4025	if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
4026		__u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
4027		cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
4028		/* check for reconnect case in which we do not
4029		   want to change the mount behavior if we can avoid it */
4030		if (vol_info == NULL) {
4031			/* turn off POSIX ACL and PATHNAMES if not set
4032			   originally at mount time */
 
 
 
 
4033			if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
4034				cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
4035			if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
4036				if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
4037					cifs_dbg(VFS, "POSIXPATH support change\n");
4038				cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
4039			} else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
4040				cifs_dbg(VFS, "possible reconnect error\n");
4041				cifs_dbg(VFS, "server disabled POSIX path support\n");
4042			}
4043		}
4044
4045		if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
4046			cifs_dbg(VFS, "per-share encryption not supported yet\n");
4047
4048		cap &= CIFS_UNIX_CAP_MASK;
4049		if (vol_info && vol_info->no_psx_acl)
4050			cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
4051		else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
4052			cifs_dbg(FYI, "negotiated posix acl support\n");
4053			if (cifs_sb)
4054				cifs_sb->mnt_cifs_flags |=
4055					CIFS_MOUNT_POSIXACL;
4056		}
4057
4058		if (vol_info && vol_info->posix_paths == 0)
4059			cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
4060		else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
4061			cifs_dbg(FYI, "negotiate posix pathnames\n");
4062			if (cifs_sb)
4063				cifs_sb->mnt_cifs_flags |=
4064					CIFS_MOUNT_POSIX_PATHS;
4065		}
4066
4067		cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
4068#ifdef CONFIG_CIFS_DEBUG2
4069		if (cap & CIFS_UNIX_FCNTL_CAP)
4070			cifs_dbg(FYI, "FCNTL cap\n");
4071		if (cap & CIFS_UNIX_EXTATTR_CAP)
4072			cifs_dbg(FYI, "EXTATTR cap\n");
4073		if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
4074			cifs_dbg(FYI, "POSIX path cap\n");
4075		if (cap & CIFS_UNIX_XATTR_CAP)
4076			cifs_dbg(FYI, "XATTR cap\n");
4077		if (cap & CIFS_UNIX_POSIX_ACL_CAP)
4078			cifs_dbg(FYI, "POSIX ACL cap\n");
4079		if (cap & CIFS_UNIX_LARGE_READ_CAP)
4080			cifs_dbg(FYI, "very large read cap\n");
4081		if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
4082			cifs_dbg(FYI, "very large write cap\n");
4083		if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
4084			cifs_dbg(FYI, "transport encryption cap\n");
4085		if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
4086			cifs_dbg(FYI, "mandatory transport encryption cap\n");
4087#endif /* CIFS_DEBUG2 */
4088		if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
4089			if (vol_info == NULL) {
4090				cifs_dbg(FYI, "resetting capabilities failed\n");
4091			} else
4092				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");
4093
4094		}
4095	}
4096}
 
4097
4098int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
4099			struct cifs_sb_info *cifs_sb)
4100{
 
 
4101	INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
4102
4103	spin_lock_init(&cifs_sb->tlink_tree_lock);
4104	cifs_sb->tlink_tree = RB_ROOT;
4105
4106	cifs_sb->bsize = pvolume_info->bsize;
4107	/*
4108	 * Temporarily set r/wsize for matching superblock. If we end up using
4109	 * new sb then client will later negotiate it downward if needed.
4110	 */
4111	cifs_sb->rsize = pvolume_info->rsize;
4112	cifs_sb->wsize = pvolume_info->wsize;
4113
4114	cifs_sb->mnt_uid = pvolume_info->linux_uid;
4115	cifs_sb->mnt_gid = pvolume_info->linux_gid;
4116	cifs_sb->mnt_file_mode = pvolume_info->file_mode;
4117	cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
4118	cifs_dbg(FYI, "file mode: %04ho  dir mode: %04ho\n",
4119		 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
 
 
 
 
 
 
 
4120
4121	cifs_sb->actimeo = pvolume_info->actimeo;
4122	cifs_sb->local_nls = pvolume_info->local_nls;
4123
4124	if (pvolume_info->nodfs)
4125		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_DFS;
4126	if (pvolume_info->noperm)
4127		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
4128	if (pvolume_info->setuids)
4129		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
4130	if (pvolume_info->setuidfromacl)
4131		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
4132	if (pvolume_info->server_ino)
4133		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
4134	if (pvolume_info->remap)
4135		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
4136	if (pvolume_info->sfu_remap)
4137		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
4138	if (pvolume_info->no_xattr)
4139		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
4140	if (pvolume_info->sfu_emul)
4141		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
4142	if (pvolume_info->nobrl)
4143		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
4144	if (pvolume_info->nohandlecache)
4145		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_HANDLE_CACHE;
4146	if (pvolume_info->nostrictsync)
4147		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
4148	if (pvolume_info->mand_lock)
4149		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
4150	if (pvolume_info->rwpidforward)
4151		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
4152	if (pvolume_info->mode_ace)
4153		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MODE_FROM_SID;
4154	if (pvolume_info->cifs_acl)
4155		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
4156	if (pvolume_info->backupuid_specified) {
4157		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
4158		cifs_sb->mnt_backupuid = pvolume_info->backupuid;
4159	}
4160	if (pvolume_info->backupgid_specified) {
4161		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
4162		cifs_sb->mnt_backupgid = pvolume_info->backupgid;
4163	}
4164	if (pvolume_info->override_uid)
4165		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
4166	if (pvolume_info->override_gid)
4167		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
4168	if (pvolume_info->dynperm)
4169		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
4170	if (pvolume_info->fsc)
4171		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
4172	if (pvolume_info->multiuser)
4173		cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
4174					    CIFS_MOUNT_NO_PERM);
4175	if (pvolume_info->strict_io)
4176		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
4177	if (pvolume_info->direct_io) {
4178		cifs_dbg(FYI, "mounting share using direct i/o\n");
4179		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
4180	}
4181	if (pvolume_info->cache_ro) {
4182		cifs_dbg(VFS, "mounting share with read only caching. Ensure that the share will not be modified while in use.\n");
4183		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RO_CACHE;
4184	} else if (pvolume_info->cache_rw) {
4185		cifs_dbg(VFS, "mounting share in single client RW caching mode. Ensure that no other systems will be accessing the share.\n");
4186		cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_RO_CACHE |
4187					    CIFS_MOUNT_RW_CACHE);
4188	}
4189	if (pvolume_info->mfsymlinks) {
4190		if (pvolume_info->sfu_emul) {
4191			/*
4192			 * Our SFU ("Services for Unix" emulation does not allow
4193			 * creating symlinks but does allow reading existing SFU
4194			 * symlinks (it does allow both creating and reading SFU
4195			 * style mknod and FIFOs though). When "mfsymlinks" and
4196			 * "sfu" are both enabled at the same time, it allows
4197			 * reading both types of symlinks, but will only create
4198			 * them with mfsymlinks format. This allows better
4199			 * Apple compatibility (probably better for Samba too)
4200			 * while still recognizing old Windows style symlinks.
4201			 */
4202			cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
4203		}
4204		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
4205	}
4206
4207	if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
4208		cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
4209
4210	if (pvolume_info->prepath) {
4211		cifs_sb->prepath = kstrdup(pvolume_info->prepath, GFP_KERNEL);
4212		if (cifs_sb->prepath == NULL)
4213			return -ENOMEM;
 
4214	}
4215
4216	return 0;
4217}
4218
4219void
4220cifs_cleanup_volume_info_contents(struct smb_vol *volume_info)
4221{
4222	kfree(volume_info->username);
4223	kfree_sensitive(volume_info->password);
4224	kfree(volume_info->UNC);
4225	kfree(volume_info->domainname);
4226	kfree(volume_info->iocharset);
4227	kfree(volume_info->prepath);
4228}
4229
4230void
4231cifs_cleanup_volume_info(struct smb_vol *volume_info)
4232{
4233	if (!volume_info)
4234		return;
4235	cifs_cleanup_volume_info_contents(volume_info);
4236	kfree(volume_info);
4237}
4238
4239/* Release all succeed connections */
4240static inline void mount_put_conns(struct cifs_sb_info *cifs_sb,
4241				   unsigned int xid,
4242				   struct TCP_Server_Info *server,
4243				   struct cifs_ses *ses, struct cifs_tcon *tcon)
4244{
4245	int rc = 0;
4246
4247	if (tcon)
4248		cifs_put_tcon(tcon);
4249	else if (ses)
4250		cifs_put_smb_ses(ses);
4251	else if (server)
4252		cifs_put_tcp_session(server, 0);
4253	cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
4254	free_xid(xid);
4255}
4256
4257/* Get connections for tcp, ses and tcon */
4258static int mount_get_conns(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
4259			   unsigned int *xid,
4260			   struct TCP_Server_Info **nserver,
4261			   struct cifs_ses **nses, struct cifs_tcon **ntcon)
4262{
 
 
 
 
4263	int rc = 0;
4264	struct TCP_Server_Info *server;
4265	struct cifs_ses *ses;
4266	struct cifs_tcon *tcon;
4267
4268	*nserver = NULL;
4269	*nses = NULL;
4270	*ntcon = NULL;
4271
4272	*xid = get_xid();
 
 
 
 
4273
4274	/* get a reference to a tcp session */
4275	server = cifs_get_tcp_session(vol);
4276	if (IS_ERR(server)) {
4277		rc = PTR_ERR(server);
4278		return rc;
 
4279	}
4280
4281	*nserver = server;
4282
4283	if ((vol->max_credits < 20) || (vol->max_credits > 60000))
4284		server->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
4285	else
4286		server->max_credits = vol->max_credits;
4287
4288	/* get a reference to a SMB session */
4289	ses = cifs_get_smb_ses(server, vol);
4290	if (IS_ERR(ses)) {
4291		rc = PTR_ERR(ses);
4292		return rc;
 
4293	}
4294
4295	*nses = ses;
4296
4297	if ((vol->persistent == true) && (!(ses->server->capabilities &
4298					    SMB2_GLOBAL_CAP_PERSISTENT_HANDLES))) {
4299		cifs_server_dbg(VFS, "persistent handles not supported by server\n");
4300		return -EOPNOTSUPP;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4301	}
 
 
 
4302
4303	/* search for existing tcon to this server share */
4304	tcon = cifs_get_tcon(ses, vol);
4305	if (IS_ERR(tcon)) {
4306		rc = PTR_ERR(tcon);
4307		return rc;
 
4308	}
4309
4310	*ntcon = tcon;
4311
4312	/* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
4313	if (tcon->posix_extensions)
4314		cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
4315
 
4316	/* tell server which Unix caps we support */
4317	if (cap_unix(tcon->ses)) {
4318		/*
4319		 * reset of caps checks mount to see if unix extensions disabled
4320		 * for just this mount.
4321		 */
4322		reset_cifs_unix_caps(*xid, tcon, cifs_sb, vol);
 
4323		if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
4324		    (le64_to_cpu(tcon->fsUnixInfo.Capability) &
4325		     CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP))
4326			return -EACCES;
 
 
 
 
4327	} else
 
4328		tcon->unix_ext = 0; /* server does not support them */
4329
4330	/* do not care if a following call succeed - informational */
4331	if (!tcon->pipe && server->ops->qfs_tcon) {
4332		server->ops->qfs_tcon(*xid, tcon, cifs_sb);
4333		if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE) {
4334			if (tcon->fsDevInfo.DeviceCharacteristics &
4335			    cpu_to_le32(FILE_READ_ONLY_DEVICE))
4336				cifs_dbg(VFS, "mounted to read only share\n");
4337			else if ((cifs_sb->mnt_cifs_flags &
4338				  CIFS_MOUNT_RW_CACHE) == 0)
4339				cifs_dbg(VFS, "read only mount of RW share\n");
4340			/* no need to log a RW mount of a typical RW share */
4341		}
4342	}
4343
4344	cifs_sb->wsize = server->ops->negotiate_wsize(tcon, vol);
4345	cifs_sb->rsize = server->ops->negotiate_rsize(tcon, vol);
 
 
 
 
 
 
 
 
 
4346
4347	return 0;
 
 
 
 
 
 
 
 
 
 
4348}
4349
4350static int mount_setup_tlink(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
4351			     struct cifs_tcon *tcon)
4352{
4353	struct tcon_link *tlink;
4354
4355	/* hang the tcon off of the superblock */
4356	tlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4357	if (tlink == NULL)
4358		return -ENOMEM;
4359
4360	tlink->tl_uid = ses->linux_uid;
4361	tlink->tl_tcon = tcon;
4362	tlink->tl_time = jiffies;
4363	set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
4364	set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4365
4366	cifs_sb->master_tlink = tlink;
4367	spin_lock(&cifs_sb->tlink_tree_lock);
4368	tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4369	spin_unlock(&cifs_sb->tlink_tree_lock);
4370
4371	queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4372				TLINK_IDLE_EXPIRE);
4373	return 0;
4374}
4375
4376#ifdef CONFIG_CIFS_DFS_UPCALL
4377/*
4378 * cifs_build_path_to_root returns full path to root when we do not have an
4379 * exiting connection (tcon)
4380 */
4381static char *
4382build_unc_path_to_root(const struct smb_vol *vol,
4383		       const struct cifs_sb_info *cifs_sb, bool useppath)
4384{
4385	char *full_path, *pos;
4386	unsigned int pplen = useppath && vol->prepath ?
4387		strlen(vol->prepath) + 1 : 0;
4388	unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
4389
4390	if (unc_len > MAX_TREE_SIZE)
4391		return ERR_PTR(-EINVAL);
4392
4393	full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
4394	if (full_path == NULL)
4395		return ERR_PTR(-ENOMEM);
4396
4397	memcpy(full_path, vol->UNC, unc_len);
4398	pos = full_path + unc_len;
4399
4400	if (pplen) {
4401		*pos = CIFS_DIR_SEP(cifs_sb);
4402		memcpy(pos + 1, vol->prepath, pplen);
4403		pos += pplen;
4404	}
4405
4406	*pos = '\0'; /* add trailing null */
4407	convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
4408	cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
4409	return full_path;
4410}
4411
4412/**
4413 * expand_dfs_referral - Perform a dfs referral query and update the cifs_sb
4414 *
4415 *
4416 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
4417 * to a string containing updated options for the submount.  Otherwise it
4418 * will be left untouched.
4419 *
4420 * Returns the rc from get_dfs_path to the caller, which can be used to
4421 * determine whether there were referrals.
4422 */
4423static int
4424expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
4425		    struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
4426		    char *ref_path)
4427{
4428	int rc;
4429	struct dfs_info3_param referral = {0};
4430	char *full_path = NULL, *mdata = NULL;
4431
4432	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4433		return -EREMOTE;
4434
4435	full_path = build_unc_path_to_root(volume_info, cifs_sb, true);
4436	if (IS_ERR(full_path))
4437		return PTR_ERR(full_path);
4438
4439	rc = dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4440			    ref_path, &referral, NULL);
4441	if (!rc) {
4442		char *fake_devname = NULL;
4443
4444		mdata = cifs_compose_mount_options(cifs_sb->mountdata,
4445						   full_path + 1, &referral,
4446						   &fake_devname);
4447		free_dfs_info_param(&referral);
4448
4449		if (IS_ERR(mdata)) {
4450			rc = PTR_ERR(mdata);
4451			mdata = NULL;
4452		} else {
4453			cifs_cleanup_volume_info_contents(volume_info);
4454			rc = cifs_setup_volume_info(volume_info, mdata,
4455						    fake_devname, false);
4456		}
4457		kfree(fake_devname);
4458		kfree(cifs_sb->mountdata);
4459		cifs_sb->mountdata = mdata;
4460	}
4461	kfree(full_path);
4462	return rc;
4463}
4464
4465static inline int get_next_dfs_tgt(const char *path,
4466				   struct dfs_cache_tgt_list *tgt_list,
4467				   struct dfs_cache_tgt_iterator **tgt_it)
4468{
4469	if (!*tgt_it)
4470		*tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
4471	else
4472		*tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
4473	return !*tgt_it ? -EHOSTDOWN : 0;
4474}
4475
4476static int update_vol_info(const struct dfs_cache_tgt_iterator *tgt_it,
4477			   struct smb_vol *fake_vol, struct smb_vol *vol)
4478{
4479	const char *tgt = dfs_cache_get_tgt_name(tgt_it);
4480	int len = strlen(tgt) + 2;
4481	char *new_unc;
4482
4483	new_unc = kmalloc(len, GFP_KERNEL);
4484	if (!new_unc)
4485		return -ENOMEM;
4486	scnprintf(new_unc, len, "\\%s", tgt);
4487
4488	kfree(vol->UNC);
4489	vol->UNC = new_unc;
4490
4491	if (fake_vol->prepath) {
4492		kfree(vol->prepath);
4493		vol->prepath = fake_vol->prepath;
4494		fake_vol->prepath = NULL;
4495	}
4496	memcpy(&vol->dstaddr, &fake_vol->dstaddr, sizeof(vol->dstaddr));
4497
4498	return 0;
4499}
4500
4501static int setup_dfs_tgt_conn(const char *path, const char *full_path,
4502			      const struct dfs_cache_tgt_iterator *tgt_it,
4503			      struct cifs_sb_info *cifs_sb, struct smb_vol *vol, unsigned int *xid,
4504			      struct TCP_Server_Info **server, struct cifs_ses **ses,
4505			      struct cifs_tcon **tcon)
4506{
4507	int rc;
4508	struct dfs_info3_param ref = {0};
4509	char *mdata = NULL, *fake_devname = NULL;
4510	struct smb_vol fake_vol = {NULL};
4511
4512	cifs_dbg(FYI, "%s: dfs path: %s\n", __func__, path);
4513
4514	rc = dfs_cache_get_tgt_referral(path, tgt_it, &ref);
4515	if (rc)
4516		return rc;
4517
4518	mdata = cifs_compose_mount_options(cifs_sb->mountdata, full_path + 1, &ref, &fake_devname);
4519	free_dfs_info_param(&ref);
4520
4521	if (IS_ERR(mdata)) {
4522		rc = PTR_ERR(mdata);
4523		mdata = NULL;
4524	} else {
4525		cifs_dbg(FYI, "%s: fake_devname: %s\n", __func__, fake_devname);
4526		rc = cifs_setup_volume_info(&fake_vol, mdata, fake_devname,
4527					    false);
4528	}
4529	kfree(mdata);
4530	kfree(fake_devname);
4531
4532	if (!rc) {
4533		/*
4534		 * We use a 'fake_vol' here because we need pass it down to the
4535		 * mount_{get,put} functions to test connection against new DFS
4536		 * targets.
4537		 */
4538		mount_put_conns(cifs_sb, *xid, *server, *ses, *tcon);
4539		rc = mount_get_conns(&fake_vol, cifs_sb, xid, server, ses,
4540				     tcon);
4541		if (!rc || (*server && *ses)) {
4542			/*
4543			 * We were able to connect to new target server.
4544			 * Update current volume info with new target server.
4545			 */
4546			rc = update_vol_info(tgt_it, &fake_vol, vol);
4547		}
4548	}
4549	cifs_cleanup_volume_info_contents(&fake_vol);
4550	return rc;
4551}
4552
4553static int do_dfs_failover(const char *path, const char *full_path, struct cifs_sb_info *cifs_sb,
4554			   struct smb_vol *vol, struct cifs_ses *root_ses, unsigned int *xid,
4555			   struct TCP_Server_Info **server, struct cifs_ses **ses,
4556			   struct cifs_tcon **tcon)
4557{
4558	int rc;
4559	struct dfs_cache_tgt_list tgt_list;
4560	struct dfs_cache_tgt_iterator *tgt_it = NULL;
4561
4562	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4563		return -EOPNOTSUPP;
4564
4565	rc = dfs_cache_noreq_find(path, NULL, &tgt_list);
4566	if (rc)
4567		return rc;
4568
4569	for (;;) {
4570		/* Get next DFS target server - if any */
4571		rc = get_next_dfs_tgt(path, &tgt_list, &tgt_it);
4572		if (rc)
4573			break;
4574		/* Connect to next DFS target */
4575		rc = setup_dfs_tgt_conn(path, full_path, tgt_it, cifs_sb, vol, xid, server, ses,
4576					tcon);
4577		if (!rc || (*server && *ses))
4578			break;
4579	}
4580	if (!rc) {
4581		/*
4582		 * Update DFS target hint in DFS referral cache with the target
4583		 * server we successfully reconnected to.
4584		 */
4585		rc = dfs_cache_update_tgthint(*xid, root_ses ? root_ses : *ses,
4586					      cifs_sb->local_nls,
4587					      cifs_remap(cifs_sb), path,
4588					      tgt_it);
4589	}
4590	dfs_cache_free_tgts(&tgt_list);
4591	return rc;
4592}
4593#endif
4594
4595int
4596cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
4597			const char *devname, bool is_smb3)
4598{
4599	int rc = 0;
4600
4601	if (cifs_parse_mount_options(mount_data, devname, volume_info, is_smb3))
4602		return -EINVAL;
4603
4604	if (volume_info->nullauth) {
4605		cifs_dbg(FYI, "Anonymous login\n");
4606		kfree(volume_info->username);
4607		volume_info->username = NULL;
4608	} else if (volume_info->username) {
4609		/* BB fixme parse for domain name here */
4610		cifs_dbg(FYI, "Username: %s\n", volume_info->username);
4611	} else {
4612		cifs_dbg(VFS, "No username specified\n");
4613	/* In userspace mount helper we can get user name from alternate
4614	   locations such as env variables and files on disk */
4615		return -EINVAL;
4616	}
4617
4618	/* this is needed for ASCII cp to Unicode converts */
4619	if (volume_info->iocharset == NULL) {
4620		/* load_nls_default cannot return null */
4621		volume_info->local_nls = load_nls_default();
4622	} else {
4623		volume_info->local_nls = load_nls(volume_info->iocharset);
4624		if (volume_info->local_nls == NULL) {
4625			cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
4626				 volume_info->iocharset);
4627			return -ELIBACC;
4628		}
4629	}
4630
4631	return rc;
4632}
4633
4634struct smb_vol *
4635cifs_get_volume_info(char *mount_data, const char *devname, bool is_smb3)
4636{
4637	int rc;
4638	struct smb_vol *volume_info;
4639
4640	volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
4641	if (!volume_info)
4642		return ERR_PTR(-ENOMEM);
4643
4644	rc = cifs_setup_volume_info(volume_info, mount_data, devname, is_smb3);
4645	if (rc) {
4646		cifs_cleanup_volume_info(volume_info);
4647		volume_info = ERR_PTR(rc);
4648	}
4649
4650	return volume_info;
4651}
4652
4653static int
4654cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
4655					unsigned int xid,
4656					struct cifs_tcon *tcon,
4657					struct cifs_sb_info *cifs_sb,
4658					char *full_path,
4659					int added_treename)
4660{
4661	int rc;
4662	char *s;
4663	char sep, tmp;
4664	int skip = added_treename ? 1 : 0;
4665
4666	sep = CIFS_DIR_SEP(cifs_sb);
4667	s = full_path;
4668
4669	rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
4670	while (rc == 0) {
4671		/* skip separators */
4672		while (*s == sep)
4673			s++;
4674		if (!*s)
4675			break;
4676		/* next separator */
4677		while (*s && *s != sep)
4678			s++;
4679		/*
4680		 * if the treename is added, we then have to skip the first
4681		 * part within the separators
4682		 */
4683		if (skip) {
4684			skip = 0;
4685			continue;
4686		}
4687		/*
4688		 * temporarily null-terminate the path at the end of
4689		 * the current component
4690		 */
4691		tmp = *s;
4692		*s = 0;
4693		rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4694						     full_path);
4695		*s = tmp;
4696	}
4697	return rc;
4698}
4699
4700/*
4701 * Check if path is remote (e.g. a DFS share). Return -EREMOTE if it is,
4702 * otherwise 0.
 
4703 */
4704static int is_path_remote(struct cifs_sb_info *cifs_sb, struct smb_vol *vol,
4705			  const unsigned int xid,
4706			  struct TCP_Server_Info *server,
4707			  struct cifs_tcon *tcon)
4708{
4709	int rc;
 
 
 
 
 
4710	char *full_path;
4711
4712	if (!server->ops->is_path_accessible)
4713		return -EOPNOTSUPP;
4714
4715	/*
4716	 * cifs_build_path_to_root works only when we have a valid tcon
4717	 */
4718	full_path = cifs_build_path_to_root(vol, cifs_sb, tcon,
4719					    tcon->Flags & SMB_SHARE_IS_IN_DFS);
4720	if (full_path == NULL)
4721		return -ENOMEM;
4722
4723	cifs_dbg(FYI, "%s: full_path: %s\n", __func__, full_path);
4724
4725	rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4726					     full_path);
4727	if (rc != 0 && rc != -EREMOTE) {
4728		kfree(full_path);
4729		return rc;
4730	}
4731
4732	if (rc != -EREMOTE) {
4733		rc = cifs_are_all_path_components_accessible(server, xid, tcon,
4734			cifs_sb, full_path, tcon->Flags & SMB_SHARE_IS_IN_DFS);
4735		if (rc != 0) {
4736			cifs_server_dbg(VFS, "cannot query dirs between root and final path, enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
4737			cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
4738			rc = 0;
4739		}
4740	}
4741
 
4742	kfree(full_path);
4743	return rc;
4744}
4745
4746#ifdef CONFIG_CIFS_DFS_UPCALL
4747static void set_root_ses(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
4748			 struct cifs_ses **root_ses)
4749{
4750	if (ses) {
4751		spin_lock(&cifs_tcp_ses_lock);
4752		ses->ses_count++;
4753		ses->tcon_ipc->remap = cifs_remap(cifs_sb);
4754		spin_unlock(&cifs_tcp_ses_lock);
4755	}
4756	*root_ses = ses;
4757}
4758
4759static void put_root_ses(struct cifs_ses *ses)
4760{
4761	if (ses)
4762		cifs_put_smb_ses(ses);
4763}
4764
4765/* Check if a path component is remote and then update @dfs_path accordingly */
4766static int check_dfs_prepath(struct cifs_sb_info *cifs_sb, struct smb_vol *vol,
4767			     const unsigned int xid, struct TCP_Server_Info *server,
4768			     struct cifs_tcon *tcon, char **dfs_path)
4769{
4770	char *path, *s;
4771	char sep = CIFS_DIR_SEP(cifs_sb), tmp;
4772	char *npath;
4773	int rc = 0;
4774	int added_treename = tcon->Flags & SMB_SHARE_IS_IN_DFS;
4775	int skip = added_treename;
4776
4777	path = cifs_build_path_to_root(vol, cifs_sb, tcon, added_treename);
4778	if (!path)
4779		return -ENOMEM;
4780
4781	/*
4782	 * Walk through the path components in @path and check if they're accessible. In case any of
4783	 * the components is -EREMOTE, then update @dfs_path with the next DFS referral request path
4784	 * (NOT including the remaining components).
4785	 */
4786	s = path;
4787	do {
4788		/* skip separators */
4789		while (*s && *s == sep)
4790			s++;
4791		if (!*s)
4792			break;
4793		/* next separator */
4794		while (*s && *s != sep)
4795			s++;
4796		/*
4797		 * if the treename is added, we then have to skip the first
4798		 * part within the separators
4799		 */
4800		if (skip) {
4801			skip = 0;
4802			continue;
4803		}
4804		tmp = *s;
4805		*s = 0;
4806		rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, path);
4807		if (rc && rc == -EREMOTE) {
4808			struct smb_vol v = {NULL};
4809			/* if @path contains a tree name, skip it in the prefix path */
4810			if (added_treename) {
4811				rc = cifs_parse_devname(path, &v);
4812				if (rc)
4813					break;
4814				rc = -EREMOTE;
4815				npath = build_unc_path_to_root(&v, cifs_sb, true);
4816				cifs_cleanup_volume_info_contents(&v);
4817			} else {
4818				v.UNC = vol->UNC;
4819				v.prepath = path + 1;
4820				npath = build_unc_path_to_root(&v, cifs_sb, true);
4821			}
4822			if (IS_ERR(npath)) {
4823				rc = PTR_ERR(npath);
4824				break;
4825			}
4826			kfree(*dfs_path);
4827			*dfs_path = npath;
4828		}
4829		*s = tmp;
4830	} while (rc == 0);
4831
4832	kfree(path);
4833	return rc;
4834}
4835
4836int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4837{
4838	int rc = 0;
4839	unsigned int xid;
4840	struct TCP_Server_Info *server = NULL;
4841	struct cifs_ses *ses = NULL, *root_ses = NULL;
4842	struct cifs_tcon *tcon = NULL;
4843	int count = 0;
4844	char *ref_path = NULL, *full_path = NULL;
4845	char *oldmnt = NULL;
4846	char *mntdata = NULL;
4847
4848	rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4849	/*
4850	 * Unconditionally try to get an DFS referral (even cached) to determine whether it is an
4851	 * DFS mount.
4852	 *
4853	 * Skip prefix path to provide support for DFS referrals from w2k8 servers which don't seem
4854	 * to respond with PATH_NOT_COVERED to requests that include the prefix.
4855	 */
4856	if (dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb), vol->UNC + 1, NULL,
4857			   NULL)) {
4858		/* No DFS referral was returned.  Looks like a regular share. */
4859		if (rc)
4860			goto error;
4861		/* Check if it is fully accessible and then mount it */
4862		rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4863		if (!rc)
4864			goto out;
4865		if (rc != -EREMOTE)
4866			goto error;
4867	}
4868	/* Save mount options */
4869	mntdata = kstrndup(cifs_sb->mountdata, strlen(cifs_sb->mountdata), GFP_KERNEL);
4870	if (!mntdata) {
4871		rc = -ENOMEM;
4872		goto error;
4873	}
4874	/* Get path of DFS root */
4875	ref_path = build_unc_path_to_root(vol, cifs_sb, false);
4876	if (IS_ERR(ref_path)) {
4877		rc = PTR_ERR(ref_path);
4878		ref_path = NULL;
4879		goto error;
4880	}
4881
4882	set_root_ses(cifs_sb, ses, &root_ses);
4883	do {
4884		/* Save full path of last DFS path we used to resolve final target server */
4885		kfree(full_path);
4886		full_path = build_unc_path_to_root(vol, cifs_sb, !!count);
4887		if (IS_ERR(full_path)) {
4888			rc = PTR_ERR(full_path);
4889			full_path = NULL;
4890			break;
4891		}
4892		/* Chase referral */
4893		oldmnt = cifs_sb->mountdata;
4894		rc = expand_dfs_referral(xid, root_ses, vol, cifs_sb, ref_path + 1);
4895		if (rc)
4896			break;
4897		/* Connect to new DFS target only if we were redirected */
4898		if (oldmnt != cifs_sb->mountdata) {
4899			mount_put_conns(cifs_sb, xid, server, ses, tcon);
4900			rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4901		}
4902		if (rc && !server && !ses) {
4903			/* Failed to connect. Try to connect to other targets in the referral. */
4904			rc = do_dfs_failover(ref_path + 1, full_path, cifs_sb, vol, root_ses, &xid,
4905					     &server, &ses, &tcon);
4906		}
4907		if (rc == -EACCES || rc == -EOPNOTSUPP || !server || !ses)
4908			break;
4909		if (!tcon)
4910			continue;
4911		/* Make sure that requests go through new root servers */
4912		if (is_tcon_dfs(tcon)) {
4913			put_root_ses(root_ses);
4914			set_root_ses(cifs_sb, ses, &root_ses);
4915		}
4916		/* Check for remaining path components and then continue chasing them (-EREMOTE) */
4917		rc = check_dfs_prepath(cifs_sb, vol, xid, server, tcon, &ref_path);
4918		/* Prevent recursion on broken link referrals */
4919		if (rc == -EREMOTE && ++count > MAX_NESTED_LINKS)
4920			rc = -ELOOP;
4921	} while (rc == -EREMOTE);
4922
 
 
4923	if (rc)
4924		goto error;
4925	put_root_ses(root_ses);
4926	root_ses = NULL;
4927	kfree(ref_path);
4928	ref_path = NULL;
4929	/*
4930	 * Store DFS full path in both superblock and tree connect structures.
4931	 *
4932	 * For DFS root mounts, the prefix path (cifs_sb->prepath) is preserved during reconnect so
4933	 * only the root path is set in cifs_sb->origin_fullpath and tcon->dfs_path. And for DFS
4934	 * links, the prefix path is included in both and may be changed during reconnect.  See
4935	 * cifs_tree_connect().
4936	 */
4937	cifs_sb->origin_fullpath = kstrndup(full_path, strlen(full_path), GFP_KERNEL);
4938	if (!cifs_sb->origin_fullpath) {
4939		rc = -ENOMEM;
4940		goto error;
4941	}
4942	spin_lock(&cifs_tcp_ses_lock);
4943	tcon->dfs_path = full_path;
4944	full_path = NULL;
4945	tcon->remap = cifs_remap(cifs_sb);
4946	spin_unlock(&cifs_tcp_ses_lock);
4947
4948	/* Add original volume information for DFS cache to be used when refreshing referrals */
4949	rc = dfs_cache_add_vol(mntdata, vol, cifs_sb->origin_fullpath);
4950	if (rc)
4951		goto error;
4952	/*
4953	 * After reconnecting to a different server, unique ids won't
4954	 * match anymore, so we disable serverino. This prevents
4955	 * dentry revalidation to think the dentry are stale (ESTALE).
4956	 */
4957	cifs_autodisable_serverino(cifs_sb);
4958	/*
4959	 * Force the use of prefix path to support failover on DFS paths that
4960	 * resolve to targets that have different prefix paths.
4961	 */
4962	cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
4963	kfree(cifs_sb->prepath);
4964	cifs_sb->prepath = vol->prepath;
4965	vol->prepath = NULL;
 
4966
4967out:
4968	free_xid(xid);
4969	cifs_try_adding_channels(ses);
4970	return mount_setup_tlink(cifs_sb, ses, tcon);
 
 
 
 
4971
4972error:
4973	kfree(ref_path);
4974	kfree(full_path);
4975	kfree(mntdata);
4976	kfree(cifs_sb->origin_fullpath);
4977	put_root_ses(root_ses);
4978	mount_put_conns(cifs_sb, xid, server, ses, tcon);
4979	return rc;
4980}
4981#else
4982int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4983{
4984	int rc = 0;
4985	unsigned int xid;
4986	struct cifs_ses *ses;
4987	struct cifs_tcon *tcon;
4988	struct TCP_Server_Info *server;
 
4989
4990	rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4991	if (rc)
4992		goto error;
4993
4994	if (tcon) {
4995		rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4996		if (rc == -EREMOTE)
4997			rc = -EOPNOTSUPP;
4998		if (rc)
4999			goto error;
5000	}
5001
5002	free_xid(xid);
 
 
5003
5004	return mount_setup_tlink(cifs_sb, ses, tcon);
 
5005
5006error:
5007	mount_put_conns(cifs_sb, xid, server, ses, tcon);
5008	return rc;
5009}
5010#endif
5011
5012/*
5013 * Issue a TREE_CONNECT request.
5014 */
5015int
5016CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
5017	 const char *tree, struct cifs_tcon *tcon,
5018	 const struct nls_table *nls_codepage)
5019{
5020	struct smb_hdr *smb_buffer;
5021	struct smb_hdr *smb_buffer_response;
5022	TCONX_REQ *pSMB;
5023	TCONX_RSP *pSMBr;
5024	unsigned char *bcc_ptr;
5025	int rc = 0;
5026	int length;
5027	__u16 bytes_left, count;
5028
5029	if (ses == NULL)
5030		return -EIO;
5031
5032	smb_buffer = cifs_buf_get();
5033	if (smb_buffer == NULL)
5034		return -ENOMEM;
5035
5036	smb_buffer_response = smb_buffer;
5037
5038	header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
5039			NULL /*no tid */ , 4 /*wct */ );
5040
5041	smb_buffer->Mid = get_next_mid(ses->server);
5042	smb_buffer->Uid = ses->Suid;
5043	pSMB = (TCONX_REQ *) smb_buffer;
5044	pSMBr = (TCONX_RSP *) smb_buffer_response;
5045
5046	pSMB->AndXCommand = 0xFF;
5047	pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
5048	bcc_ptr = &pSMB->Password[0];
5049	if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
5050		pSMB->PasswordLength = cpu_to_le16(1);	/* minimum */
5051		*bcc_ptr = 0; /* password is null byte */
5052		bcc_ptr++;              /* skip password */
5053		/* already aligned so no need to do it below */
5054	} else {
5055		pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
5056		/* BB FIXME add code to fail this if NTLMv2 or Kerberos
5057		   specified as required (when that support is added to
5058		   the vfs in the future) as only NTLM or the much
5059		   weaker LANMAN (which we do not send by default) is accepted
5060		   by Samba (not sure whether other servers allow
5061		   NTLMv2 password here) */
5062#ifdef CONFIG_CIFS_WEAK_PW_HASH
5063		if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
5064		    (ses->sectype == LANMAN))
5065			calc_lanman_hash(tcon->password, ses->server->cryptkey,
5066					 ses->server->sec_mode &
5067					    SECMODE_PW_ENCRYPT ? true : false,
5068					 bcc_ptr);
5069		else
5070#endif /* CIFS_WEAK_PW_HASH */
5071		rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
5072					bcc_ptr, nls_codepage);
5073		if (rc) {
5074			cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
5075				 __func__, rc);
5076			cifs_buf_release(smb_buffer);
5077			return rc;
5078		}
5079
5080		bcc_ptr += CIFS_AUTH_RESP_SIZE;
5081		if (ses->capabilities & CAP_UNICODE) {
5082			/* must align unicode strings */
5083			*bcc_ptr = 0; /* null byte password */
5084			bcc_ptr++;
5085		}
5086	}
5087
5088	if (ses->server->sign)
5089		smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
5090
5091	if (ses->capabilities & CAP_STATUS32) {
5092		smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
5093	}
5094	if (ses->capabilities & CAP_DFS) {
5095		smb_buffer->Flags2 |= SMBFLG2_DFS;
5096	}
5097	if (ses->capabilities & CAP_UNICODE) {
5098		smb_buffer->Flags2 |= SMBFLG2_UNICODE;
5099		length =
5100		    cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
5101			6 /* max utf8 char length in bytes */ *
5102			(/* server len*/ + 256 /* share len */), nls_codepage);
5103		bcc_ptr += 2 * length;	/* convert num 16 bit words to bytes */
5104		bcc_ptr += 2;	/* skip trailing null */
5105	} else {		/* ASCII */
5106		strcpy(bcc_ptr, tree);
5107		bcc_ptr += strlen(tree) + 1;
5108	}
5109	strcpy(bcc_ptr, "?????");
5110	bcc_ptr += strlen("?????");
5111	bcc_ptr += 1;
5112	count = bcc_ptr - &pSMB->Password[0];
5113	be32_add_cpu(&pSMB->hdr.smb_buf_length, count);
5114	pSMB->ByteCount = cpu_to_le16(count);
5115
5116	rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
5117			 0);
5118
5119	/* above now done in SendReceive */
5120	if (rc == 0) {
5121		bool is_unicode;
5122
5123		tcon->tidStatus = CifsGood;
5124		tcon->need_reconnect = false;
5125		tcon->tid = smb_buffer_response->Tid;
5126		bcc_ptr = pByteArea(smb_buffer_response);
5127		bytes_left = get_bcc(smb_buffer_response);
5128		length = strnlen(bcc_ptr, bytes_left - 2);
5129		if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
5130			is_unicode = true;
5131		else
5132			is_unicode = false;
5133
5134
5135		/* skip service field (NB: this field is always ASCII) */
5136		if (length == 3) {
5137			if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
5138			    (bcc_ptr[2] == 'C')) {
5139				cifs_dbg(FYI, "IPC connection\n");
5140				tcon->ipc = true;
5141				tcon->pipe = true;
5142			}
5143		} else if (length == 2) {
5144			if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
5145				/* the most common case */
5146				cifs_dbg(FYI, "disk share connection\n");
5147			}
5148		}
5149		bcc_ptr += length + 1;
5150		bytes_left -= (length + 1);
5151		strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
5152
5153		/* mostly informational -- no need to fail on error here */
5154		kfree(tcon->nativeFileSystem);
5155		tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
5156						      bytes_left, is_unicode,
5157						      nls_codepage);
5158
5159		cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
5160
5161		if ((smb_buffer_response->WordCount == 3) ||
5162			 (smb_buffer_response->WordCount == 7))
5163			/* field is in same location */
5164			tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
5165		else
5166			tcon->Flags = 0;
5167		cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
5168	}
5169
5170	cifs_buf_release(smb_buffer);
5171	return rc;
5172}
5173
5174static void delayed_free(struct rcu_head *p)
5175{
5176	struct cifs_sb_info *sbi = container_of(p, struct cifs_sb_info, rcu);
5177	unload_nls(sbi->local_nls);
5178	kfree(sbi);
 
 
5179}
5180
5181void
5182cifs_umount(struct cifs_sb_info *cifs_sb)
5183{
5184	struct rb_root *root = &cifs_sb->tlink_tree;
5185	struct rb_node *node;
5186	struct tcon_link *tlink;
5187
5188	cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
5189
5190	spin_lock(&cifs_sb->tlink_tree_lock);
5191	while ((node = rb_first(root))) {
5192		tlink = rb_entry(node, struct tcon_link, tl_rbnode);
5193		cifs_get_tlink(tlink);
5194		clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
5195		rb_erase(node, root);
5196
5197		spin_unlock(&cifs_sb->tlink_tree_lock);
5198		cifs_put_tlink(tlink);
5199		spin_lock(&cifs_sb->tlink_tree_lock);
5200	}
5201	spin_unlock(&cifs_sb->tlink_tree_lock);
5202
5203	kfree(cifs_sb->mountdata);
5204	kfree(cifs_sb->prepath);
5205#ifdef CONFIG_CIFS_DFS_UPCALL
5206	dfs_cache_del_vol(cifs_sb->origin_fullpath);
5207	kfree(cifs_sb->origin_fullpath);
5208#endif
5209	call_rcu(&cifs_sb->rcu, delayed_free);
5210}
5211
5212int
5213cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
 
5214{
5215	int rc = 0;
5216	struct TCP_Server_Info *server = cifs_ses_server(ses);
5217
5218	if (!server->ops->need_neg || !server->ops->negotiate)
5219		return -ENOSYS;
5220
5221	/* only send once per connect */
5222	if (!server->ops->need_neg(server))
 
 
 
5223		return 0;
 
 
 
5224
5225	rc = server->ops->negotiate(xid, ses);
5226	if (rc == 0) {
5227		spin_lock(&GlobalMid_Lock);
5228		if (server->tcpStatus == CifsNeedNegotiate)
5229			server->tcpStatus = CifsGood;
5230		else
5231			rc = -EHOSTDOWN;
5232		spin_unlock(&GlobalMid_Lock);
 
 
 
 
 
5233	}
5234
5235	return rc;
5236}
5237
5238int
5239cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
 
5240		   struct nls_table *nls_info)
5241{
5242	int rc = -ENOSYS;
5243	struct TCP_Server_Info *server = cifs_ses_server(ses);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5244
5245	if (!ses->binding) {
5246		ses->capabilities = server->capabilities;
5247		if (linuxExtEnabled == 0)
5248			ses->capabilities &= (~server->vals->cap_unix);
5249
5250		if (ses->auth_key.response) {
5251			cifs_dbg(FYI, "Free previous auth_key.response = %p\n",
5252				 ses->auth_key.response);
5253			kfree(ses->auth_key.response);
5254			ses->auth_key.response = NULL;
5255			ses->auth_key.len = 0;
5256		}
5257	}
5258
5259	cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
5260		 server->sec_mode, server->capabilities, server->timeAdj);
5261
5262	if (server->ops->sess_setup)
5263		rc = server->ops->sess_setup(xid, ses, nls_info);
5264
5265	if (rc)
5266		cifs_server_dbg(VFS, "Send error in SessSetup = %d\n", rc);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5267
5268	return rc;
5269}
5270
5271static int
5272cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
5273{
5274	vol->sectype = ses->sectype;
5275
5276	/* krb5 is special, since we don't need username or pw */
5277	if (vol->sectype == Kerberos)
5278		return 0;
5279
5280	return cifs_set_cifscreds(vol, ses);
5281}
5282
5283static struct cifs_tcon *
5284cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
5285{
5286	int rc;
5287	struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
5288	struct cifs_ses *ses;
5289	struct cifs_tcon *tcon = NULL;
5290	struct smb_vol *vol_info;
5291
5292	vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
5293	if (vol_info == NULL)
5294		return ERR_PTR(-ENOMEM);
5295
5296	vol_info->local_nls = cifs_sb->local_nls;
5297	vol_info->linux_uid = fsuid;
5298	vol_info->cred_uid = fsuid;
5299	vol_info->UNC = master_tcon->treeName;
5300	vol_info->retry = master_tcon->retry;
5301	vol_info->nocase = master_tcon->nocase;
5302	vol_info->nohandlecache = master_tcon->nohandlecache;
5303	vol_info->local_lease = master_tcon->local_lease;
5304	vol_info->no_lease = master_tcon->no_lease;
5305	vol_info->resilient = master_tcon->use_resilient;
5306	vol_info->persistent = master_tcon->use_persistent;
5307	vol_info->handle_timeout = master_tcon->handle_timeout;
5308	vol_info->no_linux_ext = !master_tcon->unix_ext;
5309	vol_info->linux_ext = master_tcon->posix_extensions;
5310	vol_info->sectype = master_tcon->ses->sectype;
5311	vol_info->sign = master_tcon->ses->sign;
5312	vol_info->seal = master_tcon->seal;
 
5313
5314	rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
5315	if (rc) {
5316		tcon = ERR_PTR(rc);
5317		goto out;
5318	}
5319
5320	/* get a reference for the same TCP session */
5321	spin_lock(&cifs_tcp_ses_lock);
5322	++master_tcon->ses->server->srv_count;
5323	spin_unlock(&cifs_tcp_ses_lock);
5324
5325	ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
5326	if (IS_ERR(ses)) {
5327		tcon = (struct cifs_tcon *)ses;
5328		cifs_put_tcp_session(master_tcon->ses->server, 0);
5329		goto out;
5330	}
5331
5332	tcon = cifs_get_tcon(ses, vol_info);
5333	if (IS_ERR(tcon)) {
5334		cifs_put_smb_ses(ses);
5335		goto out;
5336	}
5337
 
5338	if (cap_unix(ses))
5339		reset_cifs_unix_caps(0, tcon, NULL, vol_info);
 
5340
5341out:
5342	kfree(vol_info->username);
5343	kfree_sensitive(vol_info->password);
5344	kfree(vol_info);
5345
5346	return tcon;
5347}
5348
5349struct cifs_tcon *
5350cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
5351{
5352	return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
5353}
5354
5355/* find and return a tlink with given uid */
5356static struct tcon_link *
5357tlink_rb_search(struct rb_root *root, kuid_t uid)
5358{
5359	struct rb_node *node = root->rb_node;
5360	struct tcon_link *tlink;
5361
5362	while (node) {
5363		tlink = rb_entry(node, struct tcon_link, tl_rbnode);
5364
5365		if (uid_gt(tlink->tl_uid, uid))
5366			node = node->rb_left;
5367		else if (uid_lt(tlink->tl_uid, uid))
5368			node = node->rb_right;
5369		else
5370			return tlink;
5371	}
5372	return NULL;
5373}
5374
5375/* insert a tcon_link into the tree */
5376static void
5377tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
5378{
5379	struct rb_node **new = &(root->rb_node), *parent = NULL;
5380	struct tcon_link *tlink;
5381
5382	while (*new) {
5383		tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
5384		parent = *new;
5385
5386		if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
5387			new = &((*new)->rb_left);
5388		else
5389			new = &((*new)->rb_right);
5390	}
5391
5392	rb_link_node(&new_tlink->tl_rbnode, parent, new);
5393	rb_insert_color(&new_tlink->tl_rbnode, root);
5394}
5395
5396/*
5397 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
5398 * current task.
5399 *
5400 * If the superblock doesn't refer to a multiuser mount, then just return
5401 * the master tcon for the mount.
5402 *
5403 * First, search the rbtree for an existing tcon for this fsuid. If one
5404 * exists, then check to see if it's pending construction. If it is then wait
5405 * for construction to complete. Once it's no longer pending, check to see if
5406 * it failed and either return an error or retry construction, depending on
5407 * the timeout.
5408 *
5409 * If one doesn't exist then insert a new tcon_link struct into the tree and
5410 * try to construct a new one.
5411 */
5412struct tcon_link *
5413cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
5414{
5415	int ret;
5416	kuid_t fsuid = current_fsuid();
5417	struct tcon_link *tlink, *newtlink;
5418
5419	if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
5420		return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
5421
5422	spin_lock(&cifs_sb->tlink_tree_lock);
5423	tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5424	if (tlink)
5425		cifs_get_tlink(tlink);
5426	spin_unlock(&cifs_sb->tlink_tree_lock);
5427
5428	if (tlink == NULL) {
5429		newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
5430		if (newtlink == NULL)
5431			return ERR_PTR(-ENOMEM);
5432		newtlink->tl_uid = fsuid;
5433		newtlink->tl_tcon = ERR_PTR(-EACCES);
5434		set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
5435		set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
5436		cifs_get_tlink(newtlink);
5437
5438		spin_lock(&cifs_sb->tlink_tree_lock);
5439		/* was one inserted after previous search? */
5440		tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5441		if (tlink) {
5442			cifs_get_tlink(tlink);
5443			spin_unlock(&cifs_sb->tlink_tree_lock);
5444			kfree(newtlink);
5445			goto wait_for_construction;
5446		}
5447		tlink = newtlink;
5448		tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
5449		spin_unlock(&cifs_sb->tlink_tree_lock);
5450	} else {
5451wait_for_construction:
5452		ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
5453				  TASK_INTERRUPTIBLE);
5454		if (ret) {
5455			cifs_put_tlink(tlink);
5456			return ERR_PTR(-ERESTARTSYS);
5457		}
5458
5459		/* if it's good, return it */
5460		if (!IS_ERR(tlink->tl_tcon))
5461			return tlink;
5462
5463		/* return error if we tried this already recently */
5464		if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
5465			cifs_put_tlink(tlink);
5466			return ERR_PTR(-EACCES);
5467		}
5468
5469		if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
5470			goto wait_for_construction;
5471	}
5472
5473	tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
5474	clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
5475	wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
5476
5477	if (IS_ERR(tlink->tl_tcon)) {
5478		cifs_put_tlink(tlink);
5479		return ERR_PTR(-EACCES);
5480	}
5481
5482	return tlink;
5483}
5484
5485/*
5486 * periodic workqueue job that scans tcon_tree for a superblock and closes
5487 * out tcons.
5488 */
5489static void
5490cifs_prune_tlinks(struct work_struct *work)
5491{
5492	struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
5493						    prune_tlinks.work);
5494	struct rb_root *root = &cifs_sb->tlink_tree;
5495	struct rb_node *node;
5496	struct rb_node *tmp;
5497	struct tcon_link *tlink;
5498
5499	/*
5500	 * Because we drop the spinlock in the loop in order to put the tlink
5501	 * it's not guarded against removal of links from the tree. The only
5502	 * places that remove entries from the tree are this function and
5503	 * umounts. Because this function is non-reentrant and is canceled
5504	 * before umount can proceed, this is safe.
5505	 */
5506	spin_lock(&cifs_sb->tlink_tree_lock);
5507	node = rb_first(root);
5508	while (node != NULL) {
5509		tmp = node;
5510		node = rb_next(tmp);
5511		tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
5512
5513		if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
5514		    atomic_read(&tlink->tl_count) != 0 ||
5515		    time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
5516			continue;
5517
5518		cifs_get_tlink(tlink);
5519		clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
5520		rb_erase(tmp, root);
5521
5522		spin_unlock(&cifs_sb->tlink_tree_lock);
5523		cifs_put_tlink(tlink);
5524		spin_lock(&cifs_sb->tlink_tree_lock);
5525	}
5526	spin_unlock(&cifs_sb->tlink_tree_lock);
5527
5528	queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
5529				TLINK_IDLE_EXPIRE);
5530}
5531
5532#ifdef CONFIG_CIFS_DFS_UPCALL
5533int cifs_tree_connect(const unsigned int xid, struct cifs_tcon *tcon, const struct nls_table *nlsc)
5534{
5535	int rc;
5536	struct TCP_Server_Info *server = tcon->ses->server;
5537	const struct smb_version_operations *ops = server->ops;
5538	struct dfs_cache_tgt_list tl;
5539	struct dfs_cache_tgt_iterator *it = NULL;
5540	char *tree;
5541	const char *tcp_host;
5542	size_t tcp_host_len;
5543	const char *dfs_host;
5544	size_t dfs_host_len;
5545	char *share = NULL, *prefix = NULL;
5546	struct dfs_info3_param ref = {0};
5547	bool isroot;
5548
5549	tree = kzalloc(MAX_TREE_SIZE, GFP_KERNEL);
5550	if (!tree)
5551		return -ENOMEM;
5552
5553	if (!tcon->dfs_path) {
5554		if (tcon->ipc) {
5555			scnprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$", server->hostname);
5556			rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
5557		} else {
5558			rc = ops->tree_connect(xid, tcon->ses, tcon->treeName, tcon, nlsc);
5559		}
5560		goto out;
5561	}
 
 
5562
5563	rc = dfs_cache_noreq_find(tcon->dfs_path + 1, &ref, &tl);
5564	if (rc)
5565		goto out;
5566	isroot = ref.server_type == DFS_TYPE_ROOT;
5567	free_dfs_info_param(&ref);
5568
5569	extract_unc_hostname(server->hostname, &tcp_host, &tcp_host_len);
5570
5571	for (it = dfs_cache_get_tgt_iterator(&tl); it; it = dfs_cache_get_next_tgt(&tl, it)) {
5572		bool target_match;
5573
5574		kfree(share);
5575		kfree(prefix);
5576		share = NULL;
5577		prefix = NULL;
5578
5579		rc = dfs_cache_get_tgt_share(tcon->dfs_path + 1, it, &share, &prefix);
5580		if (rc) {
5581			cifs_dbg(VFS, "%s: failed to parse target share %d\n",
5582				 __func__, rc);
5583			continue;
5584		}
5585
5586		extract_unc_hostname(share, &dfs_host, &dfs_host_len);
5587
5588		if (dfs_host_len != tcp_host_len
5589		    || strncasecmp(dfs_host, tcp_host, dfs_host_len) != 0) {
5590			cifs_dbg(FYI, "%s: %.*s doesn't match %.*s\n", __func__, (int)dfs_host_len,
5591				 dfs_host, (int)tcp_host_len, tcp_host);
5592
5593			rc = match_target_ip(server, dfs_host, dfs_host_len, &target_match);
5594			if (rc) {
5595				cifs_dbg(VFS, "%s: failed to match target ip: %d\n", __func__, rc);
5596				break;
5597			}
5598
5599			if (!target_match) {
5600				cifs_dbg(FYI, "%s: skipping target\n", __func__);
5601				continue;
5602			}
5603		}
5604
5605		if (tcon->ipc) {
5606			scnprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$", share);
5607			rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
5608		} else {
5609			scnprintf(tree, MAX_TREE_SIZE, "\\%s", share);
5610			rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
5611			/* Only handle prefix paths of DFS link targets */
5612			if (!rc && !isroot) {
5613				rc = update_super_prepath(tcon, prefix);
5614				break;
5615			}
5616		}
5617		if (rc == -EREMOTE)
5618			break;
5619	}
5620
5621	kfree(share);
5622	kfree(prefix);
5623
5624	if (!rc) {
5625		if (it)
5626			rc = dfs_cache_noreq_update_tgthint(tcon->dfs_path + 1, it);
5627		else
5628			rc = -ENOENT;
5629	}
5630	dfs_cache_free_tgts(&tl);
5631out:
5632	kfree(tree);
5633	return rc;
5634}
5635#else
5636int cifs_tree_connect(const unsigned int xid, struct cifs_tcon *tcon, const struct nls_table *nlsc)
5637{
5638	const struct smb_version_operations *ops = tcon->ses->server->ops;
5639
5640	return ops->tree_connect(xid, tcon->ses, tcon->treeName, tcon, nlsc);
5641}
5642#endif