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 (IS_ERR(server->hostname)) {
438 "%s: failed to extract hostname from target: %ld\n",
439 __func__, PTR_ERR(server->hostname));
443 static inline int reconn_setup_dfs_targets(struct cifs_sb_info *cifs_sb,
444 struct dfs_cache_tgt_list *tl,
445 struct dfs_cache_tgt_iterator **it)
447 if (!cifs_sb->origin_fullpath)
449 return dfs_cache_noreq_find(cifs_sb->origin_fullpath + 1, NULL, tl);
454 * cifs tcp session reconnection
456 * mark tcp session as reconnecting so temporarily locked
457 * mark all smb sessions as reconnecting for tcp session
458 * reconnect tcp session
459 * wake up waiters on reconnection? - (not needed currently)
462 cifs_reconnect(struct TCP_Server_Info *server)
465 struct list_head *tmp, *tmp2;
466 struct cifs_ses *ses;
467 struct cifs_tcon *tcon;
468 struct mid_q_entry *mid_entry;
469 struct list_head retry_list;
470 #ifdef CONFIG_CIFS_DFS_UPCALL
471 struct cifs_sb_info *cifs_sb = NULL;
472 struct dfs_cache_tgt_list tgt_list = {0};
473 struct dfs_cache_tgt_iterator *tgt_it = NULL;
476 spin_lock(&GlobalMid_Lock);
477 server->nr_targets = 1;
478 #ifdef CONFIG_CIFS_DFS_UPCALL
479 cifs_sb = find_super_by_tcp(server);
480 if (IS_ERR(cifs_sb)) {
481 rc = PTR_ERR(cifs_sb);
482 cifs_dbg(FYI, "%s: will not do DFS failover: rc = %d\n",
486 rc = reconn_setup_dfs_targets(cifs_sb, &tgt_list, &tgt_it);
487 if (rc && (rc != -EOPNOTSUPP)) {
488 cifs_dbg(VFS, "%s: no target servers for DFS failover\n",
491 server->nr_targets = dfs_cache_get_nr_tgts(&tgt_list);
494 cifs_dbg(FYI, "%s: will retry %d target(s)\n", __func__,
497 if (server->tcpStatus == CifsExiting) {
498 /* the demux thread will exit normally
499 next time through the loop */
500 spin_unlock(&GlobalMid_Lock);
503 server->tcpStatus = CifsNeedReconnect;
504 spin_unlock(&GlobalMid_Lock);
506 server->max_read = 0;
508 cifs_dbg(FYI, "Mark tcp session as need reconnect\n");
509 trace_smb3_reconnect(server->CurrentMid, server->hostname);
511 /* before reconnecting the tcp session, mark the smb session (uid)
512 and the tid bad so they are not used until reconnected */
513 cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
515 spin_lock(&cifs_tcp_ses_lock);
516 list_for_each(tmp, &server->smb_ses_list) {
517 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
518 ses->need_reconnect = true;
519 list_for_each(tmp2, &ses->tcon_list) {
520 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
521 tcon->need_reconnect = true;
524 ses->tcon_ipc->need_reconnect = true;
526 spin_unlock(&cifs_tcp_ses_lock);
528 /* do not want to be sending data on a socket we are freeing */
529 cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
530 mutex_lock(&server->srv_mutex);
531 if (server->ssocket) {
532 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
533 server->ssocket->state, server->ssocket->flags);
534 kernel_sock_shutdown(server->ssocket, SHUT_WR);
535 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
536 server->ssocket->state, server->ssocket->flags);
537 sock_release(server->ssocket);
538 server->ssocket = NULL;
540 server->sequence_number = 0;
541 server->session_estab = false;
542 kfree(server->session_key.response);
543 server->session_key.response = NULL;
544 server->session_key.len = 0;
545 server->lstrp = jiffies;
547 /* mark submitted MIDs for retry and issue callback */
548 INIT_LIST_HEAD(&retry_list);
549 cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
550 spin_lock(&GlobalMid_Lock);
551 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
552 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
553 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
554 mid_entry->mid_state = MID_RETRY_NEEDED;
555 list_move(&mid_entry->qhead, &retry_list);
557 spin_unlock(&GlobalMid_Lock);
558 mutex_unlock(&server->srv_mutex);
560 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
561 list_for_each_safe(tmp, tmp2, &retry_list) {
562 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
563 list_del_init(&mid_entry->qhead);
564 mid_entry->callback(mid_entry);
570 mutex_lock(&server->srv_mutex);
572 * Set up next DFS target server (if any) for reconnect. If DFS
573 * feature is disabled, then we will retry last server we
574 * connected to before.
576 if (cifs_rdma_enabled(server))
577 rc = smbd_reconnect(server);
579 rc = generic_ip_connect(server);
581 cifs_dbg(FYI, "reconnect error %d\n", rc);
582 #ifdef CONFIG_CIFS_DFS_UPCALL
583 reconn_inval_dfs_target(server, cifs_sb, &tgt_list,
586 rc = reconn_set_ipaddr(server);
588 cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
591 mutex_unlock(&server->srv_mutex);
594 atomic_inc(&tcpSesReconnectCount);
595 spin_lock(&GlobalMid_Lock);
596 if (server->tcpStatus != CifsExiting)
597 server->tcpStatus = CifsNeedNegotiate;
598 spin_unlock(&GlobalMid_Lock);
599 mutex_unlock(&server->srv_mutex);
601 } while (server->tcpStatus == CifsNeedReconnect);
603 #ifdef CONFIG_CIFS_DFS_UPCALL
605 rc = dfs_cache_noreq_update_tgthint(cifs_sb->origin_fullpath + 1,
608 cifs_dbg(VFS, "%s: failed to update DFS target hint: rc = %d\n",
611 rc = dfs_cache_update_vol(cifs_sb->origin_fullpath, server);
613 cifs_dbg(VFS, "%s: failed to update vol info in DFS cache: rc = %d\n",
616 dfs_cache_free_tgts(&tgt_list);
619 if (server->tcpStatus == CifsNeedNegotiate)
620 mod_delayed_work(cifsiod_wq, &server->echo, 0);
626 cifs_echo_request(struct work_struct *work)
629 struct TCP_Server_Info *server = container_of(work,
630 struct TCP_Server_Info, echo.work);
631 unsigned long echo_interval;
634 * If we need to renegotiate, set echo interval to zero to
635 * immediately call echo service where we can renegotiate.
637 if (server->tcpStatus == CifsNeedNegotiate)
640 echo_interval = server->echo_interval;
643 * We cannot send an echo if it is disabled.
644 * Also, no need to ping if we got a response recently.
647 if (server->tcpStatus == CifsNeedReconnect ||
648 server->tcpStatus == CifsExiting ||
649 server->tcpStatus == CifsNew ||
650 (server->ops->can_echo && !server->ops->can_echo(server)) ||
651 time_before(jiffies, server->lstrp + echo_interval - HZ))
654 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
656 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
660 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
664 allocate_buffers(struct TCP_Server_Info *server)
666 if (!server->bigbuf) {
667 server->bigbuf = (char *)cifs_buf_get();
668 if (!server->bigbuf) {
669 cifs_dbg(VFS, "No memory for large SMB response\n");
671 /* retry will check if exiting */
674 } else if (server->large_buf) {
675 /* we are reusing a dirty large buf, clear its start */
676 memset(server->bigbuf, 0, HEADER_SIZE(server));
679 if (!server->smallbuf) {
680 server->smallbuf = (char *)cifs_small_buf_get();
681 if (!server->smallbuf) {
682 cifs_dbg(VFS, "No memory for SMB response\n");
684 /* retry will check if exiting */
687 /* beginning of smb buffer is cleared in our buf_get */
689 /* if existing small buf clear beginning */
690 memset(server->smallbuf, 0, HEADER_SIZE(server));
697 server_unresponsive(struct TCP_Server_Info *server)
700 * We need to wait 2 echo intervals to make sure we handle such
702 * 1s client sends a normal SMB request
703 * 2s client gets a response
704 * 30s echo workqueue job pops, and decides we got a response recently
705 * and don't need to send another
707 * 65s kernel_recvmsg times out, and we see that we haven't gotten
708 * a response in >60s.
710 if ((server->tcpStatus == CifsGood ||
711 server->tcpStatus == CifsNeedNegotiate) &&
712 time_after(jiffies, server->lstrp + 2 * server->echo_interval)) {
713 cifs_dbg(VFS, "Server %s has not responded in %lu seconds. Reconnecting...\n",
714 server->hostname, (2 * server->echo_interval) / HZ);
715 cifs_reconnect(server);
716 wake_up(&server->response_q);
724 zero_credits(struct TCP_Server_Info *server)
728 spin_lock(&server->req_lock);
729 val = server->credits + server->echo_credits + server->oplock_credits;
730 if (server->in_flight == 0 && val == 0) {
731 spin_unlock(&server->req_lock);
734 spin_unlock(&server->req_lock);
739 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
744 smb_msg->msg_control = NULL;
745 smb_msg->msg_controllen = 0;
747 for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
750 /* reconnect if no credits and no requests in flight */
751 if (zero_credits(server)) {
752 cifs_reconnect(server);
753 return -ECONNABORTED;
756 if (server_unresponsive(server))
757 return -ECONNABORTED;
758 if (cifs_rdma_enabled(server) && server->smbd_conn)
759 length = smbd_recv(server->smbd_conn, smb_msg);
761 length = sock_recvmsg(server->ssocket, smb_msg, 0);
763 if (server->tcpStatus == CifsExiting)
766 if (server->tcpStatus == CifsNeedReconnect) {
767 cifs_reconnect(server);
768 return -ECONNABORTED;
771 if (length == -ERESTARTSYS ||
775 * Minimum sleep to prevent looping, allowing socket
776 * to clear and app threads to set tcpStatus
777 * CifsNeedReconnect if server hung.
779 usleep_range(1000, 2000);
785 cifs_dbg(FYI, "Received no data or error: %d\n", length);
786 cifs_reconnect(server);
787 return -ECONNABORTED;
794 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
795 unsigned int to_read)
797 struct msghdr smb_msg;
798 struct kvec iov = {.iov_base = buf, .iov_len = to_read};
799 iov_iter_kvec(&smb_msg.msg_iter, READ, &iov, 1, to_read);
801 return cifs_readv_from_socket(server, &smb_msg);
805 cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
806 unsigned int page_offset, unsigned int to_read)
808 struct msghdr smb_msg;
809 struct bio_vec bv = {
810 .bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
811 iov_iter_bvec(&smb_msg.msg_iter, READ, &bv, 1, to_read);
812 return cifs_readv_from_socket(server, &smb_msg);
816 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
819 * The first byte big endian of the length field,
820 * is actually not part of the length but the type
821 * with the most common, zero, as regular data.
824 case RFC1002_SESSION_MESSAGE:
825 /* Regular SMB response */
827 case RFC1002_SESSION_KEEP_ALIVE:
828 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
830 case RFC1002_POSITIVE_SESSION_RESPONSE:
831 cifs_dbg(FYI, "RFC 1002 positive session response\n");
833 case RFC1002_NEGATIVE_SESSION_RESPONSE:
835 * We get this from Windows 98 instead of an error on
836 * SMB negprot response.
838 cifs_dbg(FYI, "RFC 1002 negative session response\n");
839 /* give server a second to clean up */
842 * Always try 445 first on reconnect since we get NACK
843 * on some if we ever connected to port 139 (the NACK
844 * is since we do not begin with RFC1001 session
847 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
848 cifs_reconnect(server);
849 wake_up(&server->response_q);
852 cifs_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
853 cifs_reconnect(server);
860 dequeue_mid(struct mid_q_entry *mid, bool malformed)
862 #ifdef CONFIG_CIFS_STATS2
863 mid->when_received = jiffies;
865 spin_lock(&GlobalMid_Lock);
867 mid->mid_state = MID_RESPONSE_RECEIVED;
869 mid->mid_state = MID_RESPONSE_MALFORMED;
871 * Trying to handle/dequeue a mid after the send_recv()
872 * function has finished processing it is a bug.
874 if (mid->mid_flags & MID_DELETED)
875 printk_once(KERN_WARNING
876 "trying to dequeue a deleted mid\n");
878 list_del_init(&mid->qhead);
879 spin_unlock(&GlobalMid_Lock);
883 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
884 char *buf, int malformed)
886 if (server->ops->check_trans2 &&
887 server->ops->check_trans2(mid, server, buf, malformed))
890 mid->large_buf = server->large_buf;
891 /* Was previous buf put in mpx struct for multi-rsp? */
892 if (!mid->multiRsp) {
893 /* smb buffer will be freed by user thread */
894 if (server->large_buf)
895 server->bigbuf = NULL;
897 server->smallbuf = NULL;
899 dequeue_mid(mid, malformed);
902 static void clean_demultiplex_info(struct TCP_Server_Info *server)
906 /* take it off the list, if it's not already */
907 spin_lock(&cifs_tcp_ses_lock);
908 list_del_init(&server->tcp_ses_list);
909 spin_unlock(&cifs_tcp_ses_lock);
911 spin_lock(&GlobalMid_Lock);
912 server->tcpStatus = CifsExiting;
913 spin_unlock(&GlobalMid_Lock);
914 wake_up_all(&server->response_q);
916 /* check if we have blocked requests that need to free */
917 spin_lock(&server->req_lock);
918 if (server->credits <= 0)
920 spin_unlock(&server->req_lock);
922 * Although there should not be any requests blocked on this queue it
923 * can not hurt to be paranoid and try to wake up requests that may
924 * haven been blocked when more than 50 at time were on the wire to the
925 * same server - they now will see the session is in exit state and get
926 * out of SendReceive.
928 wake_up_all(&server->request_q);
929 /* give those requests time to exit */
931 if (cifs_rdma_enabled(server) && server->smbd_conn) {
932 smbd_destroy(server->smbd_conn);
933 server->smbd_conn = NULL;
935 if (server->ssocket) {
936 sock_release(server->ssocket);
937 server->ssocket = NULL;
940 if (!list_empty(&server->pending_mid_q)) {
941 struct list_head dispose_list;
942 struct mid_q_entry *mid_entry;
943 struct list_head *tmp, *tmp2;
945 INIT_LIST_HEAD(&dispose_list);
946 spin_lock(&GlobalMid_Lock);
947 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
948 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
949 cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
950 mid_entry->mid_state = MID_SHUTDOWN;
951 list_move(&mid_entry->qhead, &dispose_list);
953 spin_unlock(&GlobalMid_Lock);
955 /* now walk dispose list and issue callbacks */
956 list_for_each_safe(tmp, tmp2, &dispose_list) {
957 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
958 cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
959 list_del_init(&mid_entry->qhead);
960 mid_entry->callback(mid_entry);
962 /* 1/8th of sec is more than enough time for them to exit */
966 if (!list_empty(&server->pending_mid_q)) {
968 * mpx threads have not exited yet give them at least the smb
969 * send timeout time for long ops.
971 * Due to delays on oplock break requests, we need to wait at
972 * least 45 seconds before giving up on a request getting a
973 * response and going ahead and killing cifsd.
975 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
978 * If threads still have not exited they are probably never
979 * coming home not much else we can do but free the memory.
983 kfree(server->hostname);
986 length = atomic_dec_return(&tcpSesAllocCount);
988 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
992 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
995 char *buf = server->smallbuf;
996 unsigned int pdu_length = server->pdu_size;
998 /* make sure this will fit in a large buffer */
999 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
1000 server->vals->header_preamble_size) {
1001 cifs_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
1002 cifs_reconnect(server);
1003 wake_up(&server->response_q);
1004 return -ECONNABORTED;
1007 /* switch to large buffer if too big for a small one */
1008 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
1009 server->large_buf = true;
1010 memcpy(server->bigbuf, buf, server->total_read);
1011 buf = server->bigbuf;
1014 /* now read the rest */
1015 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
1016 pdu_length - HEADER_SIZE(server) + 1
1017 + server->vals->header_preamble_size);
1021 server->total_read += length;
1023 dump_smb(buf, server->total_read);
1025 return cifs_handle_standard(server, mid);
1029 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1031 char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
1035 * We know that we received enough to get to the MID as we
1036 * checked the pdu_length earlier. Now check to see
1037 * if the rest of the header is OK. We borrow the length
1038 * var for the rest of the loop to avoid a new stack var.
1040 * 48 bytes is enough to display the header and a little bit
1041 * into the payload for debugging purposes.
1043 length = server->ops->check_message(buf, server->total_read, server);
1045 cifs_dump_mem("Bad SMB: ", buf,
1046 min_t(unsigned int, server->total_read, 48));
1048 if (server->ops->is_session_expired &&
1049 server->ops->is_session_expired(buf)) {
1050 cifs_reconnect(server);
1051 wake_up(&server->response_q);
1055 if (server->ops->is_status_pending &&
1056 server->ops->is_status_pending(buf, server, length))
1062 handle_mid(mid, server, buf, length);
1067 cifs_demultiplex_thread(void *p)
1069 int i, num_mids, length;
1070 struct TCP_Server_Info *server = p;
1071 unsigned int pdu_length;
1072 unsigned int next_offset;
1074 struct task_struct *task_to_wake = NULL;
1075 struct mid_q_entry *mids[MAX_COMPOUND];
1076 char *bufs[MAX_COMPOUND];
1078 current->flags |= PF_MEMALLOC;
1079 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
1081 length = atomic_inc_return(&tcpSesAllocCount);
1083 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
1086 while (server->tcpStatus != CifsExiting) {
1087 if (try_to_freeze())
1090 if (!allocate_buffers(server))
1093 server->large_buf = false;
1094 buf = server->smallbuf;
1095 pdu_length = 4; /* enough to get RFC1001 header */
1097 length = cifs_read_from_socket(server, buf, pdu_length);
1101 if (server->vals->header_preamble_size == 0)
1102 server->total_read = 0;
1104 server->total_read = length;
1107 * The right amount was read from socket - 4 bytes,
1108 * so we can now interpret the length field.
1110 pdu_length = get_rfc1002_length(buf);
1112 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
1113 if (!is_smb_response(server, buf[0]))
1116 server->pdu_size = pdu_length;
1118 /* make sure we have enough to get to the MID */
1119 if (server->pdu_size < HEADER_SIZE(server) - 1 -
1120 server->vals->header_preamble_size) {
1121 cifs_dbg(VFS, "SMB response too short (%u bytes)\n",
1123 cifs_reconnect(server);
1124 wake_up(&server->response_q);
1128 /* read down to the MID */
1129 length = cifs_read_from_socket(server,
1130 buf + server->vals->header_preamble_size,
1131 HEADER_SIZE(server) - 1
1132 - server->vals->header_preamble_size);
1135 server->total_read += length;
1137 if (server->ops->next_header) {
1138 next_offset = server->ops->next_header(buf);
1140 server->pdu_size = next_offset;
1143 memset(mids, 0, sizeof(mids));
1144 memset(bufs, 0, sizeof(bufs));
1147 if (server->ops->is_transform_hdr &&
1148 server->ops->receive_transform &&
1149 server->ops->is_transform_hdr(buf)) {
1150 length = server->ops->receive_transform(server,
1155 mids[0] = server->ops->find_mid(server, buf);
1159 if (!mids[0] || !mids[0]->receive)
1160 length = standard_receive3(server, mids[0]);
1162 length = mids[0]->receive(server, mids[0]);
1166 for (i = 0; i < num_mids; i++)
1168 cifs_mid_q_entry_release(mids[i]);
1172 if (server->large_buf)
1173 buf = server->bigbuf;
1176 server->lstrp = jiffies;
1178 for (i = 0; i < num_mids; i++) {
1179 if (mids[i] != NULL) {
1180 mids[i]->resp_buf_size = server->pdu_size;
1181 if ((mids[i]->mid_flags & MID_WAIT_CANCELLED) &&
1182 mids[i]->mid_state == MID_RESPONSE_RECEIVED &&
1183 server->ops->handle_cancelled_mid)
1184 server->ops->handle_cancelled_mid(
1188 if (!mids[i]->multiRsp || mids[i]->multiEnd)
1189 mids[i]->callback(mids[i]);
1191 cifs_mid_q_entry_release(mids[i]);
1192 } else if (server->ops->is_oplock_break &&
1193 server->ops->is_oplock_break(bufs[i],
1195 cifs_dbg(FYI, "Received oplock break\n");
1197 cifs_dbg(VFS, "No task to wake, unknown frame "
1198 "received! NumMids %d\n",
1199 atomic_read(&midCount));
1200 cifs_dump_mem("Received Data is: ", bufs[i],
1201 HEADER_SIZE(server));
1202 #ifdef CONFIG_CIFS_DEBUG2
1203 if (server->ops->dump_detail)
1204 server->ops->dump_detail(bufs[i],
1206 cifs_dump_mids(server);
1207 #endif /* CIFS_DEBUG2 */
1211 if (pdu_length > server->pdu_size) {
1212 if (!allocate_buffers(server))
1214 pdu_length -= server->pdu_size;
1215 server->total_read = 0;
1216 server->large_buf = false;
1217 buf = server->smallbuf;
1220 } /* end while !EXITING */
1222 /* buffer usually freed in free_mid - need to free it here on exit */
1223 cifs_buf_release(server->bigbuf);
1224 if (server->smallbuf) /* no sense logging a debug message if NULL */
1225 cifs_small_buf_release(server->smallbuf);
1227 task_to_wake = xchg(&server->tsk, NULL);
1228 clean_demultiplex_info(server);
1230 /* if server->tsk was NULL then wait for a signal before exiting */
1231 if (!task_to_wake) {
1232 set_current_state(TASK_INTERRUPTIBLE);
1233 while (!signal_pending(current)) {
1235 set_current_state(TASK_INTERRUPTIBLE);
1237 set_current_state(TASK_RUNNING);
1240 module_put_and_exit(0);
1243 /* extract the host portion of the UNC string */
1245 extract_hostname(const char *unc)
1251 /* skip double chars at beginning of string */
1252 /* BB: check validity of these bytes? */
1253 if (strlen(unc) < 3)
1254 return ERR_PTR(-EINVAL);
1255 for (src = unc; *src && *src == '\\'; src++)
1258 return ERR_PTR(-EINVAL);
1260 /* delimiter between hostname and sharename is always '\\' now */
1261 delim = strchr(src, '\\');
1263 return ERR_PTR(-EINVAL);
1266 dst = kmalloc((len + 1), GFP_KERNEL);
1268 return ERR_PTR(-ENOMEM);
1270 memcpy(dst, src, len);
1276 static int get_option_ul(substring_t args[], unsigned long *option)
1281 string = match_strdup(args);
1284 rc = kstrtoul(string, 0, option);
1290 static int get_option_uid(substring_t args[], kuid_t *result)
1292 unsigned long value;
1296 rc = get_option_ul(args, &value);
1300 uid = make_kuid(current_user_ns(), value);
1301 if (!uid_valid(uid))
1308 static int get_option_gid(substring_t args[], kgid_t *result)
1310 unsigned long value;
1314 rc = get_option_ul(args, &value);
1318 gid = make_kgid(current_user_ns(), value);
1319 if (!gid_valid(gid))
1326 static int cifs_parse_security_flavors(char *value,
1327 struct smb_vol *vol)
1330 substring_t args[MAX_OPT_ARGS];
1333 * With mount options, the last one should win. Reset any existing
1334 * settings back to default.
1336 vol->sectype = Unspecified;
1339 switch (match_token(value, cifs_secflavor_tokens, args)) {
1341 cifs_dbg(VFS, "sec=krb5p is not supported!\n");
1347 vol->sectype = Kerberos;
1349 case Opt_sec_ntlmsspi:
1352 case Opt_sec_ntlmssp:
1353 vol->sectype = RawNTLMSSP;
1359 vol->sectype = NTLM;
1361 case Opt_sec_ntlmv2i:
1364 case Opt_sec_ntlmv2:
1365 vol->sectype = NTLMv2;
1367 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1368 case Opt_sec_lanman:
1369 vol->sectype = LANMAN;
1376 cifs_dbg(VFS, "bad security option: %s\n", value);
1384 cifs_parse_cache_flavor(char *value, struct smb_vol *vol)
1386 substring_t args[MAX_OPT_ARGS];
1388 switch (match_token(value, cifs_cacheflavor_tokens, args)) {
1389 case Opt_cache_loose:
1390 vol->direct_io = false;
1391 vol->strict_io = false;
1393 case Opt_cache_strict:
1394 vol->direct_io = false;
1395 vol->strict_io = true;
1397 case Opt_cache_none:
1398 vol->direct_io = true;
1399 vol->strict_io = false;
1402 cifs_dbg(VFS, "bad cache= option: %s\n", value);
1409 cifs_parse_smb_version(char *value, struct smb_vol *vol, bool is_smb3)
1411 substring_t args[MAX_OPT_ARGS];
1413 switch (match_token(value, cifs_smb_version_tokens, args)) {
1414 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1416 if (disable_legacy_dialects) {
1417 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1421 cifs_dbg(VFS, "vers=1.0 (cifs) not permitted when mounting with smb3\n");
1424 vol->ops = &smb1_operations;
1425 vol->vals = &smb1_values;
1428 if (disable_legacy_dialects) {
1429 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1433 cifs_dbg(VFS, "vers=2.0 not permitted when mounting with smb3\n");
1436 vol->ops = &smb20_operations;
1437 vol->vals = &smb20_values;
1441 cifs_dbg(VFS, "vers=1.0 (cifs) mount not permitted when legacy dialects disabled\n");
1444 cifs_dbg(VFS, "vers=2.0 mount not permitted when legacy dialects disabled\n");
1446 #endif /* CIFS_ALLOW_INSECURE_LEGACY */
1448 vol->ops = &smb21_operations;
1449 vol->vals = &smb21_values;
1452 vol->ops = &smb30_operations;
1453 vol->vals = &smb30_values;
1456 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1457 vol->vals = &smb302_values;
1460 vol->ops = &smb311_operations;
1461 vol->vals = &smb311_values;
1464 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1465 vol->vals = &smb3any_values;
1468 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1469 vol->vals = &smbdefault_values;
1472 cifs_dbg(VFS, "Unknown vers= option specified: %s\n", value);
1479 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1480 * fields with the result. Returns 0 on success and an error otherwise.
1483 cifs_parse_devname(const char *devname, struct smb_vol *vol)
1486 const char *delims = "/\\";
1489 /* make sure we have a valid UNC double delimiter prefix */
1490 len = strspn(devname, delims);
1494 /* find delimiter between host and sharename */
1495 pos = strpbrk(devname + 2, delims);
1499 /* skip past delimiter */
1502 /* now go until next delimiter or end of string */
1503 len = strcspn(pos, delims);
1505 /* move "pos" up to delimiter or NULL */
1507 vol->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
1511 convert_delimiter(vol->UNC, '\\');
1513 /* skip any delimiter */
1514 if (*pos == '/' || *pos == '\\')
1517 /* If pos is NULL then no prepath */
1521 vol->prepath = kstrdup(pos, GFP_KERNEL);
1529 cifs_parse_mount_options(const char *mountdata, const char *devname,
1530 struct smb_vol *vol, bool is_smb3)
1533 char *mountdata_copy = NULL, *options;
1534 unsigned int temp_len, i, j;
1536 short int override_uid = -1;
1537 short int override_gid = -1;
1538 bool uid_specified = false;
1539 bool gid_specified = false;
1540 bool sloppy = false;
1541 char *invalid = NULL;
1542 char *nodename = utsname()->nodename;
1543 char *string = NULL;
1544 char *tmp_end, *value;
1546 bool got_ip = false;
1547 bool got_version = false;
1548 unsigned short port = 0;
1549 struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1553 delim = separator[0];
1555 /* ensure we always start with zeroed-out smb_vol */
1556 memset(vol, 0, sizeof(*vol));
1559 * does not have to be perfect mapping since field is
1560 * informational, only used for servers that do not support
1561 * port 445 and it can be overridden at mount time
1563 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1564 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1565 vol->source_rfc1001_name[i] = toupper(nodename[i]);
1567 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1568 /* null target name indicates to use *SMBSERVR default called name
1569 if we end up sending RFC1001 session initialize */
1570 vol->target_rfc1001_name[0] = 0;
1571 vol->cred_uid = current_uid();
1572 vol->linux_uid = current_uid();
1573 vol->linux_gid = current_gid();
1576 * default to SFM style remapping of seven reserved characters
1577 * unless user overrides it or we negotiate CIFS POSIX where
1578 * it is unnecessary. Can not simultaneously use more than one mapping
1579 * since then readdir could list files that open could not open
1583 /* default to only allowing write access to owner of the mount */
1584 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1586 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1587 /* default is always to request posix paths. */
1588 vol->posix_paths = 1;
1589 /* default to using server inode numbers where available */
1590 vol->server_ino = 1;
1592 /* default is to use strict cifs caching semantics */
1593 vol->strict_io = true;
1595 vol->actimeo = CIFS_DEF_ACTIMEO;
1597 /* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1598 vol->ops = &smb30_operations;
1599 vol->vals = &smbdefault_values;
1601 vol->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1604 goto cifs_parse_mount_err;
1606 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1607 if (!mountdata_copy)
1608 goto cifs_parse_mount_err;
1610 options = mountdata_copy;
1611 end = options + strlen(options);
1613 if (strncmp(options, "sep=", 4) == 0) {
1614 if (options[4] != 0) {
1615 separator[0] = options[4];
1618 cifs_dbg(FYI, "Null separator not allowed\n");
1621 vol->backupuid_specified = false; /* no backup intent for a user */
1622 vol->backupgid_specified = false; /* no backup intent for a group */
1624 switch (cifs_parse_devname(devname, vol)) {
1628 cifs_dbg(VFS, "Unable to allocate memory for devname.\n");
1629 goto cifs_parse_mount_err;
1631 cifs_dbg(VFS, "Malformed UNC in devname.\n");
1632 goto cifs_parse_mount_err;
1634 cifs_dbg(VFS, "Unknown error parsing devname.\n");
1635 goto cifs_parse_mount_err;
1638 while ((data = strsep(&options, separator)) != NULL) {
1639 substring_t args[MAX_OPT_ARGS];
1640 unsigned long option;
1646 token = match_token(data, cifs_mount_option_tokens, args);
1650 /* Ingnore the following */
1654 /* Boolean values */
1655 case Opt_user_xattr:
1658 case Opt_nouser_xattr:
1664 case Opt_noforceuid:
1670 case Opt_noforcegid:
1673 case Opt_noblocksend:
1674 vol->noblocksnd = 1;
1676 case Opt_noautotune:
1677 vol->noautotune = 1;
1692 vol->sfu_remap = true;
1693 vol->remap = false; /* disable SFM mapping */
1695 case Opt_nomapchars:
1696 vol->sfu_remap = false;
1700 vol->sfu_remap = false; /* disable SFU mapping */
1702 case Opt_nomapposix:
1714 case Opt_posixpaths:
1715 vol->posix_paths = 1;
1717 case Opt_noposixpaths:
1718 vol->posix_paths = 0;
1723 "conflicting unix mount options\n");
1724 vol->no_linux_ext = 1;
1727 if (vol->no_linux_ext)
1729 "conflicting unix mount options\n");
1741 * turn off mandatory locking in mode
1742 * if remote locking is turned off since the
1743 * local vfs will do advisory
1745 if (vol->file_mode ==
1746 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1747 vol->file_mode = S_IALLUGO;
1749 case Opt_nohandlecache:
1750 vol->nohandlecache = 1;
1752 case Opt_handlecache:
1753 vol->nohandlecache = 0;
1755 case Opt_forcemandatorylock:
1764 case Opt_setuidfromacl:
1765 vol->setuidfromacl = 1;
1768 vol->dynperm = true;
1771 vol->dynperm = false;
1785 case Opt_nostrictsync:
1786 vol->nostrictsync = 1;
1788 case Opt_strictsync:
1789 vol->nostrictsync = 0;
1792 vol->server_ino = 1;
1794 case Opt_noserverino:
1795 vol->server_ino = 0;
1797 case Opt_rwpidforward:
1798 vol->rwpidforward = 1;
1807 vol->no_psx_acl = 0;
1810 vol->no_psx_acl = 1;
1812 case Opt_locallease:
1813 vol->local_lease = 1;
1819 /* we do not do the following in secFlags because seal
1820 * is a per tree connection (mount) not a per socket
1821 * or per-smb connection option in the protocol
1822 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1827 pr_warn("CIFS: Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1830 #ifndef CONFIG_CIFS_FSCACHE
1831 cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1832 goto cifs_parse_mount_err;
1836 case Opt_mfsymlinks:
1837 vol->mfsymlinks = true;
1840 vol->multiuser = true;
1845 case Opt_nosharesock:
1846 vol->nosharesock = true;
1848 case Opt_nopersistent:
1849 vol->nopersistent = true;
1850 if (vol->persistent) {
1852 "persistenthandles mount options conflict\n");
1853 goto cifs_parse_mount_err;
1856 case Opt_persistent:
1857 vol->persistent = true;
1858 if ((vol->nopersistent) || (vol->resilient)) {
1860 "persistenthandles mount options conflict\n");
1861 goto cifs_parse_mount_err;
1865 vol->resilient = true;
1866 if (vol->persistent) {
1868 "persistenthandles mount options conflict\n");
1869 goto cifs_parse_mount_err;
1872 case Opt_noresilient:
1873 vol->resilient = false; /* already the default */
1875 case Opt_domainauto:
1876 vol->domainauto = true;
1882 /* Numeric Values */
1884 if (get_option_uid(args, &vol->backupuid)) {
1885 cifs_dbg(VFS, "%s: Invalid backupuid value\n",
1887 goto cifs_parse_mount_err;
1889 vol->backupuid_specified = true;
1892 if (get_option_gid(args, &vol->backupgid)) {
1893 cifs_dbg(VFS, "%s: Invalid backupgid value\n",
1895 goto cifs_parse_mount_err;
1897 vol->backupgid_specified = true;
1900 if (get_option_uid(args, &vol->linux_uid)) {
1901 cifs_dbg(VFS, "%s: Invalid uid value\n",
1903 goto cifs_parse_mount_err;
1905 uid_specified = true;
1908 if (get_option_uid(args, &vol->cred_uid)) {
1909 cifs_dbg(VFS, "%s: Invalid cruid value\n",
1911 goto cifs_parse_mount_err;
1915 if (get_option_gid(args, &vol->linux_gid)) {
1916 cifs_dbg(VFS, "%s: Invalid gid value\n",
1918 goto cifs_parse_mount_err;
1920 gid_specified = true;
1923 if (get_option_ul(args, &option)) {
1924 cifs_dbg(VFS, "%s: Invalid file_mode value\n",
1926 goto cifs_parse_mount_err;
1928 vol->file_mode = option;
1931 if (get_option_ul(args, &option)) {
1932 cifs_dbg(VFS, "%s: Invalid dir_mode value\n",
1934 goto cifs_parse_mount_err;
1936 vol->dir_mode = option;
1939 if (get_option_ul(args, &option) ||
1940 option > USHRT_MAX) {
1941 cifs_dbg(VFS, "%s: Invalid port value\n",
1943 goto cifs_parse_mount_err;
1945 port = (unsigned short)option;
1948 if (get_option_ul(args, &option)) {
1949 cifs_dbg(VFS, "%s: Invalid rsize value\n",
1951 goto cifs_parse_mount_err;
1953 vol->rsize = option;
1956 if (get_option_ul(args, &option)) {
1957 cifs_dbg(VFS, "%s: Invalid wsize value\n",
1959 goto cifs_parse_mount_err;
1961 vol->wsize = option;
1964 if (get_option_ul(args, &option)) {
1965 cifs_dbg(VFS, "%s: Invalid actimeo value\n",
1967 goto cifs_parse_mount_err;
1969 vol->actimeo = HZ * option;
1970 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
1971 cifs_dbg(VFS, "attribute cache timeout too large\n");
1972 goto cifs_parse_mount_err;
1975 case Opt_echo_interval:
1976 if (get_option_ul(args, &option)) {
1977 cifs_dbg(VFS, "%s: Invalid echo interval value\n",
1979 goto cifs_parse_mount_err;
1981 vol->echo_interval = option;
1984 if (get_option_ul(args, &option)) {
1985 cifs_dbg(VFS, "%s: Invalid snapshot time\n",
1987 goto cifs_parse_mount_err;
1989 vol->snapshot_time = option;
1991 case Opt_max_credits:
1992 if (get_option_ul(args, &option) || (option < 20) ||
1994 cifs_dbg(VFS, "%s: Invalid max_credits value\n",
1996 goto cifs_parse_mount_err;
1998 vol->max_credits = option;
2001 /* String Arguments */
2003 case Opt_blank_user:
2004 /* null user, ie. anonymous authentication */
2006 vol->username = NULL;
2009 string = match_strdup(args);
2013 if (strnlen(string, CIFS_MAX_USERNAME_LEN) >
2014 CIFS_MAX_USERNAME_LEN) {
2015 pr_warn("CIFS: username too long\n");
2016 goto cifs_parse_mount_err;
2019 kfree(vol->username);
2020 vol->username = kstrdup(string, GFP_KERNEL);
2022 goto cifs_parse_mount_err;
2024 case Opt_blank_pass:
2025 /* passwords have to be handled differently
2026 * to allow the character used for deliminator
2027 * to be passed within them
2031 * Check if this is a case where the password
2032 * starts with a delimiter
2034 tmp_end = strchr(data, '=');
2036 if (!(tmp_end < end && tmp_end[1] == delim)) {
2037 /* No it is not. Set the password to NULL */
2038 kzfree(vol->password);
2039 vol->password = NULL;
2042 /* Fallthrough - to Opt_pass below.*/
2044 /* Obtain the value string */
2045 value = strchr(data, '=');
2048 /* Set tmp_end to end of the string */
2049 tmp_end = (char *) value + strlen(value);
2051 /* Check if following character is the deliminator
2052 * If yes, we have encountered a double deliminator
2053 * reset the NULL character to the deliminator
2055 if (tmp_end < end && tmp_end[1] == delim) {
2058 /* Keep iterating until we get to a single
2059 * deliminator OR the end
2061 while ((tmp_end = strchr(tmp_end, delim))
2062 != NULL && (tmp_end[1] == delim)) {
2063 tmp_end = (char *) &tmp_end[2];
2066 /* Reset var options to point to next element */
2069 options = (char *) &tmp_end[1];
2071 /* Reached the end of the mount option
2076 kzfree(vol->password);
2077 /* Now build new password string */
2078 temp_len = strlen(value);
2079 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
2080 if (vol->password == NULL) {
2081 pr_warn("CIFS: no memory for password\n");
2082 goto cifs_parse_mount_err;
2085 for (i = 0, j = 0; i < temp_len; i++, j++) {
2086 vol->password[j] = value[i];
2087 if ((value[i] == delim) &&
2088 value[i+1] == delim)
2089 /* skip the second deliminator */
2092 vol->password[j] = '\0';
2095 /* FIXME: should this be an error instead? */
2099 string = match_strdup(args);
2103 if (!cifs_convert_address(dstaddr, string,
2105 pr_err("CIFS: bad ip= option (%s).\n", string);
2106 goto cifs_parse_mount_err;
2111 string = match_strdup(args);
2115 if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
2116 == CIFS_MAX_DOMAINNAME_LEN) {
2117 pr_warn("CIFS: domain name too long\n");
2118 goto cifs_parse_mount_err;
2121 kfree(vol->domainname);
2122 vol->domainname = kstrdup(string, GFP_KERNEL);
2123 if (!vol->domainname) {
2124 pr_warn("CIFS: no memory for domainname\n");
2125 goto cifs_parse_mount_err;
2127 cifs_dbg(FYI, "Domain name set\n");
2130 string = match_strdup(args);
2134 if (!cifs_convert_address(
2135 (struct sockaddr *)&vol->srcaddr,
2136 string, strlen(string))) {
2137 pr_warn("CIFS: Could not parse srcaddr: %s\n",
2139 goto cifs_parse_mount_err;
2143 string = match_strdup(args);
2147 if (strnlen(string, 1024) >= 65) {
2148 pr_warn("CIFS: iocharset name too long.\n");
2149 goto cifs_parse_mount_err;
2152 if (strncasecmp(string, "default", 7) != 0) {
2153 kfree(vol->iocharset);
2154 vol->iocharset = kstrdup(string,
2156 if (!vol->iocharset) {
2157 pr_warn("CIFS: no memory for charset\n");
2158 goto cifs_parse_mount_err;
2161 /* if iocharset not set then load_nls_default
2164 cifs_dbg(FYI, "iocharset set to %s\n", string);
2166 case Opt_netbiosname:
2167 string = match_strdup(args);
2171 memset(vol->source_rfc1001_name, 0x20,
2174 * FIXME: are there cases in which a comma can
2175 * be valid in workstation netbios name (and
2176 * need special handling)?
2178 for (i = 0; i < RFC1001_NAME_LEN; i++) {
2179 /* don't ucase netbiosname for user */
2182 vol->source_rfc1001_name[i] = string[i];
2184 /* The string has 16th byte zero still from
2185 * set at top of the function
2187 if (i == RFC1001_NAME_LEN && string[i] != 0)
2188 pr_warn("CIFS: netbiosname longer than 15 truncated.\n");
2191 /* servernetbiosname specified override *SMBSERVER */
2192 string = match_strdup(args);
2196 /* last byte, type, is 0x20 for servr type */
2197 memset(vol->target_rfc1001_name, 0x20,
2198 RFC1001_NAME_LEN_WITH_NULL);
2200 /* BB are there cases in which a comma can be
2201 valid in this workstation netbios name
2202 (and need special handling)? */
2204 /* user or mount helper must uppercase the
2206 for (i = 0; i < 15; i++) {
2209 vol->target_rfc1001_name[i] = string[i];
2211 /* The string has 16th byte zero still from
2212 set at top of the function */
2213 if (i == RFC1001_NAME_LEN && string[i] != 0)
2214 pr_warn("CIFS: server netbiosname longer than 15 truncated.\n");
2217 /* version of mount userspace tools, not dialect */
2218 string = match_strdup(args);
2222 /* If interface changes in mount.cifs bump to new ver */
2223 if (strncasecmp(string, "1", 1) == 0) {
2224 if (strlen(string) > 1) {
2225 pr_warn("Bad mount helper ver=%s. Did "
2226 "you want SMB1 (CIFS) dialect "
2227 "and mean to type vers=1.0 "
2228 "instead?\n", string);
2229 goto cifs_parse_mount_err;
2231 /* This is the default */
2234 /* For all other value, error */
2235 pr_warn("CIFS: Invalid mount helper version specified\n");
2236 goto cifs_parse_mount_err;
2238 /* protocol version (dialect) */
2239 string = match_strdup(args);
2243 if (cifs_parse_smb_version(string, vol, is_smb3) != 0)
2244 goto cifs_parse_mount_err;
2248 string = match_strdup(args);
2252 if (cifs_parse_security_flavors(string, vol) != 0)
2253 goto cifs_parse_mount_err;
2256 string = match_strdup(args);
2260 if (cifs_parse_cache_flavor(string, vol) != 0)
2261 goto cifs_parse_mount_err;
2265 * An option we don't recognize. Save it off for later
2266 * if we haven't already found one
2272 /* Free up any allocated string */
2277 if (!sloppy && invalid) {
2278 pr_err("CIFS: Unknown mount option \"%s\"\n", invalid);
2279 goto cifs_parse_mount_err;
2282 if (vol->rdma && vol->vals->protocol_id < SMB30_PROT_ID) {
2283 cifs_dbg(VFS, "SMB Direct requires Version >=3.0\n");
2284 goto cifs_parse_mount_err;
2288 /* Muliuser mounts require CONFIG_KEYS support */
2289 if (vol->multiuser) {
2290 cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
2291 goto cifs_parse_mount_err;
2295 cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
2296 goto cifs_parse_mount_err;
2299 /* make sure UNC has a share name */
2300 if (!strchr(vol->UNC + 3, '\\')) {
2301 cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
2302 goto cifs_parse_mount_err;
2309 /* No ip= option specified? Try to get it from UNC */
2310 /* Use the address part of the UNC. */
2311 slash = strchr(&vol->UNC[2], '\\');
2312 len = slash - &vol->UNC[2];
2313 if (!cifs_convert_address(dstaddr, &vol->UNC[2], len)) {
2314 pr_err("Unable to determine destination address.\n");
2315 goto cifs_parse_mount_err;
2319 /* set the port that we got earlier */
2320 cifs_set_port(dstaddr, port);
2323 vol->override_uid = override_uid;
2324 else if (override_uid == 1)
2325 pr_notice("CIFS: ignoring forceuid mount option specified with no uid= option.\n");
2328 vol->override_gid = override_gid;
2329 else if (override_gid == 1)
2330 pr_notice("CIFS: ignoring forcegid mount option specified with no gid= option.\n");
2332 if (got_version == false)
2333 pr_warn("No dialect specified on mount. Default has changed to "
2334 "a more secure dialect, SMB2.1 or later (e.g. SMB3), from CIFS "
2335 "(SMB1). To use the less secure SMB1 dialect to access "
2336 "old servers which do not support SMB3 (or SMB2.1) specify vers=1.0"
2339 kfree(mountdata_copy);
2343 pr_warn("Could not allocate temporary buffer\n");
2344 cifs_parse_mount_err:
2346 kfree(mountdata_copy);
2350 /** Returns true if srcaddr isn't specified and rhs isn't
2351 * specified, or if srcaddr is specified and
2352 * matches the IP address of the rhs argument.
2355 srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
2357 switch (srcaddr->sa_family) {
2359 return (rhs->sa_family == AF_UNSPEC);
2361 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
2362 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
2363 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
2366 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
2367 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
2368 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
2372 return false; /* don't expect to be here */
2377 * If no port is specified in addr structure, we try to match with 445 port
2378 * and if it fails - with 139 ports. It should be called only if address
2379 * families of server and addr are equal.
2382 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
2384 __be16 port, *sport;
2386 switch (addr->sa_family) {
2388 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
2389 port = ((struct sockaddr_in *) addr)->sin_port;
2392 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
2393 port = ((struct sockaddr_in6 *) addr)->sin6_port;
2401 port = htons(CIFS_PORT);
2405 port = htons(RFC1001_PORT);
2408 return port == *sport;
2412 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
2413 struct sockaddr *srcaddr)
2415 switch (addr->sa_family) {
2417 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
2418 struct sockaddr_in *srv_addr4 =
2419 (struct sockaddr_in *)&server->dstaddr;
2421 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
2426 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
2427 struct sockaddr_in6 *srv_addr6 =
2428 (struct sockaddr_in6 *)&server->dstaddr;
2430 if (!ipv6_addr_equal(&addr6->sin6_addr,
2431 &srv_addr6->sin6_addr))
2433 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
2439 return false; /* don't expect to be here */
2442 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
2449 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2452 * The select_sectype function should either return the vol->sectype
2453 * that was specified, or "Unspecified" if that sectype was not
2454 * compatible with the given NEGOTIATE request.
2456 if (server->ops->select_sectype(server, vol->sectype)
2461 * Now check if signing mode is acceptable. No need to check
2462 * global_secflags at this point since if MUST_SIGN is set then
2463 * the server->sign had better be too.
2465 if (vol->sign && !server->sign)
2471 static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
2473 struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2475 if (vol->nosharesock)
2478 /* BB update this for smb3any and default case */
2479 if ((server->vals != vol->vals) || (server->ops != vol->ops))
2482 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2485 if (!match_address(server, addr,
2486 (struct sockaddr *)&vol->srcaddr))
2489 if (!match_port(server, addr))
2492 if (!match_security(server, vol))
2495 if (server->echo_interval != vol->echo_interval * HZ)
2498 if (server->rdma != vol->rdma)
2504 struct TCP_Server_Info *
2505 cifs_find_tcp_session(struct smb_vol *vol)
2507 struct TCP_Server_Info *server;
2509 spin_lock(&cifs_tcp_ses_lock);
2510 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
2511 if (!match_server(server, vol))
2514 ++server->srv_count;
2515 spin_unlock(&cifs_tcp_ses_lock);
2516 cifs_dbg(FYI, "Existing tcp session with server found\n");
2519 spin_unlock(&cifs_tcp_ses_lock);
2524 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
2526 struct task_struct *task;
2528 spin_lock(&cifs_tcp_ses_lock);
2529 if (--server->srv_count > 0) {
2530 spin_unlock(&cifs_tcp_ses_lock);
2534 put_net(cifs_net_ns(server));
2536 list_del_init(&server->tcp_ses_list);
2537 spin_unlock(&cifs_tcp_ses_lock);
2539 cancel_delayed_work_sync(&server->echo);
2543 * Avoid deadlock here: reconnect work calls
2544 * cifs_put_tcp_session() at its end. Need to be sure
2545 * that reconnect work does nothing with server pointer after
2548 cancel_delayed_work(&server->reconnect);
2550 cancel_delayed_work_sync(&server->reconnect);
2552 spin_lock(&GlobalMid_Lock);
2553 server->tcpStatus = CifsExiting;
2554 spin_unlock(&GlobalMid_Lock);
2556 cifs_crypto_secmech_release(server);
2557 cifs_fscache_release_client_cookie(server);
2559 kfree(server->session_key.response);
2560 server->session_key.response = NULL;
2561 server->session_key.len = 0;
2563 task = xchg(&server->tsk, NULL);
2565 force_sig(SIGKILL, task);
2568 static struct TCP_Server_Info *
2569 cifs_get_tcp_session(struct smb_vol *volume_info)
2571 struct TCP_Server_Info *tcp_ses = NULL;
2574 cifs_dbg(FYI, "UNC: %s\n", volume_info->UNC);
2576 /* see if we already have a matching tcp_ses */
2577 tcp_ses = cifs_find_tcp_session(volume_info);
2581 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2587 tcp_ses->ops = volume_info->ops;
2588 tcp_ses->vals = volume_info->vals;
2589 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2590 tcp_ses->hostname = extract_hostname(volume_info->UNC);
2591 if (IS_ERR(tcp_ses->hostname)) {
2592 rc = PTR_ERR(tcp_ses->hostname);
2593 goto out_err_crypto_release;
2596 tcp_ses->noblocksnd = volume_info->noblocksnd;
2597 tcp_ses->noautotune = volume_info->noautotune;
2598 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2599 tcp_ses->rdma = volume_info->rdma;
2600 tcp_ses->in_flight = 0;
2601 tcp_ses->credits = 1;
2602 init_waitqueue_head(&tcp_ses->response_q);
2603 init_waitqueue_head(&tcp_ses->request_q);
2604 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2605 mutex_init(&tcp_ses->srv_mutex);
2606 memcpy(tcp_ses->workstation_RFC1001_name,
2607 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2608 memcpy(tcp_ses->server_RFC1001_name,
2609 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2610 tcp_ses->session_estab = false;
2611 tcp_ses->sequence_number = 0;
2612 tcp_ses->reconnect_instance = 0;
2613 tcp_ses->lstrp = jiffies;
2614 spin_lock_init(&tcp_ses->req_lock);
2615 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2616 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2617 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2618 INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
2619 mutex_init(&tcp_ses->reconnect_mutex);
2620 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2621 sizeof(tcp_ses->srcaddr));
2622 memcpy(&tcp_ses->dstaddr, &volume_info->dstaddr,
2623 sizeof(tcp_ses->dstaddr));
2624 generate_random_uuid(tcp_ses->client_guid);
2626 * at this point we are the only ones with the pointer
2627 * to the struct since the kernel thread not created yet
2628 * no need to spinlock this init of tcpStatus or srv_count
2630 tcp_ses->tcpStatus = CifsNew;
2631 ++tcp_ses->srv_count;
2633 if (volume_info->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
2634 volume_info->echo_interval <= SMB_ECHO_INTERVAL_MAX)
2635 tcp_ses->echo_interval = volume_info->echo_interval * HZ;
2637 tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
2638 if (tcp_ses->rdma) {
2639 #ifndef CONFIG_CIFS_SMB_DIRECT
2640 cifs_dbg(VFS, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
2642 goto out_err_crypto_release;
2644 tcp_ses->smbd_conn = smbd_get_connection(
2645 tcp_ses, (struct sockaddr *)&volume_info->dstaddr);
2646 if (tcp_ses->smbd_conn) {
2647 cifs_dbg(VFS, "RDMA transport established\n");
2649 goto smbd_connected;
2652 goto out_err_crypto_release;
2655 rc = ip_connect(tcp_ses);
2657 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
2658 goto out_err_crypto_release;
2662 * since we're in a cifs function already, we know that
2663 * this will succeed. No need for try_module_get().
2665 __module_get(THIS_MODULE);
2666 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2668 if (IS_ERR(tcp_ses->tsk)) {
2669 rc = PTR_ERR(tcp_ses->tsk);
2670 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
2671 module_put(THIS_MODULE);
2672 goto out_err_crypto_release;
2674 tcp_ses->tcpStatus = CifsNeedNegotiate;
2676 tcp_ses->nr_targets = 1;
2678 /* thread spawned, put it on the list */
2679 spin_lock(&cifs_tcp_ses_lock);
2680 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2681 spin_unlock(&cifs_tcp_ses_lock);
2683 cifs_fscache_get_client_cookie(tcp_ses);
2685 /* queue echo request delayed work */
2686 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
2690 out_err_crypto_release:
2691 cifs_crypto_secmech_release(tcp_ses);
2693 put_net(cifs_net_ns(tcp_ses));
2697 if (!IS_ERR(tcp_ses->hostname))
2698 kfree(tcp_ses->hostname);
2699 if (tcp_ses->ssocket)
2700 sock_release(tcp_ses->ssocket);
2706 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2708 if (vol->sectype != Unspecified &&
2709 vol->sectype != ses->sectype)
2712 switch (ses->sectype) {
2714 if (!uid_eq(vol->cred_uid, ses->cred_uid))
2718 /* NULL username means anonymous session */
2719 if (ses->user_name == NULL) {
2725 /* anything else takes username/password */
2726 if (strncmp(ses->user_name,
2727 vol->username ? vol->username : "",
2728 CIFS_MAX_USERNAME_LEN))
2730 if ((vol->username && strlen(vol->username) != 0) &&
2731 ses->password != NULL &&
2732 strncmp(ses->password,
2733 vol->password ? vol->password : "",
2734 CIFS_MAX_PASSWORD_LEN))
2741 * cifs_setup_ipc - helper to setup the IPC tcon for the session
2743 * A new IPC connection is made and stored in the session
2744 * tcon_ipc. The IPC tcon has the same lifetime as the session.
2747 cifs_setup_ipc(struct cifs_ses *ses, struct smb_vol *volume_info)
2750 struct cifs_tcon *tcon;
2751 struct nls_table *nls_codepage;
2752 char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0};
2756 * If the mount request that resulted in the creation of the
2757 * session requires encryption, force IPC to be encrypted too.
2759 if (volume_info->seal) {
2760 if (ses->server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
2764 "IPC: server doesn't support encryption\n");
2769 tcon = tconInfoAlloc();
2773 snprintf(unc, sizeof(unc), "\\\\%s\\IPC$", ses->server->hostname);
2776 nls_codepage = load_nls_default();
2782 rc = ses->server->ops->tree_connect(xid, ses, unc, tcon, nls_codepage);
2786 cifs_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
2791 cifs_dbg(FYI, "IPC tcon rc = %d ipc tid = %d\n", rc, tcon->tid);
2793 ses->tcon_ipc = tcon;
2795 unload_nls(nls_codepage);
2800 * cifs_free_ipc - helper to release the session IPC tcon
2802 * Needs to be called everytime a session is destroyed
2805 cifs_free_ipc(struct cifs_ses *ses)
2808 struct cifs_tcon *tcon = ses->tcon_ipc;
2813 if (ses->server->ops->tree_disconnect) {
2815 rc = ses->server->ops->tree_disconnect(xid, tcon);
2820 cifs_dbg(FYI, "failed to disconnect IPC tcon (rc=%d)\n", rc);
2823 ses->tcon_ipc = NULL;
2827 static struct cifs_ses *
2828 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
2830 struct cifs_ses *ses;
2832 spin_lock(&cifs_tcp_ses_lock);
2833 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
2834 if (ses->status == CifsExiting)
2836 if (!match_session(ses, vol))
2839 spin_unlock(&cifs_tcp_ses_lock);
2842 spin_unlock(&cifs_tcp_ses_lock);
2847 cifs_put_smb_ses(struct cifs_ses *ses)
2849 unsigned int rc, xid;
2850 struct TCP_Server_Info *server = ses->server;
2852 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
2854 spin_lock(&cifs_tcp_ses_lock);
2855 if (ses->status == CifsExiting) {
2856 spin_unlock(&cifs_tcp_ses_lock);
2859 if (--ses->ses_count > 0) {
2860 spin_unlock(&cifs_tcp_ses_lock);
2863 if (ses->status == CifsGood)
2864 ses->status = CifsExiting;
2865 spin_unlock(&cifs_tcp_ses_lock);
2869 if (ses->status == CifsExiting && server->ops->logoff) {
2871 rc = server->ops->logoff(xid, ses);
2873 cifs_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
2878 spin_lock(&cifs_tcp_ses_lock);
2879 list_del_init(&ses->smb_ses_list);
2880 spin_unlock(&cifs_tcp_ses_lock);
2883 cifs_put_tcp_session(server, 0);
2888 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
2889 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
2891 /* Populate username and pw fields from keyring if possible */
2893 cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
2896 const char *delim, *payload;
2900 struct TCP_Server_Info *server = ses->server;
2901 struct sockaddr_in *sa;
2902 struct sockaddr_in6 *sa6;
2903 const struct user_key_payload *upayload;
2905 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
2909 /* try to find an address key first */
2910 switch (server->dstaddr.ss_family) {
2912 sa = (struct sockaddr_in *)&server->dstaddr;
2913 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
2916 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
2917 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
2920 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
2921 server->dstaddr.ss_family);
2926 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2927 key = request_key(&key_type_logon, desc, "");
2929 if (!ses->domainName) {
2930 cifs_dbg(FYI, "domainName is NULL\n");
2935 /* didn't work, try to find a domain key */
2936 sprintf(desc, "cifs:d:%s", ses->domainName);
2937 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2938 key = request_key(&key_type_logon, desc, "");
2945 down_read(&key->sem);
2946 upayload = user_key_payload_locked(key);
2947 if (IS_ERR_OR_NULL(upayload)) {
2948 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
2952 /* find first : in payload */
2953 payload = upayload->data;
2954 delim = strnchr(payload, upayload->datalen, ':');
2955 cifs_dbg(FYI, "payload=%s\n", payload);
2957 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
2963 len = delim - payload;
2964 if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
2965 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
2971 vol->username = kstrndup(payload, len, GFP_KERNEL);
2972 if (!vol->username) {
2973 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
2978 cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
2980 len = key->datalen - (len + 1);
2981 if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
2982 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
2984 kfree(vol->username);
2985 vol->username = NULL;
2990 vol->password = kstrndup(delim, len, GFP_KERNEL);
2991 if (!vol->password) {
2992 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
2995 kfree(vol->username);
2996 vol->username = NULL;
3005 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
3008 #else /* ! CONFIG_KEYS */
3010 cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
3011 struct cifs_ses *ses __attribute__((unused)))
3015 #endif /* CONFIG_KEYS */
3018 * cifs_get_smb_ses - get a session matching @volume_info data from @server
3020 * This function assumes it is being called from cifs_mount() where we
3021 * already got a server reference (server refcount +1). See
3022 * cifs_get_tcon() for refcount explanations.
3024 static struct cifs_ses *
3025 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
3029 struct cifs_ses *ses;
3030 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3031 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3035 ses = cifs_find_smb_ses(server, volume_info);
3037 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
3040 mutex_lock(&ses->session_mutex);
3041 rc = cifs_negotiate_protocol(xid, ses);
3043 mutex_unlock(&ses->session_mutex);
3044 /* problem -- put our ses reference */
3045 cifs_put_smb_ses(ses);
3049 if (ses->need_reconnect) {
3050 cifs_dbg(FYI, "Session needs reconnect\n");
3051 rc = cifs_setup_session(xid, ses,
3052 volume_info->local_nls);
3054 mutex_unlock(&ses->session_mutex);
3055 /* problem -- put our reference */
3056 cifs_put_smb_ses(ses);
3061 mutex_unlock(&ses->session_mutex);
3063 /* existing SMB ses has a server reference already */
3064 cifs_put_tcp_session(server, 0);
3069 cifs_dbg(FYI, "Existing smb sess not found\n");
3070 ses = sesInfoAlloc();
3074 /* new SMB session uses our server ref */
3075 ses->server = server;
3076 if (server->dstaddr.ss_family == AF_INET6)
3077 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
3079 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
3081 if (volume_info->username) {
3082 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
3083 if (!ses->user_name)
3087 /* volume_info->password freed at unmount */
3088 if (volume_info->password) {
3089 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
3093 if (volume_info->domainname) {
3094 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
3095 if (!ses->domainName)
3098 if (volume_info->domainauto)
3099 ses->domainAuto = volume_info->domainauto;
3100 ses->cred_uid = volume_info->cred_uid;
3101 ses->linux_uid = volume_info->linux_uid;
3103 ses->sectype = volume_info->sectype;
3104 ses->sign = volume_info->sign;
3106 mutex_lock(&ses->session_mutex);
3107 rc = cifs_negotiate_protocol(xid, ses);
3109 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
3110 mutex_unlock(&ses->session_mutex);
3114 /* success, put it on the list */
3115 spin_lock(&cifs_tcp_ses_lock);
3116 list_add(&ses->smb_ses_list, &server->smb_ses_list);
3117 spin_unlock(&cifs_tcp_ses_lock);
3121 cifs_setup_ipc(ses, volume_info);
3131 static int match_tcon(struct cifs_tcon *tcon, struct smb_vol *volume_info)
3133 if (tcon->tidStatus == CifsExiting)
3135 if (strncmp(tcon->treeName, volume_info->UNC, MAX_TREE_SIZE))
3137 if (tcon->seal != volume_info->seal)
3139 if (tcon->snapshot_time != volume_info->snapshot_time)
3144 static struct cifs_tcon *
3145 cifs_find_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3147 struct list_head *tmp;
3148 struct cifs_tcon *tcon;
3150 spin_lock(&cifs_tcp_ses_lock);
3151 list_for_each(tmp, &ses->tcon_list) {
3152 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
3153 if (!match_tcon(tcon, volume_info))
3156 spin_unlock(&cifs_tcp_ses_lock);
3159 spin_unlock(&cifs_tcp_ses_lock);
3164 cifs_put_tcon(struct cifs_tcon *tcon)
3167 struct cifs_ses *ses;
3170 * IPC tcon share the lifetime of their session and are
3171 * destroyed in the session put function
3173 if (tcon == NULL || tcon->ipc)
3177 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
3178 spin_lock(&cifs_tcp_ses_lock);
3179 if (--tcon->tc_count > 0) {
3180 spin_unlock(&cifs_tcp_ses_lock);
3184 list_del_init(&tcon->tcon_list);
3185 spin_unlock(&cifs_tcp_ses_lock);
3188 if (ses->server->ops->tree_disconnect)
3189 ses->server->ops->tree_disconnect(xid, tcon);
3192 cifs_fscache_release_super_cookie(tcon);
3194 cifs_put_smb_ses(ses);
3198 * cifs_get_tcon - get a tcon matching @volume_info data from @ses
3200 * - tcon refcount is the number of mount points using the tcon.
3201 * - ses refcount is the number of tcon using the session.
3203 * 1. This function assumes it is being called from cifs_mount() where
3204 * we already got a session reference (ses refcount +1).
3206 * 2. Since we're in the context of adding a mount point, the end
3207 * result should be either:
3209 * a) a new tcon already allocated with refcount=1 (1 mount point) and
3210 * its session refcount incremented (1 new tcon). This +1 was
3211 * already done in (1).
3213 * b) an existing tcon with refcount+1 (add a mount point to it) and
3214 * identical ses refcount (no new tcon). Because of (1) we need to
3215 * decrement the ses refcount.
3217 static struct cifs_tcon *
3218 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3221 struct cifs_tcon *tcon;
3223 tcon = cifs_find_tcon(ses, volume_info);
3226 * tcon has refcount already incremented but we need to
3227 * decrement extra ses reference gotten by caller (case b)
3229 cifs_dbg(FYI, "Found match on UNC path\n");
3230 cifs_put_smb_ses(ses);
3234 if (!ses->server->ops->tree_connect) {
3239 tcon = tconInfoAlloc();
3245 if (volume_info->snapshot_time) {
3246 if (ses->server->vals->protocol_id == 0) {
3248 "Use SMB2 or later for snapshot mount option\n");
3252 tcon->snapshot_time = volume_info->snapshot_time;
3256 if (volume_info->password) {
3257 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
3258 if (!tcon->password) {
3264 if (volume_info->seal) {
3265 if (ses->server->vals->protocol_id == 0) {
3267 "SMB3 or later required for encryption\n");
3270 } else if (tcon->ses->server->capabilities &
3271 SMB2_GLOBAL_CAP_ENCRYPTION)
3274 cifs_dbg(VFS, "Encryption is not supported on share\n");
3280 if (volume_info->linux_ext) {
3281 if (ses->server->posix_ext_supported) {
3282 tcon->posix_extensions = true;
3283 printk_once(KERN_WARNING
3284 "SMB3.11 POSIX Extensions are experimental\n");
3286 cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions.\n");
3293 * BB Do we need to wrap session_mutex around this TCon call and Unix
3294 * SetFS as we do on SessSetup and reconnect?
3297 rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
3298 volume_info->local_nls);
3300 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
3304 tcon->use_persistent = false;
3305 /* check if SMB2 or later, CIFS does not support persistent handles */
3306 if (volume_info->persistent) {
3307 if (ses->server->vals->protocol_id == 0) {
3309 "SMB3 or later required for persistent handles\n");
3312 } else if (ses->server->capabilities &
3313 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3314 tcon->use_persistent = true;
3315 else /* persistent handles requested but not supported */ {
3317 "Persistent handles not supported on share\n");
3321 } else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
3322 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3323 && (volume_info->nopersistent == false)) {
3324 cifs_dbg(FYI, "enabling persistent handles\n");
3325 tcon->use_persistent = true;
3326 } else if (volume_info->resilient) {
3327 if (ses->server->vals->protocol_id == 0) {
3329 "SMB2.1 or later required for resilient handles\n");
3333 tcon->use_resilient = true;
3337 * We can have only one retry value for a connection to a share so for
3338 * resources mounted more than once to the same server share the last
3339 * value passed in for the retry flag is used.
3341 tcon->retry = volume_info->retry;
3342 tcon->nocase = volume_info->nocase;
3343 tcon->nohandlecache = volume_info->nohandlecache;
3344 tcon->local_lease = volume_info->local_lease;
3345 INIT_LIST_HEAD(&tcon->pending_opens);
3347 spin_lock(&cifs_tcp_ses_lock);
3348 list_add(&tcon->tcon_list, &ses->tcon_list);
3349 spin_unlock(&cifs_tcp_ses_lock);
3351 cifs_fscache_get_super_cookie(tcon);
3361 cifs_put_tlink(struct tcon_link *tlink)
3363 if (!tlink || IS_ERR(tlink))
3366 if (!atomic_dec_and_test(&tlink->tl_count) ||
3367 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
3368 tlink->tl_time = jiffies;
3372 if (!IS_ERR(tlink_tcon(tlink)))
3373 cifs_put_tcon(tlink_tcon(tlink));
3379 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3381 struct cifs_sb_info *old = CIFS_SB(sb);
3382 struct cifs_sb_info *new = mnt_data->cifs_sb;
3384 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
3387 if ((old->mnt_cifs_flags & CIFS_MOUNT_MASK) !=
3388 (new->mnt_cifs_flags & CIFS_MOUNT_MASK))
3392 * We want to share sb only if we don't specify an r/wsize or
3393 * specified r/wsize is greater than or equal to existing one.
3395 if (new->wsize && new->wsize < old->wsize)
3398 if (new->rsize && new->rsize < old->rsize)
3401 if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))
3404 if (old->mnt_file_mode != new->mnt_file_mode ||
3405 old->mnt_dir_mode != new->mnt_dir_mode)
3408 if (strcmp(old->local_nls->charset, new->local_nls->charset))
3411 if (old->actimeo != new->actimeo)
3418 match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3420 struct cifs_sb_info *old = CIFS_SB(sb);
3421 struct cifs_sb_info *new = mnt_data->cifs_sb;
3422 bool old_set = old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH;
3423 bool new_set = new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH;
3425 if (old_set && new_set && !strcmp(new->prepath, old->prepath))
3427 else if (!old_set && !new_set)
3434 cifs_match_super(struct super_block *sb, void *data)
3436 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
3437 struct smb_vol *volume_info;
3438 struct cifs_sb_info *cifs_sb;
3439 struct TCP_Server_Info *tcp_srv;
3440 struct cifs_ses *ses;
3441 struct cifs_tcon *tcon;
3442 struct tcon_link *tlink;
3445 spin_lock(&cifs_tcp_ses_lock);
3446 cifs_sb = CIFS_SB(sb);
3447 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3448 if (IS_ERR(tlink)) {
3449 spin_unlock(&cifs_tcp_ses_lock);
3452 tcon = tlink_tcon(tlink);
3454 tcp_srv = ses->server;
3456 volume_info = mnt_data->vol;
3458 if (!match_server(tcp_srv, volume_info) ||
3459 !match_session(ses, volume_info) ||
3460 !match_tcon(tcon, volume_info) ||
3461 !match_prepath(sb, mnt_data)) {
3466 rc = compare_mount_options(sb, mnt_data);
3468 spin_unlock(&cifs_tcp_ses_lock);
3469 cifs_put_tlink(tlink);
3473 #ifdef CONFIG_DEBUG_LOCK_ALLOC
3474 static struct lock_class_key cifs_key[2];
3475 static struct lock_class_key cifs_slock_key[2];
3478 cifs_reclassify_socket4(struct socket *sock)
3480 struct sock *sk = sock->sk;
3481 BUG_ON(!sock_allow_reclassification(sk));
3482 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
3483 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
3487 cifs_reclassify_socket6(struct socket *sock)
3489 struct sock *sk = sock->sk;
3490 BUG_ON(!sock_allow_reclassification(sk));
3491 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
3492 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
3496 cifs_reclassify_socket4(struct socket *sock)
3501 cifs_reclassify_socket6(struct socket *sock)
3506 /* See RFC1001 section 14 on representation of Netbios names */
3507 static void rfc1002mangle(char *target, char *source, unsigned int length)
3511 for (i = 0, j = 0; i < (length); i++) {
3512 /* mask a nibble at a time and encode */
3513 target[j] = 'A' + (0x0F & (source[i] >> 4));
3514 target[j+1] = 'A' + (0x0F & source[i]);
3521 bind_socket(struct TCP_Server_Info *server)
3524 if (server->srcaddr.ss_family != AF_UNSPEC) {
3525 /* Bind to the specified local IP address */
3526 struct socket *socket = server->ssocket;
3527 rc = socket->ops->bind(socket,
3528 (struct sockaddr *) &server->srcaddr,
3529 sizeof(server->srcaddr));
3531 struct sockaddr_in *saddr4;
3532 struct sockaddr_in6 *saddr6;
3533 saddr4 = (struct sockaddr_in *)&server->srcaddr;
3534 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
3535 if (saddr6->sin6_family == AF_INET6)
3536 cifs_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
3537 &saddr6->sin6_addr, rc);
3539 cifs_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
3540 &saddr4->sin_addr.s_addr, rc);
3547 ip_rfc1001_connect(struct TCP_Server_Info *server)
3551 * some servers require RFC1001 sessinit before sending
3552 * negprot - BB check reconnection in case where second
3553 * sessinit is sent but no second negprot
3555 struct rfc1002_session_packet *ses_init_buf;
3556 struct smb_hdr *smb_buf;
3557 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
3560 ses_init_buf->trailer.session_req.called_len = 32;
3562 if (server->server_RFC1001_name[0] != 0)
3563 rfc1002mangle(ses_init_buf->trailer.
3564 session_req.called_name,
3565 server->server_RFC1001_name,
3566 RFC1001_NAME_LEN_WITH_NULL);
3568 rfc1002mangle(ses_init_buf->trailer.
3569 session_req.called_name,
3570 DEFAULT_CIFS_CALLED_NAME,
3571 RFC1001_NAME_LEN_WITH_NULL);
3573 ses_init_buf->trailer.session_req.calling_len = 32;
3576 * calling name ends in null (byte 16) from old smb
3579 if (server->workstation_RFC1001_name[0] != 0)
3580 rfc1002mangle(ses_init_buf->trailer.
3581 session_req.calling_name,
3582 server->workstation_RFC1001_name,
3583 RFC1001_NAME_LEN_WITH_NULL);
3585 rfc1002mangle(ses_init_buf->trailer.
3586 session_req.calling_name,
3588 RFC1001_NAME_LEN_WITH_NULL);
3590 ses_init_buf->trailer.session_req.scope1 = 0;
3591 ses_init_buf->trailer.session_req.scope2 = 0;
3592 smb_buf = (struct smb_hdr *)ses_init_buf;
3594 /* sizeof RFC1002_SESSION_REQUEST with no scope */
3595 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
3596 rc = smb_send(server, smb_buf, 0x44);
3597 kfree(ses_init_buf);
3599 * RFC1001 layer in at least one server
3600 * requires very short break before negprot
3601 * presumably because not expecting negprot
3602 * to follow so fast. This is a simple
3603 * solution that works without
3604 * complicating the code and causes no
3605 * significant slowing down on mount
3608 usleep_range(1000, 2000);
3611 * else the negprot may still work without this
3612 * even though malloc failed
3619 generic_ip_connect(struct TCP_Server_Info *server)
3624 struct socket *socket = server->ssocket;
3625 struct sockaddr *saddr;
3627 saddr = (struct sockaddr *) &server->dstaddr;
3629 if (server->dstaddr.ss_family == AF_INET6) {
3630 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
3631 slen = sizeof(struct sockaddr_in6);
3634 sport = ((struct sockaddr_in *) saddr)->sin_port;
3635 slen = sizeof(struct sockaddr_in);
3639 if (socket == NULL) {
3640 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3641 IPPROTO_TCP, &socket, 1);
3643 cifs_dbg(VFS, "Error %d creating socket\n", rc);
3644 server->ssocket = NULL;
3648 /* BB other socket options to set KEEPALIVE, NODELAY? */
3649 cifs_dbg(FYI, "Socket created\n");
3650 server->ssocket = socket;
3651 socket->sk->sk_allocation = GFP_NOFS;
3652 if (sfamily == AF_INET6)
3653 cifs_reclassify_socket6(socket);
3655 cifs_reclassify_socket4(socket);
3658 rc = bind_socket(server);
3663 * Eventually check for other socket options to change from
3664 * the default. sock_setsockopt not used because it expects
3667 socket->sk->sk_rcvtimeo = 7 * HZ;
3668 socket->sk->sk_sndtimeo = 5 * HZ;
3670 /* make the bufsizes depend on wsize/rsize and max requests */
3671 if (server->noautotune) {
3672 if (socket->sk->sk_sndbuf < (200 * 1024))
3673 socket->sk->sk_sndbuf = 200 * 1024;
3674 if (socket->sk->sk_rcvbuf < (140 * 1024))
3675 socket->sk->sk_rcvbuf = 140 * 1024;
3678 if (server->tcp_nodelay) {
3680 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
3681 (char *)&val, sizeof(val));
3683 cifs_dbg(FYI, "set TCP_NODELAY socket option error %d\n",
3687 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3688 socket->sk->sk_sndbuf,
3689 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3691 rc = socket->ops->connect(socket, saddr, slen, 0);
3693 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3694 sock_release(socket);
3695 server->ssocket = NULL;
3699 if (sport == htons(RFC1001_PORT))
3700 rc = ip_rfc1001_connect(server);
3706 ip_connect(struct TCP_Server_Info *server)
3709 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3710 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3712 if (server->dstaddr.ss_family == AF_INET6)
3713 sport = &addr6->sin6_port;
3715 sport = &addr->sin_port;
3720 /* try with 445 port at first */
3721 *sport = htons(CIFS_PORT);
3723 rc = generic_ip_connect(server);
3727 /* if it failed, try with 139 port */
3728 *sport = htons(RFC1001_PORT);
3731 return generic_ip_connect(server);
3734 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
3735 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
3737 /* if we are reconnecting then should we check to see if
3738 * any requested capabilities changed locally e.g. via
3739 * remount but we can not do much about it here
3740 * if they have (even if we could detect it by the following)
3741 * Perhaps we could add a backpointer to array of sb from tcon
3742 * or if we change to make all sb to same share the same
3743 * sb as NFS - then we only have one backpointer to sb.
3744 * What if we wanted to mount the server share twice once with
3745 * and once without posixacls or posix paths? */
3746 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3748 if (vol_info && vol_info->no_linux_ext) {
3749 tcon->fsUnixInfo.Capability = 0;
3750 tcon->unix_ext = 0; /* Unix Extensions disabled */
3751 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
3753 } else if (vol_info)
3754 tcon->unix_ext = 1; /* Unix Extensions supported */
3756 if (tcon->unix_ext == 0) {
3757 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
3761 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
3762 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3763 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
3764 /* check for reconnect case in which we do not
3765 want to change the mount behavior if we can avoid it */
3766 if (vol_info == NULL) {
3767 /* turn off POSIX ACL and PATHNAMES if not set
3768 originally at mount time */
3769 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
3770 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3771 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3772 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3773 cifs_dbg(VFS, "POSIXPATH support change\n");
3774 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3775 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3776 cifs_dbg(VFS, "possible reconnect error\n");
3777 cifs_dbg(VFS, "server disabled POSIX path support\n");
3781 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3782 cifs_dbg(VFS, "per-share encryption not supported yet\n");
3784 cap &= CIFS_UNIX_CAP_MASK;
3785 if (vol_info && vol_info->no_psx_acl)
3786 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3787 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
3788 cifs_dbg(FYI, "negotiated posix acl support\n");
3790 cifs_sb->mnt_cifs_flags |=
3791 CIFS_MOUNT_POSIXACL;
3794 if (vol_info && vol_info->posix_paths == 0)
3795 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3796 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
3797 cifs_dbg(FYI, "negotiate posix pathnames\n");
3799 cifs_sb->mnt_cifs_flags |=
3800 CIFS_MOUNT_POSIX_PATHS;
3803 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
3804 #ifdef CONFIG_CIFS_DEBUG2
3805 if (cap & CIFS_UNIX_FCNTL_CAP)
3806 cifs_dbg(FYI, "FCNTL cap\n");
3807 if (cap & CIFS_UNIX_EXTATTR_CAP)
3808 cifs_dbg(FYI, "EXTATTR cap\n");
3809 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3810 cifs_dbg(FYI, "POSIX path cap\n");
3811 if (cap & CIFS_UNIX_XATTR_CAP)
3812 cifs_dbg(FYI, "XATTR cap\n");
3813 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
3814 cifs_dbg(FYI, "POSIX ACL cap\n");
3815 if (cap & CIFS_UNIX_LARGE_READ_CAP)
3816 cifs_dbg(FYI, "very large read cap\n");
3817 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
3818 cifs_dbg(FYI, "very large write cap\n");
3819 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
3820 cifs_dbg(FYI, "transport encryption cap\n");
3821 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3822 cifs_dbg(FYI, "mandatory transport encryption cap\n");
3823 #endif /* CIFS_DEBUG2 */
3824 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
3825 if (vol_info == NULL) {
3826 cifs_dbg(FYI, "resetting capabilities failed\n");
3828 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");
3834 int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
3835 struct cifs_sb_info *cifs_sb)
3837 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
3839 spin_lock_init(&cifs_sb->tlink_tree_lock);
3840 cifs_sb->tlink_tree = RB_ROOT;
3843 * Temporarily set r/wsize for matching superblock. If we end up using
3844 * new sb then client will later negotiate it downward if needed.
3846 cifs_sb->rsize = pvolume_info->rsize;
3847 cifs_sb->wsize = pvolume_info->wsize;
3849 cifs_sb->mnt_uid = pvolume_info->linux_uid;
3850 cifs_sb->mnt_gid = pvolume_info->linux_gid;
3851 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
3852 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
3853 cifs_dbg(FYI, "file mode: 0x%hx dir mode: 0x%hx\n",
3854 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
3856 cifs_sb->actimeo = pvolume_info->actimeo;
3857 cifs_sb->local_nls = pvolume_info->local_nls;
3859 if (pvolume_info->nodfs)
3860 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_DFS;
3861 if (pvolume_info->noperm)
3862 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
3863 if (pvolume_info->setuids)
3864 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
3865 if (pvolume_info->setuidfromacl)
3866 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
3867 if (pvolume_info->server_ino)
3868 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
3869 if (pvolume_info->remap)
3870 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
3871 if (pvolume_info->sfu_remap)
3872 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
3873 if (pvolume_info->no_xattr)
3874 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
3875 if (pvolume_info->sfu_emul)
3876 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
3877 if (pvolume_info->nobrl)
3878 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
3879 if (pvolume_info->nohandlecache)
3880 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_HANDLE_CACHE;
3881 if (pvolume_info->nostrictsync)
3882 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
3883 if (pvolume_info->mand_lock)
3884 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
3885 if (pvolume_info->rwpidforward)
3886 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
3887 if (pvolume_info->cifs_acl)
3888 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
3889 if (pvolume_info->backupuid_specified) {
3890 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
3891 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
3893 if (pvolume_info->backupgid_specified) {
3894 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
3895 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
3897 if (pvolume_info->override_uid)
3898 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
3899 if (pvolume_info->override_gid)
3900 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
3901 if (pvolume_info->dynperm)
3902 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
3903 if (pvolume_info->fsc)
3904 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
3905 if (pvolume_info->multiuser)
3906 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
3907 CIFS_MOUNT_NO_PERM);
3908 if (pvolume_info->strict_io)
3909 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
3910 if (pvolume_info->direct_io) {
3911 cifs_dbg(FYI, "mounting share using direct i/o\n");
3912 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
3914 if (pvolume_info->mfsymlinks) {
3915 if (pvolume_info->sfu_emul) {
3917 * Our SFU ("Services for Unix" emulation does not allow
3918 * creating symlinks but does allow reading existing SFU
3919 * symlinks (it does allow both creating and reading SFU
3920 * style mknod and FIFOs though). When "mfsymlinks" and
3921 * "sfu" are both enabled at the same time, it allows
3922 * reading both types of symlinks, but will only create
3923 * them with mfsymlinks format. This allows better
3924 * Apple compatibility (probably better for Samba too)
3925 * while still recognizing old Windows style symlinks.
3927 cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
3929 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
3932 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
3933 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
3935 if (pvolume_info->prepath) {
3936 cifs_sb->prepath = kstrdup(pvolume_info->prepath, GFP_KERNEL);
3937 if (cifs_sb->prepath == NULL)
3945 cifs_cleanup_volume_info_contents(struct smb_vol *volume_info)
3947 kfree(volume_info->username);
3948 kzfree(volume_info->password);
3949 kfree(volume_info->UNC);
3950 kfree(volume_info->domainname);
3951 kfree(volume_info->iocharset);
3952 kfree(volume_info->prepath);
3956 cifs_cleanup_volume_info(struct smb_vol *volume_info)
3960 cifs_cleanup_volume_info_contents(volume_info);
3964 /* Release all succeed connections */
3965 static inline void mount_put_conns(struct cifs_sb_info *cifs_sb,
3967 struct TCP_Server_Info *server,
3968 struct cifs_ses *ses, struct cifs_tcon *tcon)
3973 cifs_put_tcon(tcon);
3975 cifs_put_smb_ses(ses);
3977 cifs_put_tcp_session(server, 0);
3978 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
3982 /* Get connections for tcp, ses and tcon */
3983 static int mount_get_conns(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
3985 struct TCP_Server_Info **nserver,
3986 struct cifs_ses **nses, struct cifs_tcon **ntcon)
3989 struct TCP_Server_Info *server;
3990 struct cifs_ses *ses;
3991 struct cifs_tcon *tcon;
3999 /* get a reference to a tcp session */
4000 server = cifs_get_tcp_session(vol);
4001 if (IS_ERR(server)) {
4002 rc = PTR_ERR(server);
4008 if ((vol->max_credits < 20) || (vol->max_credits > 60000))
4009 server->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
4011 server->max_credits = vol->max_credits;
4013 /* get a reference to a SMB session */
4014 ses = cifs_get_smb_ses(server, vol);
4022 if ((vol->persistent == true) && (!(ses->server->capabilities &
4023 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES))) {
4024 cifs_dbg(VFS, "persistent handles not supported by server\n");
4028 /* search for existing tcon to this server share */
4029 tcon = cifs_get_tcon(ses, vol);
4037 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
4038 if (tcon->posix_extensions)
4039 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
4041 /* tell server which Unix caps we support */
4042 if (cap_unix(tcon->ses)) {
4044 * reset of caps checks mount to see if unix extensions disabled
4045 * for just this mount.
4047 reset_cifs_unix_caps(*xid, tcon, cifs_sb, vol);
4048 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
4049 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
4050 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP))
4053 tcon->unix_ext = 0; /* server does not support them */
4055 /* do not care if a following call succeed - informational */
4056 if (!tcon->pipe && server->ops->qfs_tcon)
4057 server->ops->qfs_tcon(*xid, tcon);
4059 cifs_sb->wsize = server->ops->negotiate_wsize(tcon, vol);
4060 cifs_sb->rsize = server->ops->negotiate_rsize(tcon, vol);
4065 static int mount_setup_tlink(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
4066 struct cifs_tcon *tcon)
4068 struct tcon_link *tlink;
4070 /* hang the tcon off of the superblock */
4071 tlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4075 tlink->tl_uid = ses->linux_uid;
4076 tlink->tl_tcon = tcon;
4077 tlink->tl_time = jiffies;
4078 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
4079 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4081 cifs_sb->master_tlink = tlink;
4082 spin_lock(&cifs_sb->tlink_tree_lock);
4083 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4084 spin_unlock(&cifs_sb->tlink_tree_lock);
4086 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4091 #ifdef CONFIG_CIFS_DFS_UPCALL
4093 * cifs_build_path_to_root returns full path to root when we do not have an
4094 * exiting connection (tcon)
4097 build_unc_path_to_root(const struct smb_vol *vol,
4098 const struct cifs_sb_info *cifs_sb, bool useppath)
4100 char *full_path, *pos;
4101 unsigned int pplen = useppath && vol->prepath ?
4102 strlen(vol->prepath) + 1 : 0;
4103 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
4105 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
4106 if (full_path == NULL)
4107 return ERR_PTR(-ENOMEM);
4109 strncpy(full_path, vol->UNC, unc_len);
4110 pos = full_path + unc_len;
4113 *pos = CIFS_DIR_SEP(cifs_sb);
4114 strncpy(pos + 1, vol->prepath, pplen);
4118 *pos = '\0'; /* add trailing null */
4119 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
4120 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
4125 * expand_dfs_referral - Perform a dfs referral query and update the cifs_sb
4128 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
4129 * to a string containing updated options for the submount. Otherwise it
4130 * will be left untouched.
4132 * Returns the rc from get_dfs_path to the caller, which can be used to
4133 * determine whether there were referrals.
4136 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
4137 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
4141 struct dfs_info3_param referral = {0};
4142 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
4144 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4147 full_path = build_unc_path_to_root(volume_info, cifs_sb, true);
4148 if (IS_ERR(full_path))
4149 return PTR_ERR(full_path);
4151 /* For DFS paths, skip the first '\' of the UNC */
4152 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
4154 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4155 ref_path, &referral, NULL);
4157 char *fake_devname = NULL;
4159 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
4160 full_path + 1, &referral,
4162 free_dfs_info_param(&referral);
4164 if (IS_ERR(mdata)) {
4165 rc = PTR_ERR(mdata);
4168 cifs_cleanup_volume_info_contents(volume_info);
4169 rc = cifs_setup_volume_info(volume_info, mdata,
4170 fake_devname, false);
4172 kfree(fake_devname);
4173 kfree(cifs_sb->mountdata);
4174 cifs_sb->mountdata = mdata;
4180 static inline int get_next_dfs_tgt(const char *path,
4181 struct dfs_cache_tgt_list *tgt_list,
4182 struct dfs_cache_tgt_iterator **tgt_it)
4185 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
4187 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
4188 return !*tgt_it ? -EHOSTDOWN : 0;
4191 static int update_vol_info(const struct dfs_cache_tgt_iterator *tgt_it,
4192 struct smb_vol *fake_vol, struct smb_vol *vol)
4194 const char *tgt = dfs_cache_get_tgt_name(tgt_it);
4195 int len = strlen(tgt) + 2;
4198 new_unc = kmalloc(len, GFP_KERNEL);
4201 snprintf(new_unc, len, "\\%s", tgt);
4206 if (fake_vol->prepath) {
4207 kfree(vol->prepath);
4208 vol->prepath = fake_vol->prepath;
4209 fake_vol->prepath = NULL;
4211 memcpy(&vol->dstaddr, &fake_vol->dstaddr, sizeof(vol->dstaddr));
4216 static int setup_dfs_tgt_conn(const char *path,
4217 const struct dfs_cache_tgt_iterator *tgt_it,
4218 struct cifs_sb_info *cifs_sb,
4219 struct smb_vol *vol,
4221 struct TCP_Server_Info **server,
4222 struct cifs_ses **ses,
4223 struct cifs_tcon **tcon)
4226 struct dfs_info3_param ref = {0};
4227 char *mdata = NULL, *fake_devname = NULL;
4228 struct smb_vol fake_vol = {0};
4230 cifs_dbg(FYI, "%s: dfs path: %s\n", __func__, path);
4232 rc = dfs_cache_get_tgt_referral(path, tgt_it, &ref);
4236 mdata = cifs_compose_mount_options(cifs_sb->mountdata, path, &ref,
4238 free_dfs_info_param(&ref);
4240 if (IS_ERR(mdata)) {
4241 rc = PTR_ERR(mdata);
4244 cifs_dbg(FYI, "%s: fake_devname: %s\n", __func__, fake_devname);
4245 rc = cifs_setup_volume_info(&fake_vol, mdata, fake_devname,
4249 kfree(fake_devname);
4253 * We use a 'fake_vol' here because we need pass it down to the
4254 * mount_{get,put} functions to test connection against new DFS
4257 mount_put_conns(cifs_sb, *xid, *server, *ses, *tcon);
4258 rc = mount_get_conns(&fake_vol, cifs_sb, xid, server, ses,
4262 * We were able to connect to new target server.
4263 * Update current volume info with new target server.
4265 rc = update_vol_info(tgt_it, &fake_vol, vol);
4268 cifs_cleanup_volume_info_contents(&fake_vol);
4272 static int mount_do_dfs_failover(const char *path,
4273 struct cifs_sb_info *cifs_sb,
4274 struct smb_vol *vol,
4275 struct cifs_ses *root_ses,
4277 struct TCP_Server_Info **server,
4278 struct cifs_ses **ses,
4279 struct cifs_tcon **tcon)
4282 struct dfs_cache_tgt_list tgt_list;
4283 struct dfs_cache_tgt_iterator *tgt_it = NULL;
4285 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4288 rc = dfs_cache_noreq_find(path, NULL, &tgt_list);
4293 /* Get next DFS target server - if any */
4294 rc = get_next_dfs_tgt(path, &tgt_list, &tgt_it);
4297 /* Connect to next DFS target */
4298 rc = setup_dfs_tgt_conn(path, tgt_it, cifs_sb, vol, xid, server,
4300 if (!rc || rc == -EACCES || rc == -EOPNOTSUPP)
4305 * Update DFS target hint in DFS referral cache with the target
4306 * server we successfully reconnected to.
4308 rc = dfs_cache_update_tgthint(*xid, root_ses ? root_ses : *ses,
4310 cifs_remap(cifs_sb), path,
4313 dfs_cache_free_tgts(&tgt_list);
4319 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
4320 const char *devname, bool is_smb3)
4324 if (cifs_parse_mount_options(mount_data, devname, volume_info, is_smb3))
4327 if (volume_info->nullauth) {
4328 cifs_dbg(FYI, "Anonymous login\n");
4329 kfree(volume_info->username);
4330 volume_info->username = NULL;
4331 } else if (volume_info->username) {
4332 /* BB fixme parse for domain name here */
4333 cifs_dbg(FYI, "Username: %s\n", volume_info->username);
4335 cifs_dbg(VFS, "No username specified\n");
4336 /* In userspace mount helper we can get user name from alternate
4337 locations such as env variables and files on disk */
4341 /* this is needed for ASCII cp to Unicode converts */
4342 if (volume_info->iocharset == NULL) {
4343 /* load_nls_default cannot return null */
4344 volume_info->local_nls = load_nls_default();
4346 volume_info->local_nls = load_nls(volume_info->iocharset);
4347 if (volume_info->local_nls == NULL) {
4348 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
4349 volume_info->iocharset);
4358 cifs_get_volume_info(char *mount_data, const char *devname, bool is_smb3)
4361 struct smb_vol *volume_info;
4363 volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
4365 return ERR_PTR(-ENOMEM);
4367 rc = cifs_setup_volume_info(volume_info, mount_data, devname, is_smb3);
4369 cifs_cleanup_volume_info(volume_info);
4370 volume_info = ERR_PTR(rc);
4377 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
4379 struct cifs_tcon *tcon,
4380 struct cifs_sb_info *cifs_sb,
4387 sep = CIFS_DIR_SEP(cifs_sb);
4390 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
4392 /* skip separators */
4397 /* next separator */
4398 while (*s && *s != sep)
4402 * temporarily null-terminate the path at the end of
4403 * the current component
4407 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4415 * Check if path is remote (e.g. a DFS share). Return -EREMOTE if it is,
4418 static int is_path_remote(struct cifs_sb_info *cifs_sb, struct smb_vol *vol,
4419 const unsigned int xid,
4420 struct TCP_Server_Info *server,
4421 struct cifs_tcon *tcon)
4426 if (!server->ops->is_path_accessible)
4430 * cifs_build_path_to_root works only when we have a valid tcon
4432 full_path = cifs_build_path_to_root(vol, cifs_sb, tcon,
4433 tcon->Flags & SMB_SHARE_IS_IN_DFS);
4434 if (full_path == NULL)
4437 cifs_dbg(FYI, "%s: full_path: %s\n", __func__, full_path);
4439 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4441 if (rc != 0 && rc != -EREMOTE) {
4446 if (rc != -EREMOTE) {
4447 rc = cifs_are_all_path_components_accessible(server, xid, tcon,
4451 cifs_dbg(VFS, "cannot query dirs between root and final path, "
4452 "enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
4453 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
4462 #ifdef CONFIG_CIFS_DFS_UPCALL
4463 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4467 struct cifs_ses *ses;
4468 struct cifs_tcon *root_tcon = NULL;
4469 struct cifs_tcon *tcon = NULL;
4470 struct TCP_Server_Info *server;
4471 char *root_path = NULL, *full_path = NULL;
4472 char *old_mountdata;
4475 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4477 /* If not a standalone DFS root, then check if path is remote */
4478 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls,
4479 cifs_remap(cifs_sb), vol->UNC + 1, NULL,
4482 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4490 * If first DFS target server went offline and we failed to connect it,
4491 * server and ses pointers are NULL at this point, though we still have
4492 * chance to get a cached DFS referral in expand_dfs_referral() and
4493 * retry next target available in it.
4495 * If a NULL ses ptr is passed to dfs_cache_find(), a lookup will be
4496 * performed against DFS path and *no* requests will be sent to server
4497 * for any new DFS referrals. Hence it's safe to skip checking whether
4498 * server or ses ptr is NULL.
4500 if (rc == -EACCES || rc == -EOPNOTSUPP)
4503 root_path = build_unc_path_to_root(vol, cifs_sb, false);
4504 if (IS_ERR(root_path)) {
4505 rc = PTR_ERR(root_path);
4510 full_path = build_unc_path_to_root(vol, cifs_sb, true);
4511 if (IS_ERR(full_path)) {
4512 rc = PTR_ERR(full_path);
4517 * Perform an unconditional check for whether there are DFS
4518 * referrals for this path without prefix, to provide support
4519 * for DFS referrals from w2k8 servers which don't seem to respond
4520 * with PATH_NOT_COVERED to requests that include the prefix.
4521 * Chase the referral if found, otherwise continue normally.
4523 old_mountdata = cifs_sb->mountdata;
4524 (void)expand_dfs_referral(xid, ses, vol, cifs_sb, false);
4526 if (cifs_sb->mountdata == NULL) {
4531 if (cifs_sb->mountdata != old_mountdata) {
4532 /* If we were redirected, reconnect to new target server */
4533 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4534 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4537 if (rc == -EACCES || rc == -EOPNOTSUPP)
4539 /* Perform DFS failover to any other DFS targets */
4540 rc = mount_do_dfs_failover(root_path + 1, cifs_sb, vol, NULL,
4541 &xid, &server, &ses, &tcon);
4547 root_path = build_unc_path_to_root(vol, cifs_sb, false);
4548 if (IS_ERR(root_path)) {
4549 rc = PTR_ERR(root_path);
4553 /* Cache out resolved root server */
4554 (void)dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4555 root_path + 1, NULL, NULL);
4557 * Save root tcon for additional DFS requests to update or create a new
4558 * DFS cache entry, or even perform DFS failover.
4560 spin_lock(&cifs_tcp_ses_lock);
4562 tcon->dfs_path = root_path;
4564 tcon->remap = cifs_remap(cifs_sb);
4565 spin_unlock(&cifs_tcp_ses_lock);
4569 for (count = 1; ;) {
4571 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4572 if (!rc || rc != -EREMOTE)
4576 * BB: when we implement proper loop detection,
4577 * we will remove this check. But now we need it
4578 * to prevent an indefinite loop if 'DFS tree' is
4579 * misconfigured (i.e. has loops).
4581 if (count++ > MAX_NESTED_LINKS) {
4587 full_path = build_unc_path_to_root(vol, cifs_sb, true);
4588 if (IS_ERR(full_path)) {
4589 rc = PTR_ERR(full_path);
4594 old_mountdata = cifs_sb->mountdata;
4595 rc = expand_dfs_referral(xid, root_tcon->ses, vol, cifs_sb,
4600 if (cifs_sb->mountdata != old_mountdata) {
4601 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4602 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses,
4606 if (rc == -EACCES || rc == -EOPNOTSUPP)
4608 /* Perform DFS failover to any other DFS targets */
4609 rc = mount_do_dfs_failover(full_path + 1, cifs_sb, vol,
4610 root_tcon->ses, &xid,
4611 &server, &ses, &tcon);
4612 if (rc == -EACCES || rc == -EOPNOTSUPP || !server ||
4617 cifs_put_tcon(root_tcon);
4622 spin_lock(&cifs_tcp_ses_lock);
4623 if (!tcon->dfs_path) {
4624 /* Save full path in new tcon to do failover when reconnecting tcons */
4625 tcon->dfs_path = full_path;
4627 tcon->remap = cifs_remap(cifs_sb);
4629 cifs_sb->origin_fullpath = kstrndup(tcon->dfs_path,
4630 strlen(tcon->dfs_path),
4632 if (!cifs_sb->origin_fullpath) {
4633 spin_unlock(&cifs_tcp_ses_lock);
4637 spin_unlock(&cifs_tcp_ses_lock);
4639 rc = dfs_cache_add_vol(vol, cifs_sb->origin_fullpath);
4641 kfree(cifs_sb->origin_fullpath);
4645 * After reconnecting to a different server, unique ids won't
4646 * match anymore, so we disable serverino. This prevents
4647 * dentry revalidation to think the dentry are stale (ESTALE).
4649 cifs_autodisable_serverino(cifs_sb);
4652 return mount_setup_tlink(cifs_sb, ses, tcon);
4657 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4661 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4665 struct cifs_ses *ses;
4666 struct cifs_tcon *tcon;
4667 struct TCP_Server_Info *server;
4669 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4674 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4683 return mount_setup_tlink(cifs_sb, ses, tcon);
4686 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4692 * Issue a TREE_CONNECT request.
4695 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
4696 const char *tree, struct cifs_tcon *tcon,
4697 const struct nls_table *nls_codepage)
4699 struct smb_hdr *smb_buffer;
4700 struct smb_hdr *smb_buffer_response;
4703 unsigned char *bcc_ptr;
4706 __u16 bytes_left, count;
4711 smb_buffer = cifs_buf_get();
4712 if (smb_buffer == NULL)
4715 smb_buffer_response = smb_buffer;
4717 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
4718 NULL /*no tid */ , 4 /*wct */ );
4720 smb_buffer->Mid = get_next_mid(ses->server);
4721 smb_buffer->Uid = ses->Suid;
4722 pSMB = (TCONX_REQ *) smb_buffer;
4723 pSMBr = (TCONX_RSP *) smb_buffer_response;
4725 pSMB->AndXCommand = 0xFF;
4726 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
4727 bcc_ptr = &pSMB->Password[0];
4728 if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
4729 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
4730 *bcc_ptr = 0; /* password is null byte */
4731 bcc_ptr++; /* skip password */
4732 /* already aligned so no need to do it below */
4734 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
4735 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
4736 specified as required (when that support is added to
4737 the vfs in the future) as only NTLM or the much
4738 weaker LANMAN (which we do not send by default) is accepted
4739 by Samba (not sure whether other servers allow
4740 NTLMv2 password here) */
4741 #ifdef CONFIG_CIFS_WEAK_PW_HASH
4742 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
4743 (ses->sectype == LANMAN))
4744 calc_lanman_hash(tcon->password, ses->server->cryptkey,
4745 ses->server->sec_mode &
4746 SECMODE_PW_ENCRYPT ? true : false,
4749 #endif /* CIFS_WEAK_PW_HASH */
4750 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
4751 bcc_ptr, nls_codepage);
4753 cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
4755 cifs_buf_release(smb_buffer);
4759 bcc_ptr += CIFS_AUTH_RESP_SIZE;
4760 if (ses->capabilities & CAP_UNICODE) {
4761 /* must align unicode strings */
4762 *bcc_ptr = 0; /* null byte password */
4767 if (ses->server->sign)
4768 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
4770 if (ses->capabilities & CAP_STATUS32) {
4771 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
4773 if (ses->capabilities & CAP_DFS) {
4774 smb_buffer->Flags2 |= SMBFLG2_DFS;
4776 if (ses->capabilities & CAP_UNICODE) {
4777 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
4779 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
4780 6 /* max utf8 char length in bytes */ *
4781 (/* server len*/ + 256 /* share len */), nls_codepage);
4782 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
4783 bcc_ptr += 2; /* skip trailing null */
4784 } else { /* ASCII */
4785 strcpy(bcc_ptr, tree);
4786 bcc_ptr += strlen(tree) + 1;
4788 strcpy(bcc_ptr, "?????");
4789 bcc_ptr += strlen("?????");
4791 count = bcc_ptr - &pSMB->Password[0];
4792 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
4793 pSMB->hdr.smb_buf_length) + count);
4794 pSMB->ByteCount = cpu_to_le16(count);
4796 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
4799 /* above now done in SendReceive */
4803 tcon->tidStatus = CifsGood;
4804 tcon->need_reconnect = false;
4805 tcon->tid = smb_buffer_response->Tid;
4806 bcc_ptr = pByteArea(smb_buffer_response);
4807 bytes_left = get_bcc(smb_buffer_response);
4808 length = strnlen(bcc_ptr, bytes_left - 2);
4809 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
4815 /* skip service field (NB: this field is always ASCII) */
4817 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
4818 (bcc_ptr[2] == 'C')) {
4819 cifs_dbg(FYI, "IPC connection\n");
4823 } else if (length == 2) {
4824 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
4825 /* the most common case */
4826 cifs_dbg(FYI, "disk share connection\n");
4829 bcc_ptr += length + 1;
4830 bytes_left -= (length + 1);
4831 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
4833 /* mostly informational -- no need to fail on error here */
4834 kfree(tcon->nativeFileSystem);
4835 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
4836 bytes_left, is_unicode,
4839 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
4841 if ((smb_buffer_response->WordCount == 3) ||
4842 (smb_buffer_response->WordCount == 7))
4843 /* field is in same location */
4844 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
4847 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
4850 cifs_buf_release(smb_buffer);
4854 static void delayed_free(struct rcu_head *p)
4856 struct cifs_sb_info *sbi = container_of(p, struct cifs_sb_info, rcu);
4857 unload_nls(sbi->local_nls);
4862 cifs_umount(struct cifs_sb_info *cifs_sb)
4864 struct rb_root *root = &cifs_sb->tlink_tree;
4865 struct rb_node *node;
4866 struct tcon_link *tlink;
4868 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
4870 spin_lock(&cifs_sb->tlink_tree_lock);
4871 while ((node = rb_first(root))) {
4872 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
4873 cifs_get_tlink(tlink);
4874 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4875 rb_erase(node, root);
4877 spin_unlock(&cifs_sb->tlink_tree_lock);
4878 cifs_put_tlink(tlink);
4879 spin_lock(&cifs_sb->tlink_tree_lock);
4881 spin_unlock(&cifs_sb->tlink_tree_lock);
4883 kfree(cifs_sb->mountdata);
4884 kfree(cifs_sb->prepath);
4885 #ifdef CONFIG_CIFS_DFS_UPCALL
4886 dfs_cache_del_vol(cifs_sb->origin_fullpath);
4887 kfree(cifs_sb->origin_fullpath);
4889 call_rcu(&cifs_sb->rcu, delayed_free);
4893 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
4896 struct TCP_Server_Info *server = ses->server;
4898 if (!server->ops->need_neg || !server->ops->negotiate)
4901 /* only send once per connect */
4902 if (!server->ops->need_neg(server))
4905 set_credits(server, 1);
4907 rc = server->ops->negotiate(xid, ses);
4909 spin_lock(&GlobalMid_Lock);
4910 if (server->tcpStatus == CifsNeedNegotiate)
4911 server->tcpStatus = CifsGood;
4914 spin_unlock(&GlobalMid_Lock);
4921 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
4922 struct nls_table *nls_info)
4925 struct TCP_Server_Info *server = ses->server;
4927 ses->capabilities = server->capabilities;
4928 if (linuxExtEnabled == 0)
4929 ses->capabilities &= (~server->vals->cap_unix);
4931 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
4932 server->sec_mode, server->capabilities, server->timeAdj);
4934 if (ses->auth_key.response) {
4935 cifs_dbg(FYI, "Free previous auth_key.response = %p\n",
4936 ses->auth_key.response);
4937 kfree(ses->auth_key.response);
4938 ses->auth_key.response = NULL;
4939 ses->auth_key.len = 0;
4942 if (server->ops->sess_setup)
4943 rc = server->ops->sess_setup(xid, ses, nls_info);
4946 cifs_dbg(VFS, "Send error in SessSetup = %d\n", rc);
4952 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
4954 vol->sectype = ses->sectype;
4956 /* krb5 is special, since we don't need username or pw */
4957 if (vol->sectype == Kerberos)
4960 return cifs_set_cifscreds(vol, ses);
4963 static struct cifs_tcon *
4964 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
4967 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
4968 struct cifs_ses *ses;
4969 struct cifs_tcon *tcon = NULL;
4970 struct smb_vol *vol_info;
4972 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
4973 if (vol_info == NULL)
4974 return ERR_PTR(-ENOMEM);
4976 vol_info->local_nls = cifs_sb->local_nls;
4977 vol_info->linux_uid = fsuid;
4978 vol_info->cred_uid = fsuid;
4979 vol_info->UNC = master_tcon->treeName;
4980 vol_info->retry = master_tcon->retry;
4981 vol_info->nocase = master_tcon->nocase;
4982 vol_info->nohandlecache = master_tcon->nohandlecache;
4983 vol_info->local_lease = master_tcon->local_lease;
4984 vol_info->no_linux_ext = !master_tcon->unix_ext;
4985 vol_info->sectype = master_tcon->ses->sectype;
4986 vol_info->sign = master_tcon->ses->sign;
4988 rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
4994 /* get a reference for the same TCP session */
4995 spin_lock(&cifs_tcp_ses_lock);
4996 ++master_tcon->ses->server->srv_count;
4997 spin_unlock(&cifs_tcp_ses_lock);
4999 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
5001 tcon = (struct cifs_tcon *)ses;
5002 cifs_put_tcp_session(master_tcon->ses->server, 0);
5006 tcon = cifs_get_tcon(ses, vol_info);
5008 cifs_put_smb_ses(ses);
5012 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
5013 if (tcon->posix_extensions)
5014 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
5017 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
5020 kfree(vol_info->username);
5021 kzfree(vol_info->password);
5028 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
5030 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
5033 /* find and return a tlink with given uid */
5034 static struct tcon_link *
5035 tlink_rb_search(struct rb_root *root, kuid_t uid)
5037 struct rb_node *node = root->rb_node;
5038 struct tcon_link *tlink;
5041 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
5043 if (uid_gt(tlink->tl_uid, uid))
5044 node = node->rb_left;
5045 else if (uid_lt(tlink->tl_uid, uid))
5046 node = node->rb_right;
5053 /* insert a tcon_link into the tree */
5055 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
5057 struct rb_node **new = &(root->rb_node), *parent = NULL;
5058 struct tcon_link *tlink;
5061 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
5064 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
5065 new = &((*new)->rb_left);
5067 new = &((*new)->rb_right);
5070 rb_link_node(&new_tlink->tl_rbnode, parent, new);
5071 rb_insert_color(&new_tlink->tl_rbnode, root);
5075 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
5078 * If the superblock doesn't refer to a multiuser mount, then just return
5079 * the master tcon for the mount.
5081 * First, search the rbtree for an existing tcon for this fsuid. If one
5082 * exists, then check to see if it's pending construction. If it is then wait
5083 * for construction to complete. Once it's no longer pending, check to see if
5084 * it failed and either return an error or retry construction, depending on
5087 * If one doesn't exist then insert a new tcon_link struct into the tree and
5088 * try to construct a new one.
5091 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
5094 kuid_t fsuid = current_fsuid();
5095 struct tcon_link *tlink, *newtlink;
5097 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
5098 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
5100 spin_lock(&cifs_sb->tlink_tree_lock);
5101 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5103 cifs_get_tlink(tlink);
5104 spin_unlock(&cifs_sb->tlink_tree_lock);
5106 if (tlink == NULL) {
5107 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
5108 if (newtlink == NULL)
5109 return ERR_PTR(-ENOMEM);
5110 newtlink->tl_uid = fsuid;
5111 newtlink->tl_tcon = ERR_PTR(-EACCES);
5112 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
5113 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
5114 cifs_get_tlink(newtlink);
5116 spin_lock(&cifs_sb->tlink_tree_lock);
5117 /* was one inserted after previous search? */
5118 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5120 cifs_get_tlink(tlink);
5121 spin_unlock(&cifs_sb->tlink_tree_lock);
5123 goto wait_for_construction;
5126 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
5127 spin_unlock(&cifs_sb->tlink_tree_lock);
5129 wait_for_construction:
5130 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
5131 TASK_INTERRUPTIBLE);
5133 cifs_put_tlink(tlink);
5134 return ERR_PTR(-ERESTARTSYS);
5137 /* if it's good, return it */
5138 if (!IS_ERR(tlink->tl_tcon))
5141 /* return error if we tried this already recently */
5142 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
5143 cifs_put_tlink(tlink);
5144 return ERR_PTR(-EACCES);
5147 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
5148 goto wait_for_construction;
5151 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
5152 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
5153 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
5155 if (IS_ERR(tlink->tl_tcon)) {
5156 cifs_put_tlink(tlink);
5157 return ERR_PTR(-EACCES);
5164 * periodic workqueue job that scans tcon_tree for a superblock and closes
5168 cifs_prune_tlinks(struct work_struct *work)
5170 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
5172 struct rb_root *root = &cifs_sb->tlink_tree;
5173 struct rb_node *node;
5174 struct rb_node *tmp;
5175 struct tcon_link *tlink;
5178 * Because we drop the spinlock in the loop in order to put the tlink
5179 * it's not guarded against removal of links from the tree. The only
5180 * places that remove entries from the tree are this function and
5181 * umounts. Because this function is non-reentrant and is canceled
5182 * before umount can proceed, this is safe.
5184 spin_lock(&cifs_sb->tlink_tree_lock);
5185 node = rb_first(root);
5186 while (node != NULL) {
5188 node = rb_next(tmp);
5189 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
5191 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
5192 atomic_read(&tlink->tl_count) != 0 ||
5193 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
5196 cifs_get_tlink(tlink);
5197 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
5198 rb_erase(tmp, root);
5200 spin_unlock(&cifs_sb->tlink_tree_lock);
5201 cifs_put_tlink(tlink);
5202 spin_lock(&cifs_sb->tlink_tree_lock);
5204 spin_unlock(&cifs_sb->tlink_tree_lock);
5206 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,