4 * Copyright (C) International Business Machines Corp., 2002,2011
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.
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.
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
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>
45 #include <linux/parser.h>
46 #include <linux/bvec.h>
49 #include "cifsproto.h"
50 #include "cifs_unicode.h"
51 #include "cifs_debug.h"
52 #include "cifs_fs_sb.h"
55 #include "rfc1002pdu.h"
57 #include "smb2proto.h"
58 #include "smbdirect.h"
59 #include "dns_resolve.h"
61 #ifdef CONFIG_CIFS_DFS_UPCALL
62 #include "dfs_cache.h"
65 extern mempool_t *cifs_req_poolp;
66 extern bool disable_legacy_dialects;
68 /* FIXME: should these be tunable? */
69 #define TLINK_ERROR_EXPIRE (1 * HZ)
70 #define TLINK_IDLE_EXPIRE (600 * HZ)
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,
85 Opt_handlecache, Opt_nohandlecache,
86 Opt_forcemandatorylock, Opt_setuidfromacl, Opt_setuids,
87 Opt_nosetuids, Opt_dynperm, Opt_nodynperm,
88 Opt_nohard, Opt_nosoft,
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,
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_rsize, Opt_wsize, Opt_actimeo,
106 Opt_echo_interval, Opt_max_credits,
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,
115 /* Mount options to be ignored */
118 /* Options which could be blank */
126 static const match_table_t cifs_mount_option_tokens = {
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" },
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" },
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" },
181 { Opt_noacl, "noacl" },
182 { Opt_locallease, "locallease" },
183 { Opt_sign, "sign" },
184 { Opt_seal, "seal" },
185 { Opt_noac, "noac" },
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"},
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_rsize, "rsize=%s" },
208 { Opt_wsize, "wsize=%s" },
209 { Opt_actimeo, "actimeo=%s" },
210 { Opt_echo_interval, "echo_interval=%s" },
211 { Opt_max_credits, "max_credits=%s" },
212 { Opt_snapshot, "snapshot=%s" },
214 { Opt_blank_user, "user=" },
215 { Opt_blank_user, "username=" },
216 { Opt_user, "user=%s" },
217 { Opt_user, "username=%s" },
218 { Opt_blank_pass, "pass=" },
219 { Opt_blank_pass, "password=" },
220 { Opt_pass, "pass=%s" },
221 { Opt_pass, "password=%s" },
222 { Opt_blank_ip, "ip=" },
223 { Opt_blank_ip, "addr=" },
225 { Opt_ip, "addr=%s" },
226 { Opt_ignore, "unc=%s" },
227 { Opt_ignore, "target=%s" },
228 { Opt_ignore, "path=%s" },
229 { Opt_domain, "dom=%s" },
230 { Opt_domain, "domain=%s" },
231 { Opt_domain, "workgroup=%s" },
232 { Opt_srcaddr, "srcaddr=%s" },
233 { Opt_ignore, "prefixpath=%s" },
234 { Opt_iocharset, "iocharset=%s" },
235 { Opt_netbiosname, "netbiosname=%s" },
236 { Opt_servern, "servern=%s" },
237 { Opt_ver, "ver=%s" },
238 { Opt_vers, "vers=%s" },
239 { Opt_sec, "sec=%s" },
240 { Opt_cache, "cache=%s" },
242 { Opt_ignore, "cred" },
243 { Opt_ignore, "credentials" },
244 { Opt_ignore, "cred=%s" },
245 { Opt_ignore, "credentials=%s" },
246 { Opt_ignore, "guest" },
247 { Opt_ignore, "rw" },
248 { Opt_ignore, "ro" },
249 { Opt_ignore, "suid" },
250 { Opt_ignore, "nosuid" },
251 { Opt_ignore, "exec" },
252 { Opt_ignore, "noexec" },
253 { Opt_ignore, "nodev" },
254 { Opt_ignore, "noauto" },
255 { Opt_ignore, "dev" },
256 { Opt_ignore, "mand" },
257 { Opt_ignore, "nomand" },
258 { Opt_ignore, "relatime" },
259 { Opt_ignore, "_netdev" },
265 Opt_sec_krb5, Opt_sec_krb5i, Opt_sec_krb5p,
266 Opt_sec_ntlmsspi, Opt_sec_ntlmssp,
267 Opt_ntlm, Opt_sec_ntlmi, Opt_sec_ntlmv2,
268 Opt_sec_ntlmv2i, Opt_sec_lanman,
274 static const match_table_t cifs_secflavor_tokens = {
275 { Opt_sec_krb5, "krb5" },
276 { Opt_sec_krb5i, "krb5i" },
277 { Opt_sec_krb5p, "krb5p" },
278 { Opt_sec_ntlmsspi, "ntlmsspi" },
279 { Opt_sec_ntlmssp, "ntlmssp" },
280 { Opt_ntlm, "ntlm" },
281 { Opt_sec_ntlmi, "ntlmi" },
282 { Opt_sec_ntlmv2, "nontlm" },
283 { Opt_sec_ntlmv2, "ntlmv2" },
284 { Opt_sec_ntlmv2i, "ntlmv2i" },
285 { Opt_sec_lanman, "lanman" },
286 { Opt_sec_none, "none" },
288 { Opt_sec_err, NULL }
299 static const match_table_t cifs_cacheflavor_tokens = {
300 { Opt_cache_loose, "loose" },
301 { Opt_cache_strict, "strict" },
302 { Opt_cache_none, "none" },
303 { Opt_cache_err, NULL }
306 static const match_table_t cifs_smb_version_tokens = {
307 { Smb_1, SMB1_VERSION_STRING },
308 { Smb_20, SMB20_VERSION_STRING},
309 { Smb_21, SMB21_VERSION_STRING },
310 { Smb_30, SMB30_VERSION_STRING },
311 { Smb_302, SMB302_VERSION_STRING },
312 { Smb_302, ALT_SMB302_VERSION_STRING },
313 { Smb_311, SMB311_VERSION_STRING },
314 { Smb_311, ALT_SMB311_VERSION_STRING },
315 { Smb_3any, SMB3ANY_VERSION_STRING },
316 { Smb_default, SMBDEFAULT_VERSION_STRING },
317 { Smb_version_err, NULL }
320 static int ip_connect(struct TCP_Server_Info *server);
321 static int generic_ip_connect(struct TCP_Server_Info *server);
322 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
323 static void cifs_prune_tlinks(struct work_struct *work);
324 static int cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
325 const char *devname, bool is_smb3);
326 static char *extract_hostname(const char *unc);
329 * Resolve hostname and set ip addr in tcp ses. Useful for hostnames that may
330 * get their ip addresses changed at some point.
332 * This should be called with server->srv_mutex held.
334 #ifdef CONFIG_CIFS_DFS_UPCALL
335 static int reconn_set_ipaddr(struct TCP_Server_Info *server)
339 char *unc, *ipaddr = NULL;
341 if (!server->hostname)
344 len = strlen(server->hostname) + 3;
346 unc = kmalloc(len, GFP_KERNEL);
348 cifs_dbg(FYI, "%s: failed to create UNC path\n", __func__);
351 snprintf(unc, len, "\\\\%s", server->hostname);
353 rc = dns_resolve_server_name_to_ip(unc, &ipaddr);
357 cifs_dbg(FYI, "%s: failed to resolve server part of %s to IP: %d\n",
358 __func__, server->hostname, rc);
362 rc = cifs_convert_address((struct sockaddr *)&server->dstaddr, ipaddr,
369 static inline int reconn_set_ipaddr(struct TCP_Server_Info *server)
375 #ifdef CONFIG_CIFS_DFS_UPCALL
376 struct super_cb_data {
377 struct TCP_Server_Info *server;
378 struct cifs_sb_info *cifs_sb;
381 /* These functions must be called with server->srv_mutex held */
383 static void super_cb(struct super_block *sb, void *arg)
385 struct super_cb_data *d = arg;
386 struct cifs_sb_info *cifs_sb;
387 struct cifs_tcon *tcon;
392 cifs_sb = CIFS_SB(sb);
393 tcon = cifs_sb_master_tcon(cifs_sb);
394 if (tcon->ses->server == d->server)
395 d->cifs_sb = cifs_sb;
398 static inline struct cifs_sb_info *
399 find_super_by_tcp(struct TCP_Server_Info *server)
401 struct super_cb_data d = {
406 iterate_supers_type(&cifs_fs_type, super_cb, &d);
407 return d.cifs_sb ? d.cifs_sb : ERR_PTR(-ENOENT);
410 static void reconn_inval_dfs_target(struct TCP_Server_Info *server,
411 struct cifs_sb_info *cifs_sb,
412 struct dfs_cache_tgt_list *tgt_list,
413 struct dfs_cache_tgt_iterator **tgt_it)
417 if (!cifs_sb || !cifs_sb->origin_fullpath || !tgt_list ||
422 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
424 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
426 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
429 cifs_dbg(FYI, "%s: UNC: %s\n", __func__, cifs_sb->origin_fullpath);
431 name = dfs_cache_get_tgt_name(*tgt_it);
433 kfree(server->hostname);
435 server->hostname = extract_hostname(name);
436 if (!server->hostname) {
437 cifs_dbg(FYI, "%s: failed to extract hostname from target: %d\n",
442 static inline int reconn_setup_dfs_targets(struct cifs_sb_info *cifs_sb,
443 struct dfs_cache_tgt_list *tl,
444 struct dfs_cache_tgt_iterator **it)
446 if (!cifs_sb->origin_fullpath)
448 return dfs_cache_noreq_find(cifs_sb->origin_fullpath + 1, NULL, tl);
453 * cifs tcp session reconnection
455 * mark tcp session as reconnecting so temporarily locked
456 * mark all smb sessions as reconnecting for tcp session
457 * reconnect tcp session
458 * wake up waiters on reconnection? - (not needed currently)
461 cifs_reconnect(struct TCP_Server_Info *server)
464 struct list_head *tmp, *tmp2;
465 struct cifs_ses *ses;
466 struct cifs_tcon *tcon;
467 struct mid_q_entry *mid_entry;
468 struct list_head retry_list;
469 #ifdef CONFIG_CIFS_DFS_UPCALL
470 struct cifs_sb_info *cifs_sb = NULL;
471 struct dfs_cache_tgt_list tgt_list = {0};
472 struct dfs_cache_tgt_iterator *tgt_it = NULL;
475 spin_lock(&GlobalMid_Lock);
476 server->nr_targets = 1;
477 #ifdef CONFIG_CIFS_DFS_UPCALL
478 cifs_sb = find_super_by_tcp(server);
479 if (IS_ERR(cifs_sb)) {
480 rc = PTR_ERR(cifs_sb);
481 cifs_dbg(FYI, "%s: will not do DFS failover: rc = %d\n",
485 rc = reconn_setup_dfs_targets(cifs_sb, &tgt_list, &tgt_it);
486 if (rc && (rc != -EOPNOTSUPP)) {
487 cifs_dbg(VFS, "%s: no target servers for DFS failover\n",
490 server->nr_targets = dfs_cache_get_nr_tgts(&tgt_list);
493 cifs_dbg(FYI, "%s: will retry %d target(s)\n", __func__,
496 if (server->tcpStatus == CifsExiting) {
497 /* the demux thread will exit normally
498 next time through the loop */
499 spin_unlock(&GlobalMid_Lock);
502 server->tcpStatus = CifsNeedReconnect;
503 spin_unlock(&GlobalMid_Lock);
505 server->max_read = 0;
507 cifs_dbg(FYI, "Mark tcp session as need reconnect\n");
508 trace_smb3_reconnect(server->CurrentMid, server->hostname);
510 /* before reconnecting the tcp session, mark the smb session (uid)
511 and the tid bad so they are not used until reconnected */
512 cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
514 spin_lock(&cifs_tcp_ses_lock);
515 list_for_each(tmp, &server->smb_ses_list) {
516 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
517 ses->need_reconnect = true;
518 list_for_each(tmp2, &ses->tcon_list) {
519 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
520 tcon->need_reconnect = true;
523 ses->tcon_ipc->need_reconnect = true;
525 spin_unlock(&cifs_tcp_ses_lock);
527 /* do not want to be sending data on a socket we are freeing */
528 cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
529 mutex_lock(&server->srv_mutex);
530 if (server->ssocket) {
531 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
532 server->ssocket->state, server->ssocket->flags);
533 kernel_sock_shutdown(server->ssocket, SHUT_WR);
534 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
535 server->ssocket->state, server->ssocket->flags);
536 sock_release(server->ssocket);
537 server->ssocket = NULL;
539 server->sequence_number = 0;
540 server->session_estab = false;
541 kfree(server->session_key.response);
542 server->session_key.response = NULL;
543 server->session_key.len = 0;
544 server->lstrp = jiffies;
546 /* mark submitted MIDs for retry and issue callback */
547 INIT_LIST_HEAD(&retry_list);
548 cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
549 spin_lock(&GlobalMid_Lock);
550 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
551 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
552 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
553 mid_entry->mid_state = MID_RETRY_NEEDED;
554 list_move(&mid_entry->qhead, &retry_list);
556 spin_unlock(&GlobalMid_Lock);
557 mutex_unlock(&server->srv_mutex);
559 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
560 list_for_each_safe(tmp, tmp2, &retry_list) {
561 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
562 list_del_init(&mid_entry->qhead);
563 mid_entry->callback(mid_entry);
569 mutex_lock(&server->srv_mutex);
571 * Set up next DFS target server (if any) for reconnect. If DFS
572 * feature is disabled, then we will retry last server we
573 * connected to before.
575 if (cifs_rdma_enabled(server))
576 rc = smbd_reconnect(server);
578 rc = generic_ip_connect(server);
580 cifs_dbg(FYI, "reconnect error %d\n", rc);
581 #ifdef CONFIG_CIFS_DFS_UPCALL
582 reconn_inval_dfs_target(server, cifs_sb, &tgt_list,
585 rc = reconn_set_ipaddr(server);
587 cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
590 mutex_unlock(&server->srv_mutex);
593 atomic_inc(&tcpSesReconnectCount);
594 spin_lock(&GlobalMid_Lock);
595 if (server->tcpStatus != CifsExiting)
596 server->tcpStatus = CifsNeedNegotiate;
597 spin_unlock(&GlobalMid_Lock);
598 mutex_unlock(&server->srv_mutex);
600 } while (server->tcpStatus == CifsNeedReconnect);
602 #ifdef CONFIG_CIFS_DFS_UPCALL
604 rc = dfs_cache_noreq_update_tgthint(cifs_sb->origin_fullpath + 1,
607 cifs_dbg(VFS, "%s: failed to update DFS target hint: rc = %d\n",
610 rc = dfs_cache_update_vol(cifs_sb->origin_fullpath, server);
612 cifs_dbg(VFS, "%s: failed to update vol info in DFS cache: rc = %d\n",
615 dfs_cache_free_tgts(&tgt_list);
618 if (server->tcpStatus == CifsNeedNegotiate)
619 mod_delayed_work(cifsiod_wq, &server->echo, 0);
625 cifs_echo_request(struct work_struct *work)
628 struct TCP_Server_Info *server = container_of(work,
629 struct TCP_Server_Info, echo.work);
630 unsigned long echo_interval;
633 * If we need to renegotiate, set echo interval to zero to
634 * immediately call echo service where we can renegotiate.
636 if (server->tcpStatus == CifsNeedNegotiate)
639 echo_interval = server->echo_interval;
642 * We cannot send an echo if it is disabled.
643 * Also, no need to ping if we got a response recently.
646 if (server->tcpStatus == CifsNeedReconnect ||
647 server->tcpStatus == CifsExiting ||
648 server->tcpStatus == CifsNew ||
649 (server->ops->can_echo && !server->ops->can_echo(server)) ||
650 time_before(jiffies, server->lstrp + echo_interval - HZ))
653 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
655 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
659 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
663 allocate_buffers(struct TCP_Server_Info *server)
665 if (!server->bigbuf) {
666 server->bigbuf = (char *)cifs_buf_get();
667 if (!server->bigbuf) {
668 cifs_dbg(VFS, "No memory for large SMB response\n");
670 /* retry will check if exiting */
673 } else if (server->large_buf) {
674 /* we are reusing a dirty large buf, clear its start */
675 memset(server->bigbuf, 0, HEADER_SIZE(server));
678 if (!server->smallbuf) {
679 server->smallbuf = (char *)cifs_small_buf_get();
680 if (!server->smallbuf) {
681 cifs_dbg(VFS, "No memory for SMB response\n");
683 /* retry will check if exiting */
686 /* beginning of smb buffer is cleared in our buf_get */
688 /* if existing small buf clear beginning */
689 memset(server->smallbuf, 0, HEADER_SIZE(server));
696 server_unresponsive(struct TCP_Server_Info *server)
699 * We need to wait 2 echo intervals to make sure we handle such
701 * 1s client sends a normal SMB request
702 * 2s client gets a response
703 * 30s echo workqueue job pops, and decides we got a response recently
704 * and don't need to send another
706 * 65s kernel_recvmsg times out, and we see that we haven't gotten
707 * a response in >60s.
709 if ((server->tcpStatus == CifsGood ||
710 server->tcpStatus == CifsNeedNegotiate) &&
711 time_after(jiffies, server->lstrp + 2 * server->echo_interval)) {
712 cifs_dbg(VFS, "Server %s has not responded in %lu seconds. Reconnecting...\n",
713 server->hostname, (2 * server->echo_interval) / HZ);
714 cifs_reconnect(server);
715 wake_up(&server->response_q);
723 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
728 smb_msg->msg_control = NULL;
729 smb_msg->msg_controllen = 0;
731 for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
734 if (server_unresponsive(server))
735 return -ECONNABORTED;
736 if (cifs_rdma_enabled(server) && server->smbd_conn)
737 length = smbd_recv(server->smbd_conn, smb_msg);
739 length = sock_recvmsg(server->ssocket, smb_msg, 0);
741 if (server->tcpStatus == CifsExiting)
744 if (server->tcpStatus == CifsNeedReconnect) {
745 cifs_reconnect(server);
746 return -ECONNABORTED;
749 if (length == -ERESTARTSYS ||
753 * Minimum sleep to prevent looping, allowing socket
754 * to clear and app threads to set tcpStatus
755 * CifsNeedReconnect if server hung.
757 usleep_range(1000, 2000);
763 cifs_dbg(FYI, "Received no data or error: %d\n", length);
764 cifs_reconnect(server);
765 return -ECONNABORTED;
772 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
773 unsigned int to_read)
775 struct msghdr smb_msg;
776 struct kvec iov = {.iov_base = buf, .iov_len = to_read};
777 iov_iter_kvec(&smb_msg.msg_iter, READ, &iov, 1, to_read);
779 return cifs_readv_from_socket(server, &smb_msg);
783 cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
784 unsigned int page_offset, unsigned int to_read)
786 struct msghdr smb_msg;
787 struct bio_vec bv = {
788 .bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
789 iov_iter_bvec(&smb_msg.msg_iter, READ, &bv, 1, to_read);
790 return cifs_readv_from_socket(server, &smb_msg);
794 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
797 * The first byte big endian of the length field,
798 * is actually not part of the length but the type
799 * with the most common, zero, as regular data.
802 case RFC1002_SESSION_MESSAGE:
803 /* Regular SMB response */
805 case RFC1002_SESSION_KEEP_ALIVE:
806 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
808 case RFC1002_POSITIVE_SESSION_RESPONSE:
809 cifs_dbg(FYI, "RFC 1002 positive session response\n");
811 case RFC1002_NEGATIVE_SESSION_RESPONSE:
813 * We get this from Windows 98 instead of an error on
814 * SMB negprot response.
816 cifs_dbg(FYI, "RFC 1002 negative session response\n");
817 /* give server a second to clean up */
820 * Always try 445 first on reconnect since we get NACK
821 * on some if we ever connected to port 139 (the NACK
822 * is since we do not begin with RFC1001 session
825 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
826 cifs_reconnect(server);
827 wake_up(&server->response_q);
830 cifs_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
831 cifs_reconnect(server);
838 dequeue_mid(struct mid_q_entry *mid, bool malformed)
840 #ifdef CONFIG_CIFS_STATS2
841 mid->when_received = jiffies;
843 spin_lock(&GlobalMid_Lock);
845 mid->mid_state = MID_RESPONSE_RECEIVED;
847 mid->mid_state = MID_RESPONSE_MALFORMED;
849 * Trying to handle/dequeue a mid after the send_recv()
850 * function has finished processing it is a bug.
852 if (mid->mid_flags & MID_DELETED)
853 printk_once(KERN_WARNING
854 "trying to dequeue a deleted mid\n");
856 list_del_init(&mid->qhead);
857 spin_unlock(&GlobalMid_Lock);
861 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
862 char *buf, int malformed)
864 if (server->ops->check_trans2 &&
865 server->ops->check_trans2(mid, server, buf, malformed))
868 mid->large_buf = server->large_buf;
869 /* Was previous buf put in mpx struct for multi-rsp? */
870 if (!mid->multiRsp) {
871 /* smb buffer will be freed by user thread */
872 if (server->large_buf)
873 server->bigbuf = NULL;
875 server->smallbuf = NULL;
877 dequeue_mid(mid, malformed);
880 static void clean_demultiplex_info(struct TCP_Server_Info *server)
884 /* take it off the list, if it's not already */
885 spin_lock(&cifs_tcp_ses_lock);
886 list_del_init(&server->tcp_ses_list);
887 spin_unlock(&cifs_tcp_ses_lock);
889 spin_lock(&GlobalMid_Lock);
890 server->tcpStatus = CifsExiting;
891 spin_unlock(&GlobalMid_Lock);
892 wake_up_all(&server->response_q);
894 /* check if we have blocked requests that need to free */
895 spin_lock(&server->req_lock);
896 if (server->credits <= 0)
898 spin_unlock(&server->req_lock);
900 * Although there should not be any requests blocked on this queue it
901 * can not hurt to be paranoid and try to wake up requests that may
902 * haven been blocked when more than 50 at time were on the wire to the
903 * same server - they now will see the session is in exit state and get
904 * out of SendReceive.
906 wake_up_all(&server->request_q);
907 /* give those requests time to exit */
909 if (cifs_rdma_enabled(server) && server->smbd_conn) {
910 smbd_destroy(server->smbd_conn);
911 server->smbd_conn = NULL;
913 if (server->ssocket) {
914 sock_release(server->ssocket);
915 server->ssocket = NULL;
918 if (!list_empty(&server->pending_mid_q)) {
919 struct list_head dispose_list;
920 struct mid_q_entry *mid_entry;
921 struct list_head *tmp, *tmp2;
923 INIT_LIST_HEAD(&dispose_list);
924 spin_lock(&GlobalMid_Lock);
925 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
926 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
927 cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
928 mid_entry->mid_state = MID_SHUTDOWN;
929 list_move(&mid_entry->qhead, &dispose_list);
931 spin_unlock(&GlobalMid_Lock);
933 /* now walk dispose list and issue callbacks */
934 list_for_each_safe(tmp, tmp2, &dispose_list) {
935 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
936 cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
937 list_del_init(&mid_entry->qhead);
938 mid_entry->callback(mid_entry);
940 /* 1/8th of sec is more than enough time for them to exit */
944 if (!list_empty(&server->pending_mid_q)) {
946 * mpx threads have not exited yet give them at least the smb
947 * send timeout time for long ops.
949 * Due to delays on oplock break requests, we need to wait at
950 * least 45 seconds before giving up on a request getting a
951 * response and going ahead and killing cifsd.
953 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
956 * If threads still have not exited they are probably never
957 * coming home not much else we can do but free the memory.
961 kfree(server->hostname);
964 length = atomic_dec_return(&tcpSesAllocCount);
966 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
970 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
973 char *buf = server->smallbuf;
974 unsigned int pdu_length = server->pdu_size;
976 /* make sure this will fit in a large buffer */
977 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
978 server->vals->header_preamble_size) {
979 cifs_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
980 cifs_reconnect(server);
981 wake_up(&server->response_q);
982 return -ECONNABORTED;
985 /* switch to large buffer if too big for a small one */
986 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
987 server->large_buf = true;
988 memcpy(server->bigbuf, buf, server->total_read);
989 buf = server->bigbuf;
992 /* now read the rest */
993 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
994 pdu_length - HEADER_SIZE(server) + 1
995 + server->vals->header_preamble_size);
999 server->total_read += length;
1001 dump_smb(buf, server->total_read);
1003 return cifs_handle_standard(server, mid);
1007 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1009 char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
1013 * We know that we received enough to get to the MID as we
1014 * checked the pdu_length earlier. Now check to see
1015 * if the rest of the header is OK. We borrow the length
1016 * var for the rest of the loop to avoid a new stack var.
1018 * 48 bytes is enough to display the header and a little bit
1019 * into the payload for debugging purposes.
1021 length = server->ops->check_message(buf, server->total_read, server);
1023 cifs_dump_mem("Bad SMB: ", buf,
1024 min_t(unsigned int, server->total_read, 48));
1026 if (server->ops->is_session_expired &&
1027 server->ops->is_session_expired(buf)) {
1028 cifs_reconnect(server);
1029 wake_up(&server->response_q);
1033 if (server->ops->is_status_pending &&
1034 server->ops->is_status_pending(buf, server, length))
1040 handle_mid(mid, server, buf, length);
1045 cifs_demultiplex_thread(void *p)
1047 int i, num_mids, length;
1048 struct TCP_Server_Info *server = p;
1049 unsigned int pdu_length;
1050 unsigned int next_offset;
1052 struct task_struct *task_to_wake = NULL;
1053 struct mid_q_entry *mids[MAX_COMPOUND];
1054 char *bufs[MAX_COMPOUND];
1056 current->flags |= PF_MEMALLOC;
1057 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
1059 length = atomic_inc_return(&tcpSesAllocCount);
1061 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
1064 while (server->tcpStatus != CifsExiting) {
1065 if (try_to_freeze())
1068 if (!allocate_buffers(server))
1071 server->large_buf = false;
1072 buf = server->smallbuf;
1073 pdu_length = 4; /* enough to get RFC1001 header */
1075 length = cifs_read_from_socket(server, buf, pdu_length);
1079 if (server->vals->header_preamble_size == 0)
1080 server->total_read = 0;
1082 server->total_read = length;
1085 * The right amount was read from socket - 4 bytes,
1086 * so we can now interpret the length field.
1088 pdu_length = get_rfc1002_length(buf);
1090 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
1091 if (!is_smb_response(server, buf[0]))
1094 server->pdu_size = pdu_length;
1096 /* make sure we have enough to get to the MID */
1097 if (server->pdu_size < HEADER_SIZE(server) - 1 -
1098 server->vals->header_preamble_size) {
1099 cifs_dbg(VFS, "SMB response too short (%u bytes)\n",
1101 cifs_reconnect(server);
1102 wake_up(&server->response_q);
1106 /* read down to the MID */
1107 length = cifs_read_from_socket(server,
1108 buf + server->vals->header_preamble_size,
1109 HEADER_SIZE(server) - 1
1110 - server->vals->header_preamble_size);
1113 server->total_read += length;
1115 if (server->ops->next_header) {
1116 next_offset = server->ops->next_header(buf);
1118 server->pdu_size = next_offset;
1121 memset(mids, 0, sizeof(mids));
1122 memset(bufs, 0, sizeof(bufs));
1125 if (server->ops->is_transform_hdr &&
1126 server->ops->receive_transform &&
1127 server->ops->is_transform_hdr(buf)) {
1128 length = server->ops->receive_transform(server,
1133 mids[0] = server->ops->find_mid(server, buf);
1137 if (!mids[0] || !mids[0]->receive)
1138 length = standard_receive3(server, mids[0]);
1140 length = mids[0]->receive(server, mids[0]);
1144 for (i = 0; i < num_mids; i++)
1146 cifs_mid_q_entry_release(mids[i]);
1150 if (server->large_buf)
1151 buf = server->bigbuf;
1154 server->lstrp = jiffies;
1156 for (i = 0; i < num_mids; i++) {
1157 if (mids[i] != NULL) {
1158 mids[i]->resp_buf_size = server->pdu_size;
1159 if ((mids[i]->mid_flags & MID_WAIT_CANCELLED) &&
1160 mids[i]->mid_state == MID_RESPONSE_RECEIVED &&
1161 server->ops->handle_cancelled_mid)
1162 server->ops->handle_cancelled_mid(
1166 if (!mids[i]->multiRsp || mids[i]->multiEnd)
1167 mids[i]->callback(mids[i]);
1169 cifs_mid_q_entry_release(mids[i]);
1170 } else if (server->ops->is_oplock_break &&
1171 server->ops->is_oplock_break(bufs[i],
1173 cifs_dbg(FYI, "Received oplock break\n");
1175 cifs_dbg(VFS, "No task to wake, unknown frame "
1176 "received! NumMids %d\n",
1177 atomic_read(&midCount));
1178 cifs_dump_mem("Received Data is: ", bufs[i],
1179 HEADER_SIZE(server));
1180 #ifdef CONFIG_CIFS_DEBUG2
1181 if (server->ops->dump_detail)
1182 server->ops->dump_detail(bufs[i],
1184 cifs_dump_mids(server);
1185 #endif /* CIFS_DEBUG2 */
1189 if (pdu_length > server->pdu_size) {
1190 if (!allocate_buffers(server))
1192 pdu_length -= server->pdu_size;
1193 server->total_read = 0;
1194 server->large_buf = false;
1195 buf = server->smallbuf;
1198 } /* end while !EXITING */
1200 /* buffer usually freed in free_mid - need to free it here on exit */
1201 cifs_buf_release(server->bigbuf);
1202 if (server->smallbuf) /* no sense logging a debug message if NULL */
1203 cifs_small_buf_release(server->smallbuf);
1205 task_to_wake = xchg(&server->tsk, NULL);
1206 clean_demultiplex_info(server);
1208 /* if server->tsk was NULL then wait for a signal before exiting */
1209 if (!task_to_wake) {
1210 set_current_state(TASK_INTERRUPTIBLE);
1211 while (!signal_pending(current)) {
1213 set_current_state(TASK_INTERRUPTIBLE);
1215 set_current_state(TASK_RUNNING);
1218 module_put_and_exit(0);
1221 /* extract the host portion of the UNC string */
1223 extract_hostname(const char *unc)
1229 /* skip double chars at beginning of string */
1230 /* BB: check validity of these bytes? */
1231 if (strlen(unc) < 3)
1232 return ERR_PTR(-EINVAL);
1233 for (src = unc; *src && *src == '\\'; src++)
1236 return ERR_PTR(-EINVAL);
1238 /* delimiter between hostname and sharename is always '\\' now */
1239 delim = strchr(src, '\\');
1241 return ERR_PTR(-EINVAL);
1244 dst = kmalloc((len + 1), GFP_KERNEL);
1246 return ERR_PTR(-ENOMEM);
1248 memcpy(dst, src, len);
1254 static int get_option_ul(substring_t args[], unsigned long *option)
1259 string = match_strdup(args);
1262 rc = kstrtoul(string, 0, option);
1268 static int get_option_uid(substring_t args[], kuid_t *result)
1270 unsigned long value;
1274 rc = get_option_ul(args, &value);
1278 uid = make_kuid(current_user_ns(), value);
1279 if (!uid_valid(uid))
1286 static int get_option_gid(substring_t args[], kgid_t *result)
1288 unsigned long value;
1292 rc = get_option_ul(args, &value);
1296 gid = make_kgid(current_user_ns(), value);
1297 if (!gid_valid(gid))
1304 static int cifs_parse_security_flavors(char *value,
1305 struct smb_vol *vol)
1308 substring_t args[MAX_OPT_ARGS];
1311 * With mount options, the last one should win. Reset any existing
1312 * settings back to default.
1314 vol->sectype = Unspecified;
1317 switch (match_token(value, cifs_secflavor_tokens, args)) {
1319 cifs_dbg(VFS, "sec=krb5p is not supported!\n");
1325 vol->sectype = Kerberos;
1327 case Opt_sec_ntlmsspi:
1330 case Opt_sec_ntlmssp:
1331 vol->sectype = RawNTLMSSP;
1337 vol->sectype = NTLM;
1339 case Opt_sec_ntlmv2i:
1342 case Opt_sec_ntlmv2:
1343 vol->sectype = NTLMv2;
1345 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1346 case Opt_sec_lanman:
1347 vol->sectype = LANMAN;
1354 cifs_dbg(VFS, "bad security option: %s\n", value);
1362 cifs_parse_cache_flavor(char *value, struct smb_vol *vol)
1364 substring_t args[MAX_OPT_ARGS];
1366 switch (match_token(value, cifs_cacheflavor_tokens, args)) {
1367 case Opt_cache_loose:
1368 vol->direct_io = false;
1369 vol->strict_io = false;
1371 case Opt_cache_strict:
1372 vol->direct_io = false;
1373 vol->strict_io = true;
1375 case Opt_cache_none:
1376 vol->direct_io = true;
1377 vol->strict_io = false;
1380 cifs_dbg(VFS, "bad cache= option: %s\n", value);
1387 cifs_parse_smb_version(char *value, struct smb_vol *vol, bool is_smb3)
1389 substring_t args[MAX_OPT_ARGS];
1391 switch (match_token(value, cifs_smb_version_tokens, args)) {
1392 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1394 if (disable_legacy_dialects) {
1395 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1399 cifs_dbg(VFS, "vers=1.0 (cifs) not permitted when mounting with smb3\n");
1402 vol->ops = &smb1_operations;
1403 vol->vals = &smb1_values;
1406 if (disable_legacy_dialects) {
1407 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1411 cifs_dbg(VFS, "vers=2.0 not permitted when mounting with smb3\n");
1414 vol->ops = &smb20_operations;
1415 vol->vals = &smb20_values;
1419 cifs_dbg(VFS, "vers=1.0 (cifs) mount not permitted when legacy dialects disabled\n");
1422 cifs_dbg(VFS, "vers=2.0 mount not permitted when legacy dialects disabled\n");
1424 #endif /* CIFS_ALLOW_INSECURE_LEGACY */
1426 vol->ops = &smb21_operations;
1427 vol->vals = &smb21_values;
1430 vol->ops = &smb30_operations;
1431 vol->vals = &smb30_values;
1434 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1435 vol->vals = &smb302_values;
1438 vol->ops = &smb311_operations;
1439 vol->vals = &smb311_values;
1442 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1443 vol->vals = &smb3any_values;
1446 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1447 vol->vals = &smbdefault_values;
1450 cifs_dbg(VFS, "Unknown vers= option specified: %s\n", value);
1457 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1458 * fields with the result. Returns 0 on success and an error otherwise.
1461 cifs_parse_devname(const char *devname, struct smb_vol *vol)
1464 const char *delims = "/\\";
1467 /* make sure we have a valid UNC double delimiter prefix */
1468 len = strspn(devname, delims);
1472 /* find delimiter between host and sharename */
1473 pos = strpbrk(devname + 2, delims);
1477 /* skip past delimiter */
1480 /* now go until next delimiter or end of string */
1481 len = strcspn(pos, delims);
1483 /* move "pos" up to delimiter or NULL */
1485 vol->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
1489 convert_delimiter(vol->UNC, '\\');
1491 /* skip any delimiter */
1492 if (*pos == '/' || *pos == '\\')
1495 /* If pos is NULL then no prepath */
1499 vol->prepath = kstrdup(pos, GFP_KERNEL);
1507 cifs_parse_mount_options(const char *mountdata, const char *devname,
1508 struct smb_vol *vol, bool is_smb3)
1511 char *mountdata_copy = NULL, *options;
1512 unsigned int temp_len, i, j;
1514 short int override_uid = -1;
1515 short int override_gid = -1;
1516 bool uid_specified = false;
1517 bool gid_specified = false;
1518 bool sloppy = false;
1519 char *invalid = NULL;
1520 char *nodename = utsname()->nodename;
1521 char *string = NULL;
1522 char *tmp_end, *value;
1524 bool got_ip = false;
1525 bool got_version = false;
1526 unsigned short port = 0;
1527 struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1531 delim = separator[0];
1533 /* ensure we always start with zeroed-out smb_vol */
1534 memset(vol, 0, sizeof(*vol));
1537 * does not have to be perfect mapping since field is
1538 * informational, only used for servers that do not support
1539 * port 445 and it can be overridden at mount time
1541 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1542 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1543 vol->source_rfc1001_name[i] = toupper(nodename[i]);
1545 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1546 /* null target name indicates to use *SMBSERVR default called name
1547 if we end up sending RFC1001 session initialize */
1548 vol->target_rfc1001_name[0] = 0;
1549 vol->cred_uid = current_uid();
1550 vol->linux_uid = current_uid();
1551 vol->linux_gid = current_gid();
1554 * default to SFM style remapping of seven reserved characters
1555 * unless user overrides it or we negotiate CIFS POSIX where
1556 * it is unnecessary. Can not simultaneously use more than one mapping
1557 * since then readdir could list files that open could not open
1561 /* default to only allowing write access to owner of the mount */
1562 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1564 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1565 /* default is always to request posix paths. */
1566 vol->posix_paths = 1;
1567 /* default to using server inode numbers where available */
1568 vol->server_ino = 1;
1570 /* default is to use strict cifs caching semantics */
1571 vol->strict_io = true;
1573 vol->actimeo = CIFS_DEF_ACTIMEO;
1575 /* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1576 vol->ops = &smb30_operations;
1577 vol->vals = &smbdefault_values;
1579 vol->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1582 goto cifs_parse_mount_err;
1584 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1585 if (!mountdata_copy)
1586 goto cifs_parse_mount_err;
1588 options = mountdata_copy;
1589 end = options + strlen(options);
1591 if (strncmp(options, "sep=", 4) == 0) {
1592 if (options[4] != 0) {
1593 separator[0] = options[4];
1596 cifs_dbg(FYI, "Null separator not allowed\n");
1599 vol->backupuid_specified = false; /* no backup intent for a user */
1600 vol->backupgid_specified = false; /* no backup intent for a group */
1602 switch (cifs_parse_devname(devname, vol)) {
1606 cifs_dbg(VFS, "Unable to allocate memory for devname.\n");
1607 goto cifs_parse_mount_err;
1609 cifs_dbg(VFS, "Malformed UNC in devname.\n");
1610 goto cifs_parse_mount_err;
1612 cifs_dbg(VFS, "Unknown error parsing devname.\n");
1613 goto cifs_parse_mount_err;
1616 while ((data = strsep(&options, separator)) != NULL) {
1617 substring_t args[MAX_OPT_ARGS];
1618 unsigned long option;
1624 token = match_token(data, cifs_mount_option_tokens, args);
1628 /* Ingnore the following */
1632 /* Boolean values */
1633 case Opt_user_xattr:
1636 case Opt_nouser_xattr:
1642 case Opt_noforceuid:
1648 case Opt_noforcegid:
1651 case Opt_noblocksend:
1652 vol->noblocksnd = 1;
1654 case Opt_noautotune:
1655 vol->noautotune = 1;
1670 vol->sfu_remap = true;
1671 vol->remap = false; /* disable SFM mapping */
1673 case Opt_nomapchars:
1674 vol->sfu_remap = false;
1678 vol->sfu_remap = false; /* disable SFU mapping */
1680 case Opt_nomapposix:
1692 case Opt_posixpaths:
1693 vol->posix_paths = 1;
1695 case Opt_noposixpaths:
1696 vol->posix_paths = 0;
1701 "conflicting unix mount options\n");
1702 vol->no_linux_ext = 1;
1705 if (vol->no_linux_ext)
1707 "conflicting unix mount options\n");
1719 * turn off mandatory locking in mode
1720 * if remote locking is turned off since the
1721 * local vfs will do advisory
1723 if (vol->file_mode ==
1724 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1725 vol->file_mode = S_IALLUGO;
1727 case Opt_nohandlecache:
1728 vol->nohandlecache = 1;
1730 case Opt_handlecache:
1731 vol->nohandlecache = 0;
1733 case Opt_forcemandatorylock:
1742 case Opt_setuidfromacl:
1743 vol->setuidfromacl = 1;
1746 vol->dynperm = true;
1749 vol->dynperm = false;
1763 case Opt_nostrictsync:
1764 vol->nostrictsync = 1;
1766 case Opt_strictsync:
1767 vol->nostrictsync = 0;
1770 vol->server_ino = 1;
1772 case Opt_noserverino:
1773 vol->server_ino = 0;
1775 case Opt_rwpidforward:
1776 vol->rwpidforward = 1;
1785 vol->no_psx_acl = 0;
1788 vol->no_psx_acl = 1;
1790 case Opt_locallease:
1791 vol->local_lease = 1;
1797 /* we do not do the following in secFlags because seal
1798 * is a per tree connection (mount) not a per socket
1799 * or per-smb connection option in the protocol
1800 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1805 pr_warn("CIFS: Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1808 #ifndef CONFIG_CIFS_FSCACHE
1809 cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1810 goto cifs_parse_mount_err;
1814 case Opt_mfsymlinks:
1815 vol->mfsymlinks = true;
1818 vol->multiuser = true;
1823 case Opt_nosharesock:
1824 vol->nosharesock = true;
1826 case Opt_nopersistent:
1827 vol->nopersistent = true;
1828 if (vol->persistent) {
1830 "persistenthandles mount options conflict\n");
1831 goto cifs_parse_mount_err;
1834 case Opt_persistent:
1835 vol->persistent = true;
1836 if ((vol->nopersistent) || (vol->resilient)) {
1838 "persistenthandles mount options conflict\n");
1839 goto cifs_parse_mount_err;
1843 vol->resilient = true;
1844 if (vol->persistent) {
1846 "persistenthandles mount options conflict\n");
1847 goto cifs_parse_mount_err;
1850 case Opt_noresilient:
1851 vol->resilient = false; /* already the default */
1853 case Opt_domainauto:
1854 vol->domainauto = true;
1860 /* Numeric Values */
1862 if (get_option_uid(args, &vol->backupuid)) {
1863 cifs_dbg(VFS, "%s: Invalid backupuid value\n",
1865 goto cifs_parse_mount_err;
1867 vol->backupuid_specified = true;
1870 if (get_option_gid(args, &vol->backupgid)) {
1871 cifs_dbg(VFS, "%s: Invalid backupgid value\n",
1873 goto cifs_parse_mount_err;
1875 vol->backupgid_specified = true;
1878 if (get_option_uid(args, &vol->linux_uid)) {
1879 cifs_dbg(VFS, "%s: Invalid uid value\n",
1881 goto cifs_parse_mount_err;
1883 uid_specified = true;
1886 if (get_option_uid(args, &vol->cred_uid)) {
1887 cifs_dbg(VFS, "%s: Invalid cruid value\n",
1889 goto cifs_parse_mount_err;
1893 if (get_option_gid(args, &vol->linux_gid)) {
1894 cifs_dbg(VFS, "%s: Invalid gid value\n",
1896 goto cifs_parse_mount_err;
1898 gid_specified = true;
1901 if (get_option_ul(args, &option)) {
1902 cifs_dbg(VFS, "%s: Invalid file_mode value\n",
1904 goto cifs_parse_mount_err;
1906 vol->file_mode = option;
1909 if (get_option_ul(args, &option)) {
1910 cifs_dbg(VFS, "%s: Invalid dir_mode value\n",
1912 goto cifs_parse_mount_err;
1914 vol->dir_mode = option;
1917 if (get_option_ul(args, &option) ||
1918 option > USHRT_MAX) {
1919 cifs_dbg(VFS, "%s: Invalid port value\n",
1921 goto cifs_parse_mount_err;
1923 port = (unsigned short)option;
1926 if (get_option_ul(args, &option)) {
1927 cifs_dbg(VFS, "%s: Invalid rsize value\n",
1929 goto cifs_parse_mount_err;
1931 vol->rsize = option;
1934 if (get_option_ul(args, &option)) {
1935 cifs_dbg(VFS, "%s: Invalid wsize value\n",
1937 goto cifs_parse_mount_err;
1939 vol->wsize = option;
1942 if (get_option_ul(args, &option)) {
1943 cifs_dbg(VFS, "%s: Invalid actimeo value\n",
1945 goto cifs_parse_mount_err;
1947 vol->actimeo = HZ * option;
1948 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
1949 cifs_dbg(VFS, "attribute cache timeout too large\n");
1950 goto cifs_parse_mount_err;
1953 case Opt_echo_interval:
1954 if (get_option_ul(args, &option)) {
1955 cifs_dbg(VFS, "%s: Invalid echo interval value\n",
1957 goto cifs_parse_mount_err;
1959 vol->echo_interval = option;
1962 if (get_option_ul(args, &option)) {
1963 cifs_dbg(VFS, "%s: Invalid snapshot time\n",
1965 goto cifs_parse_mount_err;
1967 vol->snapshot_time = option;
1969 case Opt_max_credits:
1970 if (get_option_ul(args, &option) || (option < 20) ||
1972 cifs_dbg(VFS, "%s: Invalid max_credits value\n",
1974 goto cifs_parse_mount_err;
1976 vol->max_credits = option;
1979 /* String Arguments */
1981 case Opt_blank_user:
1982 /* null user, ie. anonymous authentication */
1984 vol->username = NULL;
1987 string = match_strdup(args);
1991 if (strnlen(string, CIFS_MAX_USERNAME_LEN) >
1992 CIFS_MAX_USERNAME_LEN) {
1993 pr_warn("CIFS: username too long\n");
1994 goto cifs_parse_mount_err;
1997 kfree(vol->username);
1998 vol->username = kstrdup(string, GFP_KERNEL);
2000 goto cifs_parse_mount_err;
2002 case Opt_blank_pass:
2003 /* passwords have to be handled differently
2004 * to allow the character used for deliminator
2005 * to be passed within them
2009 * Check if this is a case where the password
2010 * starts with a delimiter
2012 tmp_end = strchr(data, '=');
2014 if (!(tmp_end < end && tmp_end[1] == delim)) {
2015 /* No it is not. Set the password to NULL */
2016 kzfree(vol->password);
2017 vol->password = NULL;
2020 /* Fallthrough - to Opt_pass below.*/
2022 /* Obtain the value string */
2023 value = strchr(data, '=');
2026 /* Set tmp_end to end of the string */
2027 tmp_end = (char *) value + strlen(value);
2029 /* Check if following character is the deliminator
2030 * If yes, we have encountered a double deliminator
2031 * reset the NULL character to the deliminator
2033 if (tmp_end < end && tmp_end[1] == delim) {
2036 /* Keep iterating until we get to a single
2037 * deliminator OR the end
2039 while ((tmp_end = strchr(tmp_end, delim))
2040 != NULL && (tmp_end[1] == delim)) {
2041 tmp_end = (char *) &tmp_end[2];
2044 /* Reset var options to point to next element */
2047 options = (char *) &tmp_end[1];
2049 /* Reached the end of the mount option
2054 kzfree(vol->password);
2055 /* Now build new password string */
2056 temp_len = strlen(value);
2057 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
2058 if (vol->password == NULL) {
2059 pr_warn("CIFS: no memory for password\n");
2060 goto cifs_parse_mount_err;
2063 for (i = 0, j = 0; i < temp_len; i++, j++) {
2064 vol->password[j] = value[i];
2065 if ((value[i] == delim) &&
2066 value[i+1] == delim)
2067 /* skip the second deliminator */
2070 vol->password[j] = '\0';
2073 /* FIXME: should this be an error instead? */
2077 string = match_strdup(args);
2081 if (!cifs_convert_address(dstaddr, string,
2083 pr_err("CIFS: bad ip= option (%s).\n", string);
2084 goto cifs_parse_mount_err;
2089 string = match_strdup(args);
2093 if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
2094 == CIFS_MAX_DOMAINNAME_LEN) {
2095 pr_warn("CIFS: domain name too long\n");
2096 goto cifs_parse_mount_err;
2099 kfree(vol->domainname);
2100 vol->domainname = kstrdup(string, GFP_KERNEL);
2101 if (!vol->domainname) {
2102 pr_warn("CIFS: no memory for domainname\n");
2103 goto cifs_parse_mount_err;
2105 cifs_dbg(FYI, "Domain name set\n");
2108 string = match_strdup(args);
2112 if (!cifs_convert_address(
2113 (struct sockaddr *)&vol->srcaddr,
2114 string, strlen(string))) {
2115 pr_warn("CIFS: Could not parse srcaddr: %s\n",
2117 goto cifs_parse_mount_err;
2121 string = match_strdup(args);
2125 if (strnlen(string, 1024) >= 65) {
2126 pr_warn("CIFS: iocharset name too long.\n");
2127 goto cifs_parse_mount_err;
2130 if (strncasecmp(string, "default", 7) != 0) {
2131 kfree(vol->iocharset);
2132 vol->iocharset = kstrdup(string,
2134 if (!vol->iocharset) {
2135 pr_warn("CIFS: no memory for charset\n");
2136 goto cifs_parse_mount_err;
2139 /* if iocharset not set then load_nls_default
2142 cifs_dbg(FYI, "iocharset set to %s\n", string);
2144 case Opt_netbiosname:
2145 string = match_strdup(args);
2149 memset(vol->source_rfc1001_name, 0x20,
2152 * FIXME: are there cases in which a comma can
2153 * be valid in workstation netbios name (and
2154 * need special handling)?
2156 for (i = 0; i < RFC1001_NAME_LEN; i++) {
2157 /* don't ucase netbiosname for user */
2160 vol->source_rfc1001_name[i] = string[i];
2162 /* The string has 16th byte zero still from
2163 * set at top of the function
2165 if (i == RFC1001_NAME_LEN && string[i] != 0)
2166 pr_warn("CIFS: netbiosname longer than 15 truncated.\n");
2169 /* servernetbiosname specified override *SMBSERVER */
2170 string = match_strdup(args);
2174 /* last byte, type, is 0x20 for servr type */
2175 memset(vol->target_rfc1001_name, 0x20,
2176 RFC1001_NAME_LEN_WITH_NULL);
2178 /* BB are there cases in which a comma can be
2179 valid in this workstation netbios name
2180 (and need special handling)? */
2182 /* user or mount helper must uppercase the
2184 for (i = 0; i < 15; i++) {
2187 vol->target_rfc1001_name[i] = string[i];
2189 /* The string has 16th byte zero still from
2190 set at top of the function */
2191 if (i == RFC1001_NAME_LEN && string[i] != 0)
2192 pr_warn("CIFS: server netbiosname longer than 15 truncated.\n");
2195 /* version of mount userspace tools, not dialect */
2196 string = match_strdup(args);
2200 /* If interface changes in mount.cifs bump to new ver */
2201 if (strncasecmp(string, "1", 1) == 0) {
2202 if (strlen(string) > 1) {
2203 pr_warn("Bad mount helper ver=%s. Did "
2204 "you want SMB1 (CIFS) dialect "
2205 "and mean to type vers=1.0 "
2206 "instead?\n", string);
2207 goto cifs_parse_mount_err;
2209 /* This is the default */
2212 /* For all other value, error */
2213 pr_warn("CIFS: Invalid mount helper version specified\n");
2214 goto cifs_parse_mount_err;
2216 /* protocol version (dialect) */
2217 string = match_strdup(args);
2221 if (cifs_parse_smb_version(string, vol, is_smb3) != 0)
2222 goto cifs_parse_mount_err;
2226 string = match_strdup(args);
2230 if (cifs_parse_security_flavors(string, vol) != 0)
2231 goto cifs_parse_mount_err;
2234 string = match_strdup(args);
2238 if (cifs_parse_cache_flavor(string, vol) != 0)
2239 goto cifs_parse_mount_err;
2243 * An option we don't recognize. Save it off for later
2244 * if we haven't already found one
2250 /* Free up any allocated string */
2255 if (!sloppy && invalid) {
2256 pr_err("CIFS: Unknown mount option \"%s\"\n", invalid);
2257 goto cifs_parse_mount_err;
2260 if (vol->rdma && vol->vals->protocol_id < SMB30_PROT_ID) {
2261 cifs_dbg(VFS, "SMB Direct requires Version >=3.0\n");
2262 goto cifs_parse_mount_err;
2266 /* Muliuser mounts require CONFIG_KEYS support */
2267 if (vol->multiuser) {
2268 cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
2269 goto cifs_parse_mount_err;
2273 cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
2274 goto cifs_parse_mount_err;
2277 /* make sure UNC has a share name */
2278 if (!strchr(vol->UNC + 3, '\\')) {
2279 cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
2280 goto cifs_parse_mount_err;
2287 /* No ip= option specified? Try to get it from UNC */
2288 /* Use the address part of the UNC. */
2289 slash = strchr(&vol->UNC[2], '\\');
2290 len = slash - &vol->UNC[2];
2291 if (!cifs_convert_address(dstaddr, &vol->UNC[2], len)) {
2292 pr_err("Unable to determine destination address.\n");
2293 goto cifs_parse_mount_err;
2297 /* set the port that we got earlier */
2298 cifs_set_port(dstaddr, port);
2301 vol->override_uid = override_uid;
2302 else if (override_uid == 1)
2303 pr_notice("CIFS: ignoring forceuid mount option specified with no uid= option.\n");
2306 vol->override_gid = override_gid;
2307 else if (override_gid == 1)
2308 pr_notice("CIFS: ignoring forcegid mount option specified with no gid= option.\n");
2310 if (got_version == false)
2311 pr_warn("No dialect specified on mount. Default has changed to "
2312 "a more secure dialect, SMB2.1 or later (e.g. SMB3), from CIFS "
2313 "(SMB1). To use the less secure SMB1 dialect to access "
2314 "old servers which do not support SMB3 (or SMB2.1) specify vers=1.0"
2317 kfree(mountdata_copy);
2321 pr_warn("Could not allocate temporary buffer\n");
2322 cifs_parse_mount_err:
2324 kfree(mountdata_copy);
2328 /** Returns true if srcaddr isn't specified and rhs isn't
2329 * specified, or if srcaddr is specified and
2330 * matches the IP address of the rhs argument.
2333 srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
2335 switch (srcaddr->sa_family) {
2337 return (rhs->sa_family == AF_UNSPEC);
2339 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
2340 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
2341 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
2344 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
2345 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
2346 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
2350 return false; /* don't expect to be here */
2355 * If no port is specified in addr structure, we try to match with 445 port
2356 * and if it fails - with 139 ports. It should be called only if address
2357 * families of server and addr are equal.
2360 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
2362 __be16 port, *sport;
2364 switch (addr->sa_family) {
2366 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
2367 port = ((struct sockaddr_in *) addr)->sin_port;
2370 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
2371 port = ((struct sockaddr_in6 *) addr)->sin6_port;
2379 port = htons(CIFS_PORT);
2383 port = htons(RFC1001_PORT);
2386 return port == *sport;
2390 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
2391 struct sockaddr *srcaddr)
2393 switch (addr->sa_family) {
2395 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
2396 struct sockaddr_in *srv_addr4 =
2397 (struct sockaddr_in *)&server->dstaddr;
2399 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
2404 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
2405 struct sockaddr_in6 *srv_addr6 =
2406 (struct sockaddr_in6 *)&server->dstaddr;
2408 if (!ipv6_addr_equal(&addr6->sin6_addr,
2409 &srv_addr6->sin6_addr))
2411 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
2417 return false; /* don't expect to be here */
2420 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
2427 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2430 * The select_sectype function should either return the vol->sectype
2431 * that was specified, or "Unspecified" if that sectype was not
2432 * compatible with the given NEGOTIATE request.
2434 if (server->ops->select_sectype(server, vol->sectype)
2439 * Now check if signing mode is acceptable. No need to check
2440 * global_secflags at this point since if MUST_SIGN is set then
2441 * the server->sign had better be too.
2443 if (vol->sign && !server->sign)
2449 static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
2451 struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2453 if (vol->nosharesock)
2456 /* BB update this for smb3any and default case */
2457 if ((server->vals != vol->vals) || (server->ops != vol->ops))
2460 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2463 if (!match_address(server, addr,
2464 (struct sockaddr *)&vol->srcaddr))
2467 if (!match_port(server, addr))
2470 if (!match_security(server, vol))
2473 if (server->echo_interval != vol->echo_interval * HZ)
2476 if (server->rdma != vol->rdma)
2482 struct TCP_Server_Info *
2483 cifs_find_tcp_session(struct smb_vol *vol)
2485 struct TCP_Server_Info *server;
2487 spin_lock(&cifs_tcp_ses_lock);
2488 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
2489 if (!match_server(server, vol))
2492 ++server->srv_count;
2493 spin_unlock(&cifs_tcp_ses_lock);
2494 cifs_dbg(FYI, "Existing tcp session with server found\n");
2497 spin_unlock(&cifs_tcp_ses_lock);
2502 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
2504 struct task_struct *task;
2506 spin_lock(&cifs_tcp_ses_lock);
2507 if (--server->srv_count > 0) {
2508 spin_unlock(&cifs_tcp_ses_lock);
2512 put_net(cifs_net_ns(server));
2514 list_del_init(&server->tcp_ses_list);
2515 spin_unlock(&cifs_tcp_ses_lock);
2517 cancel_delayed_work_sync(&server->echo);
2521 * Avoid deadlock here: reconnect work calls
2522 * cifs_put_tcp_session() at its end. Need to be sure
2523 * that reconnect work does nothing with server pointer after
2526 cancel_delayed_work(&server->reconnect);
2528 cancel_delayed_work_sync(&server->reconnect);
2530 spin_lock(&GlobalMid_Lock);
2531 server->tcpStatus = CifsExiting;
2532 spin_unlock(&GlobalMid_Lock);
2534 cifs_crypto_secmech_release(server);
2535 cifs_fscache_release_client_cookie(server);
2537 kfree(server->session_key.response);
2538 server->session_key.response = NULL;
2539 server->session_key.len = 0;
2541 task = xchg(&server->tsk, NULL);
2543 force_sig(SIGKILL, task);
2546 static struct TCP_Server_Info *
2547 cifs_get_tcp_session(struct smb_vol *volume_info)
2549 struct TCP_Server_Info *tcp_ses = NULL;
2552 cifs_dbg(FYI, "UNC: %s\n", volume_info->UNC);
2554 /* see if we already have a matching tcp_ses */
2555 tcp_ses = cifs_find_tcp_session(volume_info);
2559 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2565 tcp_ses->ops = volume_info->ops;
2566 tcp_ses->vals = volume_info->vals;
2567 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2568 tcp_ses->hostname = extract_hostname(volume_info->UNC);
2569 if (IS_ERR(tcp_ses->hostname)) {
2570 rc = PTR_ERR(tcp_ses->hostname);
2571 goto out_err_crypto_release;
2574 tcp_ses->noblocksnd = volume_info->noblocksnd;
2575 tcp_ses->noautotune = volume_info->noautotune;
2576 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2577 tcp_ses->rdma = volume_info->rdma;
2578 tcp_ses->in_flight = 0;
2579 tcp_ses->credits = 1;
2580 init_waitqueue_head(&tcp_ses->response_q);
2581 init_waitqueue_head(&tcp_ses->request_q);
2582 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2583 mutex_init(&tcp_ses->srv_mutex);
2584 memcpy(tcp_ses->workstation_RFC1001_name,
2585 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2586 memcpy(tcp_ses->server_RFC1001_name,
2587 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2588 tcp_ses->session_estab = false;
2589 tcp_ses->sequence_number = 0;
2590 tcp_ses->reconnect_instance = 0;
2591 tcp_ses->lstrp = jiffies;
2592 spin_lock_init(&tcp_ses->req_lock);
2593 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2594 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2595 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2596 INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
2597 mutex_init(&tcp_ses->reconnect_mutex);
2598 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2599 sizeof(tcp_ses->srcaddr));
2600 memcpy(&tcp_ses->dstaddr, &volume_info->dstaddr,
2601 sizeof(tcp_ses->dstaddr));
2602 generate_random_uuid(tcp_ses->client_guid);
2604 * at this point we are the only ones with the pointer
2605 * to the struct since the kernel thread not created yet
2606 * no need to spinlock this init of tcpStatus or srv_count
2608 tcp_ses->tcpStatus = CifsNew;
2609 ++tcp_ses->srv_count;
2611 if (volume_info->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
2612 volume_info->echo_interval <= SMB_ECHO_INTERVAL_MAX)
2613 tcp_ses->echo_interval = volume_info->echo_interval * HZ;
2615 tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
2616 if (tcp_ses->rdma) {
2617 #ifndef CONFIG_CIFS_SMB_DIRECT
2618 cifs_dbg(VFS, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
2620 goto out_err_crypto_release;
2622 tcp_ses->smbd_conn = smbd_get_connection(
2623 tcp_ses, (struct sockaddr *)&volume_info->dstaddr);
2624 if (tcp_ses->smbd_conn) {
2625 cifs_dbg(VFS, "RDMA transport established\n");
2627 goto smbd_connected;
2630 goto out_err_crypto_release;
2633 rc = ip_connect(tcp_ses);
2635 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
2636 goto out_err_crypto_release;
2640 * since we're in a cifs function already, we know that
2641 * this will succeed. No need for try_module_get().
2643 __module_get(THIS_MODULE);
2644 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2646 if (IS_ERR(tcp_ses->tsk)) {
2647 rc = PTR_ERR(tcp_ses->tsk);
2648 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
2649 module_put(THIS_MODULE);
2650 goto out_err_crypto_release;
2652 tcp_ses->tcpStatus = CifsNeedNegotiate;
2654 tcp_ses->nr_targets = 1;
2656 /* thread spawned, put it on the list */
2657 spin_lock(&cifs_tcp_ses_lock);
2658 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2659 spin_unlock(&cifs_tcp_ses_lock);
2661 cifs_fscache_get_client_cookie(tcp_ses);
2663 /* queue echo request delayed work */
2664 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
2668 out_err_crypto_release:
2669 cifs_crypto_secmech_release(tcp_ses);
2671 put_net(cifs_net_ns(tcp_ses));
2675 if (!IS_ERR(tcp_ses->hostname))
2676 kfree(tcp_ses->hostname);
2677 if (tcp_ses->ssocket)
2678 sock_release(tcp_ses->ssocket);
2684 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2686 if (vol->sectype != Unspecified &&
2687 vol->sectype != ses->sectype)
2690 switch (ses->sectype) {
2692 if (!uid_eq(vol->cred_uid, ses->cred_uid))
2696 /* NULL username means anonymous session */
2697 if (ses->user_name == NULL) {
2703 /* anything else takes username/password */
2704 if (strncmp(ses->user_name,
2705 vol->username ? vol->username : "",
2706 CIFS_MAX_USERNAME_LEN))
2708 if ((vol->username && strlen(vol->username) != 0) &&
2709 ses->password != NULL &&
2710 strncmp(ses->password,
2711 vol->password ? vol->password : "",
2712 CIFS_MAX_PASSWORD_LEN))
2719 * cifs_setup_ipc - helper to setup the IPC tcon for the session
2721 * A new IPC connection is made and stored in the session
2722 * tcon_ipc. The IPC tcon has the same lifetime as the session.
2725 cifs_setup_ipc(struct cifs_ses *ses, struct smb_vol *volume_info)
2728 struct cifs_tcon *tcon;
2729 struct nls_table *nls_codepage;
2730 char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0};
2734 * If the mount request that resulted in the creation of the
2735 * session requires encryption, force IPC to be encrypted too.
2737 if (volume_info->seal) {
2738 if (ses->server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
2742 "IPC: server doesn't support encryption\n");
2747 tcon = tconInfoAlloc();
2751 snprintf(unc, sizeof(unc), "\\\\%s\\IPC$", ses->server->hostname);
2754 nls_codepage = load_nls_default();
2760 rc = ses->server->ops->tree_connect(xid, ses, unc, tcon, nls_codepage);
2764 cifs_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
2769 cifs_dbg(FYI, "IPC tcon rc = %d ipc tid = %d\n", rc, tcon->tid);
2771 ses->tcon_ipc = tcon;
2773 unload_nls(nls_codepage);
2778 * cifs_free_ipc - helper to release the session IPC tcon
2780 * Needs to be called everytime a session is destroyed
2783 cifs_free_ipc(struct cifs_ses *ses)
2786 struct cifs_tcon *tcon = ses->tcon_ipc;
2791 if (ses->server->ops->tree_disconnect) {
2793 rc = ses->server->ops->tree_disconnect(xid, tcon);
2798 cifs_dbg(FYI, "failed to disconnect IPC tcon (rc=%d)\n", rc);
2801 ses->tcon_ipc = NULL;
2805 static struct cifs_ses *
2806 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
2808 struct cifs_ses *ses;
2810 spin_lock(&cifs_tcp_ses_lock);
2811 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
2812 if (ses->status == CifsExiting)
2814 if (!match_session(ses, vol))
2817 spin_unlock(&cifs_tcp_ses_lock);
2820 spin_unlock(&cifs_tcp_ses_lock);
2825 cifs_put_smb_ses(struct cifs_ses *ses)
2827 unsigned int rc, xid;
2828 struct TCP_Server_Info *server = ses->server;
2830 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
2832 spin_lock(&cifs_tcp_ses_lock);
2833 if (ses->status == CifsExiting) {
2834 spin_unlock(&cifs_tcp_ses_lock);
2837 if (--ses->ses_count > 0) {
2838 spin_unlock(&cifs_tcp_ses_lock);
2841 if (ses->status == CifsGood)
2842 ses->status = CifsExiting;
2843 spin_unlock(&cifs_tcp_ses_lock);
2847 if (ses->status == CifsExiting && server->ops->logoff) {
2849 rc = server->ops->logoff(xid, ses);
2851 cifs_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
2856 spin_lock(&cifs_tcp_ses_lock);
2857 list_del_init(&ses->smb_ses_list);
2858 spin_unlock(&cifs_tcp_ses_lock);
2861 cifs_put_tcp_session(server, 0);
2866 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
2867 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
2869 /* Populate username and pw fields from keyring if possible */
2871 cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
2874 const char *delim, *payload;
2878 struct TCP_Server_Info *server = ses->server;
2879 struct sockaddr_in *sa;
2880 struct sockaddr_in6 *sa6;
2881 const struct user_key_payload *upayload;
2883 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
2887 /* try to find an address key first */
2888 switch (server->dstaddr.ss_family) {
2890 sa = (struct sockaddr_in *)&server->dstaddr;
2891 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
2894 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
2895 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
2898 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
2899 server->dstaddr.ss_family);
2904 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2905 key = request_key(&key_type_logon, desc, "");
2907 if (!ses->domainName) {
2908 cifs_dbg(FYI, "domainName is NULL\n");
2913 /* didn't work, try to find a domain key */
2914 sprintf(desc, "cifs:d:%s", ses->domainName);
2915 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2916 key = request_key(&key_type_logon, desc, "");
2923 down_read(&key->sem);
2924 upayload = user_key_payload_locked(key);
2925 if (IS_ERR_OR_NULL(upayload)) {
2926 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
2930 /* find first : in payload */
2931 payload = upayload->data;
2932 delim = strnchr(payload, upayload->datalen, ':');
2933 cifs_dbg(FYI, "payload=%s\n", payload);
2935 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
2941 len = delim - payload;
2942 if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
2943 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
2949 vol->username = kstrndup(payload, len, GFP_KERNEL);
2950 if (!vol->username) {
2951 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
2956 cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
2958 len = key->datalen - (len + 1);
2959 if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
2960 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
2962 kfree(vol->username);
2963 vol->username = NULL;
2968 vol->password = kstrndup(delim, len, GFP_KERNEL);
2969 if (!vol->password) {
2970 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
2973 kfree(vol->username);
2974 vol->username = NULL;
2983 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
2986 #else /* ! CONFIG_KEYS */
2988 cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
2989 struct cifs_ses *ses __attribute__((unused)))
2993 #endif /* CONFIG_KEYS */
2996 * cifs_get_smb_ses - get a session matching @volume_info data from @server
2998 * This function assumes it is being called from cifs_mount() where we
2999 * already got a server reference (server refcount +1). See
3000 * cifs_get_tcon() for refcount explanations.
3002 static struct cifs_ses *
3003 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
3007 struct cifs_ses *ses;
3008 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3009 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3013 ses = cifs_find_smb_ses(server, volume_info);
3015 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
3018 mutex_lock(&ses->session_mutex);
3019 rc = cifs_negotiate_protocol(xid, ses);
3021 mutex_unlock(&ses->session_mutex);
3022 /* problem -- put our ses reference */
3023 cifs_put_smb_ses(ses);
3027 if (ses->need_reconnect) {
3028 cifs_dbg(FYI, "Session needs reconnect\n");
3029 rc = cifs_setup_session(xid, ses,
3030 volume_info->local_nls);
3032 mutex_unlock(&ses->session_mutex);
3033 /* problem -- put our reference */
3034 cifs_put_smb_ses(ses);
3039 mutex_unlock(&ses->session_mutex);
3041 /* existing SMB ses has a server reference already */
3042 cifs_put_tcp_session(server, 0);
3047 cifs_dbg(FYI, "Existing smb sess not found\n");
3048 ses = sesInfoAlloc();
3052 /* new SMB session uses our server ref */
3053 ses->server = server;
3054 if (server->dstaddr.ss_family == AF_INET6)
3055 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
3057 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
3059 if (volume_info->username) {
3060 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
3061 if (!ses->user_name)
3065 /* volume_info->password freed at unmount */
3066 if (volume_info->password) {
3067 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
3071 if (volume_info->domainname) {
3072 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
3073 if (!ses->domainName)
3076 if (volume_info->domainauto)
3077 ses->domainAuto = volume_info->domainauto;
3078 ses->cred_uid = volume_info->cred_uid;
3079 ses->linux_uid = volume_info->linux_uid;
3081 ses->sectype = volume_info->sectype;
3082 ses->sign = volume_info->sign;
3084 mutex_lock(&ses->session_mutex);
3085 rc = cifs_negotiate_protocol(xid, ses);
3087 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
3088 mutex_unlock(&ses->session_mutex);
3092 /* success, put it on the list */
3093 spin_lock(&cifs_tcp_ses_lock);
3094 list_add(&ses->smb_ses_list, &server->smb_ses_list);
3095 spin_unlock(&cifs_tcp_ses_lock);
3099 cifs_setup_ipc(ses, volume_info);
3109 static int match_tcon(struct cifs_tcon *tcon, struct smb_vol *volume_info)
3111 if (tcon->tidStatus == CifsExiting)
3113 if (strncmp(tcon->treeName, volume_info->UNC, MAX_TREE_SIZE))
3115 if (tcon->seal != volume_info->seal)
3117 if (tcon->snapshot_time != volume_info->snapshot_time)
3122 static struct cifs_tcon *
3123 cifs_find_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3125 struct list_head *tmp;
3126 struct cifs_tcon *tcon;
3128 spin_lock(&cifs_tcp_ses_lock);
3129 list_for_each(tmp, &ses->tcon_list) {
3130 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
3131 if (!match_tcon(tcon, volume_info))
3134 spin_unlock(&cifs_tcp_ses_lock);
3137 spin_unlock(&cifs_tcp_ses_lock);
3142 cifs_put_tcon(struct cifs_tcon *tcon)
3145 struct cifs_ses *ses;
3148 * IPC tcon share the lifetime of their session and are
3149 * destroyed in the session put function
3151 if (tcon == NULL || tcon->ipc)
3155 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
3156 spin_lock(&cifs_tcp_ses_lock);
3157 if (--tcon->tc_count > 0) {
3158 spin_unlock(&cifs_tcp_ses_lock);
3162 list_del_init(&tcon->tcon_list);
3163 spin_unlock(&cifs_tcp_ses_lock);
3166 if (ses->server->ops->tree_disconnect)
3167 ses->server->ops->tree_disconnect(xid, tcon);
3170 cifs_fscache_release_super_cookie(tcon);
3172 cifs_put_smb_ses(ses);
3176 * cifs_get_tcon - get a tcon matching @volume_info data from @ses
3178 * - tcon refcount is the number of mount points using the tcon.
3179 * - ses refcount is the number of tcon using the session.
3181 * 1. This function assumes it is being called from cifs_mount() where
3182 * we already got a session reference (ses refcount +1).
3184 * 2. Since we're in the context of adding a mount point, the end
3185 * result should be either:
3187 * a) a new tcon already allocated with refcount=1 (1 mount point) and
3188 * its session refcount incremented (1 new tcon). This +1 was
3189 * already done in (1).
3191 * b) an existing tcon with refcount+1 (add a mount point to it) and
3192 * identical ses refcount (no new tcon). Because of (1) we need to
3193 * decrement the ses refcount.
3195 static struct cifs_tcon *
3196 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3199 struct cifs_tcon *tcon;
3201 tcon = cifs_find_tcon(ses, volume_info);
3204 * tcon has refcount already incremented but we need to
3205 * decrement extra ses reference gotten by caller (case b)
3207 cifs_dbg(FYI, "Found match on UNC path\n");
3208 cifs_put_smb_ses(ses);
3212 if (!ses->server->ops->tree_connect) {
3217 tcon = tconInfoAlloc();
3223 if (volume_info->snapshot_time) {
3224 if (ses->server->vals->protocol_id == 0) {
3226 "Use SMB2 or later for snapshot mount option\n");
3230 tcon->snapshot_time = volume_info->snapshot_time;
3234 if (volume_info->password) {
3235 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
3236 if (!tcon->password) {
3242 if (volume_info->seal) {
3243 if (ses->server->vals->protocol_id == 0) {
3245 "SMB3 or later required for encryption\n");
3248 } else if (tcon->ses->server->capabilities &
3249 SMB2_GLOBAL_CAP_ENCRYPTION)
3252 cifs_dbg(VFS, "Encryption is not supported on share\n");
3258 if (volume_info->linux_ext) {
3259 if (ses->server->posix_ext_supported) {
3260 tcon->posix_extensions = true;
3261 printk_once(KERN_WARNING
3262 "SMB3.11 POSIX Extensions are experimental\n");
3264 cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions.\n");
3271 * BB Do we need to wrap session_mutex around this TCon call and Unix
3272 * SetFS as we do on SessSetup and reconnect?
3275 rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
3276 volume_info->local_nls);
3278 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
3282 tcon->use_persistent = false;
3283 /* check if SMB2 or later, CIFS does not support persistent handles */
3284 if (volume_info->persistent) {
3285 if (ses->server->vals->protocol_id == 0) {
3287 "SMB3 or later required for persistent handles\n");
3290 } else if (ses->server->capabilities &
3291 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3292 tcon->use_persistent = true;
3293 else /* persistent handles requested but not supported */ {
3295 "Persistent handles not supported on share\n");
3299 } else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
3300 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3301 && (volume_info->nopersistent == false)) {
3302 cifs_dbg(FYI, "enabling persistent handles\n");
3303 tcon->use_persistent = true;
3304 } else if (volume_info->resilient) {
3305 if (ses->server->vals->protocol_id == 0) {
3307 "SMB2.1 or later required for resilient handles\n");
3311 tcon->use_resilient = true;
3315 * We can have only one retry value for a connection to a share so for
3316 * resources mounted more than once to the same server share the last
3317 * value passed in for the retry flag is used.
3319 tcon->retry = volume_info->retry;
3320 tcon->nocase = volume_info->nocase;
3321 tcon->nohandlecache = volume_info->nohandlecache;
3322 tcon->local_lease = volume_info->local_lease;
3323 INIT_LIST_HEAD(&tcon->pending_opens);
3325 spin_lock(&cifs_tcp_ses_lock);
3326 list_add(&tcon->tcon_list, &ses->tcon_list);
3327 spin_unlock(&cifs_tcp_ses_lock);
3329 cifs_fscache_get_super_cookie(tcon);
3339 cifs_put_tlink(struct tcon_link *tlink)
3341 if (!tlink || IS_ERR(tlink))
3344 if (!atomic_dec_and_test(&tlink->tl_count) ||
3345 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
3346 tlink->tl_time = jiffies;
3350 if (!IS_ERR(tlink_tcon(tlink)))
3351 cifs_put_tcon(tlink_tcon(tlink));
3357 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3359 struct cifs_sb_info *old = CIFS_SB(sb);
3360 struct cifs_sb_info *new = mnt_data->cifs_sb;
3362 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
3365 if ((old->mnt_cifs_flags & CIFS_MOUNT_MASK) !=
3366 (new->mnt_cifs_flags & CIFS_MOUNT_MASK))
3370 * We want to share sb only if we don't specify an r/wsize or
3371 * specified r/wsize is greater than or equal to existing one.
3373 if (new->wsize && new->wsize < old->wsize)
3376 if (new->rsize && new->rsize < old->rsize)
3379 if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))
3382 if (old->mnt_file_mode != new->mnt_file_mode ||
3383 old->mnt_dir_mode != new->mnt_dir_mode)
3386 if (strcmp(old->local_nls->charset, new->local_nls->charset))
3389 if (old->actimeo != new->actimeo)
3396 match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3398 struct cifs_sb_info *old = CIFS_SB(sb);
3399 struct cifs_sb_info *new = mnt_data->cifs_sb;
3400 bool old_set = old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH;
3401 bool new_set = new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH;
3403 if (old_set && new_set && !strcmp(new->prepath, old->prepath))
3405 else if (!old_set && !new_set)
3412 cifs_match_super(struct super_block *sb, void *data)
3414 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
3415 struct smb_vol *volume_info;
3416 struct cifs_sb_info *cifs_sb;
3417 struct TCP_Server_Info *tcp_srv;
3418 struct cifs_ses *ses;
3419 struct cifs_tcon *tcon;
3420 struct tcon_link *tlink;
3423 spin_lock(&cifs_tcp_ses_lock);
3424 cifs_sb = CIFS_SB(sb);
3425 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3426 if (IS_ERR(tlink)) {
3427 spin_unlock(&cifs_tcp_ses_lock);
3430 tcon = tlink_tcon(tlink);
3432 tcp_srv = ses->server;
3434 volume_info = mnt_data->vol;
3436 if (!match_server(tcp_srv, volume_info) ||
3437 !match_session(ses, volume_info) ||
3438 !match_tcon(tcon, volume_info) ||
3439 !match_prepath(sb, mnt_data)) {
3444 rc = compare_mount_options(sb, mnt_data);
3446 spin_unlock(&cifs_tcp_ses_lock);
3447 cifs_put_tlink(tlink);
3451 #ifdef CONFIG_DEBUG_LOCK_ALLOC
3452 static struct lock_class_key cifs_key[2];
3453 static struct lock_class_key cifs_slock_key[2];
3456 cifs_reclassify_socket4(struct socket *sock)
3458 struct sock *sk = sock->sk;
3459 BUG_ON(!sock_allow_reclassification(sk));
3460 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
3461 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
3465 cifs_reclassify_socket6(struct socket *sock)
3467 struct sock *sk = sock->sk;
3468 BUG_ON(!sock_allow_reclassification(sk));
3469 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
3470 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
3474 cifs_reclassify_socket4(struct socket *sock)
3479 cifs_reclassify_socket6(struct socket *sock)
3484 /* See RFC1001 section 14 on representation of Netbios names */
3485 static void rfc1002mangle(char *target, char *source, unsigned int length)
3489 for (i = 0, j = 0; i < (length); i++) {
3490 /* mask a nibble at a time and encode */
3491 target[j] = 'A' + (0x0F & (source[i] >> 4));
3492 target[j+1] = 'A' + (0x0F & source[i]);
3499 bind_socket(struct TCP_Server_Info *server)
3502 if (server->srcaddr.ss_family != AF_UNSPEC) {
3503 /* Bind to the specified local IP address */
3504 struct socket *socket = server->ssocket;
3505 rc = socket->ops->bind(socket,
3506 (struct sockaddr *) &server->srcaddr,
3507 sizeof(server->srcaddr));
3509 struct sockaddr_in *saddr4;
3510 struct sockaddr_in6 *saddr6;
3511 saddr4 = (struct sockaddr_in *)&server->srcaddr;
3512 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
3513 if (saddr6->sin6_family == AF_INET6)
3514 cifs_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
3515 &saddr6->sin6_addr, rc);
3517 cifs_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
3518 &saddr4->sin_addr.s_addr, rc);
3525 ip_rfc1001_connect(struct TCP_Server_Info *server)
3529 * some servers require RFC1001 sessinit before sending
3530 * negprot - BB check reconnection in case where second
3531 * sessinit is sent but no second negprot
3533 struct rfc1002_session_packet *ses_init_buf;
3534 struct smb_hdr *smb_buf;
3535 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
3538 ses_init_buf->trailer.session_req.called_len = 32;
3540 if (server->server_RFC1001_name[0] != 0)
3541 rfc1002mangle(ses_init_buf->trailer.
3542 session_req.called_name,
3543 server->server_RFC1001_name,
3544 RFC1001_NAME_LEN_WITH_NULL);
3546 rfc1002mangle(ses_init_buf->trailer.
3547 session_req.called_name,
3548 DEFAULT_CIFS_CALLED_NAME,
3549 RFC1001_NAME_LEN_WITH_NULL);
3551 ses_init_buf->trailer.session_req.calling_len = 32;
3554 * calling name ends in null (byte 16) from old smb
3557 if (server->workstation_RFC1001_name[0] != 0)
3558 rfc1002mangle(ses_init_buf->trailer.
3559 session_req.calling_name,
3560 server->workstation_RFC1001_name,
3561 RFC1001_NAME_LEN_WITH_NULL);
3563 rfc1002mangle(ses_init_buf->trailer.
3564 session_req.calling_name,
3566 RFC1001_NAME_LEN_WITH_NULL);
3568 ses_init_buf->trailer.session_req.scope1 = 0;
3569 ses_init_buf->trailer.session_req.scope2 = 0;
3570 smb_buf = (struct smb_hdr *)ses_init_buf;
3572 /* sizeof RFC1002_SESSION_REQUEST with no scope */
3573 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
3574 rc = smb_send(server, smb_buf, 0x44);
3575 kfree(ses_init_buf);
3577 * RFC1001 layer in at least one server
3578 * requires very short break before negprot
3579 * presumably because not expecting negprot
3580 * to follow so fast. This is a simple
3581 * solution that works without
3582 * complicating the code and causes no
3583 * significant slowing down on mount
3586 usleep_range(1000, 2000);
3589 * else the negprot may still work without this
3590 * even though malloc failed
3597 generic_ip_connect(struct TCP_Server_Info *server)
3602 struct socket *socket = server->ssocket;
3603 struct sockaddr *saddr;
3605 saddr = (struct sockaddr *) &server->dstaddr;
3607 if (server->dstaddr.ss_family == AF_INET6) {
3608 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
3609 slen = sizeof(struct sockaddr_in6);
3612 sport = ((struct sockaddr_in *) saddr)->sin_port;
3613 slen = sizeof(struct sockaddr_in);
3617 if (socket == NULL) {
3618 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3619 IPPROTO_TCP, &socket, 1);
3621 cifs_dbg(VFS, "Error %d creating socket\n", rc);
3622 server->ssocket = NULL;
3626 /* BB other socket options to set KEEPALIVE, NODELAY? */
3627 cifs_dbg(FYI, "Socket created\n");
3628 server->ssocket = socket;
3629 socket->sk->sk_allocation = GFP_NOFS;
3630 if (sfamily == AF_INET6)
3631 cifs_reclassify_socket6(socket);
3633 cifs_reclassify_socket4(socket);
3636 rc = bind_socket(server);
3641 * Eventually check for other socket options to change from
3642 * the default. sock_setsockopt not used because it expects
3645 socket->sk->sk_rcvtimeo = 7 * HZ;
3646 socket->sk->sk_sndtimeo = 5 * HZ;
3648 /* make the bufsizes depend on wsize/rsize and max requests */
3649 if (server->noautotune) {
3650 if (socket->sk->sk_sndbuf < (200 * 1024))
3651 socket->sk->sk_sndbuf = 200 * 1024;
3652 if (socket->sk->sk_rcvbuf < (140 * 1024))
3653 socket->sk->sk_rcvbuf = 140 * 1024;
3656 if (server->tcp_nodelay) {
3658 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
3659 (char *)&val, sizeof(val));
3661 cifs_dbg(FYI, "set TCP_NODELAY socket option error %d\n",
3665 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3666 socket->sk->sk_sndbuf,
3667 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3669 rc = socket->ops->connect(socket, saddr, slen, 0);
3671 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3672 sock_release(socket);
3673 server->ssocket = NULL;
3677 if (sport == htons(RFC1001_PORT))
3678 rc = ip_rfc1001_connect(server);
3684 ip_connect(struct TCP_Server_Info *server)
3687 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3688 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3690 if (server->dstaddr.ss_family == AF_INET6)
3691 sport = &addr6->sin6_port;
3693 sport = &addr->sin_port;
3698 /* try with 445 port at first */
3699 *sport = htons(CIFS_PORT);
3701 rc = generic_ip_connect(server);
3705 /* if it failed, try with 139 port */
3706 *sport = htons(RFC1001_PORT);
3709 return generic_ip_connect(server);
3712 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
3713 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
3715 /* if we are reconnecting then should we check to see if
3716 * any requested capabilities changed locally e.g. via
3717 * remount but we can not do much about it here
3718 * if they have (even if we could detect it by the following)
3719 * Perhaps we could add a backpointer to array of sb from tcon
3720 * or if we change to make all sb to same share the same
3721 * sb as NFS - then we only have one backpointer to sb.
3722 * What if we wanted to mount the server share twice once with
3723 * and once without posixacls or posix paths? */
3724 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3726 if (vol_info && vol_info->no_linux_ext) {
3727 tcon->fsUnixInfo.Capability = 0;
3728 tcon->unix_ext = 0; /* Unix Extensions disabled */
3729 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
3731 } else if (vol_info)
3732 tcon->unix_ext = 1; /* Unix Extensions supported */
3734 if (tcon->unix_ext == 0) {
3735 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
3739 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
3740 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3741 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
3742 /* check for reconnect case in which we do not
3743 want to change the mount behavior if we can avoid it */
3744 if (vol_info == NULL) {
3745 /* turn off POSIX ACL and PATHNAMES if not set
3746 originally at mount time */
3747 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
3748 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3749 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3750 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3751 cifs_dbg(VFS, "POSIXPATH support change\n");
3752 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3753 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3754 cifs_dbg(VFS, "possible reconnect error\n");
3755 cifs_dbg(VFS, "server disabled POSIX path support\n");
3759 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3760 cifs_dbg(VFS, "per-share encryption not supported yet\n");
3762 cap &= CIFS_UNIX_CAP_MASK;
3763 if (vol_info && vol_info->no_psx_acl)
3764 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3765 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
3766 cifs_dbg(FYI, "negotiated posix acl support\n");
3768 cifs_sb->mnt_cifs_flags |=
3769 CIFS_MOUNT_POSIXACL;
3772 if (vol_info && vol_info->posix_paths == 0)
3773 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3774 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
3775 cifs_dbg(FYI, "negotiate posix pathnames\n");
3777 cifs_sb->mnt_cifs_flags |=
3778 CIFS_MOUNT_POSIX_PATHS;
3781 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
3782 #ifdef CONFIG_CIFS_DEBUG2
3783 if (cap & CIFS_UNIX_FCNTL_CAP)
3784 cifs_dbg(FYI, "FCNTL cap\n");
3785 if (cap & CIFS_UNIX_EXTATTR_CAP)
3786 cifs_dbg(FYI, "EXTATTR cap\n");
3787 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3788 cifs_dbg(FYI, "POSIX path cap\n");
3789 if (cap & CIFS_UNIX_XATTR_CAP)
3790 cifs_dbg(FYI, "XATTR cap\n");
3791 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
3792 cifs_dbg(FYI, "POSIX ACL cap\n");
3793 if (cap & CIFS_UNIX_LARGE_READ_CAP)
3794 cifs_dbg(FYI, "very large read cap\n");
3795 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
3796 cifs_dbg(FYI, "very large write cap\n");
3797 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
3798 cifs_dbg(FYI, "transport encryption cap\n");
3799 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3800 cifs_dbg(FYI, "mandatory transport encryption cap\n");
3801 #endif /* CIFS_DEBUG2 */
3802 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
3803 if (vol_info == NULL) {
3804 cifs_dbg(FYI, "resetting capabilities failed\n");
3806 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");
3812 int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
3813 struct cifs_sb_info *cifs_sb)
3815 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
3817 spin_lock_init(&cifs_sb->tlink_tree_lock);
3818 cifs_sb->tlink_tree = RB_ROOT;
3821 * Temporarily set r/wsize for matching superblock. If we end up using
3822 * new sb then client will later negotiate it downward if needed.
3824 cifs_sb->rsize = pvolume_info->rsize;
3825 cifs_sb->wsize = pvolume_info->wsize;
3827 cifs_sb->mnt_uid = pvolume_info->linux_uid;
3828 cifs_sb->mnt_gid = pvolume_info->linux_gid;
3829 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
3830 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
3831 cifs_dbg(FYI, "file mode: 0x%hx dir mode: 0x%hx\n",
3832 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
3834 cifs_sb->actimeo = pvolume_info->actimeo;
3835 cifs_sb->local_nls = pvolume_info->local_nls;
3837 if (pvolume_info->nodfs)
3838 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_DFS;
3839 if (pvolume_info->noperm)
3840 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
3841 if (pvolume_info->setuids)
3842 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
3843 if (pvolume_info->setuidfromacl)
3844 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
3845 if (pvolume_info->server_ino)
3846 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
3847 if (pvolume_info->remap)
3848 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
3849 if (pvolume_info->sfu_remap)
3850 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
3851 if (pvolume_info->no_xattr)
3852 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
3853 if (pvolume_info->sfu_emul)
3854 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
3855 if (pvolume_info->nobrl)
3856 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
3857 if (pvolume_info->nohandlecache)
3858 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_HANDLE_CACHE;
3859 if (pvolume_info->nostrictsync)
3860 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
3861 if (pvolume_info->mand_lock)
3862 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
3863 if (pvolume_info->rwpidforward)
3864 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
3865 if (pvolume_info->cifs_acl)
3866 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
3867 if (pvolume_info->backupuid_specified) {
3868 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
3869 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
3871 if (pvolume_info->backupgid_specified) {
3872 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
3873 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
3875 if (pvolume_info->override_uid)
3876 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
3877 if (pvolume_info->override_gid)
3878 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
3879 if (pvolume_info->dynperm)
3880 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
3881 if (pvolume_info->fsc)
3882 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
3883 if (pvolume_info->multiuser)
3884 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
3885 CIFS_MOUNT_NO_PERM);
3886 if (pvolume_info->strict_io)
3887 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
3888 if (pvolume_info->direct_io) {
3889 cifs_dbg(FYI, "mounting share using direct i/o\n");
3890 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
3892 if (pvolume_info->mfsymlinks) {
3893 if (pvolume_info->sfu_emul) {
3895 * Our SFU ("Services for Unix" emulation does not allow
3896 * creating symlinks but does allow reading existing SFU
3897 * symlinks (it does allow both creating and reading SFU
3898 * style mknod and FIFOs though). When "mfsymlinks" and
3899 * "sfu" are both enabled at the same time, it allows
3900 * reading both types of symlinks, but will only create
3901 * them with mfsymlinks format. This allows better
3902 * Apple compatibility (probably better for Samba too)
3903 * while still recognizing old Windows style symlinks.
3905 cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
3907 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
3910 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
3911 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
3913 if (pvolume_info->prepath) {
3914 cifs_sb->prepath = kstrdup(pvolume_info->prepath, GFP_KERNEL);
3915 if (cifs_sb->prepath == NULL)
3923 cifs_cleanup_volume_info_contents(struct smb_vol *volume_info)
3925 kfree(volume_info->username);
3926 kzfree(volume_info->password);
3927 kfree(volume_info->UNC);
3928 kfree(volume_info->domainname);
3929 kfree(volume_info->iocharset);
3930 kfree(volume_info->prepath);
3934 cifs_cleanup_volume_info(struct smb_vol *volume_info)
3938 cifs_cleanup_volume_info_contents(volume_info);
3942 /* Release all succeed connections */
3943 static inline void mount_put_conns(struct cifs_sb_info *cifs_sb,
3945 struct TCP_Server_Info *server,
3946 struct cifs_ses *ses, struct cifs_tcon *tcon)
3951 cifs_put_tcon(tcon);
3953 cifs_put_smb_ses(ses);
3955 cifs_put_tcp_session(server, 0);
3956 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
3960 /* Get connections for tcp, ses and tcon */
3961 static int mount_get_conns(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
3963 struct TCP_Server_Info **nserver,
3964 struct cifs_ses **nses, struct cifs_tcon **ntcon)
3967 struct TCP_Server_Info *server;
3968 struct cifs_ses *ses;
3969 struct cifs_tcon *tcon;
3977 /* get a reference to a tcp session */
3978 server = cifs_get_tcp_session(vol);
3979 if (IS_ERR(server)) {
3980 rc = PTR_ERR(server);
3986 if ((vol->max_credits < 20) || (vol->max_credits > 60000))
3987 server->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
3989 server->max_credits = vol->max_credits;
3991 /* get a reference to a SMB session */
3992 ses = cifs_get_smb_ses(server, vol);
4000 if ((vol->persistent == true) && (!(ses->server->capabilities &
4001 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES))) {
4002 cifs_dbg(VFS, "persistent handles not supported by server\n");
4006 /* search for existing tcon to this server share */
4007 tcon = cifs_get_tcon(ses, vol);
4015 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
4016 if (tcon->posix_extensions)
4017 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
4019 /* tell server which Unix caps we support */
4020 if (cap_unix(tcon->ses)) {
4022 * reset of caps checks mount to see if unix extensions disabled
4023 * for just this mount.
4025 reset_cifs_unix_caps(*xid, tcon, cifs_sb, vol);
4026 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
4027 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
4028 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP))
4031 tcon->unix_ext = 0; /* server does not support them */
4033 /* do not care if a following call succeed - informational */
4034 if (!tcon->pipe && server->ops->qfs_tcon)
4035 server->ops->qfs_tcon(*xid, tcon);
4037 cifs_sb->wsize = server->ops->negotiate_wsize(tcon, vol);
4038 cifs_sb->rsize = server->ops->negotiate_rsize(tcon, vol);
4043 static int mount_setup_tlink(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
4044 struct cifs_tcon *tcon)
4046 struct tcon_link *tlink;
4048 /* hang the tcon off of the superblock */
4049 tlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4053 tlink->tl_uid = ses->linux_uid;
4054 tlink->tl_tcon = tcon;
4055 tlink->tl_time = jiffies;
4056 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
4057 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4059 cifs_sb->master_tlink = tlink;
4060 spin_lock(&cifs_sb->tlink_tree_lock);
4061 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4062 spin_unlock(&cifs_sb->tlink_tree_lock);
4064 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4069 #ifdef CONFIG_CIFS_DFS_UPCALL
4071 * cifs_build_path_to_root returns full path to root when we do not have an
4072 * exiting connection (tcon)
4075 build_unc_path_to_root(const struct smb_vol *vol,
4076 const struct cifs_sb_info *cifs_sb, bool useppath)
4078 char *full_path, *pos;
4079 unsigned int pplen = useppath && vol->prepath ?
4080 strlen(vol->prepath) + 1 : 0;
4081 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
4083 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
4084 if (full_path == NULL)
4085 return ERR_PTR(-ENOMEM);
4087 strncpy(full_path, vol->UNC, unc_len);
4088 pos = full_path + unc_len;
4091 *pos = CIFS_DIR_SEP(cifs_sb);
4092 strncpy(pos + 1, vol->prepath, pplen);
4096 *pos = '\0'; /* add trailing null */
4097 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
4098 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
4103 * expand_dfs_referral - Perform a dfs referral query and update the cifs_sb
4106 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
4107 * to a string containing updated options for the submount. Otherwise it
4108 * will be left untouched.
4110 * Returns the rc from get_dfs_path to the caller, which can be used to
4111 * determine whether there were referrals.
4114 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
4115 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
4119 struct dfs_info3_param referral = {0};
4120 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
4122 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4125 full_path = build_unc_path_to_root(volume_info, cifs_sb, true);
4126 if (IS_ERR(full_path))
4127 return PTR_ERR(full_path);
4129 /* For DFS paths, skip the first '\' of the UNC */
4130 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
4132 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4133 ref_path, &referral, NULL);
4135 char *fake_devname = NULL;
4137 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
4138 full_path + 1, &referral,
4140 free_dfs_info_param(&referral);
4142 if (IS_ERR(mdata)) {
4143 rc = PTR_ERR(mdata);
4146 cifs_cleanup_volume_info_contents(volume_info);
4147 rc = cifs_setup_volume_info(volume_info, mdata,
4148 fake_devname, false);
4150 kfree(fake_devname);
4151 kfree(cifs_sb->mountdata);
4152 cifs_sb->mountdata = mdata;
4158 static inline int get_next_dfs_tgt(const char *path,
4159 struct dfs_cache_tgt_list *tgt_list,
4160 struct dfs_cache_tgt_iterator **tgt_it)
4163 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
4165 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
4166 return !*tgt_it ? -EHOSTDOWN : 0;
4169 static int update_vol_info(const struct dfs_cache_tgt_iterator *tgt_it,
4170 struct smb_vol *fake_vol, struct smb_vol *vol)
4172 const char *tgt = dfs_cache_get_tgt_name(tgt_it);
4173 int len = strlen(tgt) + 2;
4176 new_unc = kmalloc(len, GFP_KERNEL);
4179 snprintf(new_unc, len, "\\%s", tgt);
4184 if (fake_vol->prepath) {
4185 kfree(vol->prepath);
4186 vol->prepath = fake_vol->prepath;
4187 fake_vol->prepath = NULL;
4189 memcpy(&vol->dstaddr, &fake_vol->dstaddr, sizeof(vol->dstaddr));
4194 static int setup_dfs_tgt_conn(const char *path,
4195 const struct dfs_cache_tgt_iterator *tgt_it,
4196 struct cifs_sb_info *cifs_sb,
4197 struct smb_vol *vol,
4199 struct TCP_Server_Info **server,
4200 struct cifs_ses **ses,
4201 struct cifs_tcon **tcon)
4204 struct dfs_info3_param ref = {0};
4205 char *mdata = NULL, *fake_devname = NULL;
4206 struct smb_vol fake_vol = {0};
4208 cifs_dbg(FYI, "%s: dfs path: %s\n", __func__, path);
4210 rc = dfs_cache_get_tgt_referral(path, tgt_it, &ref);
4214 mdata = cifs_compose_mount_options(cifs_sb->mountdata, path, &ref,
4216 free_dfs_info_param(&ref);
4218 if (IS_ERR(mdata)) {
4219 rc = PTR_ERR(mdata);
4222 cifs_dbg(FYI, "%s: fake_devname: %s\n", __func__, fake_devname);
4223 rc = cifs_setup_volume_info(&fake_vol, mdata, fake_devname,
4227 kfree(fake_devname);
4231 * We use a 'fake_vol' here because we need pass it down to the
4232 * mount_{get,put} functions to test connection against new DFS
4235 mount_put_conns(cifs_sb, *xid, *server, *ses, *tcon);
4236 rc = mount_get_conns(&fake_vol, cifs_sb, xid, server, ses,
4240 * We were able to connect to new target server.
4241 * Update current volume info with new target server.
4243 rc = update_vol_info(tgt_it, &fake_vol, vol);
4246 cifs_cleanup_volume_info_contents(&fake_vol);
4250 static int mount_do_dfs_failover(const char *path,
4251 struct cifs_sb_info *cifs_sb,
4252 struct smb_vol *vol,
4253 struct cifs_ses *root_ses,
4255 struct TCP_Server_Info **server,
4256 struct cifs_ses **ses,
4257 struct cifs_tcon **tcon)
4260 struct dfs_cache_tgt_list tgt_list;
4261 struct dfs_cache_tgt_iterator *tgt_it = NULL;
4263 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4266 rc = dfs_cache_noreq_find(path, NULL, &tgt_list);
4271 /* Get next DFS target server - if any */
4272 rc = get_next_dfs_tgt(path, &tgt_list, &tgt_it);
4275 /* Connect to next DFS target */
4276 rc = setup_dfs_tgt_conn(path, tgt_it, cifs_sb, vol, xid, server,
4278 if (!rc || rc == -EACCES || rc == -EOPNOTSUPP)
4283 * Update DFS target hint in DFS referral cache with the target
4284 * server we successfully reconnected to.
4286 rc = dfs_cache_update_tgthint(*xid, root_ses ? root_ses : *ses,
4288 cifs_remap(cifs_sb), path,
4291 dfs_cache_free_tgts(&tgt_list);
4297 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
4298 const char *devname, bool is_smb3)
4302 if (cifs_parse_mount_options(mount_data, devname, volume_info, is_smb3))
4305 if (volume_info->nullauth) {
4306 cifs_dbg(FYI, "Anonymous login\n");
4307 kfree(volume_info->username);
4308 volume_info->username = NULL;
4309 } else if (volume_info->username) {
4310 /* BB fixme parse for domain name here */
4311 cifs_dbg(FYI, "Username: %s\n", volume_info->username);
4313 cifs_dbg(VFS, "No username specified\n");
4314 /* In userspace mount helper we can get user name from alternate
4315 locations such as env variables and files on disk */
4319 /* this is needed for ASCII cp to Unicode converts */
4320 if (volume_info->iocharset == NULL) {
4321 /* load_nls_default cannot return null */
4322 volume_info->local_nls = load_nls_default();
4324 volume_info->local_nls = load_nls(volume_info->iocharset);
4325 if (volume_info->local_nls == NULL) {
4326 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
4327 volume_info->iocharset);
4336 cifs_get_volume_info(char *mount_data, const char *devname, bool is_smb3)
4339 struct smb_vol *volume_info;
4341 volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
4343 return ERR_PTR(-ENOMEM);
4345 rc = cifs_setup_volume_info(volume_info, mount_data, devname, is_smb3);
4347 cifs_cleanup_volume_info(volume_info);
4348 volume_info = ERR_PTR(rc);
4355 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
4357 struct cifs_tcon *tcon,
4358 struct cifs_sb_info *cifs_sb,
4365 sep = CIFS_DIR_SEP(cifs_sb);
4368 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
4370 /* skip separators */
4375 /* next separator */
4376 while (*s && *s != sep)
4380 * temporarily null-terminate the path at the end of
4381 * the current component
4385 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4393 * Check if path is remote (e.g. a DFS share). Return -EREMOTE if it is,
4396 static int is_path_remote(struct cifs_sb_info *cifs_sb, struct smb_vol *vol,
4397 const unsigned int xid,
4398 struct TCP_Server_Info *server,
4399 struct cifs_tcon *tcon)
4404 if (!server->ops->is_path_accessible)
4408 * cifs_build_path_to_root works only when we have a valid tcon
4410 full_path = cifs_build_path_to_root(vol, cifs_sb, tcon,
4411 tcon->Flags & SMB_SHARE_IS_IN_DFS);
4412 if (full_path == NULL)
4415 cifs_dbg(FYI, "%s: full_path: %s\n", __func__, full_path);
4417 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4419 if (rc != 0 && rc != -EREMOTE) {
4424 if (rc != -EREMOTE) {
4425 rc = cifs_are_all_path_components_accessible(server, xid, tcon,
4429 cifs_dbg(VFS, "cannot query dirs between root and final path, "
4430 "enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
4431 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
4440 #ifdef CONFIG_CIFS_DFS_UPCALL
4441 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4445 struct cifs_ses *ses;
4446 struct cifs_tcon *root_tcon = NULL;
4447 struct cifs_tcon *tcon = NULL;
4448 struct TCP_Server_Info *server;
4449 char *root_path = NULL, *full_path = NULL;
4450 char *old_mountdata;
4453 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4455 /* If not a standalone DFS root, then check if path is remote */
4456 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls,
4457 cifs_remap(cifs_sb), vol->UNC + 1, NULL,
4460 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4468 * If first DFS target server went offline and we failed to connect it,
4469 * server and ses pointers are NULL at this point, though we still have
4470 * chance to get a cached DFS referral in expand_dfs_referral() and
4471 * retry next target available in it.
4473 * If a NULL ses ptr is passed to dfs_cache_find(), a lookup will be
4474 * performed against DFS path and *no* requests will be sent to server
4475 * for any new DFS referrals. Hence it's safe to skip checking whether
4476 * server or ses ptr is NULL.
4478 if (rc == -EACCES || rc == -EOPNOTSUPP)
4481 root_path = build_unc_path_to_root(vol, cifs_sb, false);
4482 if (IS_ERR(root_path)) {
4483 rc = PTR_ERR(root_path);
4488 full_path = build_unc_path_to_root(vol, cifs_sb, true);
4489 if (IS_ERR(full_path)) {
4490 rc = PTR_ERR(full_path);
4495 * Perform an unconditional check for whether there are DFS
4496 * referrals for this path without prefix, to provide support
4497 * for DFS referrals from w2k8 servers which don't seem to respond
4498 * with PATH_NOT_COVERED to requests that include the prefix.
4499 * Chase the referral if found, otherwise continue normally.
4501 old_mountdata = cifs_sb->mountdata;
4502 (void)expand_dfs_referral(xid, ses, vol, cifs_sb, false);
4504 if (cifs_sb->mountdata == NULL) {
4509 if (cifs_sb->mountdata != old_mountdata) {
4510 /* If we were redirected, reconnect to new target server */
4511 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4512 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4515 if (rc == -EACCES || rc == -EOPNOTSUPP)
4517 /* Perform DFS failover to any other DFS targets */
4518 rc = mount_do_dfs_failover(root_path + 1, cifs_sb, vol, NULL,
4519 &xid, &server, &ses, &tcon);
4525 root_path = build_unc_path_to_root(vol, cifs_sb, false);
4526 if (IS_ERR(root_path)) {
4527 rc = PTR_ERR(root_path);
4531 /* Cache out resolved root server */
4532 (void)dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4533 root_path + 1, NULL, NULL);
4535 * Save root tcon for additional DFS requests to update or create a new
4536 * DFS cache entry, or even perform DFS failover.
4538 spin_lock(&cifs_tcp_ses_lock);
4540 tcon->dfs_path = root_path;
4542 tcon->remap = cifs_remap(cifs_sb);
4543 spin_unlock(&cifs_tcp_ses_lock);
4547 for (count = 1; ;) {
4549 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4550 if (!rc || rc != -EREMOTE)
4554 * BB: when we implement proper loop detection,
4555 * we will remove this check. But now we need it
4556 * to prevent an indefinite loop if 'DFS tree' is
4557 * misconfigured (i.e. has loops).
4559 if (count++ > MAX_NESTED_LINKS) {
4565 full_path = build_unc_path_to_root(vol, cifs_sb, true);
4566 if (IS_ERR(full_path)) {
4567 rc = PTR_ERR(full_path);
4572 old_mountdata = cifs_sb->mountdata;
4573 rc = expand_dfs_referral(xid, root_tcon->ses, vol, cifs_sb,
4578 if (cifs_sb->mountdata != old_mountdata) {
4579 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4580 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses,
4584 if (rc == -EACCES || rc == -EOPNOTSUPP)
4586 /* Perform DFS failover to any other DFS targets */
4587 rc = mount_do_dfs_failover(full_path + 1, cifs_sb, vol,
4588 root_tcon->ses, &xid,
4589 &server, &ses, &tcon);
4590 if (rc == -EACCES || rc == -EOPNOTSUPP || !server ||
4595 cifs_put_tcon(root_tcon);
4600 spin_lock(&cifs_tcp_ses_lock);
4601 if (!tcon->dfs_path) {
4602 /* Save full path in new tcon to do failover when reconnecting tcons */
4603 tcon->dfs_path = full_path;
4605 tcon->remap = cifs_remap(cifs_sb);
4607 cifs_sb->origin_fullpath = kstrndup(tcon->dfs_path,
4608 strlen(tcon->dfs_path),
4610 if (!cifs_sb->origin_fullpath) {
4611 spin_unlock(&cifs_tcp_ses_lock);
4615 spin_unlock(&cifs_tcp_ses_lock);
4617 rc = dfs_cache_add_vol(vol, cifs_sb->origin_fullpath);
4619 kfree(cifs_sb->origin_fullpath);
4623 * After reconnecting to a different server, unique ids won't
4624 * match anymore, so we disable serverino. This prevents
4625 * dentry revalidation to think the dentry are stale (ESTALE).
4627 cifs_autodisable_serverino(cifs_sb);
4630 return mount_setup_tlink(cifs_sb, ses, tcon);
4635 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4639 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4643 struct cifs_ses *ses;
4644 struct cifs_tcon *tcon;
4645 struct TCP_Server_Info *server;
4647 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4652 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4661 return mount_setup_tlink(cifs_sb, ses, tcon);
4664 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4670 * Issue a TREE_CONNECT request.
4673 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
4674 const char *tree, struct cifs_tcon *tcon,
4675 const struct nls_table *nls_codepage)
4677 struct smb_hdr *smb_buffer;
4678 struct smb_hdr *smb_buffer_response;
4681 unsigned char *bcc_ptr;
4684 __u16 bytes_left, count;
4689 smb_buffer = cifs_buf_get();
4690 if (smb_buffer == NULL)
4693 smb_buffer_response = smb_buffer;
4695 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
4696 NULL /*no tid */ , 4 /*wct */ );
4698 smb_buffer->Mid = get_next_mid(ses->server);
4699 smb_buffer->Uid = ses->Suid;
4700 pSMB = (TCONX_REQ *) smb_buffer;
4701 pSMBr = (TCONX_RSP *) smb_buffer_response;
4703 pSMB->AndXCommand = 0xFF;
4704 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
4705 bcc_ptr = &pSMB->Password[0];
4706 if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
4707 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
4708 *bcc_ptr = 0; /* password is null byte */
4709 bcc_ptr++; /* skip password */
4710 /* already aligned so no need to do it below */
4712 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
4713 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
4714 specified as required (when that support is added to
4715 the vfs in the future) as only NTLM or the much
4716 weaker LANMAN (which we do not send by default) is accepted
4717 by Samba (not sure whether other servers allow
4718 NTLMv2 password here) */
4719 #ifdef CONFIG_CIFS_WEAK_PW_HASH
4720 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
4721 (ses->sectype == LANMAN))
4722 calc_lanman_hash(tcon->password, ses->server->cryptkey,
4723 ses->server->sec_mode &
4724 SECMODE_PW_ENCRYPT ? true : false,
4727 #endif /* CIFS_WEAK_PW_HASH */
4728 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
4729 bcc_ptr, nls_codepage);
4731 cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
4733 cifs_buf_release(smb_buffer);
4737 bcc_ptr += CIFS_AUTH_RESP_SIZE;
4738 if (ses->capabilities & CAP_UNICODE) {
4739 /* must align unicode strings */
4740 *bcc_ptr = 0; /* null byte password */
4745 if (ses->server->sign)
4746 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
4748 if (ses->capabilities & CAP_STATUS32) {
4749 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
4751 if (ses->capabilities & CAP_DFS) {
4752 smb_buffer->Flags2 |= SMBFLG2_DFS;
4754 if (ses->capabilities & CAP_UNICODE) {
4755 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
4757 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
4758 6 /* max utf8 char length in bytes */ *
4759 (/* server len*/ + 256 /* share len */), nls_codepage);
4760 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
4761 bcc_ptr += 2; /* skip trailing null */
4762 } else { /* ASCII */
4763 strcpy(bcc_ptr, tree);
4764 bcc_ptr += strlen(tree) + 1;
4766 strcpy(bcc_ptr, "?????");
4767 bcc_ptr += strlen("?????");
4769 count = bcc_ptr - &pSMB->Password[0];
4770 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
4771 pSMB->hdr.smb_buf_length) + count);
4772 pSMB->ByteCount = cpu_to_le16(count);
4774 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
4777 /* above now done in SendReceive */
4781 tcon->tidStatus = CifsGood;
4782 tcon->need_reconnect = false;
4783 tcon->tid = smb_buffer_response->Tid;
4784 bcc_ptr = pByteArea(smb_buffer_response);
4785 bytes_left = get_bcc(smb_buffer_response);
4786 length = strnlen(bcc_ptr, bytes_left - 2);
4787 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
4793 /* skip service field (NB: this field is always ASCII) */
4795 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
4796 (bcc_ptr[2] == 'C')) {
4797 cifs_dbg(FYI, "IPC connection\n");
4801 } else if (length == 2) {
4802 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
4803 /* the most common case */
4804 cifs_dbg(FYI, "disk share connection\n");
4807 bcc_ptr += length + 1;
4808 bytes_left -= (length + 1);
4809 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
4811 /* mostly informational -- no need to fail on error here */
4812 kfree(tcon->nativeFileSystem);
4813 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
4814 bytes_left, is_unicode,
4817 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
4819 if ((smb_buffer_response->WordCount == 3) ||
4820 (smb_buffer_response->WordCount == 7))
4821 /* field is in same location */
4822 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
4825 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
4828 cifs_buf_release(smb_buffer);
4832 static void delayed_free(struct rcu_head *p)
4834 struct cifs_sb_info *sbi = container_of(p, struct cifs_sb_info, rcu);
4835 unload_nls(sbi->local_nls);
4840 cifs_umount(struct cifs_sb_info *cifs_sb)
4842 struct rb_root *root = &cifs_sb->tlink_tree;
4843 struct rb_node *node;
4844 struct tcon_link *tlink;
4846 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
4848 spin_lock(&cifs_sb->tlink_tree_lock);
4849 while ((node = rb_first(root))) {
4850 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
4851 cifs_get_tlink(tlink);
4852 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4853 rb_erase(node, root);
4855 spin_unlock(&cifs_sb->tlink_tree_lock);
4856 cifs_put_tlink(tlink);
4857 spin_lock(&cifs_sb->tlink_tree_lock);
4859 spin_unlock(&cifs_sb->tlink_tree_lock);
4861 kfree(cifs_sb->mountdata);
4862 kfree(cifs_sb->prepath);
4863 #ifdef CONFIG_CIFS_DFS_UPCALL
4864 dfs_cache_del_vol(cifs_sb->origin_fullpath);
4865 kfree(cifs_sb->origin_fullpath);
4867 call_rcu(&cifs_sb->rcu, delayed_free);
4871 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
4874 struct TCP_Server_Info *server = ses->server;
4876 if (!server->ops->need_neg || !server->ops->negotiate)
4879 /* only send once per connect */
4880 if (!server->ops->need_neg(server))
4883 set_credits(server, 1);
4885 rc = server->ops->negotiate(xid, ses);
4887 spin_lock(&GlobalMid_Lock);
4888 if (server->tcpStatus == CifsNeedNegotiate)
4889 server->tcpStatus = CifsGood;
4892 spin_unlock(&GlobalMid_Lock);
4899 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
4900 struct nls_table *nls_info)
4903 struct TCP_Server_Info *server = ses->server;
4905 ses->capabilities = server->capabilities;
4906 if (linuxExtEnabled == 0)
4907 ses->capabilities &= (~server->vals->cap_unix);
4909 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
4910 server->sec_mode, server->capabilities, server->timeAdj);
4912 if (ses->auth_key.response) {
4913 cifs_dbg(FYI, "Free previous auth_key.response = %p\n",
4914 ses->auth_key.response);
4915 kfree(ses->auth_key.response);
4916 ses->auth_key.response = NULL;
4917 ses->auth_key.len = 0;
4920 if (server->ops->sess_setup)
4921 rc = server->ops->sess_setup(xid, ses, nls_info);
4924 cifs_dbg(VFS, "Send error in SessSetup = %d\n", rc);
4930 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
4932 vol->sectype = ses->sectype;
4934 /* krb5 is special, since we don't need username or pw */
4935 if (vol->sectype == Kerberos)
4938 return cifs_set_cifscreds(vol, ses);
4941 static struct cifs_tcon *
4942 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
4945 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
4946 struct cifs_ses *ses;
4947 struct cifs_tcon *tcon = NULL;
4948 struct smb_vol *vol_info;
4950 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
4951 if (vol_info == NULL)
4952 return ERR_PTR(-ENOMEM);
4954 vol_info->local_nls = cifs_sb->local_nls;
4955 vol_info->linux_uid = fsuid;
4956 vol_info->cred_uid = fsuid;
4957 vol_info->UNC = master_tcon->treeName;
4958 vol_info->retry = master_tcon->retry;
4959 vol_info->nocase = master_tcon->nocase;
4960 vol_info->nohandlecache = master_tcon->nohandlecache;
4961 vol_info->local_lease = master_tcon->local_lease;
4962 vol_info->no_linux_ext = !master_tcon->unix_ext;
4963 vol_info->sectype = master_tcon->ses->sectype;
4964 vol_info->sign = master_tcon->ses->sign;
4966 rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
4972 /* get a reference for the same TCP session */
4973 spin_lock(&cifs_tcp_ses_lock);
4974 ++master_tcon->ses->server->srv_count;
4975 spin_unlock(&cifs_tcp_ses_lock);
4977 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
4979 tcon = (struct cifs_tcon *)ses;
4980 cifs_put_tcp_session(master_tcon->ses->server, 0);
4984 tcon = cifs_get_tcon(ses, vol_info);
4986 cifs_put_smb_ses(ses);
4990 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
4991 if (tcon->posix_extensions)
4992 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
4995 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
4998 kfree(vol_info->username);
4999 kzfree(vol_info->password);
5006 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
5008 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
5011 /* find and return a tlink with given uid */
5012 static struct tcon_link *
5013 tlink_rb_search(struct rb_root *root, kuid_t uid)
5015 struct rb_node *node = root->rb_node;
5016 struct tcon_link *tlink;
5019 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
5021 if (uid_gt(tlink->tl_uid, uid))
5022 node = node->rb_left;
5023 else if (uid_lt(tlink->tl_uid, uid))
5024 node = node->rb_right;
5031 /* insert a tcon_link into the tree */
5033 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
5035 struct rb_node **new = &(root->rb_node), *parent = NULL;
5036 struct tcon_link *tlink;
5039 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
5042 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
5043 new = &((*new)->rb_left);
5045 new = &((*new)->rb_right);
5048 rb_link_node(&new_tlink->tl_rbnode, parent, new);
5049 rb_insert_color(&new_tlink->tl_rbnode, root);
5053 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
5056 * If the superblock doesn't refer to a multiuser mount, then just return
5057 * the master tcon for the mount.
5059 * First, search the rbtree for an existing tcon for this fsuid. If one
5060 * exists, then check to see if it's pending construction. If it is then wait
5061 * for construction to complete. Once it's no longer pending, check to see if
5062 * it failed and either return an error or retry construction, depending on
5065 * If one doesn't exist then insert a new tcon_link struct into the tree and
5066 * try to construct a new one.
5069 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
5072 kuid_t fsuid = current_fsuid();
5073 struct tcon_link *tlink, *newtlink;
5075 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
5076 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
5078 spin_lock(&cifs_sb->tlink_tree_lock);
5079 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5081 cifs_get_tlink(tlink);
5082 spin_unlock(&cifs_sb->tlink_tree_lock);
5084 if (tlink == NULL) {
5085 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
5086 if (newtlink == NULL)
5087 return ERR_PTR(-ENOMEM);
5088 newtlink->tl_uid = fsuid;
5089 newtlink->tl_tcon = ERR_PTR(-EACCES);
5090 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
5091 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
5092 cifs_get_tlink(newtlink);
5094 spin_lock(&cifs_sb->tlink_tree_lock);
5095 /* was one inserted after previous search? */
5096 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5098 cifs_get_tlink(tlink);
5099 spin_unlock(&cifs_sb->tlink_tree_lock);
5101 goto wait_for_construction;
5104 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
5105 spin_unlock(&cifs_sb->tlink_tree_lock);
5107 wait_for_construction:
5108 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
5109 TASK_INTERRUPTIBLE);
5111 cifs_put_tlink(tlink);
5112 return ERR_PTR(-ERESTARTSYS);
5115 /* if it's good, return it */
5116 if (!IS_ERR(tlink->tl_tcon))
5119 /* return error if we tried this already recently */
5120 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
5121 cifs_put_tlink(tlink);
5122 return ERR_PTR(-EACCES);
5125 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
5126 goto wait_for_construction;
5129 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
5130 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
5131 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
5133 if (IS_ERR(tlink->tl_tcon)) {
5134 cifs_put_tlink(tlink);
5135 return ERR_PTR(-EACCES);
5142 * periodic workqueue job that scans tcon_tree for a superblock and closes
5146 cifs_prune_tlinks(struct work_struct *work)
5148 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
5150 struct rb_root *root = &cifs_sb->tlink_tree;
5151 struct rb_node *node;
5152 struct rb_node *tmp;
5153 struct tcon_link *tlink;
5156 * Because we drop the spinlock in the loop in order to put the tlink
5157 * it's not guarded against removal of links from the tree. The only
5158 * places that remove entries from the tree are this function and
5159 * umounts. Because this function is non-reentrant and is canceled
5160 * before umount can proceed, this is safe.
5162 spin_lock(&cifs_sb->tlink_tree_lock);
5163 node = rb_first(root);
5164 while (node != NULL) {
5166 node = rb_next(tmp);
5167 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
5169 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
5170 atomic_read(&tlink->tl_count) != 0 ||
5171 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
5174 cifs_get_tlink(tlink);
5175 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
5176 rb_erase(tmp, root);
5178 spin_unlock(&cifs_sb->tlink_tree_lock);
5179 cifs_put_tlink(tlink);
5180 spin_lock(&cifs_sb->tlink_tree_lock);
5182 spin_unlock(&cifs_sb->tlink_tree_lock);
5184 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,