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