4 * Copyright (C) International Business Machines Corp., 2002,2011
5 * Author(s): Steve French (sfrench@us.ibm.com)
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);
328 #ifdef CONFIG_CIFS_DFS_UPCALL
329 struct super_cb_data {
330 struct TCP_Server_Info *server;
331 struct cifs_sb_info *cifs_sb;
334 /* These functions must be called with server->srv_mutex held */
336 static void super_cb(struct super_block *sb, void *arg)
338 struct super_cb_data *d = arg;
339 struct cifs_sb_info *cifs_sb;
340 struct cifs_tcon *tcon;
345 cifs_sb = CIFS_SB(sb);
346 tcon = cifs_sb_master_tcon(cifs_sb);
347 if (tcon->ses->server == d->server)
348 d->cifs_sb = cifs_sb;
351 static inline struct cifs_sb_info *
352 find_super_by_tcp(struct TCP_Server_Info *server)
354 struct super_cb_data d = {
359 iterate_supers_type(&cifs_fs_type, super_cb, &d);
360 return d.cifs_sb ? d.cifs_sb : ERR_PTR(-ENOENT);
363 static void reconn_inval_dfs_target(struct TCP_Server_Info *server,
364 struct cifs_sb_info *cifs_sb,
365 struct dfs_cache_tgt_list *tgt_list,
366 struct dfs_cache_tgt_iterator **tgt_it)
374 if (!cifs_sb || !cifs_sb->origin_fullpath || !tgt_list ||
379 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
381 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
383 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
386 cifs_dbg(FYI, "%s: UNC: %s\n", __func__, cifs_sb->origin_fullpath);
388 name = dfs_cache_get_tgt_name(*tgt_it);
390 kfree(server->hostname);
392 server->hostname = extract_hostname(name);
393 if (!server->hostname) {
394 cifs_dbg(FYI, "%s: failed to extract hostname from target: %d\n",
399 len = strlen(server->hostname) + 3;
401 unc = kmalloc(len, GFP_KERNEL);
403 cifs_dbg(FYI, "%s: failed to create UNC path\n", __func__);
406 snprintf(unc, len, "\\\\%s", server->hostname);
408 rc = dns_resolve_server_name_to_ip(unc, &ipaddr);
412 cifs_dbg(FYI, "%s: Failed to resolve server part of %s to IP: %d\n",
413 __func__, server->hostname, rc);
417 rc = cifs_convert_address((struct sockaddr *)&server->dstaddr, ipaddr,
422 cifs_dbg(FYI, "%s: failed to get ipaddr out of hostname\n",
427 static inline int reconn_setup_dfs_targets(struct cifs_sb_info *cifs_sb,
428 struct dfs_cache_tgt_list *tl,
429 struct dfs_cache_tgt_iterator **it)
431 if (!cifs_sb->origin_fullpath)
433 return dfs_cache_noreq_find(cifs_sb->origin_fullpath + 1, NULL, tl);
438 * cifs tcp session reconnection
440 * mark tcp session as reconnecting so temporarily locked
441 * mark all smb sessions as reconnecting for tcp session
442 * reconnect tcp session
443 * wake up waiters on reconnection? - (not needed currently)
446 cifs_reconnect(struct TCP_Server_Info *server)
449 struct list_head *tmp, *tmp2;
450 struct cifs_ses *ses;
451 struct cifs_tcon *tcon;
452 struct mid_q_entry *mid_entry;
453 struct list_head retry_list;
454 #ifdef CONFIG_CIFS_DFS_UPCALL
455 struct cifs_sb_info *cifs_sb;
456 struct dfs_cache_tgt_list tgt_list;
457 struct dfs_cache_tgt_iterator *tgt_it = NULL;
460 spin_lock(&GlobalMid_Lock);
461 server->nr_targets = 1;
462 #ifdef CONFIG_CIFS_DFS_UPCALL
463 cifs_sb = find_super_by_tcp(server);
464 if (IS_ERR(cifs_sb)) {
465 rc = PTR_ERR(cifs_sb);
466 cifs_dbg(FYI, "%s: will not do DFS failover: rc = %d\n",
470 rc = reconn_setup_dfs_targets(cifs_sb, &tgt_list, &tgt_it);
472 cifs_dbg(VFS, "%s: no target servers for DFS failover\n",
475 server->nr_targets = dfs_cache_get_nr_tgts(&tgt_list);
478 cifs_dbg(FYI, "%s: will retry %d target(s)\n", __func__,
481 if (server->tcpStatus == CifsExiting) {
482 /* the demux thread will exit normally
483 next time through the loop */
484 spin_unlock(&GlobalMid_Lock);
487 server->tcpStatus = CifsNeedReconnect;
488 spin_unlock(&GlobalMid_Lock);
490 server->max_read = 0;
492 cifs_dbg(FYI, "Mark tcp session as need reconnect\n");
493 trace_smb3_reconnect(server->CurrentMid, server->hostname);
495 /* before reconnecting the tcp session, mark the smb session (uid)
496 and the tid bad so they are not used until reconnected */
497 cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
499 spin_lock(&cifs_tcp_ses_lock);
500 list_for_each(tmp, &server->smb_ses_list) {
501 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
502 ses->need_reconnect = true;
503 list_for_each(tmp2, &ses->tcon_list) {
504 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
505 tcon->need_reconnect = true;
508 ses->tcon_ipc->need_reconnect = true;
510 spin_unlock(&cifs_tcp_ses_lock);
512 /* do not want to be sending data on a socket we are freeing */
513 cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
514 mutex_lock(&server->srv_mutex);
515 if (server->ssocket) {
516 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
517 server->ssocket->state, server->ssocket->flags);
518 kernel_sock_shutdown(server->ssocket, SHUT_WR);
519 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
520 server->ssocket->state, server->ssocket->flags);
521 sock_release(server->ssocket);
522 server->ssocket = NULL;
524 server->sequence_number = 0;
525 server->session_estab = false;
526 kfree(server->session_key.response);
527 server->session_key.response = NULL;
528 server->session_key.len = 0;
529 server->lstrp = jiffies;
531 /* mark submitted MIDs for retry and issue callback */
532 INIT_LIST_HEAD(&retry_list);
533 cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
534 spin_lock(&GlobalMid_Lock);
535 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
536 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
537 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
538 mid_entry->mid_state = MID_RETRY_NEEDED;
539 list_move(&mid_entry->qhead, &retry_list);
541 spin_unlock(&GlobalMid_Lock);
542 mutex_unlock(&server->srv_mutex);
544 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
545 list_for_each_safe(tmp, tmp2, &retry_list) {
546 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
547 list_del_init(&mid_entry->qhead);
548 mid_entry->callback(mid_entry);
554 mutex_lock(&server->srv_mutex);
556 * Set up next DFS target server (if any) for reconnect. If DFS
557 * feature is disabled, then we will retry last server we
558 * connected to before.
560 if (cifs_rdma_enabled(server))
561 rc = smbd_reconnect(server);
563 rc = generic_ip_connect(server);
565 cifs_dbg(FYI, "reconnect error %d\n", rc);
566 #ifdef CONFIG_CIFS_DFS_UPCALL
567 reconn_inval_dfs_target(server, cifs_sb, &tgt_list,
570 mutex_unlock(&server->srv_mutex);
573 atomic_inc(&tcpSesReconnectCount);
574 spin_lock(&GlobalMid_Lock);
575 if (server->tcpStatus != CifsExiting)
576 server->tcpStatus = CifsNeedNegotiate;
577 spin_unlock(&GlobalMid_Lock);
578 mutex_unlock(&server->srv_mutex);
580 } while (server->tcpStatus == CifsNeedReconnect);
582 #ifdef CONFIG_CIFS_DFS_UPCALL
584 rc = dfs_cache_noreq_update_tgthint(cifs_sb->origin_fullpath + 1,
587 cifs_dbg(VFS, "%s: failed to update DFS target hint: rc = %d\n",
590 rc = dfs_cache_update_vol(cifs_sb->origin_fullpath, server);
592 cifs_dbg(VFS, "%s: failed to update vol info in DFS cache: rc = %d\n",
596 dfs_cache_free_tgts(&tgt_list);
598 if (server->tcpStatus == CifsNeedNegotiate)
599 mod_delayed_work(cifsiod_wq, &server->echo, 0);
605 cifs_echo_request(struct work_struct *work)
608 struct TCP_Server_Info *server = container_of(work,
609 struct TCP_Server_Info, echo.work);
610 unsigned long echo_interval;
613 * If we need to renegotiate, set echo interval to zero to
614 * immediately call echo service where we can renegotiate.
616 if (server->tcpStatus == CifsNeedNegotiate)
619 echo_interval = server->echo_interval;
622 * We cannot send an echo if it is disabled.
623 * Also, no need to ping if we got a response recently.
626 if (server->tcpStatus == CifsNeedReconnect ||
627 server->tcpStatus == CifsExiting ||
628 server->tcpStatus == CifsNew ||
629 (server->ops->can_echo && !server->ops->can_echo(server)) ||
630 time_before(jiffies, server->lstrp + echo_interval - HZ))
633 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
635 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
639 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
643 allocate_buffers(struct TCP_Server_Info *server)
645 if (!server->bigbuf) {
646 server->bigbuf = (char *)cifs_buf_get();
647 if (!server->bigbuf) {
648 cifs_dbg(VFS, "No memory for large SMB response\n");
650 /* retry will check if exiting */
653 } else if (server->large_buf) {
654 /* we are reusing a dirty large buf, clear its start */
655 memset(server->bigbuf, 0, HEADER_SIZE(server));
658 if (!server->smallbuf) {
659 server->smallbuf = (char *)cifs_small_buf_get();
660 if (!server->smallbuf) {
661 cifs_dbg(VFS, "No memory for SMB response\n");
663 /* retry will check if exiting */
666 /* beginning of smb buffer is cleared in our buf_get */
668 /* if existing small buf clear beginning */
669 memset(server->smallbuf, 0, HEADER_SIZE(server));
676 server_unresponsive(struct TCP_Server_Info *server)
679 * We need to wait 2 echo intervals to make sure we handle such
681 * 1s client sends a normal SMB request
682 * 2s client gets a response
683 * 30s echo workqueue job pops, and decides we got a response recently
684 * and don't need to send another
686 * 65s kernel_recvmsg times out, and we see that we haven't gotten
687 * a response in >60s.
689 if ((server->tcpStatus == CifsGood ||
690 server->tcpStatus == CifsNeedNegotiate) &&
691 time_after(jiffies, server->lstrp + 2 * server->echo_interval)) {
692 cifs_dbg(VFS, "Server %s has not responded in %lu seconds. Reconnecting...\n",
693 server->hostname, (2 * server->echo_interval) / HZ);
694 cifs_reconnect(server);
695 wake_up(&server->response_q);
703 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
708 smb_msg->msg_control = NULL;
709 smb_msg->msg_controllen = 0;
711 for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
714 if (server_unresponsive(server))
715 return -ECONNABORTED;
716 if (cifs_rdma_enabled(server) && server->smbd_conn)
717 length = smbd_recv(server->smbd_conn, smb_msg);
719 length = sock_recvmsg(server->ssocket, smb_msg, 0);
721 if (server->tcpStatus == CifsExiting)
724 if (server->tcpStatus == CifsNeedReconnect) {
725 cifs_reconnect(server);
726 return -ECONNABORTED;
729 if (length == -ERESTARTSYS ||
733 * Minimum sleep to prevent looping, allowing socket
734 * to clear and app threads to set tcpStatus
735 * CifsNeedReconnect if server hung.
737 usleep_range(1000, 2000);
743 cifs_dbg(FYI, "Received no data or error: %d\n", length);
744 cifs_reconnect(server);
745 return -ECONNABORTED;
752 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
753 unsigned int to_read)
755 struct msghdr smb_msg;
756 struct kvec iov = {.iov_base = buf, .iov_len = to_read};
757 iov_iter_kvec(&smb_msg.msg_iter, READ, &iov, 1, to_read);
759 return cifs_readv_from_socket(server, &smb_msg);
763 cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
764 unsigned int page_offset, unsigned int to_read)
766 struct msghdr smb_msg;
767 struct bio_vec bv = {
768 .bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
769 iov_iter_bvec(&smb_msg.msg_iter, READ, &bv, 1, to_read);
770 return cifs_readv_from_socket(server, &smb_msg);
774 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
777 * The first byte big endian of the length field,
778 * is actually not part of the length but the type
779 * with the most common, zero, as regular data.
782 case RFC1002_SESSION_MESSAGE:
783 /* Regular SMB response */
785 case RFC1002_SESSION_KEEP_ALIVE:
786 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
788 case RFC1002_POSITIVE_SESSION_RESPONSE:
789 cifs_dbg(FYI, "RFC 1002 positive session response\n");
791 case RFC1002_NEGATIVE_SESSION_RESPONSE:
793 * We get this from Windows 98 instead of an error on
794 * SMB negprot response.
796 cifs_dbg(FYI, "RFC 1002 negative session response\n");
797 /* give server a second to clean up */
800 * Always try 445 first on reconnect since we get NACK
801 * on some if we ever connected to port 139 (the NACK
802 * is since we do not begin with RFC1001 session
805 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
806 cifs_reconnect(server);
807 wake_up(&server->response_q);
810 cifs_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
811 cifs_reconnect(server);
818 dequeue_mid(struct mid_q_entry *mid, bool malformed)
820 #ifdef CONFIG_CIFS_STATS2
821 mid->when_received = jiffies;
823 spin_lock(&GlobalMid_Lock);
825 mid->mid_state = MID_RESPONSE_RECEIVED;
827 mid->mid_state = MID_RESPONSE_MALFORMED;
829 * Trying to handle/dequeue a mid after the send_recv()
830 * function has finished processing it is a bug.
832 if (mid->mid_flags & MID_DELETED)
833 printk_once(KERN_WARNING
834 "trying to dequeue a deleted mid\n");
836 list_del_init(&mid->qhead);
837 spin_unlock(&GlobalMid_Lock);
841 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
842 char *buf, int malformed)
844 if (server->ops->check_trans2 &&
845 server->ops->check_trans2(mid, server, buf, malformed))
848 mid->large_buf = server->large_buf;
849 /* Was previous buf put in mpx struct for multi-rsp? */
850 if (!mid->multiRsp) {
851 /* smb buffer will be freed by user thread */
852 if (server->large_buf)
853 server->bigbuf = NULL;
855 server->smallbuf = NULL;
857 dequeue_mid(mid, malformed);
860 static void clean_demultiplex_info(struct TCP_Server_Info *server)
864 /* take it off the list, if it's not already */
865 spin_lock(&cifs_tcp_ses_lock);
866 list_del_init(&server->tcp_ses_list);
867 spin_unlock(&cifs_tcp_ses_lock);
869 spin_lock(&GlobalMid_Lock);
870 server->tcpStatus = CifsExiting;
871 spin_unlock(&GlobalMid_Lock);
872 wake_up_all(&server->response_q);
874 /* check if we have blocked requests that need to free */
875 spin_lock(&server->req_lock);
876 if (server->credits <= 0)
878 spin_unlock(&server->req_lock);
880 * Although there should not be any requests blocked on this queue it
881 * can not hurt to be paranoid and try to wake up requests that may
882 * haven been blocked when more than 50 at time were on the wire to the
883 * same server - they now will see the session is in exit state and get
884 * out of SendReceive.
886 wake_up_all(&server->request_q);
887 /* give those requests time to exit */
889 if (cifs_rdma_enabled(server) && server->smbd_conn) {
890 smbd_destroy(server->smbd_conn);
891 server->smbd_conn = NULL;
893 if (server->ssocket) {
894 sock_release(server->ssocket);
895 server->ssocket = NULL;
898 if (!list_empty(&server->pending_mid_q)) {
899 struct list_head dispose_list;
900 struct mid_q_entry *mid_entry;
901 struct list_head *tmp, *tmp2;
903 INIT_LIST_HEAD(&dispose_list);
904 spin_lock(&GlobalMid_Lock);
905 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
906 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
907 cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
908 mid_entry->mid_state = MID_SHUTDOWN;
909 list_move(&mid_entry->qhead, &dispose_list);
911 spin_unlock(&GlobalMid_Lock);
913 /* now walk dispose list and issue callbacks */
914 list_for_each_safe(tmp, tmp2, &dispose_list) {
915 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
916 cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
917 list_del_init(&mid_entry->qhead);
918 mid_entry->callback(mid_entry);
920 /* 1/8th of sec is more than enough time for them to exit */
924 if (!list_empty(&server->pending_mid_q)) {
926 * mpx threads have not exited yet give them at least the smb
927 * send timeout time for long ops.
929 * Due to delays on oplock break requests, we need to wait at
930 * least 45 seconds before giving up on a request getting a
931 * response and going ahead and killing cifsd.
933 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
936 * If threads still have not exited they are probably never
937 * coming home not much else we can do but free the memory.
941 kfree(server->hostname);
944 length = atomic_dec_return(&tcpSesAllocCount);
946 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
950 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
953 char *buf = server->smallbuf;
954 unsigned int pdu_length = server->pdu_size;
956 /* make sure this will fit in a large buffer */
957 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
958 server->vals->header_preamble_size) {
959 cifs_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
960 cifs_reconnect(server);
961 wake_up(&server->response_q);
962 return -ECONNABORTED;
965 /* switch to large buffer if too big for a small one */
966 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
967 server->large_buf = true;
968 memcpy(server->bigbuf, buf, server->total_read);
969 buf = server->bigbuf;
972 /* now read the rest */
973 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
974 pdu_length - HEADER_SIZE(server) + 1
975 + server->vals->header_preamble_size);
979 server->total_read += length;
981 dump_smb(buf, server->total_read);
983 return cifs_handle_standard(server, mid);
987 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
989 char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
993 * We know that we received enough to get to the MID as we
994 * checked the pdu_length earlier. Now check to see
995 * if the rest of the header is OK. We borrow the length
996 * var for the rest of the loop to avoid a new stack var.
998 * 48 bytes is enough to display the header and a little bit
999 * into the payload for debugging purposes.
1001 length = server->ops->check_message(buf, server->total_read, server);
1003 cifs_dump_mem("Bad SMB: ", buf,
1004 min_t(unsigned int, server->total_read, 48));
1006 if (server->ops->is_session_expired &&
1007 server->ops->is_session_expired(buf)) {
1008 cifs_reconnect(server);
1009 wake_up(&server->response_q);
1013 if (server->ops->is_status_pending &&
1014 server->ops->is_status_pending(buf, server, length))
1020 handle_mid(mid, server, buf, length);
1025 cifs_demultiplex_thread(void *p)
1027 int i, num_mids, length;
1028 struct TCP_Server_Info *server = p;
1029 unsigned int pdu_length;
1030 unsigned int next_offset;
1032 struct task_struct *task_to_wake = NULL;
1033 struct mid_q_entry *mids[MAX_COMPOUND];
1034 char *bufs[MAX_COMPOUND];
1036 current->flags |= PF_MEMALLOC;
1037 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
1039 length = atomic_inc_return(&tcpSesAllocCount);
1041 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
1044 while (server->tcpStatus != CifsExiting) {
1045 if (try_to_freeze())
1048 if (!allocate_buffers(server))
1051 server->large_buf = false;
1052 buf = server->smallbuf;
1053 pdu_length = 4; /* enough to get RFC1001 header */
1055 length = cifs_read_from_socket(server, buf, pdu_length);
1059 if (server->vals->header_preamble_size == 0)
1060 server->total_read = 0;
1062 server->total_read = length;
1065 * The right amount was read from socket - 4 bytes,
1066 * so we can now interpret the length field.
1068 pdu_length = get_rfc1002_length(buf);
1070 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
1071 if (!is_smb_response(server, buf[0]))
1074 server->pdu_size = pdu_length;
1076 /* make sure we have enough to get to the MID */
1077 if (server->pdu_size < HEADER_SIZE(server) - 1 -
1078 server->vals->header_preamble_size) {
1079 cifs_dbg(VFS, "SMB response too short (%u bytes)\n",
1081 cifs_reconnect(server);
1082 wake_up(&server->response_q);
1086 /* read down to the MID */
1087 length = cifs_read_from_socket(server,
1088 buf + server->vals->header_preamble_size,
1089 HEADER_SIZE(server) - 1
1090 - server->vals->header_preamble_size);
1093 server->total_read += length;
1095 if (server->ops->next_header) {
1096 next_offset = server->ops->next_header(buf);
1098 server->pdu_size = next_offset;
1101 memset(mids, 0, sizeof(mids));
1102 memset(bufs, 0, sizeof(bufs));
1105 if (server->ops->is_transform_hdr &&
1106 server->ops->receive_transform &&
1107 server->ops->is_transform_hdr(buf)) {
1108 length = server->ops->receive_transform(server,
1113 mids[0] = server->ops->find_mid(server, buf);
1117 if (!mids[0] || !mids[0]->receive)
1118 length = standard_receive3(server, mids[0]);
1120 length = mids[0]->receive(server, mids[0]);
1124 for (i = 0; i < num_mids; i++)
1126 cifs_mid_q_entry_release(mids[i]);
1130 if (server->large_buf)
1131 buf = server->bigbuf;
1134 server->lstrp = jiffies;
1136 for (i = 0; i < num_mids; i++) {
1137 if (mids[i] != NULL) {
1138 mids[i]->resp_buf_size = server->pdu_size;
1139 if ((mids[i]->mid_flags & MID_WAIT_CANCELLED) &&
1140 mids[i]->mid_state == MID_RESPONSE_RECEIVED &&
1141 server->ops->handle_cancelled_mid)
1142 server->ops->handle_cancelled_mid(
1146 if (!mids[i]->multiRsp || mids[i]->multiEnd)
1147 mids[i]->callback(mids[i]);
1149 cifs_mid_q_entry_release(mids[i]);
1150 } else if (server->ops->is_oplock_break &&
1151 server->ops->is_oplock_break(bufs[i],
1153 cifs_dbg(FYI, "Received oplock break\n");
1155 cifs_dbg(VFS, "No task to wake, unknown frame "
1156 "received! NumMids %d\n",
1157 atomic_read(&midCount));
1158 cifs_dump_mem("Received Data is: ", bufs[i],
1159 HEADER_SIZE(server));
1160 #ifdef CONFIG_CIFS_DEBUG2
1161 if (server->ops->dump_detail)
1162 server->ops->dump_detail(bufs[i],
1164 cifs_dump_mids(server);
1165 #endif /* CIFS_DEBUG2 */
1169 if (pdu_length > server->pdu_size) {
1170 if (!allocate_buffers(server))
1172 pdu_length -= server->pdu_size;
1173 server->total_read = 0;
1174 server->large_buf = false;
1175 buf = server->smallbuf;
1178 } /* end while !EXITING */
1180 /* buffer usually freed in free_mid - need to free it here on exit */
1181 cifs_buf_release(server->bigbuf);
1182 if (server->smallbuf) /* no sense logging a debug message if NULL */
1183 cifs_small_buf_release(server->smallbuf);
1185 task_to_wake = xchg(&server->tsk, NULL);
1186 clean_demultiplex_info(server);
1188 /* if server->tsk was NULL then wait for a signal before exiting */
1189 if (!task_to_wake) {
1190 set_current_state(TASK_INTERRUPTIBLE);
1191 while (!signal_pending(current)) {
1193 set_current_state(TASK_INTERRUPTIBLE);
1195 set_current_state(TASK_RUNNING);
1198 module_put_and_exit(0);
1201 /* extract the host portion of the UNC string */
1203 extract_hostname(const char *unc)
1209 /* skip double chars at beginning of string */
1210 /* BB: check validity of these bytes? */
1211 if (strlen(unc) < 3)
1212 return ERR_PTR(-EINVAL);
1213 for (src = unc; *src && *src == '\\'; src++)
1216 return ERR_PTR(-EINVAL);
1218 /* delimiter between hostname and sharename is always '\\' now */
1219 delim = strchr(src, '\\');
1221 return ERR_PTR(-EINVAL);
1224 dst = kmalloc((len + 1), GFP_KERNEL);
1226 return ERR_PTR(-ENOMEM);
1228 memcpy(dst, src, len);
1234 static int get_option_ul(substring_t args[], unsigned long *option)
1239 string = match_strdup(args);
1242 rc = kstrtoul(string, 0, option);
1248 static int get_option_uid(substring_t args[], kuid_t *result)
1250 unsigned long value;
1254 rc = get_option_ul(args, &value);
1258 uid = make_kuid(current_user_ns(), value);
1259 if (!uid_valid(uid))
1266 static int get_option_gid(substring_t args[], kgid_t *result)
1268 unsigned long value;
1272 rc = get_option_ul(args, &value);
1276 gid = make_kgid(current_user_ns(), value);
1277 if (!gid_valid(gid))
1284 static int cifs_parse_security_flavors(char *value,
1285 struct smb_vol *vol)
1288 substring_t args[MAX_OPT_ARGS];
1291 * With mount options, the last one should win. Reset any existing
1292 * settings back to default.
1294 vol->sectype = Unspecified;
1297 switch (match_token(value, cifs_secflavor_tokens, args)) {
1299 cifs_dbg(VFS, "sec=krb5p is not supported!\n");
1305 vol->sectype = Kerberos;
1307 case Opt_sec_ntlmsspi:
1310 case Opt_sec_ntlmssp:
1311 vol->sectype = RawNTLMSSP;
1317 vol->sectype = NTLM;
1319 case Opt_sec_ntlmv2i:
1322 case Opt_sec_ntlmv2:
1323 vol->sectype = NTLMv2;
1325 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1326 case Opt_sec_lanman:
1327 vol->sectype = LANMAN;
1334 cifs_dbg(VFS, "bad security option: %s\n", value);
1342 cifs_parse_cache_flavor(char *value, struct smb_vol *vol)
1344 substring_t args[MAX_OPT_ARGS];
1346 switch (match_token(value, cifs_cacheflavor_tokens, args)) {
1347 case Opt_cache_loose:
1348 vol->direct_io = false;
1349 vol->strict_io = false;
1351 case Opt_cache_strict:
1352 vol->direct_io = false;
1353 vol->strict_io = true;
1355 case Opt_cache_none:
1356 vol->direct_io = true;
1357 vol->strict_io = false;
1360 cifs_dbg(VFS, "bad cache= option: %s\n", value);
1367 cifs_parse_smb_version(char *value, struct smb_vol *vol, bool is_smb3)
1369 substring_t args[MAX_OPT_ARGS];
1371 switch (match_token(value, cifs_smb_version_tokens, args)) {
1372 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1374 if (disable_legacy_dialects) {
1375 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1379 cifs_dbg(VFS, "vers=1.0 (cifs) not permitted when mounting with smb3\n");
1382 vol->ops = &smb1_operations;
1383 vol->vals = &smb1_values;
1386 if (disable_legacy_dialects) {
1387 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1391 cifs_dbg(VFS, "vers=2.0 not permitted when mounting with smb3\n");
1394 vol->ops = &smb20_operations;
1395 vol->vals = &smb20_values;
1399 cifs_dbg(VFS, "vers=1.0 (cifs) mount not permitted when legacy dialects disabled\n");
1402 cifs_dbg(VFS, "vers=2.0 mount not permitted when legacy dialects disabled\n");
1404 #endif /* CIFS_ALLOW_INSECURE_LEGACY */
1406 vol->ops = &smb21_operations;
1407 vol->vals = &smb21_values;
1410 vol->ops = &smb30_operations;
1411 vol->vals = &smb30_values;
1414 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1415 vol->vals = &smb302_values;
1418 vol->ops = &smb311_operations;
1419 vol->vals = &smb311_values;
1422 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1423 vol->vals = &smb3any_values;
1426 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1427 vol->vals = &smbdefault_values;
1430 cifs_dbg(VFS, "Unknown vers= option specified: %s\n", value);
1437 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1438 * fields with the result. Returns 0 on success and an error otherwise.
1441 cifs_parse_devname(const char *devname, struct smb_vol *vol)
1444 const char *delims = "/\\";
1447 /* make sure we have a valid UNC double delimiter prefix */
1448 len = strspn(devname, delims);
1452 /* find delimiter between host and sharename */
1453 pos = strpbrk(devname + 2, delims);
1457 /* skip past delimiter */
1460 /* now go until next delimiter or end of string */
1461 len = strcspn(pos, delims);
1463 /* move "pos" up to delimiter or NULL */
1465 vol->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
1469 convert_delimiter(vol->UNC, '\\');
1471 /* skip any delimiter */
1472 if (*pos == '/' || *pos == '\\')
1475 /* If pos is NULL then no prepath */
1479 vol->prepath = kstrdup(pos, GFP_KERNEL);
1487 cifs_parse_mount_options(const char *mountdata, const char *devname,
1488 struct smb_vol *vol, bool is_smb3)
1491 char *mountdata_copy = NULL, *options;
1492 unsigned int temp_len, i, j;
1494 short int override_uid = -1;
1495 short int override_gid = -1;
1496 bool uid_specified = false;
1497 bool gid_specified = false;
1498 bool sloppy = false;
1499 char *invalid = NULL;
1500 char *nodename = utsname()->nodename;
1501 char *string = NULL;
1502 char *tmp_end, *value;
1504 bool got_ip = false;
1505 bool got_version = false;
1506 unsigned short port = 0;
1507 struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1511 delim = separator[0];
1513 /* ensure we always start with zeroed-out smb_vol */
1514 memset(vol, 0, sizeof(*vol));
1517 * does not have to be perfect mapping since field is
1518 * informational, only used for servers that do not support
1519 * port 445 and it can be overridden at mount time
1521 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1522 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1523 vol->source_rfc1001_name[i] = toupper(nodename[i]);
1525 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1526 /* null target name indicates to use *SMBSERVR default called name
1527 if we end up sending RFC1001 session initialize */
1528 vol->target_rfc1001_name[0] = 0;
1529 vol->cred_uid = current_uid();
1530 vol->linux_uid = current_uid();
1531 vol->linux_gid = current_gid();
1534 * default to SFM style remapping of seven reserved characters
1535 * unless user overrides it or we negotiate CIFS POSIX where
1536 * it is unnecessary. Can not simultaneously use more than one mapping
1537 * since then readdir could list files that open could not open
1541 /* default to only allowing write access to owner of the mount */
1542 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1544 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1545 /* default is always to request posix paths. */
1546 vol->posix_paths = 1;
1547 /* default to using server inode numbers where available */
1548 vol->server_ino = 1;
1550 /* default is to use strict cifs caching semantics */
1551 vol->strict_io = true;
1553 vol->actimeo = CIFS_DEF_ACTIMEO;
1555 /* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1556 vol->ops = &smb30_operations;
1557 vol->vals = &smbdefault_values;
1559 vol->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1562 goto cifs_parse_mount_err;
1564 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1565 if (!mountdata_copy)
1566 goto cifs_parse_mount_err;
1568 options = mountdata_copy;
1569 end = options + strlen(options);
1571 if (strncmp(options, "sep=", 4) == 0) {
1572 if (options[4] != 0) {
1573 separator[0] = options[4];
1576 cifs_dbg(FYI, "Null separator not allowed\n");
1579 vol->backupuid_specified = false; /* no backup intent for a user */
1580 vol->backupgid_specified = false; /* no backup intent for a group */
1582 switch (cifs_parse_devname(devname, vol)) {
1586 cifs_dbg(VFS, "Unable to allocate memory for devname.\n");
1587 goto cifs_parse_mount_err;
1589 cifs_dbg(VFS, "Malformed UNC in devname.\n");
1590 goto cifs_parse_mount_err;
1592 cifs_dbg(VFS, "Unknown error parsing devname.\n");
1593 goto cifs_parse_mount_err;
1596 while ((data = strsep(&options, separator)) != NULL) {
1597 substring_t args[MAX_OPT_ARGS];
1598 unsigned long option;
1604 token = match_token(data, cifs_mount_option_tokens, args);
1608 /* Ingnore the following */
1612 /* Boolean values */
1613 case Opt_user_xattr:
1616 case Opt_nouser_xattr:
1622 case Opt_noforceuid:
1628 case Opt_noforcegid:
1631 case Opt_noblocksend:
1632 vol->noblocksnd = 1;
1634 case Opt_noautotune:
1635 vol->noautotune = 1;
1650 vol->sfu_remap = true;
1651 vol->remap = false; /* disable SFM mapping */
1653 case Opt_nomapchars:
1654 vol->sfu_remap = false;
1658 vol->sfu_remap = false; /* disable SFU mapping */
1660 case Opt_nomapposix:
1672 case Opt_posixpaths:
1673 vol->posix_paths = 1;
1675 case Opt_noposixpaths:
1676 vol->posix_paths = 0;
1681 "conflicting unix mount options\n");
1682 vol->no_linux_ext = 1;
1685 if (vol->no_linux_ext)
1687 "conflicting unix mount options\n");
1699 * turn off mandatory locking in mode
1700 * if remote locking is turned off since the
1701 * local vfs will do advisory
1703 if (vol->file_mode ==
1704 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1705 vol->file_mode = S_IALLUGO;
1707 case Opt_nohandlecache:
1708 vol->nohandlecache = 1;
1710 case Opt_handlecache:
1711 vol->nohandlecache = 0;
1713 case Opt_forcemandatorylock:
1722 case Opt_setuidfromacl:
1723 vol->setuidfromacl = 1;
1726 vol->dynperm = true;
1729 vol->dynperm = false;
1743 case Opt_nostrictsync:
1744 vol->nostrictsync = 1;
1746 case Opt_strictsync:
1747 vol->nostrictsync = 0;
1750 vol->server_ino = 1;
1752 case Opt_noserverino:
1753 vol->server_ino = 0;
1755 case Opt_rwpidforward:
1756 vol->rwpidforward = 1;
1765 vol->no_psx_acl = 0;
1768 vol->no_psx_acl = 1;
1770 case Opt_locallease:
1771 vol->local_lease = 1;
1777 /* we do not do the following in secFlags because seal
1778 * is a per tree connection (mount) not a per socket
1779 * or per-smb connection option in the protocol
1780 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1785 pr_warn("CIFS: Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1788 #ifndef CONFIG_CIFS_FSCACHE
1789 cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1790 goto cifs_parse_mount_err;
1794 case Opt_mfsymlinks:
1795 vol->mfsymlinks = true;
1798 vol->multiuser = true;
1803 case Opt_nosharesock:
1804 vol->nosharesock = true;
1806 case Opt_nopersistent:
1807 vol->nopersistent = true;
1808 if (vol->persistent) {
1810 "persistenthandles mount options conflict\n");
1811 goto cifs_parse_mount_err;
1814 case Opt_persistent:
1815 vol->persistent = true;
1816 if ((vol->nopersistent) || (vol->resilient)) {
1818 "persistenthandles mount options conflict\n");
1819 goto cifs_parse_mount_err;
1823 vol->resilient = true;
1824 if (vol->persistent) {
1826 "persistenthandles mount options conflict\n");
1827 goto cifs_parse_mount_err;
1830 case Opt_noresilient:
1831 vol->resilient = false; /* already the default */
1833 case Opt_domainauto:
1834 vol->domainauto = true;
1840 /* Numeric Values */
1842 if (get_option_uid(args, &vol->backupuid)) {
1843 cifs_dbg(VFS, "%s: Invalid backupuid value\n",
1845 goto cifs_parse_mount_err;
1847 vol->backupuid_specified = true;
1850 if (get_option_gid(args, &vol->backupgid)) {
1851 cifs_dbg(VFS, "%s: Invalid backupgid value\n",
1853 goto cifs_parse_mount_err;
1855 vol->backupgid_specified = true;
1858 if (get_option_uid(args, &vol->linux_uid)) {
1859 cifs_dbg(VFS, "%s: Invalid uid value\n",
1861 goto cifs_parse_mount_err;
1863 uid_specified = true;
1866 if (get_option_uid(args, &vol->cred_uid)) {
1867 cifs_dbg(VFS, "%s: Invalid cruid value\n",
1869 goto cifs_parse_mount_err;
1873 if (get_option_gid(args, &vol->linux_gid)) {
1874 cifs_dbg(VFS, "%s: Invalid gid value\n",
1876 goto cifs_parse_mount_err;
1878 gid_specified = true;
1881 if (get_option_ul(args, &option)) {
1882 cifs_dbg(VFS, "%s: Invalid file_mode value\n",
1884 goto cifs_parse_mount_err;
1886 vol->file_mode = option;
1889 if (get_option_ul(args, &option)) {
1890 cifs_dbg(VFS, "%s: Invalid dir_mode value\n",
1892 goto cifs_parse_mount_err;
1894 vol->dir_mode = option;
1897 if (get_option_ul(args, &option) ||
1898 option > USHRT_MAX) {
1899 cifs_dbg(VFS, "%s: Invalid port value\n",
1901 goto cifs_parse_mount_err;
1903 port = (unsigned short)option;
1906 if (get_option_ul(args, &option)) {
1907 cifs_dbg(VFS, "%s: Invalid rsize value\n",
1909 goto cifs_parse_mount_err;
1911 vol->rsize = option;
1914 if (get_option_ul(args, &option)) {
1915 cifs_dbg(VFS, "%s: Invalid wsize value\n",
1917 goto cifs_parse_mount_err;
1919 vol->wsize = option;
1922 if (get_option_ul(args, &option)) {
1923 cifs_dbg(VFS, "%s: Invalid actimeo value\n",
1925 goto cifs_parse_mount_err;
1927 vol->actimeo = HZ * option;
1928 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
1929 cifs_dbg(VFS, "attribute cache timeout too large\n");
1930 goto cifs_parse_mount_err;
1933 case Opt_echo_interval:
1934 if (get_option_ul(args, &option)) {
1935 cifs_dbg(VFS, "%s: Invalid echo interval value\n",
1937 goto cifs_parse_mount_err;
1939 vol->echo_interval = option;
1942 if (get_option_ul(args, &option)) {
1943 cifs_dbg(VFS, "%s: Invalid snapshot time\n",
1945 goto cifs_parse_mount_err;
1947 vol->snapshot_time = option;
1949 case Opt_max_credits:
1950 if (get_option_ul(args, &option) || (option < 20) ||
1952 cifs_dbg(VFS, "%s: Invalid max_credits value\n",
1954 goto cifs_parse_mount_err;
1956 vol->max_credits = option;
1959 /* String Arguments */
1961 case Opt_blank_user:
1962 /* null user, ie. anonymous authentication */
1964 vol->username = NULL;
1967 string = match_strdup(args);
1971 if (strnlen(string, CIFS_MAX_USERNAME_LEN) >
1972 CIFS_MAX_USERNAME_LEN) {
1973 pr_warn("CIFS: username too long\n");
1974 goto cifs_parse_mount_err;
1977 kfree(vol->username);
1978 vol->username = kstrdup(string, GFP_KERNEL);
1980 goto cifs_parse_mount_err;
1982 case Opt_blank_pass:
1983 /* passwords have to be handled differently
1984 * to allow the character used for deliminator
1985 * to be passed within them
1989 * Check if this is a case where the password
1990 * starts with a delimiter
1992 tmp_end = strchr(data, '=');
1994 if (!(tmp_end < end && tmp_end[1] == delim)) {
1995 /* No it is not. Set the password to NULL */
1996 kzfree(vol->password);
1997 vol->password = NULL;
2000 /* Fallthrough - to Opt_pass below.*/
2002 /* Obtain the value string */
2003 value = strchr(data, '=');
2006 /* Set tmp_end to end of the string */
2007 tmp_end = (char *) value + strlen(value);
2009 /* Check if following character is the deliminator
2010 * If yes, we have encountered a double deliminator
2011 * reset the NULL character to the deliminator
2013 if (tmp_end < end && tmp_end[1] == delim) {
2016 /* Keep iterating until we get to a single
2017 * deliminator OR the end
2019 while ((tmp_end = strchr(tmp_end, delim))
2020 != NULL && (tmp_end[1] == delim)) {
2021 tmp_end = (char *) &tmp_end[2];
2024 /* Reset var options to point to next element */
2027 options = (char *) &tmp_end[1];
2029 /* Reached the end of the mount option
2034 kzfree(vol->password);
2035 /* Now build new password string */
2036 temp_len = strlen(value);
2037 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
2038 if (vol->password == NULL) {
2039 pr_warn("CIFS: no memory for password\n");
2040 goto cifs_parse_mount_err;
2043 for (i = 0, j = 0; i < temp_len; i++, j++) {
2044 vol->password[j] = value[i];
2045 if ((value[i] == delim) &&
2046 value[i+1] == delim)
2047 /* skip the second deliminator */
2050 vol->password[j] = '\0';
2053 /* FIXME: should this be an error instead? */
2057 string = match_strdup(args);
2061 if (!cifs_convert_address(dstaddr, string,
2063 pr_err("CIFS: bad ip= option (%s).\n", string);
2064 goto cifs_parse_mount_err;
2069 string = match_strdup(args);
2073 if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
2074 == CIFS_MAX_DOMAINNAME_LEN) {
2075 pr_warn("CIFS: domain name too long\n");
2076 goto cifs_parse_mount_err;
2079 kfree(vol->domainname);
2080 vol->domainname = kstrdup(string, GFP_KERNEL);
2081 if (!vol->domainname) {
2082 pr_warn("CIFS: no memory for domainname\n");
2083 goto cifs_parse_mount_err;
2085 cifs_dbg(FYI, "Domain name set\n");
2088 string = match_strdup(args);
2092 if (!cifs_convert_address(
2093 (struct sockaddr *)&vol->srcaddr,
2094 string, strlen(string))) {
2095 pr_warn("CIFS: Could not parse srcaddr: %s\n",
2097 goto cifs_parse_mount_err;
2101 string = match_strdup(args);
2105 if (strnlen(string, 1024) >= 65) {
2106 pr_warn("CIFS: iocharset name too long.\n");
2107 goto cifs_parse_mount_err;
2110 if (strncasecmp(string, "default", 7) != 0) {
2111 kfree(vol->iocharset);
2112 vol->iocharset = kstrdup(string,
2114 if (!vol->iocharset) {
2115 pr_warn("CIFS: no memory for charset\n");
2116 goto cifs_parse_mount_err;
2119 /* if iocharset not set then load_nls_default
2122 cifs_dbg(FYI, "iocharset set to %s\n", string);
2124 case Opt_netbiosname:
2125 string = match_strdup(args);
2129 memset(vol->source_rfc1001_name, 0x20,
2132 * FIXME: are there cases in which a comma can
2133 * be valid in workstation netbios name (and
2134 * need special handling)?
2136 for (i = 0; i < RFC1001_NAME_LEN; i++) {
2137 /* don't ucase netbiosname for user */
2140 vol->source_rfc1001_name[i] = string[i];
2142 /* The string has 16th byte zero still from
2143 * set at top of the function
2145 if (i == RFC1001_NAME_LEN && string[i] != 0)
2146 pr_warn("CIFS: netbiosname longer than 15 truncated.\n");
2149 /* servernetbiosname specified override *SMBSERVER */
2150 string = match_strdup(args);
2154 /* last byte, type, is 0x20 for servr type */
2155 memset(vol->target_rfc1001_name, 0x20,
2156 RFC1001_NAME_LEN_WITH_NULL);
2158 /* BB are there cases in which a comma can be
2159 valid in this workstation netbios name
2160 (and need special handling)? */
2162 /* user or mount helper must uppercase the
2164 for (i = 0; i < 15; i++) {
2167 vol->target_rfc1001_name[i] = string[i];
2169 /* The string has 16th byte zero still from
2170 set at top of the function */
2171 if (i == RFC1001_NAME_LEN && string[i] != 0)
2172 pr_warn("CIFS: server netbiosname longer than 15 truncated.\n");
2175 /* version of mount userspace tools, not dialect */
2176 string = match_strdup(args);
2180 /* If interface changes in mount.cifs bump to new ver */
2181 if (strncasecmp(string, "1", 1) == 0) {
2182 if (strlen(string) > 1) {
2183 pr_warn("Bad mount helper ver=%s. Did "
2184 "you want SMB1 (CIFS) dialect "
2185 "and mean to type vers=1.0 "
2186 "instead?\n", string);
2187 goto cifs_parse_mount_err;
2189 /* This is the default */
2192 /* For all other value, error */
2193 pr_warn("CIFS: Invalid mount helper version specified\n");
2194 goto cifs_parse_mount_err;
2196 /* protocol version (dialect) */
2197 string = match_strdup(args);
2201 if (cifs_parse_smb_version(string, vol, is_smb3) != 0)
2202 goto cifs_parse_mount_err;
2206 string = match_strdup(args);
2210 if (cifs_parse_security_flavors(string, vol) != 0)
2211 goto cifs_parse_mount_err;
2214 string = match_strdup(args);
2218 if (cifs_parse_cache_flavor(string, vol) != 0)
2219 goto cifs_parse_mount_err;
2223 * An option we don't recognize. Save it off for later
2224 * if we haven't already found one
2230 /* Free up any allocated string */
2235 if (!sloppy && invalid) {
2236 pr_err("CIFS: Unknown mount option \"%s\"\n", invalid);
2237 goto cifs_parse_mount_err;
2240 if (vol->rdma && vol->vals->protocol_id < SMB30_PROT_ID) {
2241 cifs_dbg(VFS, "SMB Direct requires Version >=3.0\n");
2242 goto cifs_parse_mount_err;
2246 /* Muliuser mounts require CONFIG_KEYS support */
2247 if (vol->multiuser) {
2248 cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
2249 goto cifs_parse_mount_err;
2253 cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
2254 goto cifs_parse_mount_err;
2257 /* make sure UNC has a share name */
2258 if (!strchr(vol->UNC + 3, '\\')) {
2259 cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
2260 goto cifs_parse_mount_err;
2267 /* No ip= option specified? Try to get it from UNC */
2268 /* Use the address part of the UNC. */
2269 slash = strchr(&vol->UNC[2], '\\');
2270 len = slash - &vol->UNC[2];
2271 if (!cifs_convert_address(dstaddr, &vol->UNC[2], len)) {
2272 pr_err("Unable to determine destination address.\n");
2273 goto cifs_parse_mount_err;
2277 /* set the port that we got earlier */
2278 cifs_set_port(dstaddr, port);
2281 vol->override_uid = override_uid;
2282 else if (override_uid == 1)
2283 pr_notice("CIFS: ignoring forceuid mount option specified with no uid= option.\n");
2286 vol->override_gid = override_gid;
2287 else if (override_gid == 1)
2288 pr_notice("CIFS: ignoring forcegid mount option specified with no gid= option.\n");
2290 if (got_version == false)
2291 pr_warn("No dialect specified on mount. Default has changed to "
2292 "a more secure dialect, SMB2.1 or later (e.g. SMB3), from CIFS "
2293 "(SMB1). To use the less secure SMB1 dialect to access "
2294 "old servers which do not support SMB3 (or SMB2.1) specify vers=1.0"
2297 kfree(mountdata_copy);
2301 pr_warn("Could not allocate temporary buffer\n");
2302 cifs_parse_mount_err:
2304 kfree(mountdata_copy);
2308 /** Returns true if srcaddr isn't specified and rhs isn't
2309 * specified, or if srcaddr is specified and
2310 * matches the IP address of the rhs argument.
2313 srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
2315 switch (srcaddr->sa_family) {
2317 return (rhs->sa_family == AF_UNSPEC);
2319 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
2320 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
2321 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
2324 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
2325 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
2326 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
2330 return false; /* don't expect to be here */
2335 * If no port is specified in addr structure, we try to match with 445 port
2336 * and if it fails - with 139 ports. It should be called only if address
2337 * families of server and addr are equal.
2340 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
2342 __be16 port, *sport;
2344 switch (addr->sa_family) {
2346 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
2347 port = ((struct sockaddr_in *) addr)->sin_port;
2350 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
2351 port = ((struct sockaddr_in6 *) addr)->sin6_port;
2359 port = htons(CIFS_PORT);
2363 port = htons(RFC1001_PORT);
2366 return port == *sport;
2370 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
2371 struct sockaddr *srcaddr)
2373 switch (addr->sa_family) {
2375 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
2376 struct sockaddr_in *srv_addr4 =
2377 (struct sockaddr_in *)&server->dstaddr;
2379 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
2384 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
2385 struct sockaddr_in6 *srv_addr6 =
2386 (struct sockaddr_in6 *)&server->dstaddr;
2388 if (!ipv6_addr_equal(&addr6->sin6_addr,
2389 &srv_addr6->sin6_addr))
2391 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
2397 return false; /* don't expect to be here */
2400 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
2407 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2410 * The select_sectype function should either return the vol->sectype
2411 * that was specified, or "Unspecified" if that sectype was not
2412 * compatible with the given NEGOTIATE request.
2414 if (server->ops->select_sectype(server, vol->sectype)
2419 * Now check if signing mode is acceptable. No need to check
2420 * global_secflags at this point since if MUST_SIGN is set then
2421 * the server->sign had better be too.
2423 if (vol->sign && !server->sign)
2429 static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
2431 struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2433 if (vol->nosharesock)
2436 /* BB update this for smb3any and default case */
2437 if ((server->vals != vol->vals) || (server->ops != vol->ops))
2440 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2443 if (!match_address(server, addr,
2444 (struct sockaddr *)&vol->srcaddr))
2447 if (!match_port(server, addr))
2450 if (!match_security(server, vol))
2453 if (server->echo_interval != vol->echo_interval * HZ)
2456 if (server->rdma != vol->rdma)
2462 struct TCP_Server_Info *
2463 cifs_find_tcp_session(struct smb_vol *vol)
2465 struct TCP_Server_Info *server;
2467 spin_lock(&cifs_tcp_ses_lock);
2468 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
2469 if (!match_server(server, vol))
2472 ++server->srv_count;
2473 spin_unlock(&cifs_tcp_ses_lock);
2474 cifs_dbg(FYI, "Existing tcp session with server found\n");
2477 spin_unlock(&cifs_tcp_ses_lock);
2482 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
2484 struct task_struct *task;
2486 spin_lock(&cifs_tcp_ses_lock);
2487 if (--server->srv_count > 0) {
2488 spin_unlock(&cifs_tcp_ses_lock);
2492 put_net(cifs_net_ns(server));
2494 list_del_init(&server->tcp_ses_list);
2495 spin_unlock(&cifs_tcp_ses_lock);
2497 cancel_delayed_work_sync(&server->echo);
2501 * Avoid deadlock here: reconnect work calls
2502 * cifs_put_tcp_session() at its end. Need to be sure
2503 * that reconnect work does nothing with server pointer after
2506 cancel_delayed_work(&server->reconnect);
2508 cancel_delayed_work_sync(&server->reconnect);
2510 spin_lock(&GlobalMid_Lock);
2511 server->tcpStatus = CifsExiting;
2512 spin_unlock(&GlobalMid_Lock);
2514 cifs_crypto_secmech_release(server);
2515 cifs_fscache_release_client_cookie(server);
2517 kfree(server->session_key.response);
2518 server->session_key.response = NULL;
2519 server->session_key.len = 0;
2521 task = xchg(&server->tsk, NULL);
2523 force_sig(SIGKILL, task);
2526 static struct TCP_Server_Info *
2527 cifs_get_tcp_session(struct smb_vol *volume_info)
2529 struct TCP_Server_Info *tcp_ses = NULL;
2532 cifs_dbg(FYI, "UNC: %s\n", volume_info->UNC);
2534 /* see if we already have a matching tcp_ses */
2535 tcp_ses = cifs_find_tcp_session(volume_info);
2539 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2545 tcp_ses->ops = volume_info->ops;
2546 tcp_ses->vals = volume_info->vals;
2547 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2548 tcp_ses->hostname = extract_hostname(volume_info->UNC);
2549 if (IS_ERR(tcp_ses->hostname)) {
2550 rc = PTR_ERR(tcp_ses->hostname);
2551 goto out_err_crypto_release;
2554 tcp_ses->noblocksnd = volume_info->noblocksnd;
2555 tcp_ses->noautotune = volume_info->noautotune;
2556 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2557 tcp_ses->rdma = volume_info->rdma;
2558 tcp_ses->in_flight = 0;
2559 tcp_ses->credits = 1;
2560 init_waitqueue_head(&tcp_ses->response_q);
2561 init_waitqueue_head(&tcp_ses->request_q);
2562 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2563 mutex_init(&tcp_ses->srv_mutex);
2564 memcpy(tcp_ses->workstation_RFC1001_name,
2565 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2566 memcpy(tcp_ses->server_RFC1001_name,
2567 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2568 tcp_ses->session_estab = false;
2569 tcp_ses->sequence_number = 0;
2570 tcp_ses->reconnect_instance = 0;
2571 tcp_ses->lstrp = jiffies;
2572 spin_lock_init(&tcp_ses->req_lock);
2573 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2574 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2575 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2576 INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
2577 mutex_init(&tcp_ses->reconnect_mutex);
2578 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2579 sizeof(tcp_ses->srcaddr));
2580 memcpy(&tcp_ses->dstaddr, &volume_info->dstaddr,
2581 sizeof(tcp_ses->dstaddr));
2582 generate_random_uuid(tcp_ses->client_guid);
2584 * at this point we are the only ones with the pointer
2585 * to the struct since the kernel thread not created yet
2586 * no need to spinlock this init of tcpStatus or srv_count
2588 tcp_ses->tcpStatus = CifsNew;
2589 ++tcp_ses->srv_count;
2591 if (volume_info->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
2592 volume_info->echo_interval <= SMB_ECHO_INTERVAL_MAX)
2593 tcp_ses->echo_interval = volume_info->echo_interval * HZ;
2595 tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
2596 if (tcp_ses->rdma) {
2597 #ifndef CONFIG_CIFS_SMB_DIRECT
2598 cifs_dbg(VFS, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
2600 goto out_err_crypto_release;
2602 tcp_ses->smbd_conn = smbd_get_connection(
2603 tcp_ses, (struct sockaddr *)&volume_info->dstaddr);
2604 if (tcp_ses->smbd_conn) {
2605 cifs_dbg(VFS, "RDMA transport established\n");
2607 goto smbd_connected;
2610 goto out_err_crypto_release;
2613 rc = ip_connect(tcp_ses);
2615 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
2616 goto out_err_crypto_release;
2620 * since we're in a cifs function already, we know that
2621 * this will succeed. No need for try_module_get().
2623 __module_get(THIS_MODULE);
2624 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2626 if (IS_ERR(tcp_ses->tsk)) {
2627 rc = PTR_ERR(tcp_ses->tsk);
2628 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
2629 module_put(THIS_MODULE);
2630 goto out_err_crypto_release;
2632 tcp_ses->tcpStatus = CifsNeedNegotiate;
2634 tcp_ses->nr_targets = 1;
2636 /* thread spawned, put it on the list */
2637 spin_lock(&cifs_tcp_ses_lock);
2638 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2639 spin_unlock(&cifs_tcp_ses_lock);
2641 cifs_fscache_get_client_cookie(tcp_ses);
2643 /* queue echo request delayed work */
2644 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
2648 out_err_crypto_release:
2649 cifs_crypto_secmech_release(tcp_ses);
2651 put_net(cifs_net_ns(tcp_ses));
2655 if (!IS_ERR(tcp_ses->hostname))
2656 kfree(tcp_ses->hostname);
2657 if (tcp_ses->ssocket)
2658 sock_release(tcp_ses->ssocket);
2664 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2666 if (vol->sectype != Unspecified &&
2667 vol->sectype != ses->sectype)
2670 switch (ses->sectype) {
2672 if (!uid_eq(vol->cred_uid, ses->cred_uid))
2676 /* NULL username means anonymous session */
2677 if (ses->user_name == NULL) {
2683 /* anything else takes username/password */
2684 if (strncmp(ses->user_name,
2685 vol->username ? vol->username : "",
2686 CIFS_MAX_USERNAME_LEN))
2688 if ((vol->username && strlen(vol->username) != 0) &&
2689 ses->password != NULL &&
2690 strncmp(ses->password,
2691 vol->password ? vol->password : "",
2692 CIFS_MAX_PASSWORD_LEN))
2699 * cifs_setup_ipc - helper to setup the IPC tcon for the session
2701 * A new IPC connection is made and stored in the session
2702 * tcon_ipc. The IPC tcon has the same lifetime as the session.
2705 cifs_setup_ipc(struct cifs_ses *ses, struct smb_vol *volume_info)
2708 struct cifs_tcon *tcon;
2709 struct nls_table *nls_codepage;
2710 char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0};
2714 * If the mount request that resulted in the creation of the
2715 * session requires encryption, force IPC to be encrypted too.
2717 if (volume_info->seal) {
2718 if (ses->server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
2722 "IPC: server doesn't support encryption\n");
2727 tcon = tconInfoAlloc();
2731 snprintf(unc, sizeof(unc), "\\\\%s\\IPC$", ses->server->hostname);
2734 nls_codepage = load_nls_default();
2740 rc = ses->server->ops->tree_connect(xid, ses, unc, tcon, nls_codepage);
2744 cifs_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
2749 cifs_dbg(FYI, "IPC tcon rc = %d ipc tid = %d\n", rc, tcon->tid);
2751 ses->tcon_ipc = tcon;
2753 unload_nls(nls_codepage);
2758 * cifs_free_ipc - helper to release the session IPC tcon
2760 * Needs to be called everytime a session is destroyed
2763 cifs_free_ipc(struct cifs_ses *ses)
2766 struct cifs_tcon *tcon = ses->tcon_ipc;
2771 if (ses->server->ops->tree_disconnect) {
2773 rc = ses->server->ops->tree_disconnect(xid, tcon);
2778 cifs_dbg(FYI, "failed to disconnect IPC tcon (rc=%d)\n", rc);
2781 ses->tcon_ipc = NULL;
2785 static struct cifs_ses *
2786 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
2788 struct cifs_ses *ses;
2790 spin_lock(&cifs_tcp_ses_lock);
2791 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
2792 if (ses->status == CifsExiting)
2794 if (!match_session(ses, vol))
2797 spin_unlock(&cifs_tcp_ses_lock);
2800 spin_unlock(&cifs_tcp_ses_lock);
2805 cifs_put_smb_ses(struct cifs_ses *ses)
2807 unsigned int rc, xid;
2808 struct TCP_Server_Info *server = ses->server;
2810 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
2812 spin_lock(&cifs_tcp_ses_lock);
2813 if (ses->status == CifsExiting) {
2814 spin_unlock(&cifs_tcp_ses_lock);
2817 if (--ses->ses_count > 0) {
2818 spin_unlock(&cifs_tcp_ses_lock);
2821 if (ses->status == CifsGood)
2822 ses->status = CifsExiting;
2823 spin_unlock(&cifs_tcp_ses_lock);
2827 if (ses->status == CifsExiting && server->ops->logoff) {
2829 rc = server->ops->logoff(xid, ses);
2831 cifs_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
2836 spin_lock(&cifs_tcp_ses_lock);
2837 list_del_init(&ses->smb_ses_list);
2838 spin_unlock(&cifs_tcp_ses_lock);
2841 cifs_put_tcp_session(server, 0);
2846 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
2847 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
2849 /* Populate username and pw fields from keyring if possible */
2851 cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
2854 const char *delim, *payload;
2858 struct TCP_Server_Info *server = ses->server;
2859 struct sockaddr_in *sa;
2860 struct sockaddr_in6 *sa6;
2861 const struct user_key_payload *upayload;
2863 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
2867 /* try to find an address key first */
2868 switch (server->dstaddr.ss_family) {
2870 sa = (struct sockaddr_in *)&server->dstaddr;
2871 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
2874 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
2875 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
2878 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
2879 server->dstaddr.ss_family);
2884 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2885 key = request_key(&key_type_logon, desc, "");
2887 if (!ses->domainName) {
2888 cifs_dbg(FYI, "domainName is NULL\n");
2893 /* didn't work, try to find a domain key */
2894 sprintf(desc, "cifs:d:%s", ses->domainName);
2895 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2896 key = request_key(&key_type_logon, desc, "");
2903 down_read(&key->sem);
2904 upayload = user_key_payload_locked(key);
2905 if (IS_ERR_OR_NULL(upayload)) {
2906 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
2910 /* find first : in payload */
2911 payload = upayload->data;
2912 delim = strnchr(payload, upayload->datalen, ':');
2913 cifs_dbg(FYI, "payload=%s\n", payload);
2915 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
2921 len = delim - payload;
2922 if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
2923 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
2929 vol->username = kstrndup(payload, len, GFP_KERNEL);
2930 if (!vol->username) {
2931 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
2936 cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
2938 len = key->datalen - (len + 1);
2939 if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
2940 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
2942 kfree(vol->username);
2943 vol->username = NULL;
2948 vol->password = kstrndup(delim, len, GFP_KERNEL);
2949 if (!vol->password) {
2950 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
2953 kfree(vol->username);
2954 vol->username = NULL;
2963 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
2966 #else /* ! CONFIG_KEYS */
2968 cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
2969 struct cifs_ses *ses __attribute__((unused)))
2973 #endif /* CONFIG_KEYS */
2976 * cifs_get_smb_ses - get a session matching @volume_info data from @server
2978 * This function assumes it is being called from cifs_mount() where we
2979 * already got a server reference (server refcount +1). See
2980 * cifs_get_tcon() for refcount explanations.
2982 static struct cifs_ses *
2983 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
2987 struct cifs_ses *ses;
2988 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2989 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2993 ses = cifs_find_smb_ses(server, volume_info);
2995 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
2998 mutex_lock(&ses->session_mutex);
2999 rc = cifs_negotiate_protocol(xid, ses);
3001 mutex_unlock(&ses->session_mutex);
3002 /* problem -- put our ses reference */
3003 cifs_put_smb_ses(ses);
3007 if (ses->need_reconnect) {
3008 cifs_dbg(FYI, "Session needs reconnect\n");
3009 rc = cifs_setup_session(xid, ses,
3010 volume_info->local_nls);
3012 mutex_unlock(&ses->session_mutex);
3013 /* problem -- put our reference */
3014 cifs_put_smb_ses(ses);
3019 mutex_unlock(&ses->session_mutex);
3021 /* existing SMB ses has a server reference already */
3022 cifs_put_tcp_session(server, 0);
3027 cifs_dbg(FYI, "Existing smb sess not found\n");
3028 ses = sesInfoAlloc();
3032 /* new SMB session uses our server ref */
3033 ses->server = server;
3034 if (server->dstaddr.ss_family == AF_INET6)
3035 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
3037 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
3039 if (volume_info->username) {
3040 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
3041 if (!ses->user_name)
3045 /* volume_info->password freed at unmount */
3046 if (volume_info->password) {
3047 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
3051 if (volume_info->domainname) {
3052 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
3053 if (!ses->domainName)
3056 if (volume_info->domainauto)
3057 ses->domainAuto = volume_info->domainauto;
3058 ses->cred_uid = volume_info->cred_uid;
3059 ses->linux_uid = volume_info->linux_uid;
3061 ses->sectype = volume_info->sectype;
3062 ses->sign = volume_info->sign;
3064 mutex_lock(&ses->session_mutex);
3065 rc = cifs_negotiate_protocol(xid, ses);
3067 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
3068 mutex_unlock(&ses->session_mutex);
3072 /* success, put it on the list */
3073 spin_lock(&cifs_tcp_ses_lock);
3074 list_add(&ses->smb_ses_list, &server->smb_ses_list);
3075 spin_unlock(&cifs_tcp_ses_lock);
3079 cifs_setup_ipc(ses, volume_info);
3089 static int match_tcon(struct cifs_tcon *tcon, struct smb_vol *volume_info)
3091 if (tcon->tidStatus == CifsExiting)
3093 if (strncmp(tcon->treeName, volume_info->UNC, MAX_TREE_SIZE))
3095 if (tcon->seal != volume_info->seal)
3097 if (tcon->snapshot_time != volume_info->snapshot_time)
3102 static struct cifs_tcon *
3103 cifs_find_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3105 struct list_head *tmp;
3106 struct cifs_tcon *tcon;
3108 spin_lock(&cifs_tcp_ses_lock);
3109 list_for_each(tmp, &ses->tcon_list) {
3110 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
3111 if (!match_tcon(tcon, volume_info))
3114 spin_unlock(&cifs_tcp_ses_lock);
3117 spin_unlock(&cifs_tcp_ses_lock);
3122 cifs_put_tcon(struct cifs_tcon *tcon)
3125 struct cifs_ses *ses;
3128 * IPC tcon share the lifetime of their session and are
3129 * destroyed in the session put function
3131 if (tcon == NULL || tcon->ipc)
3135 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
3136 spin_lock(&cifs_tcp_ses_lock);
3137 if (--tcon->tc_count > 0) {
3138 spin_unlock(&cifs_tcp_ses_lock);
3142 list_del_init(&tcon->tcon_list);
3143 spin_unlock(&cifs_tcp_ses_lock);
3146 if (ses->server->ops->tree_disconnect)
3147 ses->server->ops->tree_disconnect(xid, tcon);
3150 cifs_fscache_release_super_cookie(tcon);
3152 cifs_put_smb_ses(ses);
3156 * cifs_get_tcon - get a tcon matching @volume_info data from @ses
3158 * - tcon refcount is the number of mount points using the tcon.
3159 * - ses refcount is the number of tcon using the session.
3161 * 1. This function assumes it is being called from cifs_mount() where
3162 * we already got a session reference (ses refcount +1).
3164 * 2. Since we're in the context of adding a mount point, the end
3165 * result should be either:
3167 * a) a new tcon already allocated with refcount=1 (1 mount point) and
3168 * its session refcount incremented (1 new tcon). This +1 was
3169 * already done in (1).
3171 * b) an existing tcon with refcount+1 (add a mount point to it) and
3172 * identical ses refcount (no new tcon). Because of (1) we need to
3173 * decrement the ses refcount.
3175 static struct cifs_tcon *
3176 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3179 struct cifs_tcon *tcon;
3181 tcon = cifs_find_tcon(ses, volume_info);
3184 * tcon has refcount already incremented but we need to
3185 * decrement extra ses reference gotten by caller (case b)
3187 cifs_dbg(FYI, "Found match on UNC path\n");
3188 cifs_put_smb_ses(ses);
3192 if (!ses->server->ops->tree_connect) {
3197 tcon = tconInfoAlloc();
3203 if (volume_info->snapshot_time) {
3204 if (ses->server->vals->protocol_id == 0) {
3206 "Use SMB2 or later for snapshot mount option\n");
3210 tcon->snapshot_time = volume_info->snapshot_time;
3214 if (volume_info->password) {
3215 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
3216 if (!tcon->password) {
3222 if (volume_info->seal) {
3223 if (ses->server->vals->protocol_id == 0) {
3225 "SMB3 or later required for encryption\n");
3228 } else if (tcon->ses->server->capabilities &
3229 SMB2_GLOBAL_CAP_ENCRYPTION)
3232 cifs_dbg(VFS, "Encryption is not supported on share\n");
3238 if (volume_info->linux_ext) {
3239 if (ses->server->posix_ext_supported) {
3240 tcon->posix_extensions = true;
3241 printk_once(KERN_WARNING
3242 "SMB3.11 POSIX Extensions are experimental\n");
3244 cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions.\n");
3251 * BB Do we need to wrap session_mutex around this TCon call and Unix
3252 * SetFS as we do on SessSetup and reconnect?
3255 rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
3256 volume_info->local_nls);
3258 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
3262 tcon->use_persistent = false;
3263 /* check if SMB2 or later, CIFS does not support persistent handles */
3264 if (volume_info->persistent) {
3265 if (ses->server->vals->protocol_id == 0) {
3267 "SMB3 or later required for persistent handles\n");
3270 } else if (ses->server->capabilities &
3271 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3272 tcon->use_persistent = true;
3273 else /* persistent handles requested but not supported */ {
3275 "Persistent handles not supported on share\n");
3279 } else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
3280 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3281 && (volume_info->nopersistent == false)) {
3282 cifs_dbg(FYI, "enabling persistent handles\n");
3283 tcon->use_persistent = true;
3284 } else if (volume_info->resilient) {
3285 if (ses->server->vals->protocol_id == 0) {
3287 "SMB2.1 or later required for resilient handles\n");
3291 tcon->use_resilient = true;
3295 * We can have only one retry value for a connection to a share so for
3296 * resources mounted more than once to the same server share the last
3297 * value passed in for the retry flag is used.
3299 tcon->retry = volume_info->retry;
3300 tcon->nocase = volume_info->nocase;
3301 tcon->nohandlecache = volume_info->nohandlecache;
3302 tcon->local_lease = volume_info->local_lease;
3303 INIT_LIST_HEAD(&tcon->pending_opens);
3305 spin_lock(&cifs_tcp_ses_lock);
3306 list_add(&tcon->tcon_list, &ses->tcon_list);
3307 spin_unlock(&cifs_tcp_ses_lock);
3309 cifs_fscache_get_super_cookie(tcon);
3319 cifs_put_tlink(struct tcon_link *tlink)
3321 if (!tlink || IS_ERR(tlink))
3324 if (!atomic_dec_and_test(&tlink->tl_count) ||
3325 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
3326 tlink->tl_time = jiffies;
3330 if (!IS_ERR(tlink_tcon(tlink)))
3331 cifs_put_tcon(tlink_tcon(tlink));
3337 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3339 struct cifs_sb_info *old = CIFS_SB(sb);
3340 struct cifs_sb_info *new = mnt_data->cifs_sb;
3342 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
3345 if ((old->mnt_cifs_flags & CIFS_MOUNT_MASK) !=
3346 (new->mnt_cifs_flags & CIFS_MOUNT_MASK))
3350 * We want to share sb only if we don't specify an r/wsize or
3351 * specified r/wsize is greater than or equal to existing one.
3353 if (new->wsize && new->wsize < old->wsize)
3356 if (new->rsize && new->rsize < old->rsize)
3359 if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))
3362 if (old->mnt_file_mode != new->mnt_file_mode ||
3363 old->mnt_dir_mode != new->mnt_dir_mode)
3366 if (strcmp(old->local_nls->charset, new->local_nls->charset))
3369 if (old->actimeo != new->actimeo)
3376 match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3378 struct cifs_sb_info *old = CIFS_SB(sb);
3379 struct cifs_sb_info *new = mnt_data->cifs_sb;
3380 bool old_set = old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH;
3381 bool new_set = new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH;
3383 if (old_set && new_set && !strcmp(new->prepath, old->prepath))
3385 else if (!old_set && !new_set)
3392 cifs_match_super(struct super_block *sb, void *data)
3394 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
3395 struct smb_vol *volume_info;
3396 struct cifs_sb_info *cifs_sb;
3397 struct TCP_Server_Info *tcp_srv;
3398 struct cifs_ses *ses;
3399 struct cifs_tcon *tcon;
3400 struct tcon_link *tlink;
3403 spin_lock(&cifs_tcp_ses_lock);
3404 cifs_sb = CIFS_SB(sb);
3405 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3406 if (IS_ERR(tlink)) {
3407 spin_unlock(&cifs_tcp_ses_lock);
3410 tcon = tlink_tcon(tlink);
3412 tcp_srv = ses->server;
3414 volume_info = mnt_data->vol;
3416 if (!match_server(tcp_srv, volume_info) ||
3417 !match_session(ses, volume_info) ||
3418 !match_tcon(tcon, volume_info) ||
3419 !match_prepath(sb, mnt_data)) {
3424 rc = compare_mount_options(sb, mnt_data);
3426 spin_unlock(&cifs_tcp_ses_lock);
3427 cifs_put_tlink(tlink);
3431 #ifdef CONFIG_DEBUG_LOCK_ALLOC
3432 static struct lock_class_key cifs_key[2];
3433 static struct lock_class_key cifs_slock_key[2];
3436 cifs_reclassify_socket4(struct socket *sock)
3438 struct sock *sk = sock->sk;
3439 BUG_ON(!sock_allow_reclassification(sk));
3440 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
3441 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
3445 cifs_reclassify_socket6(struct socket *sock)
3447 struct sock *sk = sock->sk;
3448 BUG_ON(!sock_allow_reclassification(sk));
3449 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
3450 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
3454 cifs_reclassify_socket4(struct socket *sock)
3459 cifs_reclassify_socket6(struct socket *sock)
3464 /* See RFC1001 section 14 on representation of Netbios names */
3465 static void rfc1002mangle(char *target, char *source, unsigned int length)
3469 for (i = 0, j = 0; i < (length); i++) {
3470 /* mask a nibble at a time and encode */
3471 target[j] = 'A' + (0x0F & (source[i] >> 4));
3472 target[j+1] = 'A' + (0x0F & source[i]);
3479 bind_socket(struct TCP_Server_Info *server)
3482 if (server->srcaddr.ss_family != AF_UNSPEC) {
3483 /* Bind to the specified local IP address */
3484 struct socket *socket = server->ssocket;
3485 rc = socket->ops->bind(socket,
3486 (struct sockaddr *) &server->srcaddr,
3487 sizeof(server->srcaddr));
3489 struct sockaddr_in *saddr4;
3490 struct sockaddr_in6 *saddr6;
3491 saddr4 = (struct sockaddr_in *)&server->srcaddr;
3492 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
3493 if (saddr6->sin6_family == AF_INET6)
3494 cifs_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
3495 &saddr6->sin6_addr, rc);
3497 cifs_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
3498 &saddr4->sin_addr.s_addr, rc);
3505 ip_rfc1001_connect(struct TCP_Server_Info *server)
3509 * some servers require RFC1001 sessinit before sending
3510 * negprot - BB check reconnection in case where second
3511 * sessinit is sent but no second negprot
3513 struct rfc1002_session_packet *ses_init_buf;
3514 struct smb_hdr *smb_buf;
3515 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
3518 ses_init_buf->trailer.session_req.called_len = 32;
3520 if (server->server_RFC1001_name[0] != 0)
3521 rfc1002mangle(ses_init_buf->trailer.
3522 session_req.called_name,
3523 server->server_RFC1001_name,
3524 RFC1001_NAME_LEN_WITH_NULL);
3526 rfc1002mangle(ses_init_buf->trailer.
3527 session_req.called_name,
3528 DEFAULT_CIFS_CALLED_NAME,
3529 RFC1001_NAME_LEN_WITH_NULL);
3531 ses_init_buf->trailer.session_req.calling_len = 32;
3534 * calling name ends in null (byte 16) from old smb
3537 if (server->workstation_RFC1001_name[0] != 0)
3538 rfc1002mangle(ses_init_buf->trailer.
3539 session_req.calling_name,
3540 server->workstation_RFC1001_name,
3541 RFC1001_NAME_LEN_WITH_NULL);
3543 rfc1002mangle(ses_init_buf->trailer.
3544 session_req.calling_name,
3546 RFC1001_NAME_LEN_WITH_NULL);
3548 ses_init_buf->trailer.session_req.scope1 = 0;
3549 ses_init_buf->trailer.session_req.scope2 = 0;
3550 smb_buf = (struct smb_hdr *)ses_init_buf;
3552 /* sizeof RFC1002_SESSION_REQUEST with no scope */
3553 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
3554 rc = smb_send(server, smb_buf, 0x44);
3555 kfree(ses_init_buf);
3557 * RFC1001 layer in at least one server
3558 * requires very short break before negprot
3559 * presumably because not expecting negprot
3560 * to follow so fast. This is a simple
3561 * solution that works without
3562 * complicating the code and causes no
3563 * significant slowing down on mount
3566 usleep_range(1000, 2000);
3569 * else the negprot may still work without this
3570 * even though malloc failed
3577 generic_ip_connect(struct TCP_Server_Info *server)
3582 struct socket *socket = server->ssocket;
3583 struct sockaddr *saddr;
3585 saddr = (struct sockaddr *) &server->dstaddr;
3587 if (server->dstaddr.ss_family == AF_INET6) {
3588 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
3589 slen = sizeof(struct sockaddr_in6);
3592 sport = ((struct sockaddr_in *) saddr)->sin_port;
3593 slen = sizeof(struct sockaddr_in);
3597 if (socket == NULL) {
3598 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3599 IPPROTO_TCP, &socket, 1);
3601 cifs_dbg(VFS, "Error %d creating socket\n", rc);
3602 server->ssocket = NULL;
3606 /* BB other socket options to set KEEPALIVE, NODELAY? */
3607 cifs_dbg(FYI, "Socket created\n");
3608 server->ssocket = socket;
3609 socket->sk->sk_allocation = GFP_NOFS;
3610 if (sfamily == AF_INET6)
3611 cifs_reclassify_socket6(socket);
3613 cifs_reclassify_socket4(socket);
3616 rc = bind_socket(server);
3621 * Eventually check for other socket options to change from
3622 * the default. sock_setsockopt not used because it expects
3625 socket->sk->sk_rcvtimeo = 7 * HZ;
3626 socket->sk->sk_sndtimeo = 5 * HZ;
3628 /* make the bufsizes depend on wsize/rsize and max requests */
3629 if (server->noautotune) {
3630 if (socket->sk->sk_sndbuf < (200 * 1024))
3631 socket->sk->sk_sndbuf = 200 * 1024;
3632 if (socket->sk->sk_rcvbuf < (140 * 1024))
3633 socket->sk->sk_rcvbuf = 140 * 1024;
3636 if (server->tcp_nodelay) {
3638 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
3639 (char *)&val, sizeof(val));
3641 cifs_dbg(FYI, "set TCP_NODELAY socket option error %d\n",
3645 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3646 socket->sk->sk_sndbuf,
3647 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3649 rc = socket->ops->connect(socket, saddr, slen, 0);
3651 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3652 sock_release(socket);
3653 server->ssocket = NULL;
3657 if (sport == htons(RFC1001_PORT))
3658 rc = ip_rfc1001_connect(server);
3664 ip_connect(struct TCP_Server_Info *server)
3667 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3668 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3670 if (server->dstaddr.ss_family == AF_INET6)
3671 sport = &addr6->sin6_port;
3673 sport = &addr->sin_port;
3678 /* try with 445 port at first */
3679 *sport = htons(CIFS_PORT);
3681 rc = generic_ip_connect(server);
3685 /* if it failed, try with 139 port */
3686 *sport = htons(RFC1001_PORT);
3689 return generic_ip_connect(server);
3692 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
3693 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
3695 /* if we are reconnecting then should we check to see if
3696 * any requested capabilities changed locally e.g. via
3697 * remount but we can not do much about it here
3698 * if they have (even if we could detect it by the following)
3699 * Perhaps we could add a backpointer to array of sb from tcon
3700 * or if we change to make all sb to same share the same
3701 * sb as NFS - then we only have one backpointer to sb.
3702 * What if we wanted to mount the server share twice once with
3703 * and once without posixacls or posix paths? */
3704 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3706 if (vol_info && vol_info->no_linux_ext) {
3707 tcon->fsUnixInfo.Capability = 0;
3708 tcon->unix_ext = 0; /* Unix Extensions disabled */
3709 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
3711 } else if (vol_info)
3712 tcon->unix_ext = 1; /* Unix Extensions supported */
3714 if (tcon->unix_ext == 0) {
3715 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
3719 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
3720 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3721 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
3722 /* check for reconnect case in which we do not
3723 want to change the mount behavior if we can avoid it */
3724 if (vol_info == NULL) {
3725 /* turn off POSIX ACL and PATHNAMES if not set
3726 originally at mount time */
3727 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
3728 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3729 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3730 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3731 cifs_dbg(VFS, "POSIXPATH support change\n");
3732 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3733 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3734 cifs_dbg(VFS, "possible reconnect error\n");
3735 cifs_dbg(VFS, "server disabled POSIX path support\n");
3739 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3740 cifs_dbg(VFS, "per-share encryption not supported yet\n");
3742 cap &= CIFS_UNIX_CAP_MASK;
3743 if (vol_info && vol_info->no_psx_acl)
3744 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3745 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
3746 cifs_dbg(FYI, "negotiated posix acl support\n");
3748 cifs_sb->mnt_cifs_flags |=
3749 CIFS_MOUNT_POSIXACL;
3752 if (vol_info && vol_info->posix_paths == 0)
3753 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3754 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
3755 cifs_dbg(FYI, "negotiate posix pathnames\n");
3757 cifs_sb->mnt_cifs_flags |=
3758 CIFS_MOUNT_POSIX_PATHS;
3761 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
3762 #ifdef CONFIG_CIFS_DEBUG2
3763 if (cap & CIFS_UNIX_FCNTL_CAP)
3764 cifs_dbg(FYI, "FCNTL cap\n");
3765 if (cap & CIFS_UNIX_EXTATTR_CAP)
3766 cifs_dbg(FYI, "EXTATTR cap\n");
3767 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3768 cifs_dbg(FYI, "POSIX path cap\n");
3769 if (cap & CIFS_UNIX_XATTR_CAP)
3770 cifs_dbg(FYI, "XATTR cap\n");
3771 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
3772 cifs_dbg(FYI, "POSIX ACL cap\n");
3773 if (cap & CIFS_UNIX_LARGE_READ_CAP)
3774 cifs_dbg(FYI, "very large read cap\n");
3775 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
3776 cifs_dbg(FYI, "very large write cap\n");
3777 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
3778 cifs_dbg(FYI, "transport encryption cap\n");
3779 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3780 cifs_dbg(FYI, "mandatory transport encryption cap\n");
3781 #endif /* CIFS_DEBUG2 */
3782 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
3783 if (vol_info == NULL) {
3784 cifs_dbg(FYI, "resetting capabilities failed\n");
3786 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");
3792 int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
3793 struct cifs_sb_info *cifs_sb)
3795 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
3797 spin_lock_init(&cifs_sb->tlink_tree_lock);
3798 cifs_sb->tlink_tree = RB_ROOT;
3801 * Temporarily set r/wsize for matching superblock. If we end up using
3802 * new sb then client will later negotiate it downward if needed.
3804 cifs_sb->rsize = pvolume_info->rsize;
3805 cifs_sb->wsize = pvolume_info->wsize;
3807 cifs_sb->mnt_uid = pvolume_info->linux_uid;
3808 cifs_sb->mnt_gid = pvolume_info->linux_gid;
3809 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
3810 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
3811 cifs_dbg(FYI, "file mode: 0x%hx dir mode: 0x%hx\n",
3812 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
3814 cifs_sb->actimeo = pvolume_info->actimeo;
3815 cifs_sb->local_nls = pvolume_info->local_nls;
3817 if (pvolume_info->nodfs)
3818 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_DFS;
3819 if (pvolume_info->noperm)
3820 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
3821 if (pvolume_info->setuids)
3822 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
3823 if (pvolume_info->setuidfromacl)
3824 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
3825 if (pvolume_info->server_ino)
3826 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
3827 if (pvolume_info->remap)
3828 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
3829 if (pvolume_info->sfu_remap)
3830 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
3831 if (pvolume_info->no_xattr)
3832 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
3833 if (pvolume_info->sfu_emul)
3834 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
3835 if (pvolume_info->nobrl)
3836 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
3837 if (pvolume_info->nohandlecache)
3838 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_HANDLE_CACHE;
3839 if (pvolume_info->nostrictsync)
3840 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
3841 if (pvolume_info->mand_lock)
3842 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
3843 if (pvolume_info->rwpidforward)
3844 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
3845 if (pvolume_info->cifs_acl)
3846 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
3847 if (pvolume_info->backupuid_specified) {
3848 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
3849 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
3851 if (pvolume_info->backupgid_specified) {
3852 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
3853 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
3855 if (pvolume_info->override_uid)
3856 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
3857 if (pvolume_info->override_gid)
3858 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
3859 if (pvolume_info->dynperm)
3860 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
3861 if (pvolume_info->fsc)
3862 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
3863 if (pvolume_info->multiuser)
3864 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
3865 CIFS_MOUNT_NO_PERM);
3866 if (pvolume_info->strict_io)
3867 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
3868 if (pvolume_info->direct_io) {
3869 cifs_dbg(FYI, "mounting share using direct i/o\n");
3870 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
3872 if (pvolume_info->mfsymlinks) {
3873 if (pvolume_info->sfu_emul) {
3875 * Our SFU ("Services for Unix" emulation does not allow
3876 * creating symlinks but does allow reading existing SFU
3877 * symlinks (it does allow both creating and reading SFU
3878 * style mknod and FIFOs though). When "mfsymlinks" and
3879 * "sfu" are both enabled at the same time, it allows
3880 * reading both types of symlinks, but will only create
3881 * them with mfsymlinks format. This allows better
3882 * Apple compatibility (probably better for Samba too)
3883 * while still recognizing old Windows style symlinks.
3885 cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
3887 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
3890 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
3891 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
3893 if (pvolume_info->prepath) {
3894 cifs_sb->prepath = kstrdup(pvolume_info->prepath, GFP_KERNEL);
3895 if (cifs_sb->prepath == NULL)
3903 cifs_cleanup_volume_info_contents(struct smb_vol *volume_info)
3905 kfree(volume_info->username);
3906 kzfree(volume_info->password);
3907 kfree(volume_info->UNC);
3908 kfree(volume_info->domainname);
3909 kfree(volume_info->iocharset);
3910 kfree(volume_info->prepath);
3914 cifs_cleanup_volume_info(struct smb_vol *volume_info)
3918 cifs_cleanup_volume_info_contents(volume_info);
3922 /* Release all succeed connections */
3923 static inline void mount_put_conns(struct cifs_sb_info *cifs_sb,
3925 struct TCP_Server_Info *server,
3926 struct cifs_ses *ses, struct cifs_tcon *tcon)
3931 cifs_put_tcon(tcon);
3933 cifs_put_smb_ses(ses);
3935 cifs_put_tcp_session(server, 0);
3936 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
3940 /* Get connections for tcp, ses and tcon */
3941 static int mount_get_conns(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
3943 struct TCP_Server_Info **nserver,
3944 struct cifs_ses **nses, struct cifs_tcon **ntcon)
3947 struct TCP_Server_Info *server;
3948 struct cifs_ses *ses;
3949 struct cifs_tcon *tcon;
3957 /* get a reference to a tcp session */
3958 server = cifs_get_tcp_session(vol);
3959 if (IS_ERR(server)) {
3960 rc = PTR_ERR(server);
3966 if ((vol->max_credits < 20) || (vol->max_credits > 60000))
3967 server->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
3969 server->max_credits = vol->max_credits;
3971 /* get a reference to a SMB session */
3972 ses = cifs_get_smb_ses(server, vol);
3980 if ((vol->persistent == true) && (!(ses->server->capabilities &
3981 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES))) {
3982 cifs_dbg(VFS, "persistent handles not supported by server\n");
3986 /* search for existing tcon to this server share */
3987 tcon = cifs_get_tcon(ses, vol);
3995 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
3996 if (tcon->posix_extensions)
3997 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
3999 /* tell server which Unix caps we support */
4000 if (cap_unix(tcon->ses)) {
4002 * reset of caps checks mount to see if unix extensions disabled
4003 * for just this mount.
4005 reset_cifs_unix_caps(*xid, tcon, cifs_sb, vol);
4006 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
4007 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
4008 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP))
4011 tcon->unix_ext = 0; /* server does not support them */
4013 /* do not care if a following call succeed - informational */
4014 if (!tcon->pipe && server->ops->qfs_tcon)
4015 server->ops->qfs_tcon(*xid, tcon);
4017 cifs_sb->wsize = server->ops->negotiate_wsize(tcon, vol);
4018 cifs_sb->rsize = server->ops->negotiate_rsize(tcon, vol);
4023 static int mount_setup_tlink(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
4024 struct cifs_tcon *tcon)
4026 struct tcon_link *tlink;
4028 /* hang the tcon off of the superblock */
4029 tlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4033 tlink->tl_uid = ses->linux_uid;
4034 tlink->tl_tcon = tcon;
4035 tlink->tl_time = jiffies;
4036 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
4037 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4039 cifs_sb->master_tlink = tlink;
4040 spin_lock(&cifs_sb->tlink_tree_lock);
4041 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4042 spin_unlock(&cifs_sb->tlink_tree_lock);
4044 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4049 #ifdef CONFIG_CIFS_DFS_UPCALL
4051 * cifs_build_path_to_root returns full path to root when we do not have an
4052 * exiting connection (tcon)
4055 build_unc_path_to_root(const struct smb_vol *vol,
4056 const struct cifs_sb_info *cifs_sb, bool useppath)
4058 char *full_path, *pos;
4059 unsigned int pplen = useppath && vol->prepath ?
4060 strlen(vol->prepath) + 1 : 0;
4061 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
4063 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
4064 if (full_path == NULL)
4065 return ERR_PTR(-ENOMEM);
4067 strncpy(full_path, vol->UNC, unc_len);
4068 pos = full_path + unc_len;
4071 *pos = CIFS_DIR_SEP(cifs_sb);
4072 strncpy(pos + 1, vol->prepath, pplen);
4076 *pos = '\0'; /* add trailing null */
4077 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
4078 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
4083 * expand_dfs_referral - Perform a dfs referral query and update the cifs_sb
4086 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
4087 * to a string containing updated options for the submount. Otherwise it
4088 * will be left untouched.
4090 * Returns the rc from get_dfs_path to the caller, which can be used to
4091 * determine whether there were referrals.
4094 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
4095 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
4099 struct dfs_info3_param referral = {0};
4100 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
4102 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4105 full_path = build_unc_path_to_root(volume_info, cifs_sb, true);
4106 if (IS_ERR(full_path))
4107 return PTR_ERR(full_path);
4109 /* For DFS paths, skip the first '\' of the UNC */
4110 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
4112 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4113 ref_path, &referral, NULL);
4115 char *fake_devname = NULL;
4117 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
4118 full_path + 1, &referral,
4120 free_dfs_info_param(&referral);
4122 if (IS_ERR(mdata)) {
4123 rc = PTR_ERR(mdata);
4126 cifs_cleanup_volume_info_contents(volume_info);
4127 rc = cifs_setup_volume_info(volume_info, mdata,
4128 fake_devname, false);
4130 kfree(fake_devname);
4131 kfree(cifs_sb->mountdata);
4132 cifs_sb->mountdata = mdata;
4138 static inline int get_next_dfs_tgt(const char *path,
4139 struct dfs_cache_tgt_list *tgt_list,
4140 struct dfs_cache_tgt_iterator **tgt_it)
4143 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
4145 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
4146 return !*tgt_it ? -EHOSTDOWN : 0;
4149 static int update_vol_info(const struct dfs_cache_tgt_iterator *tgt_it,
4150 struct smb_vol *fake_vol, struct smb_vol *vol)
4152 const char *tgt = dfs_cache_get_tgt_name(tgt_it);
4153 int len = strlen(tgt) + 2;
4156 new_unc = kmalloc(len, GFP_KERNEL);
4159 snprintf(new_unc, len, "\\%s", tgt);
4164 if (fake_vol->prepath) {
4165 kfree(vol->prepath);
4166 vol->prepath = fake_vol->prepath;
4167 fake_vol->prepath = NULL;
4169 memcpy(&vol->dstaddr, &fake_vol->dstaddr, sizeof(vol->dstaddr));
4174 static int setup_dfs_tgt_conn(const char *path,
4175 const struct dfs_cache_tgt_iterator *tgt_it,
4176 struct cifs_sb_info *cifs_sb,
4177 struct smb_vol *vol,
4179 struct TCP_Server_Info **server,
4180 struct cifs_ses **ses,
4181 struct cifs_tcon **tcon)
4184 struct dfs_info3_param ref = {0};
4185 char *mdata = NULL, *fake_devname = NULL;
4186 struct smb_vol fake_vol = {0};
4188 cifs_dbg(FYI, "%s: dfs path: %s\n", __func__, path);
4190 rc = dfs_cache_get_tgt_referral(path, tgt_it, &ref);
4194 mdata = cifs_compose_mount_options(cifs_sb->mountdata, path, &ref,
4196 free_dfs_info_param(&ref);
4198 if (IS_ERR(mdata)) {
4199 rc = PTR_ERR(mdata);
4202 cifs_dbg(FYI, "%s: fake_devname: %s\n", __func__, fake_devname);
4203 rc = cifs_setup_volume_info(&fake_vol, mdata, fake_devname,
4207 kfree(fake_devname);
4211 * We use a 'fake_vol' here because we need pass it down to the
4212 * mount_{get,put} functions to test connection against new DFS
4215 mount_put_conns(cifs_sb, *xid, *server, *ses, *tcon);
4216 rc = mount_get_conns(&fake_vol, cifs_sb, xid, server, ses,
4220 * We were able to connect to new target server.
4221 * Update current volume info with new target server.
4223 rc = update_vol_info(tgt_it, &fake_vol, vol);
4226 cifs_cleanup_volume_info_contents(&fake_vol);
4230 static int mount_do_dfs_failover(const char *path,
4231 struct cifs_sb_info *cifs_sb,
4232 struct smb_vol *vol,
4233 struct cifs_ses *root_ses,
4235 struct TCP_Server_Info **server,
4236 struct cifs_ses **ses,
4237 struct cifs_tcon **tcon)
4240 struct dfs_cache_tgt_list tgt_list;
4241 struct dfs_cache_tgt_iterator *tgt_it = NULL;
4243 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4246 rc = dfs_cache_noreq_find(path, NULL, &tgt_list);
4251 /* Get next DFS target server - if any */
4252 rc = get_next_dfs_tgt(path, &tgt_list, &tgt_it);
4255 /* Connect to next DFS target */
4256 rc = setup_dfs_tgt_conn(path, tgt_it, cifs_sb, vol, xid, server,
4258 if (!rc || rc == -EACCES || rc == -EOPNOTSUPP)
4263 * Update DFS target hint in DFS referral cache with the target
4264 * server we successfully reconnected to.
4266 rc = dfs_cache_update_tgthint(*xid, root_ses ? root_ses : *ses,
4268 cifs_remap(cifs_sb), path,
4271 dfs_cache_free_tgts(&tgt_list);
4277 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
4278 const char *devname, bool is_smb3)
4282 if (cifs_parse_mount_options(mount_data, devname, volume_info, is_smb3))
4285 if (volume_info->nullauth) {
4286 cifs_dbg(FYI, "Anonymous login\n");
4287 kfree(volume_info->username);
4288 volume_info->username = NULL;
4289 } else if (volume_info->username) {
4290 /* BB fixme parse for domain name here */
4291 cifs_dbg(FYI, "Username: %s\n", volume_info->username);
4293 cifs_dbg(VFS, "No username specified\n");
4294 /* In userspace mount helper we can get user name from alternate
4295 locations such as env variables and files on disk */
4299 /* this is needed for ASCII cp to Unicode converts */
4300 if (volume_info->iocharset == NULL) {
4301 /* load_nls_default cannot return null */
4302 volume_info->local_nls = load_nls_default();
4304 volume_info->local_nls = load_nls(volume_info->iocharset);
4305 if (volume_info->local_nls == NULL) {
4306 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
4307 volume_info->iocharset);
4316 cifs_get_volume_info(char *mount_data, const char *devname, bool is_smb3)
4319 struct smb_vol *volume_info;
4321 volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
4323 return ERR_PTR(-ENOMEM);
4325 rc = cifs_setup_volume_info(volume_info, mount_data, devname, is_smb3);
4327 cifs_cleanup_volume_info(volume_info);
4328 volume_info = ERR_PTR(rc);
4335 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
4337 struct cifs_tcon *tcon,
4338 struct cifs_sb_info *cifs_sb,
4345 sep = CIFS_DIR_SEP(cifs_sb);
4348 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
4350 /* skip separators */
4355 /* next separator */
4356 while (*s && *s != sep)
4360 * temporarily null-terminate the path at the end of
4361 * the current component
4365 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4373 * Check if path is remote (e.g. a DFS share). Return -EREMOTE if it is,
4376 static int is_path_remote(struct cifs_sb_info *cifs_sb, struct smb_vol *vol,
4377 const unsigned int xid,
4378 struct TCP_Server_Info *server,
4379 struct cifs_tcon *tcon)
4384 if (!server->ops->is_path_accessible)
4388 * cifs_build_path_to_root works only when we have a valid tcon
4390 full_path = cifs_build_path_to_root(vol, cifs_sb, tcon,
4391 tcon->Flags & SMB_SHARE_IS_IN_DFS);
4392 if (full_path == NULL)
4395 cifs_dbg(FYI, "%s: full_path: %s\n", __func__, full_path);
4397 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4399 if (rc != 0 && rc != -EREMOTE) {
4404 if (rc != -EREMOTE) {
4405 rc = cifs_are_all_path_components_accessible(server, xid, tcon,
4409 cifs_dbg(VFS, "cannot query dirs between root and final path, "
4410 "enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
4411 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
4420 #ifdef CONFIG_CIFS_DFS_UPCALL
4421 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4425 struct cifs_ses *ses;
4426 struct cifs_tcon *root_tcon = NULL;
4427 struct cifs_tcon *tcon = NULL;
4428 struct TCP_Server_Info *server;
4429 char *root_path = NULL, *full_path = NULL;
4430 char *old_mountdata;
4433 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4435 /* If not a standalone DFS root, then check if path is remote */
4436 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls,
4437 cifs_remap(cifs_sb), vol->UNC + 1, NULL,
4440 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4448 * If first DFS target server went offline and we failed to connect it,
4449 * server and ses pointers are NULL at this point, though we still have
4450 * chance to get a cached DFS referral in expand_dfs_referral() and
4451 * retry next target available in it.
4453 * If a NULL ses ptr is passed to dfs_cache_find(), a lookup will be
4454 * performed against DFS path and *no* requests will be sent to server
4455 * for any new DFS referrals. Hence it's safe to skip checking whether
4456 * server or ses ptr is NULL.
4458 if (rc == -EACCES || rc == -EOPNOTSUPP)
4461 root_path = build_unc_path_to_root(vol, cifs_sb, false);
4462 if (IS_ERR(root_path)) {
4463 rc = PTR_ERR(root_path);
4468 full_path = build_unc_path_to_root(vol, cifs_sb, true);
4469 if (IS_ERR(full_path)) {
4470 rc = PTR_ERR(full_path);
4475 * Perform an unconditional check for whether there are DFS
4476 * referrals for this path without prefix, to provide support
4477 * for DFS referrals from w2k8 servers which don't seem to respond
4478 * with PATH_NOT_COVERED to requests that include the prefix.
4479 * Chase the referral if found, otherwise continue normally.
4481 old_mountdata = cifs_sb->mountdata;
4482 (void)expand_dfs_referral(xid, ses, vol, cifs_sb, false);
4484 if (cifs_sb->mountdata == NULL) {
4489 if (cifs_sb->mountdata != old_mountdata) {
4490 /* If we were redirected, reconnect to new target server */
4491 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4492 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4495 if (rc == -EACCES || rc == -EOPNOTSUPP)
4497 /* Perform DFS failover to any other DFS targets */
4498 rc = mount_do_dfs_failover(root_path + 1, cifs_sb, vol, NULL,
4499 &xid, &server, &ses, &tcon);
4505 root_path = build_unc_path_to_root(vol, cifs_sb, false);
4506 if (IS_ERR(root_path)) {
4507 rc = PTR_ERR(root_path);
4511 /* Cache out resolved root server */
4512 (void)dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4513 root_path + 1, NULL, NULL);
4515 * Save root tcon for additional DFS requests to update or create a new
4516 * DFS cache entry, or even perform DFS failover.
4518 spin_lock(&cifs_tcp_ses_lock);
4520 tcon->dfs_path = root_path;
4522 tcon->remap = cifs_remap(cifs_sb);
4523 spin_unlock(&cifs_tcp_ses_lock);
4527 for (count = 1; ;) {
4529 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4530 if (!rc || rc != -EREMOTE)
4534 * BB: when we implement proper loop detection,
4535 * we will remove this check. But now we need it
4536 * to prevent an indefinite loop if 'DFS tree' is
4537 * misconfigured (i.e. has loops).
4539 if (count++ > MAX_NESTED_LINKS) {
4545 full_path = build_unc_path_to_root(vol, cifs_sb, true);
4546 if (IS_ERR(full_path)) {
4547 rc = PTR_ERR(full_path);
4552 old_mountdata = cifs_sb->mountdata;
4553 rc = expand_dfs_referral(xid, root_tcon->ses, vol, cifs_sb,
4558 if (cifs_sb->mountdata != old_mountdata) {
4559 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4560 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses,
4564 if (rc == -EACCES || rc == -EOPNOTSUPP)
4566 /* Perform DFS failover to any other DFS targets */
4567 rc = mount_do_dfs_failover(full_path + 1, cifs_sb, vol,
4568 root_tcon->ses, &xid,
4569 &server, &ses, &tcon);
4570 if (rc == -EACCES || rc == -EOPNOTSUPP || !server ||
4575 cifs_put_tcon(root_tcon);
4580 spin_lock(&cifs_tcp_ses_lock);
4581 if (!tcon->dfs_path) {
4582 /* Save full path in new tcon to do failover when reconnecting tcons */
4583 tcon->dfs_path = full_path;
4585 tcon->remap = cifs_remap(cifs_sb);
4587 cifs_sb->origin_fullpath = kstrndup(tcon->dfs_path,
4588 strlen(tcon->dfs_path),
4590 if (!cifs_sb->origin_fullpath) {
4591 spin_unlock(&cifs_tcp_ses_lock);
4595 spin_unlock(&cifs_tcp_ses_lock);
4597 rc = dfs_cache_add_vol(vol, cifs_sb->origin_fullpath);
4599 kfree(cifs_sb->origin_fullpath);
4603 * After reconnecting to a different server, unique ids won't
4604 * match anymore, so we disable serverino. This prevents
4605 * dentry revalidation to think the dentry are stale (ESTALE).
4607 cifs_autodisable_serverino(cifs_sb);
4610 return mount_setup_tlink(cifs_sb, ses, tcon);
4615 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4619 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4623 struct cifs_ses *ses;
4624 struct cifs_tcon *tcon;
4625 struct TCP_Server_Info *server;
4627 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4632 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4641 return mount_setup_tlink(cifs_sb, ses, tcon);
4644 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4650 * Issue a TREE_CONNECT request.
4653 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
4654 const char *tree, struct cifs_tcon *tcon,
4655 const struct nls_table *nls_codepage)
4657 struct smb_hdr *smb_buffer;
4658 struct smb_hdr *smb_buffer_response;
4661 unsigned char *bcc_ptr;
4664 __u16 bytes_left, count;
4669 smb_buffer = cifs_buf_get();
4670 if (smb_buffer == NULL)
4673 smb_buffer_response = smb_buffer;
4675 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
4676 NULL /*no tid */ , 4 /*wct */ );
4678 smb_buffer->Mid = get_next_mid(ses->server);
4679 smb_buffer->Uid = ses->Suid;
4680 pSMB = (TCONX_REQ *) smb_buffer;
4681 pSMBr = (TCONX_RSP *) smb_buffer_response;
4683 pSMB->AndXCommand = 0xFF;
4684 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
4685 bcc_ptr = &pSMB->Password[0];
4686 if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
4687 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
4688 *bcc_ptr = 0; /* password is null byte */
4689 bcc_ptr++; /* skip password */
4690 /* already aligned so no need to do it below */
4692 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
4693 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
4694 specified as required (when that support is added to
4695 the vfs in the future) as only NTLM or the much
4696 weaker LANMAN (which we do not send by default) is accepted
4697 by Samba (not sure whether other servers allow
4698 NTLMv2 password here) */
4699 #ifdef CONFIG_CIFS_WEAK_PW_HASH
4700 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
4701 (ses->sectype == LANMAN))
4702 calc_lanman_hash(tcon->password, ses->server->cryptkey,
4703 ses->server->sec_mode &
4704 SECMODE_PW_ENCRYPT ? true : false,
4707 #endif /* CIFS_WEAK_PW_HASH */
4708 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
4709 bcc_ptr, nls_codepage);
4711 cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
4713 cifs_buf_release(smb_buffer);
4717 bcc_ptr += CIFS_AUTH_RESP_SIZE;
4718 if (ses->capabilities & CAP_UNICODE) {
4719 /* must align unicode strings */
4720 *bcc_ptr = 0; /* null byte password */
4725 if (ses->server->sign)
4726 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
4728 if (ses->capabilities & CAP_STATUS32) {
4729 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
4731 if (ses->capabilities & CAP_DFS) {
4732 smb_buffer->Flags2 |= SMBFLG2_DFS;
4734 if (ses->capabilities & CAP_UNICODE) {
4735 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
4737 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
4738 6 /* max utf8 char length in bytes */ *
4739 (/* server len*/ + 256 /* share len */), nls_codepage);
4740 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
4741 bcc_ptr += 2; /* skip trailing null */
4742 } else { /* ASCII */
4743 strcpy(bcc_ptr, tree);
4744 bcc_ptr += strlen(tree) + 1;
4746 strcpy(bcc_ptr, "?????");
4747 bcc_ptr += strlen("?????");
4749 count = bcc_ptr - &pSMB->Password[0];
4750 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
4751 pSMB->hdr.smb_buf_length) + count);
4752 pSMB->ByteCount = cpu_to_le16(count);
4754 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
4757 /* above now done in SendReceive */
4761 tcon->tidStatus = CifsGood;
4762 tcon->need_reconnect = false;
4763 tcon->tid = smb_buffer_response->Tid;
4764 bcc_ptr = pByteArea(smb_buffer_response);
4765 bytes_left = get_bcc(smb_buffer_response);
4766 length = strnlen(bcc_ptr, bytes_left - 2);
4767 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
4773 /* skip service field (NB: this field is always ASCII) */
4775 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
4776 (bcc_ptr[2] == 'C')) {
4777 cifs_dbg(FYI, "IPC connection\n");
4781 } else if (length == 2) {
4782 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
4783 /* the most common case */
4784 cifs_dbg(FYI, "disk share connection\n");
4787 bcc_ptr += length + 1;
4788 bytes_left -= (length + 1);
4789 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
4791 /* mostly informational -- no need to fail on error here */
4792 kfree(tcon->nativeFileSystem);
4793 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
4794 bytes_left, is_unicode,
4797 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
4799 if ((smb_buffer_response->WordCount == 3) ||
4800 (smb_buffer_response->WordCount == 7))
4801 /* field is in same location */
4802 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
4805 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
4808 cifs_buf_release(smb_buffer);
4812 static void delayed_free(struct rcu_head *p)
4814 struct cifs_sb_info *sbi = container_of(p, struct cifs_sb_info, rcu);
4815 unload_nls(sbi->local_nls);
4820 cifs_umount(struct cifs_sb_info *cifs_sb)
4822 struct rb_root *root = &cifs_sb->tlink_tree;
4823 struct rb_node *node;
4824 struct tcon_link *tlink;
4826 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
4828 spin_lock(&cifs_sb->tlink_tree_lock);
4829 while ((node = rb_first(root))) {
4830 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
4831 cifs_get_tlink(tlink);
4832 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4833 rb_erase(node, root);
4835 spin_unlock(&cifs_sb->tlink_tree_lock);
4836 cifs_put_tlink(tlink);
4837 spin_lock(&cifs_sb->tlink_tree_lock);
4839 spin_unlock(&cifs_sb->tlink_tree_lock);
4841 kfree(cifs_sb->mountdata);
4842 kfree(cifs_sb->prepath);
4843 #ifdef CONFIG_CIFS_DFS_UPCALL
4844 dfs_cache_del_vol(cifs_sb->origin_fullpath);
4845 kfree(cifs_sb->origin_fullpath);
4847 call_rcu(&cifs_sb->rcu, delayed_free);
4851 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
4854 struct TCP_Server_Info *server = ses->server;
4856 if (!server->ops->need_neg || !server->ops->negotiate)
4859 /* only send once per connect */
4860 if (!server->ops->need_neg(server))
4863 set_credits(server, 1);
4865 rc = server->ops->negotiate(xid, ses);
4867 spin_lock(&GlobalMid_Lock);
4868 if (server->tcpStatus == CifsNeedNegotiate)
4869 server->tcpStatus = CifsGood;
4872 spin_unlock(&GlobalMid_Lock);
4879 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
4880 struct nls_table *nls_info)
4883 struct TCP_Server_Info *server = ses->server;
4885 ses->capabilities = server->capabilities;
4886 if (linuxExtEnabled == 0)
4887 ses->capabilities &= (~server->vals->cap_unix);
4889 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
4890 server->sec_mode, server->capabilities, server->timeAdj);
4892 if (ses->auth_key.response) {
4893 cifs_dbg(FYI, "Free previous auth_key.response = %p\n",
4894 ses->auth_key.response);
4895 kfree(ses->auth_key.response);
4896 ses->auth_key.response = NULL;
4897 ses->auth_key.len = 0;
4900 if (server->ops->sess_setup)
4901 rc = server->ops->sess_setup(xid, ses, nls_info);
4904 cifs_dbg(VFS, "Send error in SessSetup = %d\n", rc);
4910 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
4912 vol->sectype = ses->sectype;
4914 /* krb5 is special, since we don't need username or pw */
4915 if (vol->sectype == Kerberos)
4918 return cifs_set_cifscreds(vol, ses);
4921 static struct cifs_tcon *
4922 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
4925 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
4926 struct cifs_ses *ses;
4927 struct cifs_tcon *tcon = NULL;
4928 struct smb_vol *vol_info;
4930 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
4931 if (vol_info == NULL)
4932 return ERR_PTR(-ENOMEM);
4934 vol_info->local_nls = cifs_sb->local_nls;
4935 vol_info->linux_uid = fsuid;
4936 vol_info->cred_uid = fsuid;
4937 vol_info->UNC = master_tcon->treeName;
4938 vol_info->retry = master_tcon->retry;
4939 vol_info->nocase = master_tcon->nocase;
4940 vol_info->nohandlecache = master_tcon->nohandlecache;
4941 vol_info->local_lease = master_tcon->local_lease;
4942 vol_info->no_linux_ext = !master_tcon->unix_ext;
4943 vol_info->sectype = master_tcon->ses->sectype;
4944 vol_info->sign = master_tcon->ses->sign;
4946 rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
4952 /* get a reference for the same TCP session */
4953 spin_lock(&cifs_tcp_ses_lock);
4954 ++master_tcon->ses->server->srv_count;
4955 spin_unlock(&cifs_tcp_ses_lock);
4957 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
4959 tcon = (struct cifs_tcon *)ses;
4960 cifs_put_tcp_session(master_tcon->ses->server, 0);
4964 tcon = cifs_get_tcon(ses, vol_info);
4966 cifs_put_smb_ses(ses);
4970 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
4971 if (tcon->posix_extensions)
4972 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
4975 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
4978 kfree(vol_info->username);
4979 kzfree(vol_info->password);
4986 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
4988 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
4991 /* find and return a tlink with given uid */
4992 static struct tcon_link *
4993 tlink_rb_search(struct rb_root *root, kuid_t uid)
4995 struct rb_node *node = root->rb_node;
4996 struct tcon_link *tlink;
4999 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
5001 if (uid_gt(tlink->tl_uid, uid))
5002 node = node->rb_left;
5003 else if (uid_lt(tlink->tl_uid, uid))
5004 node = node->rb_right;
5011 /* insert a tcon_link into the tree */
5013 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
5015 struct rb_node **new = &(root->rb_node), *parent = NULL;
5016 struct tcon_link *tlink;
5019 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
5022 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
5023 new = &((*new)->rb_left);
5025 new = &((*new)->rb_right);
5028 rb_link_node(&new_tlink->tl_rbnode, parent, new);
5029 rb_insert_color(&new_tlink->tl_rbnode, root);
5033 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
5036 * If the superblock doesn't refer to a multiuser mount, then just return
5037 * the master tcon for the mount.
5039 * First, search the rbtree for an existing tcon for this fsuid. If one
5040 * exists, then check to see if it's pending construction. If it is then wait
5041 * for construction to complete. Once it's no longer pending, check to see if
5042 * it failed and either return an error or retry construction, depending on
5045 * If one doesn't exist then insert a new tcon_link struct into the tree and
5046 * try to construct a new one.
5049 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
5052 kuid_t fsuid = current_fsuid();
5053 struct tcon_link *tlink, *newtlink;
5055 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
5056 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
5058 spin_lock(&cifs_sb->tlink_tree_lock);
5059 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5061 cifs_get_tlink(tlink);
5062 spin_unlock(&cifs_sb->tlink_tree_lock);
5064 if (tlink == NULL) {
5065 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
5066 if (newtlink == NULL)
5067 return ERR_PTR(-ENOMEM);
5068 newtlink->tl_uid = fsuid;
5069 newtlink->tl_tcon = ERR_PTR(-EACCES);
5070 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
5071 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
5072 cifs_get_tlink(newtlink);
5074 spin_lock(&cifs_sb->tlink_tree_lock);
5075 /* was one inserted after previous search? */
5076 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5078 cifs_get_tlink(tlink);
5079 spin_unlock(&cifs_sb->tlink_tree_lock);
5081 goto wait_for_construction;
5084 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
5085 spin_unlock(&cifs_sb->tlink_tree_lock);
5087 wait_for_construction:
5088 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
5089 TASK_INTERRUPTIBLE);
5091 cifs_put_tlink(tlink);
5092 return ERR_PTR(-ERESTARTSYS);
5095 /* if it's good, return it */
5096 if (!IS_ERR(tlink->tl_tcon))
5099 /* return error if we tried this already recently */
5100 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
5101 cifs_put_tlink(tlink);
5102 return ERR_PTR(-EACCES);
5105 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
5106 goto wait_for_construction;
5109 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
5110 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
5111 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
5113 if (IS_ERR(tlink->tl_tcon)) {
5114 cifs_put_tlink(tlink);
5115 return ERR_PTR(-EACCES);
5122 * periodic workqueue job that scans tcon_tree for a superblock and closes
5126 cifs_prune_tlinks(struct work_struct *work)
5128 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
5130 struct rb_root *root = &cifs_sb->tlink_tree;
5131 struct rb_node *node;
5132 struct rb_node *tmp;
5133 struct tcon_link *tlink;
5136 * Because we drop the spinlock in the loop in order to put the tlink
5137 * it's not guarded against removal of links from the tree. The only
5138 * places that remove entries from the tree are this function and
5139 * umounts. Because this function is non-reentrant and is canceled
5140 * before umount can proceed, this is safe.
5142 spin_lock(&cifs_sb->tlink_tree_lock);
5143 node = rb_first(root);
5144 while (node != NULL) {
5146 node = rb_next(tmp);
5147 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
5149 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
5150 atomic_read(&tlink->tl_count) != 0 ||
5151 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
5154 cifs_get_tlink(tlink);
5155 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
5156 rb_erase(tmp, root);
5158 spin_unlock(&cifs_sb->tlink_tree_lock);
5159 cifs_put_tlink(tlink);
5160 spin_lock(&cifs_sb->tlink_tree_lock);
5162 spin_unlock(&cifs_sb->tlink_tree_lock);
5164 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,