Linux Audio

Check our new training course

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