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