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