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