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