cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

connect.c (127426B)


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