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