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