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}
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}