]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blob - 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
1 /*
2 * fs/cifs/connect.c
3 *
4 * Copyright (C) International Business Machines Corp., 2002,2011
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
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21 #include <linux/fs.h>
22 #include <linux/net.h>
23 #include <linux/string.h>
24 #include <linux/sched/signal.h>
25 #include <linux/list.h>
26 #include <linux/wait.h>
27 #include <linux/slab.h>
28 #include <linux/pagemap.h>
29 #include <linux/ctype.h>
30 #include <linux/utsname.h>
31 #include <linux/mempool.h>
32 #include <linux/delay.h>
33 #include <linux/completion.h>
34 #include <linux/kthread.h>
35 #include <linux/pagevec.h>
36 #include <linux/freezer.h>
37 #include <linux/namei.h>
38 #include <linux/uuid.h>
39 #include <linux/uaccess.h>
40 #include <asm/processor.h>
41 #include <linux/inet.h>
42 #include <linux/module.h>
43 #include <keys/user-type.h>
44 #include <net/ipv6.h>
45 #include <linux/parser.h>
46 #include <linux/bvec.h>
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"
56 #include "fscache.h"
57 #include "smb2proto.h"
58 #include "smbdirect.h"
59 #include "dns_resolve.h"
60 #include "cifsfs.h"
61 #ifdef CONFIG_CIFS_DFS_UPCALL
62 #include "dfs_cache.h"
63 #endif
64
65 extern mempool_t *cifs_req_poolp;
66 extern bool disable_legacy_dialects;
67
68 /* FIXME: should these be tunable? */
69 #define TLINK_ERROR_EXPIRE (1 * HZ)
70 #define TLINK_IDLE_EXPIRE (600 * HZ)
71
72 enum {
73 /* Mount options that take no arguments */
74 Opt_user_xattr, Opt_nouser_xattr,
75 Opt_forceuid, Opt_noforceuid,
76 Opt_forcegid, Opt_noforcegid,
77 Opt_noblocksend, Opt_noautotune, Opt_nolease,
78 Opt_hard, Opt_soft, Opt_perm, Opt_noperm,
79 Opt_mapposix, Opt_nomapposix,
80 Opt_mapchars, Opt_nomapchars, Opt_sfu,
81 Opt_nosfu, Opt_nodfs, Opt_posixpaths,
82 Opt_noposixpaths, Opt_nounix, Opt_unix,
83 Opt_nocase,
84 Opt_brl, Opt_nobrl,
85 Opt_handlecache, Opt_nohandlecache,
86 Opt_forcemandatorylock, Opt_setuidfromacl, Opt_setuids,
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,
94 Opt_sign, Opt_ignore_signature, Opt_seal, Opt_noac,
95 Opt_fsc, Opt_mfsymlinks,
96 Opt_multiuser, Opt_sloppy, Opt_nosharesock,
97 Opt_persistent, Opt_nopersistent,
98 Opt_resilient, Opt_noresilient,
99 Opt_domainauto, Opt_rdma, Opt_modesid, Opt_rootfs,
100 Opt_multichannel, Opt_nomultichannel,
101 Opt_compress,
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,
107 Opt_min_enc_offload,
108 Opt_blocksize, Opt_rsize, Opt_wsize, Opt_actimeo,
109 Opt_echo_interval, Opt_max_credits, Opt_handletimeout,
110 Opt_snapshot, Opt_max_channels,
111
112 /* Mount options which take string value */
113 Opt_user, Opt_pass, Opt_ip,
114 Opt_domain, Opt_srcaddr, Opt_iocharset,
115 Opt_netbiosname, Opt_servern,
116 Opt_ver, Opt_vers, Opt_sec, Opt_cache,
117
118 /* Mount options to be ignored */
119 Opt_ignore,
120
121 /* Options which could be blank */
122 Opt_blank_pass,
123 Opt_blank_user,
124 Opt_blank_ip,
125
126 Opt_err
127 };
128
129 static 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" },
135 { Opt_forcegid, "forcegid" },
136 { Opt_noforcegid, "noforcegid" },
137 { Opt_noblocksend, "noblocksend" },
138 { Opt_noautotune, "noautotune" },
139 { Opt_nolease, "nolease" },
140 { Opt_hard, "hard" },
141 { Opt_soft, "soft" },
142 { Opt_perm, "perm" },
143 { Opt_noperm, "noperm" },
144 { Opt_mapchars, "mapchars" }, /* SFU style */
145 { Opt_nomapchars, "nomapchars" },
146 { Opt_mapposix, "mapposix" }, /* SFM style */
147 { Opt_nomapposix, "nomapposix" },
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" },
155 { Opt_nounix, "noposix" },
156 { Opt_unix, "unix" },
157 { Opt_unix, "linux" },
158 { Opt_unix, "posix" },
159 { Opt_nocase, "nocase" },
160 { Opt_nocase, "ignorecase" },
161 { Opt_brl, "brl" },
162 { Opt_nobrl, "nobrl" },
163 { Opt_handlecache, "handlecache" },
164 { Opt_nohandlecache, "nohandlecache" },
165 { Opt_nobrl, "nolock" },
166 { Opt_forcemandatorylock, "forcemandatorylock" },
167 { Opt_forcemandatorylock, "forcemand" },
168 { Opt_setuids, "setuids" },
169 { Opt_nosetuids, "nosetuids" },
170 { Opt_setuidfromacl, "idsfromsid" },
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" },
182 { Opt_modesid, "modefromsid" },
183 { Opt_cifsacl, "cifsacl" },
184 { Opt_nocifsacl, "nocifsacl" },
185 { Opt_acl, "acl" },
186 { Opt_noacl, "noacl" },
187 { Opt_locallease, "locallease" },
188 { Opt_sign, "sign" },
189 { Opt_ignore_signature, "signloosely" },
190 { Opt_seal, "seal" },
191 { Opt_noac, "noac" },
192 { Opt_fsc, "fsc" },
193 { Opt_mfsymlinks, "mfsymlinks" },
194 { Opt_multiuser, "multiuser" },
195 { Opt_sloppy, "sloppy" },
196 { Opt_nosharesock, "nosharesock" },
197 { Opt_persistent, "persistenthandles"},
198 { Opt_nopersistent, "nopersistenthandles"},
199 { Opt_resilient, "resilienthandles"},
200 { Opt_noresilient, "noresilienthandles"},
201 { Opt_domainauto, "domainauto"},
202 { Opt_rdma, "rdma"},
203 { Opt_multichannel, "multichannel" },
204 { Opt_nomultichannel, "nomultichannel" },
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" },
215 { Opt_min_enc_offload, "esize=%s" },
216 { Opt_blocksize, "bsize=%s" },
217 { Opt_rsize, "rsize=%s" },
218 { Opt_wsize, "wsize=%s" },
219 { Opt_actimeo, "actimeo=%s" },
220 { Opt_handletimeout, "handletimeout=%s" },
221 { Opt_echo_interval, "echo_interval=%s" },
222 { Opt_max_credits, "max_credits=%s" },
223 { Opt_snapshot, "snapshot=%s" },
224 { Opt_max_channels, "max_channels=%s" },
225 { Opt_compress, "compress=%s" },
226
227 { Opt_blank_user, "user=" },
228 { Opt_blank_user, "username=" },
229 { Opt_user, "user=%s" },
230 { Opt_user, "username=%s" },
231 { Opt_blank_pass, "pass=" },
232 { Opt_blank_pass, "password=" },
233 { Opt_pass, "pass=%s" },
234 { Opt_pass, "password=%s" },
235 { Opt_blank_ip, "ip=" },
236 { Opt_blank_ip, "addr=" },
237 { Opt_ip, "ip=%s" },
238 { Opt_ip, "addr=%s" },
239 { Opt_ignore, "unc=%s" },
240 { Opt_ignore, "target=%s" },
241 { Opt_ignore, "path=%s" },
242 { Opt_domain, "dom=%s" },
243 { Opt_domain, "domain=%s" },
244 { Opt_domain, "workgroup=%s" },
245 { Opt_srcaddr, "srcaddr=%s" },
246 { Opt_ignore, "prefixpath=%s" },
247 { Opt_iocharset, "iocharset=%s" },
248 { Opt_netbiosname, "netbiosname=%s" },
249 { Opt_servern, "servern=%s" },
250 { Opt_ver, "ver=%s" },
251 { Opt_vers, "vers=%s" },
252 { Opt_sec, "sec=%s" },
253 { Opt_cache, "cache=%s" },
254
255 { Opt_ignore, "cred" },
256 { Opt_ignore, "credentials" },
257 { Opt_ignore, "cred=%s" },
258 { Opt_ignore, "credentials=%s" },
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" },
271 { Opt_ignore, "relatime" },
272 { Opt_ignore, "_netdev" },
273 { Opt_rootfs, "rootfs" },
274
275 { Opt_err, NULL }
276 };
277
278 enum {
279 Opt_sec_krb5, Opt_sec_krb5i, Opt_sec_krb5p,
280 Opt_sec_ntlmsspi, Opt_sec_ntlmssp,
281 Opt_ntlm, Opt_sec_ntlmi, Opt_sec_ntlmv2,
282 Opt_sec_ntlmv2i, Opt_sec_lanman,
283 Opt_sec_none,
284
285 Opt_sec_err
286 };
287
288 static 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" },
296 { Opt_sec_ntlmv2, "nontlm" },
297 { Opt_sec_ntlmv2, "ntlmv2" },
298 { Opt_sec_ntlmv2i, "ntlmv2i" },
299 { Opt_sec_lanman, "lanman" },
300 { Opt_sec_none, "none" },
301
302 { Opt_sec_err, NULL }
303 };
304
305 /* cache flavors */
306 enum {
307 Opt_cache_loose,
308 Opt_cache_strict,
309 Opt_cache_none,
310 Opt_cache_ro,
311 Opt_cache_rw,
312 Opt_cache_err
313 };
314
315 static const match_table_t cifs_cacheflavor_tokens = {
316 { Opt_cache_loose, "loose" },
317 { Opt_cache_strict, "strict" },
318 { Opt_cache_none, "none" },
319 { Opt_cache_ro, "ro" },
320 { Opt_cache_rw, "singleclient" },
321 { Opt_cache_err, NULL }
322 };
323
324 static const match_table_t cifs_smb_version_tokens = {
325 { Smb_1, SMB1_VERSION_STRING },
326 { Smb_20, SMB20_VERSION_STRING},
327 { Smb_21, SMB21_VERSION_STRING },
328 { Smb_30, SMB30_VERSION_STRING },
329 { Smb_302, SMB302_VERSION_STRING },
330 { Smb_302, ALT_SMB302_VERSION_STRING },
331 { Smb_311, SMB311_VERSION_STRING },
332 { Smb_311, ALT_SMB311_VERSION_STRING },
333 { Smb_3any, SMB3ANY_VERSION_STRING },
334 { Smb_default, SMBDEFAULT_VERSION_STRING },
335 { Smb_version_err, NULL }
336 };
337
338 static int ip_connect(struct TCP_Server_Info *server);
339 static int generic_ip_connect(struct TCP_Server_Info *server);
340 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
341 static void cifs_prune_tlinks(struct work_struct *work);
342 static char *extract_hostname(const char *unc);
343
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
351 static 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 }
367 scnprintf(unc, len, "\\\\%s", server->hostname);
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
385 static inline int reconn_set_ipaddr(struct TCP_Server_Info *server)
386 {
387 return 0;
388 }
389 #endif
390
391 #ifdef CONFIG_CIFS_DFS_UPCALL
392 struct super_cb_data {
393 struct TCP_Server_Info *server;
394 struct super_block *sb;
395 };
396
397 /* These functions must be called with server->srv_mutex held */
398
399 static 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
405 if (d->sb)
406 return;
407
408 cifs_sb = CIFS_SB(sb);
409 tcon = cifs_sb_master_tcon(cifs_sb);
410 if (tcon->ses->server == d->server)
411 d->sb = sb;
412 }
413
414 static struct super_block *get_tcp_super(struct TCP_Server_Info *server)
415 {
416 struct super_cb_data d = {
417 .server = server,
418 .sb = NULL,
419 };
420
421 iterate_supers_type(&cifs_fs_type, super_cb, &d);
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
434 static inline void put_tcp_super(struct super_block *sb)
435 {
436 if (!IS_ERR_OR_NULL(sb))
437 cifs_sb_deactive(sb);
438 }
439
440 static 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;
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);
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));
470 }
471 }
472
473 static 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
482
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 */
491 int
492 cifs_reconnect(struct TCP_Server_Info *server)
493 {
494 int rc = 0;
495 struct list_head *tmp, *tmp2;
496 struct cifs_ses *ses;
497 struct cifs_tcon *tcon;
498 struct mid_q_entry *mid_entry;
499 struct list_head retry_list;
500 #ifdef CONFIG_CIFS_DFS_UPCALL
501 struct super_block *sb = NULL;
502 struct cifs_sb_info *cifs_sb = NULL;
503 struct dfs_cache_tgt_list tgt_list = {0};
504 struct dfs_cache_tgt_iterator *tgt_it = NULL;
505 #endif
506
507 spin_lock(&GlobalMid_Lock);
508 server->nr_targets = 1;
509 #ifdef CONFIG_CIFS_DFS_UPCALL
510 spin_unlock(&GlobalMid_Lock);
511 sb = get_tcp_super(server);
512 if (IS_ERR(sb)) {
513 rc = PTR_ERR(sb);
514 cifs_dbg(FYI, "%s: will not do DFS failover: rc = %d\n",
515 __func__, rc);
516 sb = NULL;
517 } else {
518 cifs_sb = CIFS_SB(sb);
519
520 rc = reconn_setup_dfs_targets(cifs_sb, &tgt_list, &tgt_it);
521 if (rc && (rc != -EOPNOTSUPP)) {
522 cifs_server_dbg(VFS, "%s: no target servers for DFS failover\n",
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);
530 spin_lock(&GlobalMid_Lock);
531 #endif
532 if (server->tcpStatus == CifsExiting) {
533 /* the demux thread will exit normally
534 next time through the loop */
535 spin_unlock(&GlobalMid_Lock);
536 #ifdef CONFIG_CIFS_DFS_UPCALL
537 dfs_cache_free_tgts(&tgt_list);
538 put_tcp_super(sb);
539 #endif
540 return rc;
541 } else
542 server->tcpStatus = CifsNeedReconnect;
543 spin_unlock(&GlobalMid_Lock);
544 server->maxBuf = 0;
545 server->max_read = 0;
546
547 cifs_dbg(FYI, "Mark tcp session as need reconnect\n");
548 trace_smb3_reconnect(server->CurrentMid, server->hostname);
549
550 /* before reconnecting the tcp session, mark the smb session (uid)
551 and the tid bad so they are not used until reconnected */
552 cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
553 __func__);
554 spin_lock(&cifs_tcp_ses_lock);
555 list_for_each(tmp, &server->smb_ses_list) {
556 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
557 ses->need_reconnect = true;
558 list_for_each(tmp2, &ses->tcon_list) {
559 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
560 tcon->need_reconnect = true;
561 }
562 if (ses->tcon_ipc)
563 ses->tcon_ipc->need_reconnect = true;
564 }
565 spin_unlock(&cifs_tcp_ses_lock);
566
567 /* do not want to be sending data on a socket we are freeing */
568 cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
569 mutex_lock(&server->srv_mutex);
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;
585
586 /* mark submitted MIDs for retry and issue callback */
587 INIT_LIST_HEAD(&retry_list);
588 cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
589 spin_lock(&GlobalMid_Lock);
590 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
591 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
592 kref_get(&mid_entry->refcount);
593 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
594 mid_entry->mid_state = MID_RETRY_NEEDED;
595 list_move(&mid_entry->qhead, &retry_list);
596 mid_entry->mid_flags |= MID_DELETED;
597 }
598 spin_unlock(&GlobalMid_Lock);
599 mutex_unlock(&server->srv_mutex);
600
601 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
602 list_for_each_safe(tmp, tmp2, &retry_list) {
603 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
604 list_del_init(&mid_entry->qhead);
605 mid_entry->callback(mid_entry);
606 cifs_mid_q_entry_release(mid_entry);
607 }
608
609 if (cifs_rdma_enabled(server)) {
610 mutex_lock(&server->srv_mutex);
611 smbd_destroy(server);
612 mutex_unlock(&server->srv_mutex);
613 }
614
615 do {
616 try_to_freeze();
617
618 mutex_lock(&server->srv_mutex);
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 */
624 if (cifs_rdma_enabled(server))
625 rc = smbd_reconnect(server);
626 else
627 rc = generic_ip_connect(server);
628 if (rc) {
629 cifs_dbg(FYI, "reconnect error %d\n", rc);
630 #ifdef CONFIG_CIFS_DFS_UPCALL
631 reconn_inval_dfs_target(server, cifs_sb, &tgt_list,
632 &tgt_it);
633 #endif
634 rc = reconn_set_ipaddr(server);
635 if (rc) {
636 cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
637 __func__, rc);
638 }
639 mutex_unlock(&server->srv_mutex);
640 msleep(3000);
641 } else {
642 atomic_inc(&tcpSesReconnectCount);
643 set_credits(server, 1);
644 spin_lock(&GlobalMid_Lock);
645 if (server->tcpStatus != CifsExiting)
646 server->tcpStatus = CifsNeedNegotiate;
647 spin_unlock(&GlobalMid_Lock);
648 mutex_unlock(&server->srv_mutex);
649 }
650 } while (server->tcpStatus == CifsNeedReconnect);
651
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) {
657 cifs_server_dbg(VFS, "%s: failed to update DFS target hint: rc = %d\n",
658 __func__, rc);
659 }
660 rc = dfs_cache_update_vol(cifs_sb->origin_fullpath, server);
661 if (rc) {
662 cifs_server_dbg(VFS, "%s: failed to update vol info in DFS cache: rc = %d\n",
663 __func__, rc);
664 }
665 dfs_cache_free_tgts(&tgt_list);
666
667 }
668
669 put_tcp_super(sb);
670 #endif
671 if (server->tcpStatus == CifsNeedNegotiate)
672 mod_delayed_work(cifsiod_wq, &server->echo, 0);
673
674 return rc;
675 }
676
677 static void
678 cifs_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);
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;
693
694 /*
695 * We cannot send an echo if it is disabled.
696 * Also, no need to ping if we got a response recently.
697 */
698
699 if (server->tcpStatus == CifsNeedReconnect ||
700 server->tcpStatus == CifsExiting ||
701 server->tcpStatus == CifsNew ||
702 (server->ops->can_echo && !server->ops->can_echo(server)) ||
703 time_before(jiffies, server->lstrp + echo_interval - HZ))
704 goto requeue_echo;
705
706 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
707 if (rc)
708 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
709 server->hostname);
710
711 requeue_echo:
712 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
713 }
714
715 static bool
716 allocate_buffers(struct TCP_Server_Info *server)
717 {
718 if (!server->bigbuf) {
719 server->bigbuf = (char *)cifs_buf_get();
720 if (!server->bigbuf) {
721 cifs_server_dbg(VFS, "No memory for large SMB response\n");
722 msleep(3000);
723 /* retry will check if exiting */
724 return false;
725 }
726 } else if (server->large_buf) {
727 /* we are reusing a dirty large buf, clear its start */
728 memset(server->bigbuf, 0, HEADER_SIZE(server));
729 }
730
731 if (!server->smallbuf) {
732 server->smallbuf = (char *)cifs_small_buf_get();
733 if (!server->smallbuf) {
734 cifs_server_dbg(VFS, "No memory for SMB response\n");
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 */
742 memset(server->smallbuf, 0, HEADER_SIZE(server));
743 }
744
745 return true;
746 }
747
748 static bool
749 server_unresponsive(struct TCP_Server_Info *server)
750 {
751 /*
752 * We need to wait 3 echo intervals to make sure we handle such
753 * situations right:
754 * 1s client sends a normal SMB request
755 * 2s client gets a response
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 */
762 if ((server->tcpStatus == CifsGood ||
763 server->tcpStatus == CifsNeedNegotiate) &&
764 time_after(jiffies, server->lstrp + 3 * server->echo_interval)) {
765 cifs_server_dbg(VFS, "has not responded in %lu seconds. Reconnecting...\n",
766 (3 * server->echo_interval) / HZ);
767 cifs_reconnect(server);
768 wake_up(&server->response_q);
769 return true;
770 }
771
772 return false;
773 }
774
775 static inline bool
776 zero_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
790 static int
791 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
792 {
793 int length = 0;
794 int total_read;
795
796 smb_msg->msg_control = NULL;
797 smb_msg->msg_controllen = 0;
798
799 for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
800 try_to_freeze();
801
802 /* reconnect if no credits and no requests in flight */
803 if (zero_credits(server)) {
804 cifs_reconnect(server);
805 return -ECONNABORTED;
806 }
807
808 if (server_unresponsive(server))
809 return -ECONNABORTED;
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);
814
815 if (server->tcpStatus == CifsExiting)
816 return -ESHUTDOWN;
817
818 if (server->tcpStatus == CifsNeedReconnect) {
819 cifs_reconnect(server);
820 return -ECONNABORTED;
821 }
822
823 if (length == -ERESTARTSYS ||
824 length == -EAGAIN ||
825 length == -EINTR) {
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;
833 continue;
834 }
835
836 if (length <= 0) {
837 cifs_dbg(FYI, "Received no data or error: %d\n", length);
838 cifs_reconnect(server);
839 return -ECONNABORTED;
840 }
841 }
842 return total_read;
843 }
844
845 int
846 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
847 unsigned int to_read)
848 {
849 struct msghdr smb_msg;
850 struct kvec iov = {.iov_base = buf, .iov_len = to_read};
851 iov_iter_kvec(&smb_msg.msg_iter, READ, &iov, 1, to_read);
852
853 return cifs_readv_from_socket(server, &smb_msg);
854 }
855
856 int
857 cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
858 unsigned int page_offset, unsigned int to_read)
859 {
860 struct msghdr smb_msg;
861 struct bio_vec bv = {
862 .bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
863 iov_iter_bvec(&smb_msg.msg_iter, READ, &bv, 1, to_read);
864 return cifs_readv_from_socket(server, &smb_msg);
865 }
866
867 static bool
868 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
869 {
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 */
875 switch (type) {
876 case RFC1002_SESSION_MESSAGE:
877 /* Regular SMB response */
878 return true;
879 case RFC1002_SESSION_KEEP_ALIVE:
880 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
881 break;
882 case RFC1002_POSITIVE_SESSION_RESPONSE:
883 cifs_dbg(FYI, "RFC 1002 positive session response\n");
884 break;
885 case RFC1002_NEGATIVE_SESSION_RESPONSE:
886 /*
887 * We get this from Windows 98 instead of an error on
888 * SMB negprot response.
889 */
890 cifs_dbg(FYI, "RFC 1002 negative session response\n");
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 */
899 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
900 cifs_reconnect(server);
901 wake_up(&server->response_q);
902 break;
903 default:
904 cifs_server_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
905 cifs_reconnect(server);
906 }
907
908 return false;
909 }
910
911 void
912 dequeue_mid(struct mid_q_entry *mid, bool malformed)
913 {
914 #ifdef CONFIG_CIFS_STATS2
915 mid->when_received = jiffies;
916 #endif
917 spin_lock(&GlobalMid_Lock);
918 if (!malformed)
919 mid->mid_state = MID_RESPONSE_RECEIVED;
920 else
921 mid->mid_state = MID_RESPONSE_MALFORMED;
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");
929 else {
930 list_del_init(&mid->qhead);
931 mid->mid_flags |= MID_DELETED;
932 }
933 spin_unlock(&GlobalMid_Lock);
934 }
935
936 static unsigned int
937 smb2_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
950 static void
951 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
952 char *buf, int malformed)
953 {
954 if (server->ops->check_trans2 &&
955 server->ops->check_trans2(mid, server, buf, malformed))
956 return;
957 mid->credits_received = smb2_get_credits_from_hdr(buf, server);
958 mid->resp_buf = buf;
959 mid->large_buf = server->large_buf;
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 }
968 dequeue_mid(mid, malformed);
969 }
970
971 static 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
985 /* check if we have blocked requests that need to free */
986 spin_lock(&server->req_lock);
987 if (server->credits <= 0)
988 server->credits = 1;
989 spin_unlock(&server->req_lock);
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);
1000 if (cifs_rdma_enabled(server))
1001 smbd_destroy(server);
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);
1016 cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
1017 kref_get(&mid_entry->refcount);
1018 mid_entry->mid_state = MID_SHUTDOWN;
1019 list_move(&mid_entry->qhead, &dispose_list);
1020 mid_entry->mid_flags |= MID_DELETED;
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);
1027 cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
1028 list_del_init(&mid_entry->qhead);
1029 mid_entry->callback(mid_entry);
1030 cifs_mid_q_entry_release(mid_entry);
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 */
1045 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
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)
1058 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
1059 }
1060
1061 static int
1062 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1063 {
1064 int length;
1065 char *buf = server->smallbuf;
1066 unsigned int pdu_length = server->pdu_size;
1067
1068 /* make sure this will fit in a large buffer */
1069 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
1070 server->vals->header_preamble_size) {
1071 cifs_server_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
1072 cifs_reconnect(server);
1073 wake_up(&server->response_q);
1074 return -ECONNABORTED;
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;
1080 memcpy(server->bigbuf, buf, server->total_read);
1081 buf = server->bigbuf;
1082 }
1083
1084 /* now read the rest */
1085 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
1086 pdu_length - HEADER_SIZE(server) + 1
1087 + server->vals->header_preamble_size);
1088
1089 if (length < 0)
1090 return length;
1091 server->total_read += length;
1092
1093 dump_smb(buf, server->total_read);
1094
1095 return cifs_handle_standard(server, mid);
1096 }
1097
1098 int
1099 cifs_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
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 */
1113 length = server->ops->check_message(buf, server->total_read, server);
1114 if (length != 0)
1115 cifs_dump_mem("Bad SMB: ", buf,
1116 min_t(unsigned int, server->total_read, 48));
1117
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
1125 if (server->ops->is_status_pending &&
1126 server->ops->is_status_pending(buf, server))
1127 return -1;
1128
1129 if (!mid)
1130 return length;
1131
1132 handle_mid(mid, server, buf, length);
1133 return 0;
1134 }
1135
1136 static void
1137 smb2_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
1156 static int
1157 cifs_demultiplex_thread(void *p)
1158 {
1159 int i, num_mids, length;
1160 struct TCP_Server_Info *server = p;
1161 unsigned int pdu_length;
1162 unsigned int next_offset;
1163 char *buf = NULL;
1164 struct task_struct *task_to_wake = NULL;
1165 struct mid_q_entry *mids[MAX_COMPOUND];
1166 char *bufs[MAX_COMPOUND];
1167
1168 current->flags |= PF_MEMALLOC;
1169 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
1170
1171 length = atomic_inc_return(&tcpSesAllocCount);
1172 if (length > 1)
1173 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
1174
1175 set_freezable();
1176 allow_kernel_signal(SIGKILL);
1177 while (server->tcpStatus != CifsExiting) {
1178 if (try_to_freeze())
1179 continue;
1180
1181 if (!allocate_buffers(server))
1182 continue;
1183
1184 server->large_buf = false;
1185 buf = server->smallbuf;
1186 pdu_length = 4; /* enough to get RFC1001 header */
1187
1188 length = cifs_read_from_socket(server, buf, pdu_length);
1189 if (length < 0)
1190 continue;
1191
1192 if (server->vals->header_preamble_size == 0)
1193 server->total_read = 0;
1194 else
1195 server->total_read = length;
1196
1197 /*
1198 * The right amount was read from socket - 4 bytes,
1199 * so we can now interpret the length field.
1200 */
1201 pdu_length = get_rfc1002_length(buf);
1202
1203 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
1204 if (!is_smb_response(server, buf[0]))
1205 continue;
1206 next_pdu:
1207 server->pdu_size = pdu_length;
1208
1209 /* make sure we have enough to get to the MID */
1210 if (server->pdu_size < HEADER_SIZE(server) - 1 -
1211 server->vals->header_preamble_size) {
1212 cifs_server_dbg(VFS, "SMB response too short (%u bytes)\n",
1213 server->pdu_size);
1214 cifs_reconnect(server);
1215 wake_up(&server->response_q);
1216 continue;
1217 }
1218
1219 /* read down to the MID */
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);
1224 if (length < 0)
1225 continue;
1226 server->total_read += length;
1227
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
1234 memset(mids, 0, sizeof(mids));
1235 memset(bufs, 0, sizeof(bufs));
1236 num_mids = 0;
1237
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,
1242 mids,
1243 bufs,
1244 &num_mids);
1245 } else {
1246 mids[0] = server->ops->find_mid(server, buf);
1247 bufs[0] = buf;
1248 num_mids = 1;
1249
1250 if (!mids[0] || !mids[0]->receive)
1251 length = standard_receive3(server, mids[0]);
1252 else
1253 length = mids[0]->receive(server, mids[0]);
1254 }
1255
1256 if (length < 0) {
1257 for (i = 0; i < num_mids; i++)
1258 if (mids[i])
1259 cifs_mid_q_entry_release(mids[i]);
1260 continue;
1261 }
1262
1263 server->lstrp = jiffies;
1264
1265 for (i = 0; i < num_mids; i++) {
1266 if (mids[i] != NULL) {
1267 mids[i]->resp_buf_size = server->pdu_size;
1268
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)) {
1276 smb2_add_credits_from_hdr(bufs[i], server);
1277 cifs_dbg(FYI, "Received oplock break\n");
1278 } else {
1279 cifs_server_dbg(VFS, "No task to wake, unknown frame "
1280 "received! NumMids %d\n",
1281 atomic_read(&midCount));
1282 cifs_dump_mem("Received Data is: ", bufs[i],
1283 HEADER_SIZE(server));
1284 smb2_add_credits_from_hdr(bufs[i], server);
1285 #ifdef CONFIG_CIFS_DEBUG2
1286 if (server->ops->dump_detail)
1287 server->ops->dump_detail(bufs[i],
1288 server);
1289 cifs_dump_mids(server);
1290 #endif /* CIFS_DEBUG2 */
1291 }
1292 }
1293
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;
1302 }
1303 } /* end while !EXITING */
1304
1305 /* buffer usually freed in free_mid - need to free it here on exit */
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);
1309
1310 task_to_wake = xchg(&server->tsk, NULL);
1311 clean_demultiplex_info(server);
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
1323 module_put_and_exit(0);
1324 }
1325
1326 /* extract the host portion of the UNC string */
1327 static char *
1328 extract_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? */
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);
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
1359 static 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;
1367 rc = kstrtoul(string, 0, option);
1368 kfree(string);
1369
1370 return rc;
1371 }
1372
1373 static 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
1391 static 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 }
1408
1409 static int cifs_parse_security_flavors(char *value,
1410 struct smb_vol *vol)
1411 {
1412
1413 substring_t args[MAX_OPT_ARGS];
1414
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
1422 switch (match_token(value, cifs_secflavor_tokens, args)) {
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 */
1429 case Opt_sec_krb5:
1430 vol->sectype = Kerberos;
1431 break;
1432 case Opt_sec_ntlmsspi:
1433 vol->sign = true;
1434 /* Fallthrough */
1435 case Opt_sec_ntlmssp:
1436 vol->sectype = RawNTLMSSP;
1437 break;
1438 case Opt_sec_ntlmi:
1439 vol->sign = true;
1440 /* Fallthrough */
1441 case Opt_ntlm:
1442 vol->sectype = NTLM;
1443 break;
1444 case Opt_sec_ntlmv2i:
1445 vol->sign = true;
1446 /* Fallthrough */
1447 case Opt_sec_ntlmv2:
1448 vol->sectype = NTLMv2;
1449 break;
1450 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1451 case Opt_sec_lanman:
1452 vol->sectype = LANMAN;
1453 break;
1454 #endif
1455 case Opt_sec_none:
1456 vol->nullauth = 1;
1457 break;
1458 default:
1459 cifs_dbg(VFS, "bad security option: %s\n", value);
1460 return 1;
1461 }
1462
1463 return 0;
1464 }
1465
1466 static int
1467 cifs_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;
1475 vol->cache_ro = false;
1476 vol->cache_rw = false;
1477 break;
1478 case Opt_cache_strict:
1479 vol->direct_io = false;
1480 vol->strict_io = true;
1481 vol->cache_ro = false;
1482 vol->cache_rw = false;
1483 break;
1484 case Opt_cache_none:
1485 vol->direct_io = true;
1486 vol->strict_io = false;
1487 vol->cache_ro = false;
1488 vol->cache_rw = false;
1489 break;
1490 case Opt_cache_ro:
1491 vol->direct_io = false;
1492 vol->strict_io = false;
1493 vol->cache_ro = true;
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;
1501 break;
1502 default:
1503 cifs_dbg(VFS, "bad cache= option: %s\n", value);
1504 return 1;
1505 }
1506 return 0;
1507 }
1508
1509 static int
1510 cifs_parse_smb_version(char *value, struct smb_vol *vol, bool is_smb3)
1511 {
1512 substring_t args[MAX_OPT_ARGS];
1513
1514 switch (match_token(value, cifs_smb_version_tokens, args)) {
1515 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1516 case Smb_1:
1517 if (disable_legacy_dialects) {
1518 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1519 return 1;
1520 }
1521 if (is_smb3) {
1522 cifs_dbg(VFS, "vers=1.0 (cifs) not permitted when mounting with smb3\n");
1523 return 1;
1524 }
1525 vol->ops = &smb1_operations;
1526 vol->vals = &smb1_values;
1527 break;
1528 case Smb_20:
1529 if (disable_legacy_dialects) {
1530 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1531 return 1;
1532 }
1533 if (is_smb3) {
1534 cifs_dbg(VFS, "vers=2.0 not permitted when mounting with smb3\n");
1535 return 1;
1536 }
1537 vol->ops = &smb20_operations;
1538 vol->vals = &smb20_values;
1539 break;
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 */
1548 case Smb_21:
1549 vol->ops = &smb21_operations;
1550 vol->vals = &smb21_values;
1551 break;
1552 case Smb_30:
1553 vol->ops = &smb30_operations;
1554 vol->vals = &smb30_values;
1555 break;
1556 case Smb_302:
1557 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1558 vol->vals = &smb302_values;
1559 break;
1560 case Smb_311:
1561 vol->ops = &smb311_operations;
1562 vol->vals = &smb311_values;
1563 break;
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;
1572 default:
1573 cifs_dbg(VFS, "Unknown vers= option specified: %s\n", value);
1574 return 1;
1575 }
1576 return 0;
1577 }
1578
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 */
1583 static int
1584 cifs_parse_devname(const char *devname, struct smb_vol *vol)
1585 {
1586 char *pos;
1587 const char *delims = "/\\";
1588 size_t len;
1589
1590 if (unlikely(!devname || !*devname)) {
1591 cifs_dbg(VFS, "Device name not specified.\n");
1592 return -EINVAL;
1593 }
1594
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
1619 /* skip any delimiter */
1620 if (*pos == '/' || *pos == '\\')
1621 pos++;
1622
1623 /* If pos is NULL then no prepath */
1624 if (!*pos)
1625 return 0;
1626
1627 vol->prepath = kstrdup(pos, GFP_KERNEL);
1628 if (!vol->prepath)
1629 return -ENOMEM;
1630
1631 return 0;
1632 }
1633
1634 static int
1635 cifs_parse_mount_options(const char *mountdata, const char *devname,
1636 struct smb_vol *vol, bool is_smb3)
1637 {
1638 char *data, *end;
1639 char *mountdata_copy = NULL, *options;
1640 unsigned int temp_len, i, j;
1641 char separator[2];
1642 short int override_uid = -1;
1643 short int override_gid = -1;
1644 bool uid_specified = false;
1645 bool gid_specified = false;
1646 bool sloppy = false;
1647 char *invalid = NULL;
1648 char *nodename = utsname()->nodename;
1649 char *string = NULL;
1650 char *tmp_end, *value;
1651 char delim;
1652 bool got_ip = false;
1653 bool got_version = false;
1654 unsigned short port = 0;
1655 struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1656
1657 separator[0] = ',';
1658 separator[1] = 0;
1659 delim = separator[0];
1660
1661 /* ensure we always start with zeroed-out smb_vol */
1662 memset(vol, 0, sizeof(*vol));
1663
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 */
1669 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1670 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1671 vol->source_rfc1001_name[i] = toupper(nodename[i]);
1672
1673 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
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;
1677 vol->cred_uid = current_uid();
1678 vol->linux_uid = current_uid();
1679 vol->linux_gid = current_gid();
1680 vol->bsize = 1024 * 1024; /* can improve cp performance significantly */
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
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;
1691
1692 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1693 /* default is always to request posix paths. */
1694 vol->posix_paths = 1;
1695 /* default to using server inode numbers where available */
1696 vol->server_ino = 1;
1697
1698 /* default is to use strict cifs caching semantics */
1699 vol->strict_io = true;
1700
1701 vol->actimeo = CIFS_DEF_ACTIMEO;
1702
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
1706 /* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1707 vol->ops = &smb30_operations;
1708 vol->vals = &smbdefault_values;
1709
1710 vol->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1711
1712 /* default to no multichannel (single server connection) */
1713 vol->multichannel = false;
1714 vol->max_channels = 1;
1715
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;
1722
1723 options = mountdata_copy;
1724 end = options + strlen(options);
1725
1726 if (strncmp(options, "sep=", 4) == 0) {
1727 if (options[4] != 0) {
1728 separator[0] = options[4];
1729 options += 5;
1730 } else {
1731 cifs_dbg(FYI, "Null separator not allowed\n");
1732 }
1733 }
1734 vol->backupuid_specified = false; /* no backup intent for a user */
1735 vol->backupgid_specified = false; /* no backup intent for a group */
1736
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;
1749 }
1750
1751 while ((data = strsep(&options, separator)) != NULL) {
1752 substring_t args[MAX_OPT_ARGS];
1753 unsigned long option;
1754 int token;
1755
1756 if (!*data)
1757 continue;
1758
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:
1769 vol->no_xattr = 0;
1770 break;
1771 case Opt_nouser_xattr:
1772 vol->no_xattr = 1;
1773 break;
1774 case Opt_forceuid:
1775 override_uid = 1;
1776 break;
1777 case Opt_noforceuid:
1778 override_uid = 0;
1779 break;
1780 case Opt_forcegid:
1781 override_gid = 1;
1782 break;
1783 case Opt_noforcegid:
1784 override_gid = 0;
1785 break;
1786 case Opt_noblocksend:
1787 vol->noblocksnd = 1;
1788 break;
1789 case Opt_noautotune:
1790 vol->noautotune = 1;
1791 break;
1792 case Opt_nolease:
1793 vol->no_lease = 1;
1794 break;
1795 case Opt_hard:
1796 vol->retry = 1;
1797 break;
1798 case Opt_soft:
1799 vol->retry = 0;
1800 break;
1801 case Opt_perm:
1802 vol->noperm = 0;
1803 break;
1804 case Opt_noperm:
1805 vol->noperm = 1;
1806 break;
1807 case Opt_mapchars:
1808 vol->sfu_remap = true;
1809 vol->remap = false; /* disable SFM mapping */
1810 break;
1811 case Opt_nomapchars:
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;
1820 break;
1821 case Opt_sfu:
1822 vol->sfu_emul = 1;
1823 break;
1824 case Opt_nosfu:
1825 vol->sfu_emul = 0;
1826 break;
1827 case Opt_nodfs:
1828 vol->nodfs = 1;
1829 break;
1830 case Opt_rootfs:
1831 #ifdef CONFIG_CIFS_ROOT
1832 vol->rootfs = true;
1833 #endif
1834 break;
1835 case Opt_posixpaths:
1836 vol->posix_paths = 1;
1837 break;
1838 case Opt_noposixpaths:
1839 vol->posix_paths = 0;
1840 break;
1841 case Opt_nounix:
1842 if (vol->linux_ext)
1843 cifs_dbg(VFS,
1844 "conflicting unix mount options\n");
1845 vol->no_linux_ext = 1;
1846 break;
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;
1853 case Opt_nocase:
1854 vol->nocase = 1;
1855 break;
1856 case Opt_brl:
1857 vol->nobrl = 0;
1858 break;
1859 case Opt_nobrl:
1860 vol->nobrl = 1;
1861 /*
1862 * turn off mandatory locking in mode
1863 * if remote locking is turned off since the
1864 * local vfs will do advisory
1865 */
1866 if (vol->file_mode ==
1867 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1868 vol->file_mode = S_IALLUGO;
1869 break;
1870 case Opt_nohandlecache:
1871 vol->nohandlecache = 1;
1872 break;
1873 case Opt_handlecache:
1874 vol->nohandlecache = 0;
1875 break;
1876 case Opt_forcemandatorylock:
1877 vol->mand_lock = 1;
1878 break;
1879 case Opt_setuids:
1880 vol->setuids = 1;
1881 break;
1882 case Opt_nosetuids:
1883 vol->setuids = 0;
1884 break;
1885 case Opt_setuidfromacl:
1886 vol->setuidfromacl = 1;
1887 break;
1888 case Opt_dynperm:
1889 vol->dynperm = true;
1890 break;
1891 case Opt_nodynperm:
1892 vol->dynperm = false;
1893 break;
1894 case Opt_nohard:
1895 vol->retry = 0;
1896 break;
1897 case Opt_nosoft:
1898 vol->retry = 1;
1899 break;
1900 case Opt_nointr:
1901 vol->intr = 0;
1902 break;
1903 case Opt_intr:
1904 vol->intr = 1;
1905 break;
1906 case Opt_nostrictsync:
1907 vol->nostrictsync = 1;
1908 break;
1909 case Opt_strictsync:
1910 vol->nostrictsync = 0;
1911 break;
1912 case Opt_serverino:
1913 vol->server_ino = 1;
1914 break;
1915 case Opt_noserverino:
1916 vol->server_ino = 0;
1917 break;
1918 case Opt_rwpidforward:
1919 vol->rwpidforward = 1;
1920 break;
1921 case Opt_modesid:
1922 vol->mode_ace = 1;
1923 break;
1924 case Opt_cifsacl:
1925 vol->cifs_acl = 1;
1926 break;
1927 case Opt_nocifsacl:
1928 vol->cifs_acl = 0;
1929 break;
1930 case Opt_acl:
1931 vol->no_psx_acl = 0;
1932 break;
1933 case Opt_noacl:
1934 vol->no_psx_acl = 1;
1935 break;
1936 case Opt_locallease:
1937 vol->local_lease = 1;
1938 break;
1939 case Opt_sign:
1940 vol->sign = true;
1941 break;
1942 case Opt_ignore_signature:
1943 vol->sign = true;
1944 vol->ignore_signature = true;
1945 break;
1946 case Opt_seal:
1947 /* we do not do the following in secFlags because seal
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 */
1952 vol->seal = 1;
1953 break;
1954 case Opt_noac:
1955 pr_warn("CIFS: Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1956 break;
1957 case Opt_fsc:
1958 #ifndef CONFIG_CIFS_FSCACHE
1959 cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1960 goto cifs_parse_mount_err;
1961 #endif
1962 vol->fsc = true;
1963 break;
1964 case Opt_mfsymlinks:
1965 vol->mfsymlinks = true;
1966 break;
1967 case Opt_multiuser:
1968 vol->multiuser = true;
1969 break;
1970 case Opt_sloppy:
1971 sloppy = true;
1972 break;
1973 case Opt_nosharesock:
1974 vol->nosharesock = true;
1975 break;
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;
1986 if ((vol->nopersistent) || (vol->resilient)) {
1987 cifs_dbg(VFS,
1988 "persistenthandles mount options conflict\n");
1989 goto cifs_parse_mount_err;
1990 }
1991 break;
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;
2003 case Opt_domainauto:
2004 vol->domainauto = true;
2005 break;
2006 case Opt_rdma:
2007 vol->rdma = true;
2008 break;
2009 case Opt_multichannel:
2010 vol->multichannel = true;
2011 break;
2012 case Opt_nomultichannel:
2013 vol->multichannel = false;
2014 break;
2015 case Opt_compress:
2016 vol->compression = UNKNOWN_TYPE;
2017 cifs_dbg(VFS,
2018 "SMB3 compression support is experimental\n");
2019 break;
2020
2021 /* Numeric Values */
2022 case Opt_backupuid:
2023 if (get_option_uid(args, &vol->backupuid)) {
2024 cifs_dbg(VFS, "%s: Invalid backupuid value\n",
2025 __func__);
2026 goto cifs_parse_mount_err;
2027 }
2028 vol->backupuid_specified = true;
2029 break;
2030 case Opt_backupgid:
2031 if (get_option_gid(args, &vol->backupgid)) {
2032 cifs_dbg(VFS, "%s: Invalid backupgid value\n",
2033 __func__);
2034 goto cifs_parse_mount_err;
2035 }
2036 vol->backupgid_specified = true;
2037 break;
2038 case Opt_uid:
2039 if (get_option_uid(args, &vol->linux_uid)) {
2040 cifs_dbg(VFS, "%s: Invalid uid value\n",
2041 __func__);
2042 goto cifs_parse_mount_err;
2043 }
2044 uid_specified = true;
2045 break;
2046 case Opt_cruid:
2047 if (get_option_uid(args, &vol->cred_uid)) {
2048 cifs_dbg(VFS, "%s: Invalid cruid value\n",
2049 __func__);
2050 goto cifs_parse_mount_err;
2051 }
2052 break;
2053 case Opt_gid:
2054 if (get_option_gid(args, &vol->linux_gid)) {
2055 cifs_dbg(VFS, "%s: Invalid gid value\n",
2056 __func__);
2057 goto cifs_parse_mount_err;
2058 }
2059 gid_specified = true;
2060 break;
2061 case Opt_file_mode:
2062 if (get_option_ul(args, &option)) {
2063 cifs_dbg(VFS, "%s: Invalid file_mode value\n",
2064 __func__);
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)) {
2071 cifs_dbg(VFS, "%s: Invalid dir_mode value\n",
2072 __func__);
2073 goto cifs_parse_mount_err;
2074 }
2075 vol->dir_mode = option;
2076 break;
2077 case Opt_port:
2078 if (get_option_ul(args, &option) ||
2079 option > USHRT_MAX) {
2080 cifs_dbg(VFS, "%s: Invalid port value\n",
2081 __func__);
2082 goto cifs_parse_mount_err;
2083 }
2084 port = (unsigned short)option;
2085 break;
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;
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;
2113 case Opt_rsize:
2114 if (get_option_ul(args, &option)) {
2115 cifs_dbg(VFS, "%s: Invalid rsize value\n",
2116 __func__);
2117 goto cifs_parse_mount_err;
2118 }
2119 vol->rsize = option;
2120 break;
2121 case Opt_wsize:
2122 if (get_option_ul(args, &option)) {
2123 cifs_dbg(VFS, "%s: Invalid wsize value\n",
2124 __func__);
2125 goto cifs_parse_mount_err;
2126 }
2127 vol->wsize = option;
2128 break;
2129 case Opt_actimeo:
2130 if (get_option_ul(args, &option)) {
2131 cifs_dbg(VFS, "%s: Invalid actimeo value\n",
2132 __func__);
2133 goto cifs_parse_mount_err;
2134 }
2135 vol->actimeo = HZ * option;
2136 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
2137 cifs_dbg(VFS, "attribute cache timeout too large\n");
2138 goto cifs_parse_mount_err;
2139 }
2140 break;
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;
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;
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;
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;
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;
2187
2188 /* String Arguments */
2189
2190 case Opt_blank_user:
2191 /* null user, ie. anonymous authentication */
2192 vol->nullauth = 1;
2193 vol->username = NULL;
2194 break;
2195 case Opt_user:
2196 string = match_strdup(args);
2197 if (string == NULL)
2198 goto out_nomem;
2199
2200 if (strnlen(string, CIFS_MAX_USERNAME_LEN) >
2201 CIFS_MAX_USERNAME_LEN) {
2202 pr_warn("CIFS: username too long\n");
2203 goto cifs_parse_mount_err;
2204 }
2205
2206 kfree(vol->username);
2207 vol->username = kstrdup(string, GFP_KERNEL);
2208 if (!vol->username)
2209 goto cifs_parse_mount_err;
2210 break;
2211 case Opt_blank_pass:
2212 /* passwords have to be handled differently
2213 * to allow the character used for deliminator
2214 * to be passed within them
2215 */
2216
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 */
2225 kzfree(vol->password);
2226 vol->password = NULL;
2227 break;
2228 }
2229 /* Fallthrough - to Opt_pass below.*/
2230 case Opt_pass:
2231 /* Obtain the value string */
2232 value = strchr(data, '=');
2233 value++;
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 */
2242 if (tmp_end < end && tmp_end[1] == delim) {
2243 tmp_end[0] = delim;
2244
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;
2261 }
2262
2263 kzfree(vol->password);
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) {
2268 pr_warn("CIFS: no memory for password\n");
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;
2281 case Opt_blank_ip:
2282 /* FIXME: should this be an error instead? */
2283 got_ip = false;
2284 break;
2285 case Opt_ip:
2286 string = match_strdup(args);
2287 if (string == NULL)
2288 goto out_nomem;
2289
2290 if (!cifs_convert_address(dstaddr, string,
2291 strlen(string))) {
2292 pr_err("CIFS: bad ip= option (%s).\n", string);
2293 goto cifs_parse_mount_err;
2294 }
2295 got_ip = true;
2296 break;
2297 case Opt_domain:
2298 string = match_strdup(args);
2299 if (string == NULL)
2300 goto out_nomem;
2301
2302 if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
2303 == CIFS_MAX_DOMAINNAME_LEN) {
2304 pr_warn("CIFS: domain name too long\n");
2305 goto cifs_parse_mount_err;
2306 }
2307
2308 kfree(vol->domainname);
2309 vol->domainname = kstrdup(string, GFP_KERNEL);
2310 if (!vol->domainname) {
2311 pr_warn("CIFS: no memory for domainname\n");
2312 goto cifs_parse_mount_err;
2313 }
2314 cifs_dbg(FYI, "Domain name set\n");
2315 break;
2316 case Opt_srcaddr:
2317 string = match_strdup(args);
2318 if (string == NULL)
2319 goto out_nomem;
2320
2321 if (!cifs_convert_address(
2322 (struct sockaddr *)&vol->srcaddr,
2323 string, strlen(string))) {
2324 pr_warn("CIFS: Could not parse srcaddr: %s\n",
2325 string);
2326 goto cifs_parse_mount_err;
2327 }
2328 break;
2329 case Opt_iocharset:
2330 string = match_strdup(args);
2331 if (string == NULL)
2332 goto out_nomem;
2333
2334 if (strnlen(string, 1024) >= 65) {
2335 pr_warn("CIFS: iocharset name too long.\n");
2336 goto cifs_parse_mount_err;
2337 }
2338
2339 if (strncasecmp(string, "default", 7) != 0) {
2340 kfree(vol->iocharset);
2341 vol->iocharset = kstrdup(string,
2342 GFP_KERNEL);
2343 if (!vol->iocharset) {
2344 pr_warn("CIFS: no memory for charset\n");
2345 goto cifs_parse_mount_err;
2346 }
2347 }
2348 /* if iocharset not set then load_nls_default
2349 * is used by caller
2350 */
2351 cifs_dbg(FYI, "iocharset set to %s\n", string);
2352 break;
2353 case Opt_netbiosname:
2354 string = match_strdup(args);
2355 if (string == NULL)
2356 goto out_nomem;
2357
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)
2375 pr_warn("CIFS: netbiosname longer than 15 truncated.\n");
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
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)
2401 pr_warn("CIFS: server netbiosname longer than 15 truncated.\n");
2402 break;
2403 case Opt_ver:
2404 /* version of mount userspace tools, not dialect */
2405 string = match_strdup(args);
2406 if (string == NULL)
2407 goto out_nomem;
2408
2409 /* If interface changes in mount.cifs bump to new ver */
2410 if (strncasecmp(string, "1", 1) == 0) {
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 }
2418 /* This is the default */
2419 break;
2420 }
2421 /* For all other value, error */
2422 pr_warn("CIFS: Invalid mount helper version specified\n");
2423 goto cifs_parse_mount_err;
2424 case Opt_vers:
2425 /* protocol version (dialect) */
2426 string = match_strdup(args);
2427 if (string == NULL)
2428 goto out_nomem;
2429
2430 if (cifs_parse_smb_version(string, vol, is_smb3) != 0)
2431 goto cifs_parse_mount_err;
2432 got_version = true;
2433 break;
2434 case Opt_sec:
2435 string = match_strdup(args);
2436 if (string == NULL)
2437 goto out_nomem;
2438
2439 if (cifs_parse_security_flavors(string, vol) != 0)
2440 goto cifs_parse_mount_err;
2441 break;
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;
2450 default:
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;
2457 break;
2458 }
2459 /* Free up any allocated string */
2460 kfree(string);
2461 string = NULL;
2462 }
2463
2464 if (!sloppy && invalid) {
2465 pr_err("CIFS: Unknown mount option \"%s\"\n", invalid);
2466 goto cifs_parse_mount_err;
2467 }
2468
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
2474 #ifndef CONFIG_KEYS
2475 /* Muliuser mounts require CONFIG_KEYS support */
2476 if (vol->multiuser) {
2477 cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
2478 goto cifs_parse_mount_err;
2479 }
2480 #endif
2481 if (!vol->UNC) {
2482 cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
2483 goto cifs_parse_mount_err;
2484 }
2485
2486 /* make sure UNC has a share name */
2487 if (!strchr(vol->UNC + 3, '\\')) {
2488 cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
2489 goto cifs_parse_mount_err;
2490 }
2491
2492 if (!got_ip) {
2493 int len;
2494 const char *slash;
2495
2496 /* No ip= option specified? Try to get it from UNC */
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)) {
2501 pr_err("Unable to determine destination address.\n");
2502 goto cifs_parse_mount_err;
2503 }
2504 }
2505
2506 /* set the port that we got earlier */
2507 cifs_set_port(dstaddr, port);
2508
2509 if (uid_specified)
2510 vol->override_uid = override_uid;
2511 else if (override_uid == 1)
2512 pr_notice("CIFS: ignoring forceuid mount option specified with no uid= option.\n");
2513
2514 if (gid_specified)
2515 vol->override_gid = override_gid;
2516 else if (override_gid == 1)
2517 pr_notice("CIFS: ignoring forcegid mount option specified with no gid= option.\n");
2518
2519 if (got_version == false)
2520 pr_warn("No dialect specified on mount. Default has changed to "
2521 "a more secure dialect, SMB2.1 or later (e.g. SMB3), from CIFS "
2522 "(SMB1). To use the less secure SMB1 dialect to access "
2523 "old servers which do not support SMB3 (or SMB2.1) specify vers=1.0"
2524 " on mount.\n");
2525
2526 kfree(mountdata_copy);
2527 return 0;
2528
2529 out_nomem:
2530 pr_warn("Could not allocate temporary buffer\n");
2531 cifs_parse_mount_err:
2532 kfree(string);
2533 kfree(mountdata_copy);
2534 return 1;
2535 }
2536
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 */
2541 static bool
2542 srcip_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;
2554 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
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
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 */
2568 static bool
2569 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
2570 {
2571 __be16 port, *sport;
2572
2573 /* SMBDirect manages its own ports, don't match it here */
2574 if (server->rdma)
2575 return true;
2576
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 }
2601
2602 static bool
2603 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
2604 struct sockaddr *srcaddr)
2605 {
2606 switch (addr->sa_family) {
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)
2613 return false;
2614 break;
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
2621 if (!ipv6_addr_equal(&addr6->sin6_addr,
2622 &srv_addr6->sin6_addr))
2623 return false;
2624 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
2625 return false;
2626 break;
2627 }
2628 default:
2629 WARN_ON(1);
2630 return false; /* don't expect to be here */
2631 }
2632
2633 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
2634 return false;
2635
2636 return true;
2637 }
2638
2639 static bool
2640 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2641 {
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 */
2647 if (server->ops->select_sectype(server, vol->sectype)
2648 == Unspecified)
2649 return false;
2650
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 */
2656 if (vol->sign && !server->sign)
2657 return false;
2658
2659 return true;
2660 }
2661
2662 static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
2663 {
2664 struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2665
2666 if (vol->nosharesock)
2667 return 0;
2668
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))
2678 return 0;
2679
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
2693 if (server->echo_interval != vol->echo_interval * HZ)
2694 return 0;
2695
2696 if (server->rdma != vol->rdma)
2697 return 0;
2698
2699 if (server->ignore_signature != vol->ignore_signature)
2700 return 0;
2701
2702 if (server->min_offload != vol->min_offload)
2703 return 0;
2704
2705 return 1;
2706 }
2707
2708 struct TCP_Server_Info *
2709 cifs_find_tcp_session(struct smb_vol *vol)
2710 {
2711 struct TCP_Server_Info *server;
2712
2713 spin_lock(&cifs_tcp_ses_lock);
2714 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
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))
2720 continue;
2721
2722 ++server->srv_count;
2723 spin_unlock(&cifs_tcp_ses_lock);
2724 cifs_dbg(FYI, "Existing tcp session with server found\n");
2725 return server;
2726 }
2727 spin_unlock(&cifs_tcp_ses_lock);
2728 return NULL;
2729 }
2730
2731 void
2732 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
2733 {
2734 struct task_struct *task;
2735
2736 spin_lock(&cifs_tcp_ses_lock);
2737 if (--server->srv_count > 0) {
2738 spin_unlock(&cifs_tcp_ses_lock);
2739 return;
2740 }
2741
2742 put_net(cifs_net_ns(server));
2743
2744 list_del_init(&server->tcp_ses_list);
2745 spin_unlock(&cifs_tcp_ses_lock);
2746
2747 cancel_delayed_work_sync(&server->echo);
2748
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);
2759
2760 spin_lock(&GlobalMid_Lock);
2761 server->tcpStatus = CifsExiting;
2762 spin_unlock(&GlobalMid_Lock);
2763
2764 cifs_crypto_secmech_release(server);
2765 cifs_fscache_release_client_cookie(server);
2766
2767 kfree(server->session_key.response);
2768 server->session_key.response = NULL;
2769 server->session_key.len = 0;
2770
2771 task = xchg(&server->tsk, NULL);
2772 if (task)
2773 send_sig(SIGKILL, task, 1);
2774 }
2775
2776 struct TCP_Server_Info *
2777 cifs_get_tcp_session(struct smb_vol *volume_info)
2778 {
2779 struct TCP_Server_Info *tcp_ses = NULL;
2780 int rc;
2781
2782 cifs_dbg(FYI, "UNC: %s\n", volume_info->UNC);
2783
2784 /* see if we already have a matching tcp_ses */
2785 tcp_ses = cifs_find_tcp_session(volume_info);
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
2795 tcp_ses->ops = volume_info->ops;
2796 tcp_ses->vals = volume_info->vals;
2797 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2798 tcp_ses->hostname = extract_hostname(volume_info->UNC);
2799 if (IS_ERR(tcp_ses->hostname)) {
2800 rc = PTR_ERR(tcp_ses->hostname);
2801 goto out_err_crypto_release;
2802 }
2803
2804 tcp_ses->noblockcnt = volume_info->rootfs;
2805 tcp_ses->noblocksnd = volume_info->noblocksnd || volume_info->rootfs;
2806 tcp_ses->noautotune = volume_info->noautotune;
2807 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2808 tcp_ses->rdma = volume_info->rdma;
2809 tcp_ses->in_flight = 0;
2810 tcp_ses->max_in_flight = 0;
2811 tcp_ses->credits = 1;
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);
2820 tcp_ses->session_estab = false;
2821 tcp_ses->sequence_number = 0;
2822 tcp_ses->reconnect_instance = 1;
2823 tcp_ses->lstrp = jiffies;
2824 tcp_ses->compress_algorithm = cpu_to_le16(volume_info->compression);
2825 spin_lock_init(&tcp_ses->req_lock);
2826 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2827 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2828 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2829 INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
2830 mutex_init(&tcp_ses->reconnect_mutex);
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));
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);
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
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;
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 }
2870 rc = ip_connect(tcp_ses);
2871 if (rc < 0) {
2872 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
2873 goto out_err_crypto_release;
2874 }
2875 smbd_connected:
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);
2881 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2882 tcp_ses, "cifsd");
2883 if (IS_ERR(tcp_ses->tsk)) {
2884 rc = PTR_ERR(tcp_ses->tsk);
2885 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
2886 module_put(THIS_MODULE);
2887 goto out_err_crypto_release;
2888 }
2889 tcp_ses->min_offload = volume_info->min_offload;
2890 tcp_ses->tcpStatus = CifsNeedNegotiate;
2891
2892 tcp_ses->nr_targets = 1;
2893 tcp_ses->ignore_signature = volume_info->ignore_signature;
2894 /* thread spawned, put it on the list */
2895 spin_lock(&cifs_tcp_ses_lock);
2896 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2897 spin_unlock(&cifs_tcp_ses_lock);
2898
2899 cifs_fscache_get_client_cookie(tcp_ses);
2900
2901 /* queue echo request delayed work */
2902 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
2903
2904 return tcp_ses;
2905
2906 out_err_crypto_release:
2907 cifs_crypto_secmech_release(tcp_ses);
2908
2909 put_net(cifs_net_ns(tcp_ses));
2910
2911 out_err:
2912 if (tcp_ses) {
2913 if (!IS_ERR(tcp_ses->hostname))
2914 kfree(tcp_ses->hostname);
2915 if (tcp_ses->ssocket)
2916 sock_release(tcp_ses->ssocket);
2917 kfree(tcp_ses);
2918 }
2919 return ERR_PTR(rc);
2920 }
2921
2922 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2923 {
2924 if (vol->sectype != Unspecified &&
2925 vol->sectype != ses->sectype)
2926 return 0;
2927
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
2935 switch (ses->sectype) {
2936 case Kerberos:
2937 if (!uid_eq(vol->cred_uid, ses->cred_uid))
2938 return 0;
2939 break;
2940 default:
2941 /* NULL username means anonymous session */
2942 if (ses->user_name == NULL) {
2943 if (!vol->nullauth)
2944 return 0;
2945 break;
2946 }
2947
2948 /* anything else takes username/password */
2949 if (strncmp(ses->user_name,
2950 vol->username ? vol->username : "",
2951 CIFS_MAX_USERNAME_LEN))
2952 return 0;
2953 if ((vol->username && strlen(vol->username) != 0) &&
2954 ses->password != NULL &&
2955 strncmp(ses->password,
2956 vol->password ? vol->password : "",
2957 CIFS_MAX_PASSWORD_LEN))
2958 return 0;
2959 }
2960 return 1;
2961 }
2962
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 */
2969 static int
2970 cifs_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;
2977 struct TCP_Server_Info *server = ses->server;
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) {
2984 if (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
2985 seal = true;
2986 else {
2987 cifs_server_dbg(VFS,
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
2997 scnprintf(unc, sizeof(unc), "\\\\%s\\IPC$", server->hostname);
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;
3006 rc = server->ops->tree_connect(xid, ses, unc, tcon, nls_codepage);
3007 free_xid(xid);
3008
3009 if (rc) {
3010 cifs_server_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
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;
3018 out:
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 */
3028 static int
3029 cifs_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
3051 static struct cifs_ses *
3052 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
3053 {
3054 struct cifs_ses *ses;
3055
3056 spin_lock(&cifs_tcp_ses_lock);
3057 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
3058 if (ses->status == CifsExiting)
3059 continue;
3060 if (!match_session(ses, vol))
3061 continue;
3062 ++ses->ses_count;
3063 spin_unlock(&cifs_tcp_ses_lock);
3064 return ses;
3065 }
3066 spin_unlock(&cifs_tcp_ses_lock);
3067 return NULL;
3068 }
3069
3070 void cifs_put_smb_ses(struct cifs_ses *ses)
3071 {
3072 unsigned int rc, xid;
3073 struct TCP_Server_Info *server = ses->server;
3074
3075 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
3076
3077 spin_lock(&cifs_tcp_ses_lock);
3078 if (ses->status == CifsExiting) {
3079 spin_unlock(&cifs_tcp_ses_lock);
3080 return;
3081 }
3082 if (--ses->ses_count > 0) {
3083 spin_unlock(&cifs_tcp_ses_lock);
3084 return;
3085 }
3086 if (ses->status == CifsGood)
3087 ses->status = CifsExiting;
3088 spin_unlock(&cifs_tcp_ses_lock);
3089
3090 cifs_free_ipc(ses);
3091
3092 if (ses->status == CifsExiting && server->ops->logoff) {
3093 xid = get_xid();
3094 rc = server->ops->logoff(xid, ses);
3095 if (rc)
3096 cifs_server_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
3097 __func__, rc);
3098 _free_xid(xid);
3099 }
3100
3101 spin_lock(&cifs_tcp_ses_lock);
3102 list_del_init(&ses->smb_ses_list);
3103 spin_unlock(&cifs_tcp_ses_lock);
3104
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
3113 sesInfoFree(ses);
3114 cifs_put_tcp_session(server, 0);
3115 }
3116
3117 #ifdef CONFIG_KEYS
3118
3119 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
3120 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
3121
3122 /* Populate username and pw fields from keyring if possible */
3123 static int
3124 cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
3125 {
3126 int rc = 0;
3127 int is_domain = 0;
3128 const char *delim, *payload;
3129 char *desc;
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;
3135 const struct user_key_payload *upayload;
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:
3152 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
3153 server->dstaddr.ss_family);
3154 rc = -EINVAL;
3155 goto out_err;
3156 }
3157
3158 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
3159 key = request_key(&key_type_logon, desc, "");
3160 if (IS_ERR(key)) {
3161 if (!ses->domainName) {
3162 cifs_dbg(FYI, "domainName is NULL\n");
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);
3169 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
3170 key = request_key(&key_type_logon, desc, "");
3171 if (IS_ERR(key)) {
3172 rc = PTR_ERR(key);
3173 goto out_err;
3174 }
3175 is_domain = 1;
3176 }
3177
3178 down_read(&key->sem);
3179 upayload = user_key_payload_locked(key);
3180 if (IS_ERR_OR_NULL(upayload)) {
3181 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
3182 goto out_key_put;
3183 }
3184
3185 /* find first : in payload */
3186 payload = upayload->data;
3187 delim = strnchr(payload, upayload->datalen, ':');
3188 cifs_dbg(FYI, "payload=%s\n", payload);
3189 if (!delim) {
3190 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
3191 upayload->datalen);
3192 rc = -EINVAL;
3193 goto out_key_put;
3194 }
3195
3196 len = delim - payload;
3197 if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
3198 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
3199 len);
3200 rc = -EINVAL;
3201 goto out_key_put;
3202 }
3203
3204 vol->username = kstrndup(payload, len, GFP_KERNEL);
3205 if (!vol->username) {
3206 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
3207 len);
3208 rc = -ENOMEM;
3209 goto out_key_put;
3210 }
3211 cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
3212
3213 len = key->datalen - (len + 1);
3214 if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
3215 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
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) {
3225 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
3226 len);
3227 rc = -ENOMEM;
3228 kfree(vol->username);
3229 vol->username = NULL;
3230 goto out_key_put;
3231 }
3232
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;
3247 kzfree(vol->password);
3248 vol->password = NULL;
3249 goto out_key_put;
3250 }
3251 }
3252
3253 out_key_put:
3254 up_read(&key->sem);
3255 key_put(key);
3256 out_err:
3257 kfree(desc);
3258 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
3259 return rc;
3260 }
3261 #else /* ! CONFIG_KEYS */
3262 static inline int
3263 cifs_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
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 */
3277 struct cifs_ses *
3278 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
3279 {
3280 int rc = -ENOMEM;
3281 unsigned int xid;
3282 struct cifs_ses *ses;
3283 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3284 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3285
3286 xid = get_xid();
3287
3288 ses = cifs_find_smb_ses(server, volume_info);
3289 if (ses) {
3290 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
3291 ses->status);
3292
3293 mutex_lock(&ses->session_mutex);
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);
3299 free_xid(xid);
3300 return ERR_PTR(rc);
3301 }
3302 if (ses->need_reconnect) {
3303 cifs_dbg(FYI, "Session needs reconnect\n");
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);
3310 free_xid(xid);
3311 return ERR_PTR(rc);
3312 }
3313 }
3314 mutex_unlock(&ses->session_mutex);
3315
3316 /* existing SMB ses has a server reference already */
3317 cifs_put_tcp_session(server, 0);
3318 free_xid(xid);
3319 return ses;
3320 }
3321
3322 cifs_dbg(FYI, "Existing smb sess not found\n");
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;
3329 if (server->dstaddr.ss_family == AF_INET6)
3330 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
3331 else
3332 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
3333
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 }
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) {
3347 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
3348 if (!ses->domainName)
3349 goto get_ses_fail;
3350 }
3351 if (volume_info->domainauto)
3352 ses->domainAuto = volume_info->domainauto;
3353 ses->cred_uid = volume_info->cred_uid;
3354 ses->linux_uid = volume_info->linux_uid;
3355
3356 ses->sectype = volume_info->sectype;
3357 ses->sign = volume_info->sign;
3358 mutex_lock(&ses->session_mutex);
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
3365 rc = cifs_negotiate_protocol(xid, ses);
3366 if (!rc)
3367 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
3368
3369 /* each channel uses a different signing key */
3370 memcpy(ses->chans[0].signkey, ses->smb3signingkey,
3371 sizeof(ses->smb3signingkey));
3372
3373 mutex_unlock(&ses->session_mutex);
3374 if (rc)
3375 goto get_ses_fail;
3376
3377 /* success, put it on the list and add it as first channel */
3378 spin_lock(&cifs_tcp_ses_lock);
3379 list_add(&ses->smb_ses_list, &server->smb_ses_list);
3380 spin_unlock(&cifs_tcp_ses_lock);
3381
3382 free_xid(xid);
3383
3384 cifs_setup_ipc(ses, volume_info);
3385
3386 return ses;
3387
3388 get_ses_fail:
3389 sesInfoFree(ses);
3390 free_xid(xid);
3391 return ERR_PTR(rc);
3392 }
3393
3394 static int match_tcon(struct cifs_tcon *tcon, struct smb_vol *volume_info)
3395 {
3396 if (tcon->tidStatus == CifsExiting)
3397 return 0;
3398 if (strncmp(tcon->treeName, volume_info->UNC, MAX_TREE_SIZE))
3399 return 0;
3400 if (tcon->seal != volume_info->seal)
3401 return 0;
3402 if (tcon->snapshot_time != volume_info->snapshot_time)
3403 return 0;
3404 if (tcon->handle_timeout != volume_info->handle_timeout)
3405 return 0;
3406 if (tcon->no_lease != volume_info->no_lease)
3407 return 0;
3408 return 1;
3409 }
3410
3411 static struct cifs_tcon *
3412 cifs_find_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3413 {
3414 struct list_head *tmp;
3415 struct cifs_tcon *tcon;
3416
3417 spin_lock(&cifs_tcp_ses_lock);
3418 list_for_each(tmp, &ses->tcon_list) {
3419 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
3420 if (!match_tcon(tcon, volume_info))
3421 continue;
3422 ++tcon->tc_count;
3423 spin_unlock(&cifs_tcp_ses_lock);
3424 return tcon;
3425 }
3426 spin_unlock(&cifs_tcp_ses_lock);
3427 return NULL;
3428 }
3429
3430 void
3431 cifs_put_tcon(struct cifs_tcon *tcon)
3432 {
3433 unsigned int xid;
3434 struct cifs_ses *ses;
3435
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;
3444 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
3445 spin_lock(&cifs_tcp_ses_lock);
3446 if (--tcon->tc_count > 0) {
3447 spin_unlock(&cifs_tcp_ses_lock);
3448 return;
3449 }
3450
3451 list_del_init(&tcon->tcon_list);
3452 spin_unlock(&cifs_tcp_ses_lock);
3453
3454 xid = get_xid();
3455 if (ses->server->ops->tree_disconnect)
3456 ses->server->ops->tree_disconnect(xid, tcon);
3457 _free_xid(xid);
3458
3459 cifs_fscache_release_super_cookie(tcon);
3460 tconInfoFree(tcon);
3461 cifs_put_smb_ses(ses);
3462 }
3463
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 */
3484 static struct cifs_tcon *
3485 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3486 {
3487 int rc, xid;
3488 struct cifs_tcon *tcon;
3489
3490 tcon = cifs_find_tcon(ses, volume_info);
3491 if (tcon) {
3492 /*
3493 * tcon has refcount already incremented but we need to
3494 * decrement extra ses reference gotten by caller (case b)
3495 */
3496 cifs_dbg(FYI, "Found match on UNC path\n");
3497 cifs_put_smb_ses(ses);
3498 return tcon;
3499 }
3500
3501 if (!ses->server->ops->tree_connect) {
3502 rc = -ENOSYS;
3503 goto out_fail;
3504 }
3505
3506 tcon = tconInfoAlloc();
3507 if (tcon == NULL) {
3508 rc = -ENOMEM;
3509 goto out_fail;
3510 }
3511
3512 if (volume_info->snapshot_time) {
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;
3520 }
3521
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
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
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
3557 if (volume_info->linux_ext) {
3558 if (ses->server->posix_ext_supported) {
3559 tcon->posix_extensions = true;
3560 printk_once(KERN_WARNING
3561 "SMB3.11 POSIX Extensions are experimental\n");
3562 } else {
3563 cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions.\n");
3564 rc = -EOPNOTSUPP;
3565 goto out_fail;
3566 }
3567 }
3568
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 */
3573 xid = get_xid();
3574 rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
3575 volume_info->local_nls);
3576 free_xid(xid);
3577 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
3578 if (rc)
3579 goto out_fail;
3580
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;
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;
3611 }
3612
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
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 */
3626 tcon->retry = volume_info->retry;
3627 tcon->nocase = volume_info->nocase;
3628 tcon->nohandlecache = volume_info->nohandlecache;
3629 tcon->local_lease = volume_info->local_lease;
3630 tcon->no_lease = volume_info->no_lease;
3631 INIT_LIST_HEAD(&tcon->pending_opens);
3632
3633 spin_lock(&cifs_tcp_ses_lock);
3634 list_add(&tcon->tcon_list, &ses->tcon_list);
3635 spin_unlock(&cifs_tcp_ses_lock);
3636
3637 cifs_fscache_get_super_cookie(tcon);
3638
3639 return tcon;
3640
3641 out_fail:
3642 tconInfoFree(tcon);
3643 return ERR_PTR(rc);
3644 }
3645
3646 void
3647 cifs_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 }
3663
3664 static int
3665 compare_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;
3669 unsigned int oldflags = old->mnt_cifs_flags & CIFS_MOUNT_MASK;
3670 unsigned int newflags = new->mnt_cifs_flags & CIFS_MOUNT_MASK;
3671
3672 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
3673 return 0;
3674
3675 if (old->mnt_cifs_serverino_autodisabled)
3676 newflags &= ~CIFS_MOUNT_SERVER_INUM;
3677
3678 if (oldflags != newflags)
3679 return 0;
3680
3681 /*
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.
3684 */
3685 if (new->wsize && new->wsize < old->wsize)
3686 return 0;
3687
3688 if (new->rsize && new->rsize < old->rsize)
3689 return 0;
3690
3691 if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))
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
3707 static int
3708 match_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;
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;
3716
3717 if (old_set && new_set && !strcmp(new->prepath, old->prepath))
3718 return 1;
3719 else if (!old_set && !new_set)
3720 return 1;
3721
3722 return 0;
3723 }
3724
3725 int
3726 cifs_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;
3732 struct cifs_ses *ses;
3733 struct cifs_tcon *tcon;
3734 struct tcon_link *tlink;
3735 int rc = 0;
3736
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
3750 if (!match_server(tcp_srv, volume_info) ||
3751 !match_session(ses, volume_info) ||
3752 !match_tcon(tcon, volume_info) ||
3753 !match_prepath(sb, mnt_data)) {
3754 rc = 0;
3755 goto out;
3756 }
3757
3758 rc = compare_mount_options(sb, mnt_data);
3759 out:
3760 spin_unlock(&cifs_tcp_ses_lock);
3761 cifs_put_tlink(tlink);
3762 return rc;
3763 }
3764
3765 #ifdef CONFIG_DEBUG_LOCK_ALLOC
3766 static struct lock_class_key cifs_key[2];
3767 static struct lock_class_key cifs_slock_key[2];
3768
3769 static inline void
3770 cifs_reclassify_socket4(struct socket *sock)
3771 {
3772 struct sock *sk = sock->sk;
3773 BUG_ON(!sock_allow_reclassification(sk));
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
3778 static inline void
3779 cifs_reclassify_socket6(struct socket *sock)
3780 {
3781 struct sock *sk = sock->sk;
3782 BUG_ON(!sock_allow_reclassification(sk));
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
3787 static inline void
3788 cifs_reclassify_socket4(struct socket *sock)
3789 {
3790 }
3791
3792 static inline void
3793 cifs_reclassify_socket6(struct socket *sock)
3794 {
3795 }
3796 #endif
3797
3798 /* See RFC1001 section 14 on representation of Netbios names */
3799 static void rfc1002mangle(char *target, char *source, unsigned int length)
3800 {
3801 unsigned int i, j;
3802
3803 for (i = 0, j = 0; i < (length); i++) {
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]);
3807 j += 2;
3808 }
3809
3810 }
3811
3812 static int
3813 bind_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)
3828 cifs_server_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
3829 &saddr6->sin6_addr, rc);
3830 else
3831 cifs_server_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
3832 &saddr4->sin_addr.s_addr, rc);
3833 }
3834 }
3835 return rc;
3836 }
3837
3838 static int
3839 ip_rfc1001_connect(struct TCP_Server_Info *server)
3840 {
3841 int rc = 0;
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
3854 if (server->server_RFC1001_name[0] != 0)
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 */
3871 if (server->workstation_RFC1001_name[0] != 0)
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 */
3887 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
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
3910 static int
3911 generic_ip_connect(struct TCP_Server_Info *server)
3912 {
3913 int rc = 0;
3914 __be16 sport;
3915 int slen, sfamily;
3916 struct socket *socket = server->ssocket;
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 }
3930
3931 if (socket == NULL) {
3932 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3933 IPPROTO_TCP, &socket, 1);
3934 if (rc < 0) {
3935 cifs_server_dbg(VFS, "Error %d creating socket\n", rc);
3936 server->ssocket = NULL;
3937 return rc;
3938 }
3939
3940 /* BB other socket options to set KEEPALIVE, NODELAY? */
3941 cifs_dbg(FYI, "Socket created\n");
3942 server->ssocket = socket;
3943 socket->sk->sk_allocation = GFP_NOFS;
3944 if (sfamily == AF_INET6)
3945 cifs_reclassify_socket6(socket);
3946 else
3947 cifs_reclassify_socket4(socket);
3948 }
3949
3950 rc = bind_socket(server);
3951 if (rc < 0)
3952 return rc;
3953
3954 /*
3955 * Eventually check for other socket options to change from
3956 * the default. sock_setsockopt not used because it expects
3957 * user space buffer
3958 */
3959 socket->sk->sk_rcvtimeo = 7 * HZ;
3960 socket->sk->sk_sndtimeo = 5 * HZ;
3961
3962 /* make the bufsizes depend on wsize/rsize and max requests */
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;
3968 }
3969
3970 if (server->tcp_nodelay) {
3971 int val = 1;
3972 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
3973 (char *)&val, sizeof(val));
3974 if (rc)
3975 cifs_dbg(FYI, "set TCP_NODELAY socket option error %d\n",
3976 rc);
3977 }
3978
3979 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3980 socket->sk->sk_sndbuf,
3981 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3982
3983 rc = socket->ops->connect(socket, saddr, slen,
3984 server->noblockcnt ? O_NONBLOCK : 0);
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)
3991 rc = 0;
3992 if (rc < 0) {
3993 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3994 sock_release(socket);
3995 server->ssocket = NULL;
3996 return rc;
3997 }
3998
3999 if (sport == htons(RFC1001_PORT))
4000 rc = ip_rfc1001_connect(server);
4001
4002 return rc;
4003 }
4004
4005 static int
4006 ip_connect(struct TCP_Server_Info *server)
4007 {
4008 __be16 *sport;
4009 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
4010 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
4011
4012 if (server->dstaddr.ss_family == AF_INET6)
4013 sport = &addr6->sin6_port;
4014 else
4015 sport = &addr->sin_port;
4016
4017 if (*sport == 0) {
4018 int rc;
4019
4020 /* try with 445 port at first */
4021 *sport = htons(CIFS_PORT);
4022
4023 rc = generic_ip_connect(server);
4024 if (rc >= 0)
4025 return rc;
4026
4027 /* if it failed, try with 139 port */
4028 *sport = htons(RFC1001_PORT);
4029 }
4030
4031 return generic_ip_connect(server);
4032 }
4033
4034 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
4035 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
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);
4047
4048 if (vol_info && vol_info->no_linux_ext) {
4049 tcon->fsUnixInfo.Capability = 0;
4050 tcon->unix_ext = 0; /* Unix Extensions disabled */
4051 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
4052 return;
4053 } else if (vol_info)
4054 tcon->unix_ext = 1; /* Unix Extensions supported */
4055
4056 if (tcon->unix_ext == 0) {
4057 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
4058 return;
4059 }
4060
4061 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
4062 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
4063 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
4064 /* check for reconnect case in which we do not
4065 want to change the mount behavior if we can avoid it */
4066 if (vol_info == NULL) {
4067 /* turn off POSIX ACL and PATHNAMES if not set
4068 originally at mount time */
4069 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
4070 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
4071 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
4072 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
4073 cifs_dbg(VFS, "POSIXPATH support change\n");
4074 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
4075 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
4076 cifs_dbg(VFS, "possible reconnect error\n");
4077 cifs_dbg(VFS, "server disabled POSIX path support\n");
4078 }
4079 }
4080
4081 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
4082 cifs_dbg(VFS, "per-share encryption not supported yet\n");
4083
4084 cap &= CIFS_UNIX_CAP_MASK;
4085 if (vol_info && vol_info->no_psx_acl)
4086 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
4087 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
4088 cifs_dbg(FYI, "negotiated posix acl support\n");
4089 if (cifs_sb)
4090 cifs_sb->mnt_cifs_flags |=
4091 CIFS_MOUNT_POSIXACL;
4092 }
4093
4094 if (vol_info && vol_info->posix_paths == 0)
4095 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
4096 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
4097 cifs_dbg(FYI, "negotiate posix pathnames\n");
4098 if (cifs_sb)
4099 cifs_sb->mnt_cifs_flags |=
4100 CIFS_MOUNT_POSIX_PATHS;
4101 }
4102
4103 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
4104 #ifdef CONFIG_CIFS_DEBUG2
4105 if (cap & CIFS_UNIX_FCNTL_CAP)
4106 cifs_dbg(FYI, "FCNTL cap\n");
4107 if (cap & CIFS_UNIX_EXTATTR_CAP)
4108 cifs_dbg(FYI, "EXTATTR cap\n");
4109 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
4110 cifs_dbg(FYI, "POSIX path cap\n");
4111 if (cap & CIFS_UNIX_XATTR_CAP)
4112 cifs_dbg(FYI, "XATTR cap\n");
4113 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
4114 cifs_dbg(FYI, "POSIX ACL cap\n");
4115 if (cap & CIFS_UNIX_LARGE_READ_CAP)
4116 cifs_dbg(FYI, "very large read cap\n");
4117 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
4118 cifs_dbg(FYI, "very large write cap\n");
4119 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
4120 cifs_dbg(FYI, "transport encryption cap\n");
4121 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
4122 cifs_dbg(FYI, "mandatory transport encryption cap\n");
4123 #endif /* CIFS_DEBUG2 */
4124 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
4125 if (vol_info == NULL) {
4126 cifs_dbg(FYI, "resetting capabilities failed\n");
4127 } else
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");
4129
4130 }
4131 }
4132 }
4133
4134 int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
4135 struct cifs_sb_info *cifs_sb)
4136 {
4137 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
4138
4139 spin_lock_init(&cifs_sb->tlink_tree_lock);
4140 cifs_sb->tlink_tree = RB_ROOT;
4141
4142 cifs_sb->bsize = pvolume_info->bsize;
4143 /*
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.
4146 */
4147 cifs_sb->rsize = pvolume_info->rsize;
4148 cifs_sb->wsize = pvolume_info->wsize;
4149
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;
4154 cifs_dbg(FYI, "file mode: %04ho dir mode: %04ho\n",
4155 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
4156
4157 cifs_sb->actimeo = pvolume_info->actimeo;
4158 cifs_sb->local_nls = pvolume_info->local_nls;
4159
4160 if (pvolume_info->nodfs)
4161 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_DFS;
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;
4166 if (pvolume_info->setuidfromacl)
4167 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
4168 if (pvolume_info->server_ino)
4169 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
4170 if (pvolume_info->remap)
4171 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
4172 if (pvolume_info->sfu_remap)
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;
4180 if (pvolume_info->nohandlecache)
4181 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_HANDLE_CACHE;
4182 if (pvolume_info->nostrictsync)
4183 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
4184 if (pvolume_info->mand_lock)
4185 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
4186 if (pvolume_info->rwpidforward)
4187 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
4188 if (pvolume_info->mode_ace)
4189 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MODE_FROM_SID;
4190 if (pvolume_info->cifs_acl)
4191 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
4192 if (pvolume_info->backupuid_specified) {
4193 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
4194 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
4195 }
4196 if (pvolume_info->backupgid_specified) {
4197 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
4198 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
4199 }
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;
4206 if (pvolume_info->fsc)
4207 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
4208 if (pvolume_info->multiuser)
4209 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
4210 CIFS_MOUNT_NO_PERM);
4211 if (pvolume_info->strict_io)
4212 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
4213 if (pvolume_info->direct_io) {
4214 cifs_dbg(FYI, "mounting share using direct i/o\n");
4215 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
4216 }
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;
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);
4224 }
4225 if (pvolume_info->mfsymlinks) {
4226 if (pvolume_info->sfu_emul) {
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");
4239 }
4240 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
4241 }
4242
4243 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
4244 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
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;
4253 }
4254
4255 void
4256 cifs_cleanup_volume_info_contents(struct smb_vol *volume_info)
4257 {
4258 kfree(volume_info->username);
4259 kzfree(volume_info->password);
4260 kfree(volume_info->UNC);
4261 kfree(volume_info->domainname);
4262 kfree(volume_info->iocharset);
4263 kfree(volume_info->prepath);
4264 }
4265
4266 void
4267 cifs_cleanup_volume_info(struct smb_vol *volume_info)
4268 {
4269 if (!volume_info)
4270 return;
4271 cifs_cleanup_volume_info_contents(volume_info);
4272 kfree(volume_info);
4273 }
4274
4275 /* Release all succeed connections */
4276 static 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 */
4294 static 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))) {
4335 cifs_server_dbg(VFS, "persistent handles not supported by server\n");
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 */
4367 if (!tcon->pipe && server->ops->qfs_tcon) {
4368 server->ops->qfs_tcon(*xid, tcon, cifs_sb);
4369 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE) {
4370 if (tcon->fsDevInfo.DeviceCharacteristics &
4371 cpu_to_le32(FILE_READ_ONLY_DEVICE))
4372 cifs_dbg(VFS, "mounted to read only share\n");
4373 else if ((cifs_sb->mnt_cifs_flags &
4374 CIFS_MOUNT_RW_CACHE) == 0)
4375 cifs_dbg(VFS, "read only mount of RW share\n");
4376 /* no need to log a RW mount of a typical RW share */
4377 }
4378 }
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
4386 static 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 }
4411
4412 #ifdef CONFIG_CIFS_DFS_UPCALL
4413 /*
4414 * cifs_build_path_to_root returns full path to root when we do not have an
4415 * exiting connection (tcon)
4416 */
4417 static char *
4418 build_unc_path_to_root(const struct smb_vol *vol,
4419 const struct cifs_sb_info *cifs_sb, bool useppath)
4420 {
4421 char *full_path, *pos;
4422 unsigned int pplen = useppath && vol->prepath ?
4423 strlen(vol->prepath) + 1 : 0;
4424 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
4425
4426 if (unc_len > MAX_TREE_SIZE)
4427 return ERR_PTR(-EINVAL);
4428
4429 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
4430 if (full_path == NULL)
4431 return ERR_PTR(-ENOMEM);
4432
4433 memcpy(full_path, vol->UNC, unc_len);
4434 pos = full_path + unc_len;
4435
4436 if (pplen) {
4437 *pos = CIFS_DIR_SEP(cifs_sb);
4438 memcpy(pos + 1, vol->prepath, pplen);
4439 pos += pplen;
4440 }
4441
4442 *pos = '\0'; /* add trailing null */
4443 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
4444 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
4445 return full_path;
4446 }
4447
4448 /**
4449 * expand_dfs_referral - Perform a dfs referral query and update the cifs_sb
4450 *
4451 *
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.
4455 *
4456 * Returns the rc from get_dfs_path to the caller, which can be used to
4457 * determine whether there were referrals.
4458 */
4459 static int
4460 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
4461 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
4462 int check_prefix)
4463 {
4464 int rc;
4465 struct dfs_info3_param referral = {0};
4466 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
4467
4468 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4469 return -EREMOTE;
4470
4471 full_path = build_unc_path_to_root(volume_info, cifs_sb, true);
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
4478 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4479 ref_path, &referral, NULL);
4480 if (!rc) {
4481 char *fake_devname = NULL;
4482
4483 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
4484 full_path + 1, &referral,
4485 &fake_devname);
4486 free_dfs_info_param(&referral);
4487
4488 if (IS_ERR(mdata)) {
4489 rc = PTR_ERR(mdata);
4490 mdata = NULL;
4491 } else {
4492 cifs_cleanup_volume_info_contents(volume_info);
4493 rc = cifs_setup_volume_info(volume_info, mdata,
4494 fake_devname, false);
4495 }
4496 kfree(fake_devname);
4497 kfree(cifs_sb->mountdata);
4498 cifs_sb->mountdata = mdata;
4499 }
4500 kfree(full_path);
4501 return rc;
4502 }
4503
4504 static 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
4515 static 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;
4525 scnprintf(new_unc, len, "\\%s", tgt);
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
4540 static 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;
4552 struct smb_vol fake_vol = {NULL};
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
4596 static 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 }
4640 #endif
4641
4642 int
4643 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
4644 const char *devname, bool is_smb3)
4645 {
4646 int rc = 0;
4647
4648 if (cifs_parse_mount_options(mount_data, devname, volume_info, is_smb3))
4649 return -EINVAL;
4650
4651 if (volume_info->nullauth) {
4652 cifs_dbg(FYI, "Anonymous login\n");
4653 kfree(volume_info->username);
4654 volume_info->username = NULL;
4655 } else if (volume_info->username) {
4656 /* BB fixme parse for domain name here */
4657 cifs_dbg(FYI, "Username: %s\n", volume_info->username);
4658 } else {
4659 cifs_dbg(VFS, "No username specified\n");
4660 /* In userspace mount helper we can get user name from alternate
4661 locations such as env variables and files on disk */
4662 return -EINVAL;
4663 }
4664
4665 /* this is needed for ASCII cp to Unicode converts */
4666 if (volume_info->iocharset == NULL) {
4667 /* load_nls_default cannot return null */
4668 volume_info->local_nls = load_nls_default();
4669 } else {
4670 volume_info->local_nls = load_nls(volume_info->iocharset);
4671 if (volume_info->local_nls == NULL) {
4672 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
4673 volume_info->iocharset);
4674 return -ELIBACC;
4675 }
4676 }
4677
4678 return rc;
4679 }
4680
4681 struct smb_vol *
4682 cifs_get_volume_info(char *mount_data, const char *devname, bool is_smb3)
4683 {
4684 int rc;
4685 struct smb_vol *volume_info;
4686
4687 volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
4688 if (!volume_info)
4689 return ERR_PTR(-ENOMEM);
4690
4691 rc = cifs_setup_volume_info(volume_info, mount_data, devname, is_smb3);
4692 if (rc) {
4693 cifs_cleanup_volume_info(volume_info);
4694 volume_info = ERR_PTR(rc);
4695 }
4696
4697 return volume_info;
4698 }
4699
4700 static int
4701 cifs_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,
4705 char *full_path,
4706 int added_treename)
4707 {
4708 int rc;
4709 char *s;
4710 char sep, tmp;
4711 int skip = added_treename ? 1 : 0;
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++;
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 }
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
4747 /*
4748 * Check if path is remote (e.g. a DFS share). Return -EREMOTE if it is,
4749 * otherwise 0.
4750 */
4751 static 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)
4755 {
4756 int rc;
4757 char *full_path;
4758
4759 if (!server->ops->is_path_accessible)
4760 return -EOPNOTSUPP;
4761
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;
4769
4770 cifs_dbg(FYI, "%s: full_path: %s\n", __func__, full_path);
4771
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;
4777 }
4778
4779 if (rc != -EREMOTE) {
4780 rc = cifs_are_all_path_components_accessible(server, xid, tcon,
4781 cifs_sb, full_path, tcon->Flags & SMB_SHARE_IS_IN_DFS);
4782 if (rc != 0) {
4783 cifs_server_dbg(VFS, "cannot query dirs between root and final path, "
4784 "enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
4785 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
4786 rc = 0;
4787 }
4788 }
4789
4790 kfree(full_path);
4791 return rc;
4792 }
4793
4794 #ifdef CONFIG_CIFS_DFS_UPCALL
4795 static 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
4806 int 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;
4811 struct cifs_tcon *root_tcon = NULL;
4812 struct cifs_tcon *tcon = NULL;
4813 struct TCP_Server_Info *server;
4814 char *root_path = NULL, *full_path = NULL;
4815 char *old_mountdata, *origin_mountdata = NULL;
4816 int count;
4817
4818 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4819 if (!rc && tcon) {
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 }
4831 }
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)
4844 goto error;
4845
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 }
4852
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 }
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 */
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;
4872 }
4873
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
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;
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;
4895 }
4896
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);
4907 kfree(root_path);
4908 root_path = NULL;
4909
4910 set_root_tcon(cifs_sb, tcon, &root_tcon);
4911
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;
4917 }
4918 /*
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).
4923 */
4924 if (count++ > MAX_NESTED_LINKS) {
4925 rc = -ELOOP;
4926 break;
4927 }
4928
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
4937 old_mountdata = cifs_sb->mountdata;
4938 rc = expand_dfs_referral(xid, root_tcon->ses, vol, cifs_sb,
4939 true);
4940 if (rc)
4941 break;
4942
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);
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 }
4956 }
4957 if (rc) {
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);
4964 if (rc == -EACCES || rc == -EOPNOTSUPP || !server ||
4965 !ses)
4966 goto error;
4967 }
4968 }
4969 cifs_put_tcon(root_tcon);
4970
4971 if (rc)
4972 goto error;
4973
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,
4982 strlen(tcon->dfs_path),
4983 GFP_ATOMIC);
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
4991 rc = dfs_cache_add_vol(origin_mountdata, vol, cifs_sb->origin_fullpath);
4992 if (rc) {
4993 kfree(cifs_sb->origin_fullpath);
4994 goto error;
4995 }
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);
5002 out:
5003 free_xid(xid);
5004 cifs_try_adding_channels(ses);
5005 return mount_setup_tlink(cifs_sb, ses, tcon);
5006
5007 error:
5008 kfree(full_path);
5009 kfree(root_path);
5010 kfree(origin_mountdata);
5011 mount_put_conns(cifs_sb, xid, server, ses, tcon);
5012 return rc;
5013 }
5014 #else
5015 int 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;
5022
5023 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
5024 if (rc)
5025 goto error;
5026
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;
5033 }
5034
5035 free_xid(xid);
5036
5037 return mount_setup_tlink(cifs_sb, ses, tcon);
5038
5039 error:
5040 mount_put_conns(cifs_sb, xid, server, ses, tcon);
5041 return rc;
5042 }
5043 #endif
5044
5045 /*
5046 * Issue a TREE_CONNECT request.
5047 */
5048 int
5049 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
5050 const char *tree, struct cifs_tcon *tcon,
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;
5059 int length;
5060 __u16 bytes_left, count;
5061
5062 if (ses == NULL)
5063 return -EIO;
5064
5065 smb_buffer = cifs_buf_get();
5066 if (smb_buffer == NULL)
5067 return -ENOMEM;
5068
5069 smb_buffer_response = smb_buffer;
5070
5071 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
5072 NULL /*no tid */ , 4 /*wct */ );
5073
5074 smb_buffer->Mid = get_next_mid(ses->server);
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);
5081 bcc_ptr = &pSMB->Password[0];
5082 if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
5083 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
5084 *bcc_ptr = 0; /* password is null byte */
5085 bcc_ptr++; /* skip password */
5086 /* already aligned so no need to do it below */
5087 } else {
5088 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
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
5092 weaker LANMAN (which we do not send by default) is accepted
5093 by Samba (not sure whether other servers allow
5094 NTLMv2 password here) */
5095 #ifdef CONFIG_CIFS_WEAK_PW_HASH
5096 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
5097 (ses->sectype == LANMAN))
5098 calc_lanman_hash(tcon->password, ses->server->cryptkey,
5099 ses->server->sec_mode &
5100 SECMODE_PW_ENCRYPT ? true : false,
5101 bcc_ptr);
5102 else
5103 #endif /* CIFS_WEAK_PW_HASH */
5104 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
5105 bcc_ptr, nls_codepage);
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 }
5112
5113 bcc_ptr += CIFS_AUTH_RESP_SIZE;
5114 if (ses->capabilities & CAP_UNICODE) {
5115 /* must align unicode strings */
5116 *bcc_ptr = 0; /* null byte password */
5117 bcc_ptr++;
5118 }
5119 }
5120
5121 if (ses->server->sign)
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 =
5133 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
5134 6 /* max utf8 char length in bytes */ *
5135 (/* server len*/ + 256 /* share len */), nls_codepage);
5136 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
5137 bcc_ptr += 2; /* skip trailing null */
5138 } else { /* ASCII */
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];
5146 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
5147 pSMB->hdr.smb_buf_length) + count);
5148 pSMB->ByteCount = cpu_to_le16(count);
5149
5150 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
5151 0);
5152
5153 /* above now done in SendReceive */
5154 if (rc == 0) {
5155 bool is_unicode;
5156
5157 tcon->tidStatus = CifsGood;
5158 tcon->need_reconnect = false;
5159 tcon->tid = smb_buffer_response->Tid;
5160 bcc_ptr = pByteArea(smb_buffer_response);
5161 bytes_left = get_bcc(smb_buffer_response);
5162 length = strnlen(bcc_ptr, bytes_left - 2);
5163 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
5164 is_unicode = true;
5165 else
5166 is_unicode = false;
5167
5168
5169 /* skip service field (NB: this field is always ASCII) */
5170 if (length == 3) {
5171 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
5172 (bcc_ptr[2] == 'C')) {
5173 cifs_dbg(FYI, "IPC connection\n");
5174 tcon->ipc = true;
5175 tcon->pipe = true;
5176 }
5177 } else if (length == 2) {
5178 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
5179 /* the most common case */
5180 cifs_dbg(FYI, "disk share connection\n");
5181 }
5182 }
5183 bcc_ptr += length + 1;
5184 bytes_left -= (length + 1);
5185 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
5186
5187 /* mostly informational -- no need to fail on error here */
5188 kfree(tcon->nativeFileSystem);
5189 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
5190 bytes_left, is_unicode,
5191 nls_codepage);
5192
5193 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
5194
5195 if ((smb_buffer_response->WordCount == 3) ||
5196 (smb_buffer_response->WordCount == 7))
5197 /* field is in same location */
5198 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
5199 else
5200 tcon->Flags = 0;
5201 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
5202 }
5203
5204 cifs_buf_release(smb_buffer);
5205 return rc;
5206 }
5207
5208 static 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
5215 void
5216 cifs_umount(struct cifs_sb_info *cifs_sb)
5217 {
5218 struct rb_root *root = &cifs_sb->tlink_tree;
5219 struct rb_node *node;
5220 struct tcon_link *tlink;
5221
5222 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
5223
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);
5230
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);
5236
5237 kfree(cifs_sb->mountdata);
5238 kfree(cifs_sb->prepath);
5239 #ifdef CONFIG_CIFS_DFS_UPCALL
5240 dfs_cache_del_vol(cifs_sb->origin_fullpath);
5241 kfree(cifs_sb->origin_fullpath);
5242 #endif
5243 call_rcu(&cifs_sb->rcu, delayed_free);
5244 }
5245
5246 int
5247 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
5248 {
5249 int rc = 0;
5250 struct TCP_Server_Info *server = cifs_ses_server(ses);
5251
5252 if (!server->ops->need_neg || !server->ops->negotiate)
5253 return -ENOSYS;
5254
5255 /* only send once per connect */
5256 if (!server->ops->need_neg(server))
5257 return 0;
5258
5259 rc = server->ops->negotiate(xid, ses);
5260 if (rc == 0) {
5261 spin_lock(&GlobalMid_Lock);
5262 if (server->tcpStatus == CifsNeedNegotiate)
5263 server->tcpStatus = CifsGood;
5264 else
5265 rc = -EHOSTDOWN;
5266 spin_unlock(&GlobalMid_Lock);
5267 }
5268
5269 return rc;
5270 }
5271
5272 int
5273 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
5274 struct nls_table *nls_info)
5275 {
5276 int rc = -ENOSYS;
5277 struct TCP_Server_Info *server = cifs_ses_server(ses);
5278
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 }
5292
5293 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
5294 server->sec_mode, server->capabilities, server->timeAdj);
5295
5296 if (server->ops->sess_setup)
5297 rc = server->ops->sess_setup(xid, ses, nls_info);
5298
5299 if (rc)
5300 cifs_server_dbg(VFS, "Send error in SessSetup = %d\n", rc);
5301
5302 return rc;
5303 }
5304
5305 static int
5306 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
5307 {
5308 vol->sectype = ses->sectype;
5309
5310 /* krb5 is special, since we don't need username or pw */
5311 if (vol->sectype == Kerberos)
5312 return 0;
5313
5314 return cifs_set_cifscreds(vol, ses);
5315 }
5316
5317 static struct cifs_tcon *
5318 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
5319 {
5320 int rc;
5321 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
5322 struct cifs_ses *ses;
5323 struct cifs_tcon *tcon = NULL;
5324 struct smb_vol *vol_info;
5325
5326 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
5327 if (vol_info == NULL)
5328 return ERR_PTR(-ENOMEM);
5329
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;
5336 vol_info->nohandlecache = master_tcon->nohandlecache;
5337 vol_info->local_lease = master_tcon->local_lease;
5338 vol_info->no_linux_ext = !master_tcon->unix_ext;
5339 vol_info->sectype = master_tcon->ses->sectype;
5340 vol_info->sign = master_tcon->ses->sign;
5341
5342 rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
5343 if (rc) {
5344 tcon = ERR_PTR(rc);
5345 goto out;
5346 }
5347
5348 /* get a reference for the same TCP session */
5349 spin_lock(&cifs_tcp_ses_lock);
5350 ++master_tcon->ses->server->srv_count;
5351 spin_unlock(&cifs_tcp_ses_lock);
5352
5353 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
5354 if (IS_ERR(ses)) {
5355 tcon = (struct cifs_tcon *)ses;
5356 cifs_put_tcp_session(master_tcon->ses->server, 0);
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
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;
5369
5370 if (cap_unix(ses))
5371 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
5372
5373 out:
5374 kfree(vol_info->username);
5375 kzfree(vol_info->password);
5376 kfree(vol_info);
5377
5378 return tcon;
5379 }
5380
5381 struct cifs_tcon *
5382 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
5383 {
5384 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
5385 }
5386
5387 /* find and return a tlink with given uid */
5388 static struct tcon_link *
5389 tlink_rb_search(struct rb_root *root, kuid_t uid)
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
5397 if (uid_gt(tlink->tl_uid, uid))
5398 node = node->rb_left;
5399 else if (uid_lt(tlink->tl_uid, uid))
5400 node = node->rb_right;
5401 else
5402 return tlink;
5403 }
5404 return NULL;
5405 }
5406
5407 /* insert a tcon_link into the tree */
5408 static void
5409 tlink_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
5418 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
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
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 *
5435 * First, search the rbtree for an existing tcon for this fsuid. If one
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 */
5444 struct tcon_link *
5445 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
5446 {
5447 int ret;
5448 kuid_t fsuid = current_fsuid();
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);
5455 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
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);
5464 newtlink->tl_uid = fsuid;
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
5470 spin_lock(&cifs_sb->tlink_tree_lock);
5471 /* was one inserted after previous search? */
5472 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5473 if (tlink) {
5474 cifs_get_tlink(tlink);
5475 spin_unlock(&cifs_sb->tlink_tree_lock);
5476 kfree(newtlink);
5477 goto wait_for_construction;
5478 }
5479 tlink = newtlink;
5480 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
5481 spin_unlock(&cifs_sb->tlink_tree_lock);
5482 } else {
5483 wait_for_construction:
5484 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
5485 TASK_INTERRUPTIBLE);
5486 if (ret) {
5487 cifs_put_tlink(tlink);
5488 return ERR_PTR(-ERESTARTSYS);
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 }
5516
5517 /*
5518 * periodic workqueue job that scans tcon_tree for a superblock and closes
5519 * out tcons.
5520 */
5521 static void
5522 cifs_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);
5526 struct rb_root *root = &cifs_sb->tlink_tree;
5527 struct rb_node *node;
5528 struct rb_node *tmp;
5529 struct tcon_link *tlink;
5530
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;
5549
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);
5559
5560 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
5561 TLINK_IDLE_EXPIRE);
5562 }