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