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