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, Opt_nolease,
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_ignore_signature, Opt_seal, Opt_noac,
95 Opt_fsc, Opt_mfsymlinks,
96 Opt_multiuser, Opt_sloppy, Opt_nosharesock,
97 Opt_persistent, Opt_nopersistent,
98 Opt_resilient, Opt_noresilient,
99 Opt_domainauto, Opt_rdma, Opt_modesid, Opt_rootfs,
102 /* Mount options which take numeric value */
103 Opt_backupuid, Opt_backupgid, Opt_uid,
104 Opt_cruid, Opt_gid, Opt_file_mode,
105 Opt_dirmode, Opt_port,
107 Opt_blocksize, Opt_rsize, Opt_wsize, Opt_actimeo,
108 Opt_echo_interval, Opt_max_credits, Opt_handletimeout,
111 /* Mount options which take string value */
112 Opt_user, Opt_pass, Opt_ip,
113 Opt_domain, Opt_srcaddr, Opt_iocharset,
114 Opt_netbiosname, Opt_servern,
115 Opt_ver, Opt_vers, Opt_sec, Opt_cache,
117 /* Mount options to be ignored */
120 /* Options which could be blank */
128 static const match_table_t cifs_mount_option_tokens = {
130 { Opt_user_xattr, "user_xattr" },
131 { Opt_nouser_xattr, "nouser_xattr" },
132 { Opt_forceuid, "forceuid" },
133 { Opt_noforceuid, "noforceuid" },
134 { Opt_forcegid, "forcegid" },
135 { Opt_noforcegid, "noforcegid" },
136 { Opt_noblocksend, "noblocksend" },
137 { Opt_noautotune, "noautotune" },
138 { Opt_nolease, "nolease" },
139 { Opt_hard, "hard" },
140 { Opt_soft, "soft" },
141 { Opt_perm, "perm" },
142 { Opt_noperm, "noperm" },
143 { Opt_mapchars, "mapchars" }, /* SFU style */
144 { Opt_nomapchars, "nomapchars" },
145 { Opt_mapposix, "mapposix" }, /* SFM style */
146 { Opt_nomapposix, "nomapposix" },
148 { Opt_nosfu, "nosfu" },
149 { Opt_nodfs, "nodfs" },
150 { Opt_posixpaths, "posixpaths" },
151 { Opt_noposixpaths, "noposixpaths" },
152 { Opt_nounix, "nounix" },
153 { Opt_nounix, "nolinux" },
154 { Opt_nounix, "noposix" },
155 { Opt_unix, "unix" },
156 { Opt_unix, "linux" },
157 { Opt_unix, "posix" },
158 { Opt_nocase, "nocase" },
159 { Opt_nocase, "ignorecase" },
161 { Opt_nobrl, "nobrl" },
162 { Opt_handlecache, "handlecache" },
163 { Opt_nohandlecache, "nohandlecache" },
164 { Opt_nobrl, "nolock" },
165 { Opt_forcemandatorylock, "forcemandatorylock" },
166 { Opt_forcemandatorylock, "forcemand" },
167 { Opt_setuids, "setuids" },
168 { Opt_nosetuids, "nosetuids" },
169 { Opt_setuidfromacl, "idsfromsid" },
170 { Opt_dynperm, "dynperm" },
171 { Opt_nodynperm, "nodynperm" },
172 { Opt_nohard, "nohard" },
173 { Opt_nosoft, "nosoft" },
174 { Opt_nointr, "nointr" },
175 { Opt_intr, "intr" },
176 { Opt_nostrictsync, "nostrictsync" },
177 { Opt_strictsync, "strictsync" },
178 { Opt_serverino, "serverino" },
179 { Opt_noserverino, "noserverino" },
180 { Opt_rwpidforward, "rwpidforward" },
181 { Opt_modesid, "modefromsid" },
182 { Opt_cifsacl, "cifsacl" },
183 { Opt_nocifsacl, "nocifsacl" },
185 { Opt_noacl, "noacl" },
186 { Opt_locallease, "locallease" },
187 { Opt_sign, "sign" },
188 { Opt_ignore_signature, "signloosely" },
189 { Opt_seal, "seal" },
190 { Opt_noac, "noac" },
192 { Opt_mfsymlinks, "mfsymlinks" },
193 { Opt_multiuser, "multiuser" },
194 { Opt_sloppy, "sloppy" },
195 { Opt_nosharesock, "nosharesock" },
196 { Opt_persistent, "persistenthandles"},
197 { Opt_nopersistent, "nopersistenthandles"},
198 { Opt_resilient, "resilienthandles"},
199 { Opt_noresilient, "noresilienthandles"},
200 { Opt_domainauto, "domainauto"},
203 { Opt_backupuid, "backupuid=%s" },
204 { Opt_backupgid, "backupgid=%s" },
205 { Opt_uid, "uid=%s" },
206 { Opt_cruid, "cruid=%s" },
207 { Opt_gid, "gid=%s" },
208 { Opt_file_mode, "file_mode=%s" },
209 { Opt_dirmode, "dirmode=%s" },
210 { Opt_dirmode, "dir_mode=%s" },
211 { Opt_port, "port=%s" },
212 { Opt_min_enc_offload, "esize=%s" },
213 { Opt_blocksize, "bsize=%s" },
214 { Opt_rsize, "rsize=%s" },
215 { Opt_wsize, "wsize=%s" },
216 { Opt_actimeo, "actimeo=%s" },
217 { Opt_handletimeout, "handletimeout=%s" },
218 { Opt_echo_interval, "echo_interval=%s" },
219 { Opt_max_credits, "max_credits=%s" },
220 { Opt_snapshot, "snapshot=%s" },
221 { Opt_compress, "compress=%s" },
223 { Opt_blank_user, "user=" },
224 { Opt_blank_user, "username=" },
225 { Opt_user, "user=%s" },
226 { Opt_user, "username=%s" },
227 { Opt_blank_pass, "pass=" },
228 { Opt_blank_pass, "password=" },
229 { Opt_pass, "pass=%s" },
230 { Opt_pass, "password=%s" },
231 { Opt_blank_ip, "ip=" },
232 { Opt_blank_ip, "addr=" },
234 { Opt_ip, "addr=%s" },
235 { Opt_ignore, "unc=%s" },
236 { Opt_ignore, "target=%s" },
237 { Opt_ignore, "path=%s" },
238 { Opt_domain, "dom=%s" },
239 { Opt_domain, "domain=%s" },
240 { Opt_domain, "workgroup=%s" },
241 { Opt_srcaddr, "srcaddr=%s" },
242 { Opt_ignore, "prefixpath=%s" },
243 { Opt_iocharset, "iocharset=%s" },
244 { Opt_netbiosname, "netbiosname=%s" },
245 { Opt_servern, "servern=%s" },
246 { Opt_ver, "ver=%s" },
247 { Opt_vers, "vers=%s" },
248 { Opt_sec, "sec=%s" },
249 { Opt_cache, "cache=%s" },
251 { Opt_ignore, "cred" },
252 { Opt_ignore, "credentials" },
253 { Opt_ignore, "cred=%s" },
254 { Opt_ignore, "credentials=%s" },
255 { Opt_ignore, "guest" },
256 { Opt_ignore, "rw" },
257 { Opt_ignore, "ro" },
258 { Opt_ignore, "suid" },
259 { Opt_ignore, "nosuid" },
260 { Opt_ignore, "exec" },
261 { Opt_ignore, "noexec" },
262 { Opt_ignore, "nodev" },
263 { Opt_ignore, "noauto" },
264 { Opt_ignore, "dev" },
265 { Opt_ignore, "mand" },
266 { Opt_ignore, "nomand" },
267 { Opt_ignore, "relatime" },
268 { Opt_ignore, "_netdev" },
269 { Opt_rootfs, "rootfs" },
275 Opt_sec_krb5, Opt_sec_krb5i, Opt_sec_krb5p,
276 Opt_sec_ntlmsspi, Opt_sec_ntlmssp,
277 Opt_ntlm, Opt_sec_ntlmi, Opt_sec_ntlmv2,
278 Opt_sec_ntlmv2i, Opt_sec_lanman,
284 static const match_table_t cifs_secflavor_tokens = {
285 { Opt_sec_krb5, "krb5" },
286 { Opt_sec_krb5i, "krb5i" },
287 { Opt_sec_krb5p, "krb5p" },
288 { Opt_sec_ntlmsspi, "ntlmsspi" },
289 { Opt_sec_ntlmssp, "ntlmssp" },
290 { Opt_ntlm, "ntlm" },
291 { Opt_sec_ntlmi, "ntlmi" },
292 { Opt_sec_ntlmv2, "nontlm" },
293 { Opt_sec_ntlmv2, "ntlmv2" },
294 { Opt_sec_ntlmv2i, "ntlmv2i" },
295 { Opt_sec_lanman, "lanman" },
296 { Opt_sec_none, "none" },
298 { Opt_sec_err, NULL }
311 static const match_table_t cifs_cacheflavor_tokens = {
312 { Opt_cache_loose, "loose" },
313 { Opt_cache_strict, "strict" },
314 { Opt_cache_none, "none" },
315 { Opt_cache_ro, "ro" },
316 { Opt_cache_rw, "singleclient" },
317 { Opt_cache_err, NULL }
320 static const match_table_t cifs_smb_version_tokens = {
321 { Smb_1, SMB1_VERSION_STRING },
322 { Smb_20, SMB20_VERSION_STRING},
323 { Smb_21, SMB21_VERSION_STRING },
324 { Smb_30, SMB30_VERSION_STRING },
325 { Smb_302, SMB302_VERSION_STRING },
326 { Smb_302, ALT_SMB302_VERSION_STRING },
327 { Smb_311, SMB311_VERSION_STRING },
328 { Smb_311, ALT_SMB311_VERSION_STRING },
329 { Smb_3any, SMB3ANY_VERSION_STRING },
330 { Smb_default, SMBDEFAULT_VERSION_STRING },
331 { Smb_version_err, NULL }
334 static int ip_connect(struct TCP_Server_Info *server);
335 static int generic_ip_connect(struct TCP_Server_Info *server);
336 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
337 static void cifs_prune_tlinks(struct work_struct *work);
338 static char *extract_hostname(const char *unc);
341 * Resolve hostname and set ip addr in tcp ses. Useful for hostnames that may
342 * get their ip addresses changed at some point.
344 * This should be called with server->srv_mutex held.
346 #ifdef CONFIG_CIFS_DFS_UPCALL
347 static int reconn_set_ipaddr(struct TCP_Server_Info *server)
351 char *unc, *ipaddr = NULL;
353 if (!server->hostname)
356 len = strlen(server->hostname) + 3;
358 unc = kmalloc(len, GFP_KERNEL);
360 cifs_dbg(FYI, "%s: failed to create UNC path\n", __func__);
363 scnprintf(unc, len, "\\\\%s", server->hostname);
365 rc = dns_resolve_server_name_to_ip(unc, &ipaddr);
369 cifs_dbg(FYI, "%s: failed to resolve server part of %s to IP: %d\n",
370 __func__, server->hostname, rc);
374 rc = cifs_convert_address((struct sockaddr *)&server->dstaddr, ipaddr,
381 static inline int reconn_set_ipaddr(struct TCP_Server_Info *server)
387 #ifdef CONFIG_CIFS_DFS_UPCALL
388 struct super_cb_data {
389 struct TCP_Server_Info *server;
390 struct cifs_sb_info *cifs_sb;
393 /* These functions must be called with server->srv_mutex held */
395 static void super_cb(struct super_block *sb, void *arg)
397 struct super_cb_data *d = arg;
398 struct cifs_sb_info *cifs_sb;
399 struct cifs_tcon *tcon;
404 cifs_sb = CIFS_SB(sb);
405 tcon = cifs_sb_master_tcon(cifs_sb);
406 if (tcon->ses->server == d->server)
407 d->cifs_sb = cifs_sb;
410 static inline struct cifs_sb_info *
411 find_super_by_tcp(struct TCP_Server_Info *server)
413 struct super_cb_data d = {
418 iterate_supers_type(&cifs_fs_type, super_cb, &d);
419 return d.cifs_sb ? d.cifs_sb : ERR_PTR(-ENOENT);
422 static void reconn_inval_dfs_target(struct TCP_Server_Info *server,
423 struct cifs_sb_info *cifs_sb,
424 struct dfs_cache_tgt_list *tgt_list,
425 struct dfs_cache_tgt_iterator **tgt_it)
429 if (!cifs_sb || !cifs_sb->origin_fullpath || !tgt_list ||
434 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
436 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
438 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
441 cifs_dbg(FYI, "%s: UNC: %s\n", __func__, cifs_sb->origin_fullpath);
443 name = dfs_cache_get_tgt_name(*tgt_it);
445 kfree(server->hostname);
447 server->hostname = extract_hostname(name);
448 if (IS_ERR(server->hostname)) {
450 "%s: failed to extract hostname from target: %ld\n",
451 __func__, PTR_ERR(server->hostname));
455 static inline int reconn_setup_dfs_targets(struct cifs_sb_info *cifs_sb,
456 struct dfs_cache_tgt_list *tl,
457 struct dfs_cache_tgt_iterator **it)
459 if (!cifs_sb->origin_fullpath)
461 return dfs_cache_noreq_find(cifs_sb->origin_fullpath + 1, NULL, tl);
466 * cifs tcp session reconnection
468 * mark tcp session as reconnecting so temporarily locked
469 * mark all smb sessions as reconnecting for tcp session
470 * reconnect tcp session
471 * wake up waiters on reconnection? - (not needed currently)
474 cifs_reconnect(struct TCP_Server_Info *server)
477 struct list_head *tmp, *tmp2;
478 struct cifs_ses *ses;
479 struct cifs_tcon *tcon;
480 struct mid_q_entry *mid_entry;
481 struct list_head retry_list;
482 #ifdef CONFIG_CIFS_DFS_UPCALL
483 struct cifs_sb_info *cifs_sb = NULL;
484 struct dfs_cache_tgt_list tgt_list = {0};
485 struct dfs_cache_tgt_iterator *tgt_it = NULL;
488 spin_lock(&GlobalMid_Lock);
489 server->nr_targets = 1;
490 #ifdef CONFIG_CIFS_DFS_UPCALL
491 spin_unlock(&GlobalMid_Lock);
492 cifs_sb = find_super_by_tcp(server);
493 if (IS_ERR(cifs_sb)) {
494 rc = PTR_ERR(cifs_sb);
495 cifs_dbg(FYI, "%s: will not do DFS failover: rc = %d\n",
499 rc = reconn_setup_dfs_targets(cifs_sb, &tgt_list, &tgt_it);
500 if (rc && (rc != -EOPNOTSUPP)) {
501 cifs_server_dbg(VFS, "%s: no target servers for DFS failover\n",
504 server->nr_targets = dfs_cache_get_nr_tgts(&tgt_list);
507 cifs_dbg(FYI, "%s: will retry %d target(s)\n", __func__,
509 spin_lock(&GlobalMid_Lock);
511 if (server->tcpStatus == CifsExiting) {
512 /* the demux thread will exit normally
513 next time through the loop */
514 spin_unlock(&GlobalMid_Lock);
517 server->tcpStatus = CifsNeedReconnect;
518 spin_unlock(&GlobalMid_Lock);
520 server->max_read = 0;
522 cifs_dbg(FYI, "Mark tcp session as need reconnect\n");
523 trace_smb3_reconnect(server->CurrentMid, server->hostname);
525 /* before reconnecting the tcp session, mark the smb session (uid)
526 and the tid bad so they are not used until reconnected */
527 cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
529 spin_lock(&cifs_tcp_ses_lock);
530 list_for_each(tmp, &server->smb_ses_list) {
531 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
532 ses->need_reconnect = true;
533 list_for_each(tmp2, &ses->tcon_list) {
534 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
535 tcon->need_reconnect = true;
538 ses->tcon_ipc->need_reconnect = true;
540 spin_unlock(&cifs_tcp_ses_lock);
542 /* do not want to be sending data on a socket we are freeing */
543 cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
544 mutex_lock(&server->srv_mutex);
545 if (server->ssocket) {
546 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
547 server->ssocket->state, server->ssocket->flags);
548 kernel_sock_shutdown(server->ssocket, SHUT_WR);
549 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
550 server->ssocket->state, server->ssocket->flags);
551 sock_release(server->ssocket);
552 server->ssocket = NULL;
554 server->sequence_number = 0;
555 server->session_estab = false;
556 kfree(server->session_key.response);
557 server->session_key.response = NULL;
558 server->session_key.len = 0;
559 server->lstrp = jiffies;
561 /* mark submitted MIDs for retry and issue callback */
562 INIT_LIST_HEAD(&retry_list);
563 cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
564 spin_lock(&GlobalMid_Lock);
565 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
566 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
567 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
568 mid_entry->mid_state = MID_RETRY_NEEDED;
569 list_move(&mid_entry->qhead, &retry_list);
571 spin_unlock(&GlobalMid_Lock);
572 mutex_unlock(&server->srv_mutex);
574 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
575 list_for_each_safe(tmp, tmp2, &retry_list) {
576 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
577 list_del_init(&mid_entry->qhead);
578 mid_entry->callback(mid_entry);
581 if (cifs_rdma_enabled(server)) {
582 mutex_lock(&server->srv_mutex);
583 smbd_destroy(server);
584 mutex_unlock(&server->srv_mutex);
590 mutex_lock(&server->srv_mutex);
592 * Set up next DFS target server (if any) for reconnect. If DFS
593 * feature is disabled, then we will retry last server we
594 * connected to before.
596 if (cifs_rdma_enabled(server))
597 rc = smbd_reconnect(server);
599 rc = generic_ip_connect(server);
601 cifs_dbg(FYI, "reconnect error %d\n", rc);
602 #ifdef CONFIG_CIFS_DFS_UPCALL
603 reconn_inval_dfs_target(server, cifs_sb, &tgt_list,
606 rc = reconn_set_ipaddr(server);
608 cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
611 mutex_unlock(&server->srv_mutex);
614 atomic_inc(&tcpSesReconnectCount);
615 set_credits(server, 1);
616 spin_lock(&GlobalMid_Lock);
617 if (server->tcpStatus != CifsExiting)
618 server->tcpStatus = CifsNeedNegotiate;
619 spin_unlock(&GlobalMid_Lock);
620 mutex_unlock(&server->srv_mutex);
622 } while (server->tcpStatus == CifsNeedReconnect);
624 #ifdef CONFIG_CIFS_DFS_UPCALL
626 rc = dfs_cache_noreq_update_tgthint(cifs_sb->origin_fullpath + 1,
629 cifs_server_dbg(VFS, "%s: failed to update DFS target hint: rc = %d\n",
632 rc = dfs_cache_update_vol(cifs_sb->origin_fullpath, server);
634 cifs_server_dbg(VFS, "%s: failed to update vol info in DFS cache: rc = %d\n",
637 dfs_cache_free_tgts(&tgt_list);
640 if (server->tcpStatus == CifsNeedNegotiate)
641 mod_delayed_work(cifsiod_wq, &server->echo, 0);
647 cifs_echo_request(struct work_struct *work)
650 struct TCP_Server_Info *server = container_of(work,
651 struct TCP_Server_Info, echo.work);
652 unsigned long echo_interval;
655 * If we need to renegotiate, set echo interval to zero to
656 * immediately call echo service where we can renegotiate.
658 if (server->tcpStatus == CifsNeedNegotiate)
661 echo_interval = server->echo_interval;
664 * We cannot send an echo if it is disabled.
665 * Also, no need to ping if we got a response recently.
668 if (server->tcpStatus == CifsNeedReconnect ||
669 server->tcpStatus == CifsExiting ||
670 server->tcpStatus == CifsNew ||
671 (server->ops->can_echo && !server->ops->can_echo(server)) ||
672 time_before(jiffies, server->lstrp + echo_interval - HZ))
675 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
677 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
681 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
685 allocate_buffers(struct TCP_Server_Info *server)
687 if (!server->bigbuf) {
688 server->bigbuf = (char *)cifs_buf_get();
689 if (!server->bigbuf) {
690 cifs_server_dbg(VFS, "No memory for large SMB response\n");
692 /* retry will check if exiting */
695 } else if (server->large_buf) {
696 /* we are reusing a dirty large buf, clear its start */
697 memset(server->bigbuf, 0, HEADER_SIZE(server));
700 if (!server->smallbuf) {
701 server->smallbuf = (char *)cifs_small_buf_get();
702 if (!server->smallbuf) {
703 cifs_server_dbg(VFS, "No memory for SMB response\n");
705 /* retry will check if exiting */
708 /* beginning of smb buffer is cleared in our buf_get */
710 /* if existing small buf clear beginning */
711 memset(server->smallbuf, 0, HEADER_SIZE(server));
718 server_unresponsive(struct TCP_Server_Info *server)
721 * We need to wait 3 echo intervals to make sure we handle such
723 * 1s client sends a normal SMB request
724 * 2s client gets a response
725 * 30s echo workqueue job pops, and decides we got a response recently
726 * and don't need to send another
728 * 65s kernel_recvmsg times out, and we see that we haven't gotten
729 * a response in >60s.
731 if ((server->tcpStatus == CifsGood ||
732 server->tcpStatus == CifsNeedNegotiate) &&
733 time_after(jiffies, server->lstrp + 3 * server->echo_interval)) {
734 cifs_server_dbg(VFS, "has not responded in %lu seconds. Reconnecting...\n",
735 (3 * server->echo_interval) / HZ);
736 cifs_reconnect(server);
737 wake_up(&server->response_q);
745 zero_credits(struct TCP_Server_Info *server)
749 spin_lock(&server->req_lock);
750 val = server->credits + server->echo_credits + server->oplock_credits;
751 if (server->in_flight == 0 && val == 0) {
752 spin_unlock(&server->req_lock);
755 spin_unlock(&server->req_lock);
760 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
765 smb_msg->msg_control = NULL;
766 smb_msg->msg_controllen = 0;
768 for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
771 /* reconnect if no credits and no requests in flight */
772 if (zero_credits(server)) {
773 cifs_reconnect(server);
774 return -ECONNABORTED;
777 if (server_unresponsive(server))
778 return -ECONNABORTED;
779 if (cifs_rdma_enabled(server) && server->smbd_conn)
780 length = smbd_recv(server->smbd_conn, smb_msg);
782 length = sock_recvmsg(server->ssocket, smb_msg, 0);
784 if (server->tcpStatus == CifsExiting)
787 if (server->tcpStatus == CifsNeedReconnect) {
788 cifs_reconnect(server);
789 return -ECONNABORTED;
792 if (length == -ERESTARTSYS ||
796 * Minimum sleep to prevent looping, allowing socket
797 * to clear and app threads to set tcpStatus
798 * CifsNeedReconnect if server hung.
800 usleep_range(1000, 2000);
806 cifs_dbg(FYI, "Received no data or error: %d\n", length);
807 cifs_reconnect(server);
808 return -ECONNABORTED;
815 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
816 unsigned int to_read)
818 struct msghdr smb_msg;
819 struct kvec iov = {.iov_base = buf, .iov_len = to_read};
820 iov_iter_kvec(&smb_msg.msg_iter, READ, &iov, 1, to_read);
822 return cifs_readv_from_socket(server, &smb_msg);
826 cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
827 unsigned int page_offset, unsigned int to_read)
829 struct msghdr smb_msg;
830 struct bio_vec bv = {
831 .bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
832 iov_iter_bvec(&smb_msg.msg_iter, READ, &bv, 1, to_read);
833 return cifs_readv_from_socket(server, &smb_msg);
837 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
840 * The first byte big endian of the length field,
841 * is actually not part of the length but the type
842 * with the most common, zero, as regular data.
845 case RFC1002_SESSION_MESSAGE:
846 /* Regular SMB response */
848 case RFC1002_SESSION_KEEP_ALIVE:
849 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
851 case RFC1002_POSITIVE_SESSION_RESPONSE:
852 cifs_dbg(FYI, "RFC 1002 positive session response\n");
854 case RFC1002_NEGATIVE_SESSION_RESPONSE:
856 * We get this from Windows 98 instead of an error on
857 * SMB negprot response.
859 cifs_dbg(FYI, "RFC 1002 negative session response\n");
860 /* give server a second to clean up */
863 * Always try 445 first on reconnect since we get NACK
864 * on some if we ever connected to port 139 (the NACK
865 * is since we do not begin with RFC1001 session
868 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
869 cifs_reconnect(server);
870 wake_up(&server->response_q);
873 cifs_server_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
874 cifs_reconnect(server);
881 dequeue_mid(struct mid_q_entry *mid, bool malformed)
883 #ifdef CONFIG_CIFS_STATS2
884 mid->when_received = jiffies;
886 spin_lock(&GlobalMid_Lock);
888 mid->mid_state = MID_RESPONSE_RECEIVED;
890 mid->mid_state = MID_RESPONSE_MALFORMED;
892 * Trying to handle/dequeue a mid after the send_recv()
893 * function has finished processing it is a bug.
895 if (mid->mid_flags & MID_DELETED)
896 printk_once(KERN_WARNING
897 "trying to dequeue a deleted mid\n");
899 list_del_init(&mid->qhead);
900 spin_unlock(&GlobalMid_Lock);
904 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
905 char *buf, int malformed)
907 if (server->ops->check_trans2 &&
908 server->ops->check_trans2(mid, server, buf, malformed))
911 mid->large_buf = server->large_buf;
912 /* Was previous buf put in mpx struct for multi-rsp? */
913 if (!mid->multiRsp) {
914 /* smb buffer will be freed by user thread */
915 if (server->large_buf)
916 server->bigbuf = NULL;
918 server->smallbuf = NULL;
920 dequeue_mid(mid, malformed);
923 static void clean_demultiplex_info(struct TCP_Server_Info *server)
927 /* take it off the list, if it's not already */
928 spin_lock(&cifs_tcp_ses_lock);
929 list_del_init(&server->tcp_ses_list);
930 spin_unlock(&cifs_tcp_ses_lock);
932 spin_lock(&GlobalMid_Lock);
933 server->tcpStatus = CifsExiting;
934 spin_unlock(&GlobalMid_Lock);
935 wake_up_all(&server->response_q);
937 /* check if we have blocked requests that need to free */
938 spin_lock(&server->req_lock);
939 if (server->credits <= 0)
941 spin_unlock(&server->req_lock);
943 * Although there should not be any requests blocked on this queue it
944 * can not hurt to be paranoid and try to wake up requests that may
945 * haven been blocked when more than 50 at time were on the wire to the
946 * same server - they now will see the session is in exit state and get
947 * out of SendReceive.
949 wake_up_all(&server->request_q);
950 /* give those requests time to exit */
952 if (cifs_rdma_enabled(server))
953 smbd_destroy(server);
954 if (server->ssocket) {
955 sock_release(server->ssocket);
956 server->ssocket = NULL;
959 if (!list_empty(&server->pending_mid_q)) {
960 struct list_head dispose_list;
961 struct mid_q_entry *mid_entry;
962 struct list_head *tmp, *tmp2;
964 INIT_LIST_HEAD(&dispose_list);
965 spin_lock(&GlobalMid_Lock);
966 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
967 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
968 cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
969 mid_entry->mid_state = MID_SHUTDOWN;
970 list_move(&mid_entry->qhead, &dispose_list);
972 spin_unlock(&GlobalMid_Lock);
974 /* now walk dispose list and issue callbacks */
975 list_for_each_safe(tmp, tmp2, &dispose_list) {
976 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
977 cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
978 list_del_init(&mid_entry->qhead);
979 mid_entry->callback(mid_entry);
981 /* 1/8th of sec is more than enough time for them to exit */
985 if (!list_empty(&server->pending_mid_q)) {
987 * mpx threads have not exited yet give them at least the smb
988 * send timeout time for long ops.
990 * Due to delays on oplock break requests, we need to wait at
991 * least 45 seconds before giving up on a request getting a
992 * response and going ahead and killing cifsd.
994 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
997 * If threads still have not exited they are probably never
998 * coming home not much else we can do but free the memory.
1002 kfree(server->hostname);
1005 length = atomic_dec_return(&tcpSesAllocCount);
1007 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
1011 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1014 char *buf = server->smallbuf;
1015 unsigned int pdu_length = server->pdu_size;
1017 /* make sure this will fit in a large buffer */
1018 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
1019 server->vals->header_preamble_size) {
1020 cifs_server_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
1021 cifs_reconnect(server);
1022 wake_up(&server->response_q);
1023 return -ECONNABORTED;
1026 /* switch to large buffer if too big for a small one */
1027 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
1028 server->large_buf = true;
1029 memcpy(server->bigbuf, buf, server->total_read);
1030 buf = server->bigbuf;
1033 /* now read the rest */
1034 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
1035 pdu_length - HEADER_SIZE(server) + 1
1036 + server->vals->header_preamble_size);
1040 server->total_read += length;
1042 dump_smb(buf, server->total_read);
1044 return cifs_handle_standard(server, mid);
1048 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1050 char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
1054 * We know that we received enough to get to the MID as we
1055 * checked the pdu_length earlier. Now check to see
1056 * if the rest of the header is OK. We borrow the length
1057 * var for the rest of the loop to avoid a new stack var.
1059 * 48 bytes is enough to display the header and a little bit
1060 * into the payload for debugging purposes.
1062 length = server->ops->check_message(buf, server->total_read, server);
1064 cifs_dump_mem("Bad SMB: ", buf,
1065 min_t(unsigned int, server->total_read, 48));
1067 if (server->ops->is_session_expired &&
1068 server->ops->is_session_expired(buf)) {
1069 cifs_reconnect(server);
1070 wake_up(&server->response_q);
1074 if (server->ops->is_status_pending &&
1075 server->ops->is_status_pending(buf, server))
1081 handle_mid(mid, server, buf, length);
1086 smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
1088 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
1091 * SMB1 does not use credits.
1093 if (server->vals->header_preamble_size)
1096 if (shdr->CreditRequest) {
1097 spin_lock(&server->req_lock);
1098 server->credits += le16_to_cpu(shdr->CreditRequest);
1099 spin_unlock(&server->req_lock);
1100 wake_up(&server->request_q);
1106 cifs_demultiplex_thread(void *p)
1108 int i, num_mids, length;
1109 struct TCP_Server_Info *server = p;
1110 unsigned int pdu_length;
1111 unsigned int next_offset;
1113 struct task_struct *task_to_wake = NULL;
1114 struct mid_q_entry *mids[MAX_COMPOUND];
1115 char *bufs[MAX_COMPOUND];
1117 current->flags |= PF_MEMALLOC;
1118 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
1120 length = atomic_inc_return(&tcpSesAllocCount);
1122 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
1125 allow_kernel_signal(SIGKILL);
1126 while (server->tcpStatus != CifsExiting) {
1127 if (try_to_freeze())
1130 if (!allocate_buffers(server))
1133 server->large_buf = false;
1134 buf = server->smallbuf;
1135 pdu_length = 4; /* enough to get RFC1001 header */
1137 length = cifs_read_from_socket(server, buf, pdu_length);
1141 if (server->vals->header_preamble_size == 0)
1142 server->total_read = 0;
1144 server->total_read = length;
1147 * The right amount was read from socket - 4 bytes,
1148 * so we can now interpret the length field.
1150 pdu_length = get_rfc1002_length(buf);
1152 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
1153 if (!is_smb_response(server, buf[0]))
1156 server->pdu_size = pdu_length;
1158 /* make sure we have enough to get to the MID */
1159 if (server->pdu_size < HEADER_SIZE(server) - 1 -
1160 server->vals->header_preamble_size) {
1161 cifs_server_dbg(VFS, "SMB response too short (%u bytes)\n",
1163 cifs_reconnect(server);
1164 wake_up(&server->response_q);
1168 /* read down to the MID */
1169 length = cifs_read_from_socket(server,
1170 buf + server->vals->header_preamble_size,
1171 HEADER_SIZE(server) - 1
1172 - server->vals->header_preamble_size);
1175 server->total_read += length;
1177 if (server->ops->next_header) {
1178 next_offset = server->ops->next_header(buf);
1180 server->pdu_size = next_offset;
1183 memset(mids, 0, sizeof(mids));
1184 memset(bufs, 0, sizeof(bufs));
1187 if (server->ops->is_transform_hdr &&
1188 server->ops->receive_transform &&
1189 server->ops->is_transform_hdr(buf)) {
1190 length = server->ops->receive_transform(server,
1195 mids[0] = server->ops->find_mid(server, buf);
1199 if (!mids[0] || !mids[0]->receive)
1200 length = standard_receive3(server, mids[0]);
1202 length = mids[0]->receive(server, mids[0]);
1206 for (i = 0; i < num_mids; i++)
1208 cifs_mid_q_entry_release(mids[i]);
1212 server->lstrp = jiffies;
1214 for (i = 0; i < num_mids; i++) {
1215 if (mids[i] != NULL) {
1216 mids[i]->resp_buf_size = server->pdu_size;
1217 if ((mids[i]->mid_flags & MID_WAIT_CANCELLED) &&
1218 mids[i]->mid_state == MID_RESPONSE_RECEIVED &&
1219 server->ops->handle_cancelled_mid)
1220 server->ops->handle_cancelled_mid(
1224 if (!mids[i]->multiRsp || mids[i]->multiEnd)
1225 mids[i]->callback(mids[i]);
1227 cifs_mid_q_entry_release(mids[i]);
1228 } else if (server->ops->is_oplock_break &&
1229 server->ops->is_oplock_break(bufs[i],
1231 smb2_add_credits_from_hdr(bufs[i], server);
1232 cifs_dbg(FYI, "Received oplock break\n");
1234 cifs_server_dbg(VFS, "No task to wake, unknown frame "
1235 "received! NumMids %d\n",
1236 atomic_read(&midCount));
1237 cifs_dump_mem("Received Data is: ", bufs[i],
1238 HEADER_SIZE(server));
1239 smb2_add_credits_from_hdr(bufs[i], server);
1240 #ifdef CONFIG_CIFS_DEBUG2
1241 if (server->ops->dump_detail)
1242 server->ops->dump_detail(bufs[i],
1244 cifs_dump_mids(server);
1245 #endif /* CIFS_DEBUG2 */
1249 if (pdu_length > server->pdu_size) {
1250 if (!allocate_buffers(server))
1252 pdu_length -= server->pdu_size;
1253 server->total_read = 0;
1254 server->large_buf = false;
1255 buf = server->smallbuf;
1258 } /* end while !EXITING */
1260 /* buffer usually freed in free_mid - need to free it here on exit */
1261 cifs_buf_release(server->bigbuf);
1262 if (server->smallbuf) /* no sense logging a debug message if NULL */
1263 cifs_small_buf_release(server->smallbuf);
1265 task_to_wake = xchg(&server->tsk, NULL);
1266 clean_demultiplex_info(server);
1268 /* if server->tsk was NULL then wait for a signal before exiting */
1269 if (!task_to_wake) {
1270 set_current_state(TASK_INTERRUPTIBLE);
1271 while (!signal_pending(current)) {
1273 set_current_state(TASK_INTERRUPTIBLE);
1275 set_current_state(TASK_RUNNING);
1278 module_put_and_exit(0);
1281 /* extract the host portion of the UNC string */
1283 extract_hostname(const char *unc)
1289 /* skip double chars at beginning of string */
1290 /* BB: check validity of these bytes? */
1291 if (strlen(unc) < 3)
1292 return ERR_PTR(-EINVAL);
1293 for (src = unc; *src && *src == '\\'; src++)
1296 return ERR_PTR(-EINVAL);
1298 /* delimiter between hostname and sharename is always '\\' now */
1299 delim = strchr(src, '\\');
1301 return ERR_PTR(-EINVAL);
1304 dst = kmalloc((len + 1), GFP_KERNEL);
1306 return ERR_PTR(-ENOMEM);
1308 memcpy(dst, src, len);
1314 static int get_option_ul(substring_t args[], unsigned long *option)
1319 string = match_strdup(args);
1322 rc = kstrtoul(string, 0, option);
1328 static int get_option_uid(substring_t args[], kuid_t *result)
1330 unsigned long value;
1334 rc = get_option_ul(args, &value);
1338 uid = make_kuid(current_user_ns(), value);
1339 if (!uid_valid(uid))
1346 static int get_option_gid(substring_t args[], kgid_t *result)
1348 unsigned long value;
1352 rc = get_option_ul(args, &value);
1356 gid = make_kgid(current_user_ns(), value);
1357 if (!gid_valid(gid))
1364 static int cifs_parse_security_flavors(char *value,
1365 struct smb_vol *vol)
1368 substring_t args[MAX_OPT_ARGS];
1371 * With mount options, the last one should win. Reset any existing
1372 * settings back to default.
1374 vol->sectype = Unspecified;
1377 switch (match_token(value, cifs_secflavor_tokens, args)) {
1379 cifs_dbg(VFS, "sec=krb5p is not supported!\n");
1385 vol->sectype = Kerberos;
1387 case Opt_sec_ntlmsspi:
1390 case Opt_sec_ntlmssp:
1391 vol->sectype = RawNTLMSSP;
1397 vol->sectype = NTLM;
1399 case Opt_sec_ntlmv2i:
1402 case Opt_sec_ntlmv2:
1403 vol->sectype = NTLMv2;
1405 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1406 case Opt_sec_lanman:
1407 vol->sectype = LANMAN;
1414 cifs_dbg(VFS, "bad security option: %s\n", value);
1422 cifs_parse_cache_flavor(char *value, struct smb_vol *vol)
1424 substring_t args[MAX_OPT_ARGS];
1426 switch (match_token(value, cifs_cacheflavor_tokens, args)) {
1427 case Opt_cache_loose:
1428 vol->direct_io = false;
1429 vol->strict_io = false;
1430 vol->cache_ro = false;
1431 vol->cache_rw = false;
1433 case Opt_cache_strict:
1434 vol->direct_io = false;
1435 vol->strict_io = true;
1436 vol->cache_ro = false;
1437 vol->cache_rw = false;
1439 case Opt_cache_none:
1440 vol->direct_io = true;
1441 vol->strict_io = false;
1442 vol->cache_ro = false;
1443 vol->cache_rw = false;
1446 vol->direct_io = false;
1447 vol->strict_io = false;
1448 vol->cache_ro = true;
1449 vol->cache_rw = false;
1452 vol->direct_io = false;
1453 vol->strict_io = false;
1454 vol->cache_ro = false;
1455 vol->cache_rw = true;
1458 cifs_dbg(VFS, "bad cache= option: %s\n", value);
1465 cifs_parse_smb_version(char *value, struct smb_vol *vol, bool is_smb3)
1467 substring_t args[MAX_OPT_ARGS];
1469 switch (match_token(value, cifs_smb_version_tokens, args)) {
1470 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1472 if (disable_legacy_dialects) {
1473 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1477 cifs_dbg(VFS, "vers=1.0 (cifs) not permitted when mounting with smb3\n");
1480 vol->ops = &smb1_operations;
1481 vol->vals = &smb1_values;
1484 if (disable_legacy_dialects) {
1485 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1489 cifs_dbg(VFS, "vers=2.0 not permitted when mounting with smb3\n");
1492 vol->ops = &smb20_operations;
1493 vol->vals = &smb20_values;
1497 cifs_dbg(VFS, "vers=1.0 (cifs) mount not permitted when legacy dialects disabled\n");
1500 cifs_dbg(VFS, "vers=2.0 mount not permitted when legacy dialects disabled\n");
1502 #endif /* CIFS_ALLOW_INSECURE_LEGACY */
1504 vol->ops = &smb21_operations;
1505 vol->vals = &smb21_values;
1508 vol->ops = &smb30_operations;
1509 vol->vals = &smb30_values;
1512 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1513 vol->vals = &smb302_values;
1516 vol->ops = &smb311_operations;
1517 vol->vals = &smb311_values;
1520 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1521 vol->vals = &smb3any_values;
1524 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1525 vol->vals = &smbdefault_values;
1528 cifs_dbg(VFS, "Unknown vers= option specified: %s\n", value);
1535 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1536 * fields with the result. Returns 0 on success and an error otherwise.
1539 cifs_parse_devname(const char *devname, struct smb_vol *vol)
1542 const char *delims = "/\\";
1545 if (unlikely(!devname || !*devname)) {
1546 cifs_dbg(VFS, "Device name not specified.\n");
1550 /* make sure we have a valid UNC double delimiter prefix */
1551 len = strspn(devname, delims);
1555 /* find delimiter between host and sharename */
1556 pos = strpbrk(devname + 2, delims);
1560 /* skip past delimiter */
1563 /* now go until next delimiter or end of string */
1564 len = strcspn(pos, delims);
1566 /* move "pos" up to delimiter or NULL */
1568 vol->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
1572 convert_delimiter(vol->UNC, '\\');
1574 /* skip any delimiter */
1575 if (*pos == '/' || *pos == '\\')
1578 /* If pos is NULL then no prepath */
1582 vol->prepath = kstrdup(pos, GFP_KERNEL);
1590 cifs_parse_mount_options(const char *mountdata, const char *devname,
1591 struct smb_vol *vol, bool is_smb3)
1594 char *mountdata_copy = NULL, *options;
1595 unsigned int temp_len, i, j;
1597 short int override_uid = -1;
1598 short int override_gid = -1;
1599 bool uid_specified = false;
1600 bool gid_specified = false;
1601 bool sloppy = false;
1602 char *invalid = NULL;
1603 char *nodename = utsname()->nodename;
1604 char *string = NULL;
1605 char *tmp_end, *value;
1607 bool got_ip = false;
1608 bool got_version = false;
1609 unsigned short port = 0;
1610 struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1614 delim = separator[0];
1616 /* ensure we always start with zeroed-out smb_vol */
1617 memset(vol, 0, sizeof(*vol));
1620 * does not have to be perfect mapping since field is
1621 * informational, only used for servers that do not support
1622 * port 445 and it can be overridden at mount time
1624 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1625 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1626 vol->source_rfc1001_name[i] = toupper(nodename[i]);
1628 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1629 /* null target name indicates to use *SMBSERVR default called name
1630 if we end up sending RFC1001 session initialize */
1631 vol->target_rfc1001_name[0] = 0;
1632 vol->cred_uid = current_uid();
1633 vol->linux_uid = current_uid();
1634 vol->linux_gid = current_gid();
1635 vol->bsize = 1024 * 1024; /* can improve cp performance significantly */
1637 * default to SFM style remapping of seven reserved characters
1638 * unless user overrides it or we negotiate CIFS POSIX where
1639 * it is unnecessary. Can not simultaneously use more than one mapping
1640 * since then readdir could list files that open could not open
1644 /* default to only allowing write access to owner of the mount */
1645 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1647 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1648 /* default is always to request posix paths. */
1649 vol->posix_paths = 1;
1650 /* default to using server inode numbers where available */
1651 vol->server_ino = 1;
1653 /* default is to use strict cifs caching semantics */
1654 vol->strict_io = true;
1656 vol->actimeo = CIFS_DEF_ACTIMEO;
1658 /* Most clients set timeout to 0, allows server to use its default */
1659 vol->handle_timeout = 0; /* See MS-SMB2 spec section 2.2.14.2.12 */
1661 /* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1662 vol->ops = &smb30_operations;
1663 vol->vals = &smbdefault_values;
1665 vol->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1668 goto cifs_parse_mount_err;
1670 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1671 if (!mountdata_copy)
1672 goto cifs_parse_mount_err;
1674 options = mountdata_copy;
1675 end = options + strlen(options);
1677 if (strncmp(options, "sep=", 4) == 0) {
1678 if (options[4] != 0) {
1679 separator[0] = options[4];
1682 cifs_dbg(FYI, "Null separator not allowed\n");
1685 vol->backupuid_specified = false; /* no backup intent for a user */
1686 vol->backupgid_specified = false; /* no backup intent for a group */
1688 switch (cifs_parse_devname(devname, vol)) {
1692 cifs_dbg(VFS, "Unable to allocate memory for devname.\n");
1693 goto cifs_parse_mount_err;
1695 cifs_dbg(VFS, "Malformed UNC in devname.\n");
1696 goto cifs_parse_mount_err;
1698 cifs_dbg(VFS, "Unknown error parsing devname.\n");
1699 goto cifs_parse_mount_err;
1702 while ((data = strsep(&options, separator)) != NULL) {
1703 substring_t args[MAX_OPT_ARGS];
1704 unsigned long option;
1710 token = match_token(data, cifs_mount_option_tokens, args);
1714 /* Ingnore the following */
1718 /* Boolean values */
1719 case Opt_user_xattr:
1722 case Opt_nouser_xattr:
1728 case Opt_noforceuid:
1734 case Opt_noforcegid:
1737 case Opt_noblocksend:
1738 vol->noblocksnd = 1;
1740 case Opt_noautotune:
1741 vol->noautotune = 1;
1759 vol->sfu_remap = true;
1760 vol->remap = false; /* disable SFM mapping */
1762 case Opt_nomapchars:
1763 vol->sfu_remap = false;
1767 vol->sfu_remap = false; /* disable SFU mapping */
1769 case Opt_nomapposix:
1782 #ifdef CONFIG_CIFS_ROOT
1786 case Opt_posixpaths:
1787 vol->posix_paths = 1;
1789 case Opt_noposixpaths:
1790 vol->posix_paths = 0;
1795 "conflicting unix mount options\n");
1796 vol->no_linux_ext = 1;
1799 if (vol->no_linux_ext)
1801 "conflicting unix mount options\n");
1813 * turn off mandatory locking in mode
1814 * if remote locking is turned off since the
1815 * local vfs will do advisory
1817 if (vol->file_mode ==
1818 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1819 vol->file_mode = S_IALLUGO;
1821 case Opt_nohandlecache:
1822 vol->nohandlecache = 1;
1824 case Opt_handlecache:
1825 vol->nohandlecache = 0;
1827 case Opt_forcemandatorylock:
1836 case Opt_setuidfromacl:
1837 vol->setuidfromacl = 1;
1840 vol->dynperm = true;
1843 vol->dynperm = false;
1857 case Opt_nostrictsync:
1858 vol->nostrictsync = 1;
1860 case Opt_strictsync:
1861 vol->nostrictsync = 0;
1864 vol->server_ino = 1;
1866 case Opt_noserverino:
1867 vol->server_ino = 0;
1869 case Opt_rwpidforward:
1870 vol->rwpidforward = 1;
1882 vol->no_psx_acl = 0;
1885 vol->no_psx_acl = 1;
1887 case Opt_locallease:
1888 vol->local_lease = 1;
1893 case Opt_ignore_signature:
1895 vol->ignore_signature = true;
1898 /* we do not do the following in secFlags because seal
1899 * is a per tree connection (mount) not a per socket
1900 * or per-smb connection option in the protocol
1901 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1906 pr_warn("CIFS: Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1909 #ifndef CONFIG_CIFS_FSCACHE
1910 cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1911 goto cifs_parse_mount_err;
1915 case Opt_mfsymlinks:
1916 vol->mfsymlinks = true;
1919 vol->multiuser = true;
1924 case Opt_nosharesock:
1925 vol->nosharesock = true;
1927 case Opt_nopersistent:
1928 vol->nopersistent = true;
1929 if (vol->persistent) {
1931 "persistenthandles mount options conflict\n");
1932 goto cifs_parse_mount_err;
1935 case Opt_persistent:
1936 vol->persistent = true;
1937 if ((vol->nopersistent) || (vol->resilient)) {
1939 "persistenthandles mount options conflict\n");
1940 goto cifs_parse_mount_err;
1944 vol->resilient = true;
1945 if (vol->persistent) {
1947 "persistenthandles mount options conflict\n");
1948 goto cifs_parse_mount_err;
1951 case Opt_noresilient:
1952 vol->resilient = false; /* already the default */
1954 case Opt_domainauto:
1955 vol->domainauto = true;
1961 vol->compression = UNKNOWN_TYPE;
1963 "SMB3 compression support is experimental\n");
1966 /* Numeric Values */
1968 if (get_option_uid(args, &vol->backupuid)) {
1969 cifs_dbg(VFS, "%s: Invalid backupuid value\n",
1971 goto cifs_parse_mount_err;
1973 vol->backupuid_specified = true;
1976 if (get_option_gid(args, &vol->backupgid)) {
1977 cifs_dbg(VFS, "%s: Invalid backupgid value\n",
1979 goto cifs_parse_mount_err;
1981 vol->backupgid_specified = true;
1984 if (get_option_uid(args, &vol->linux_uid)) {
1985 cifs_dbg(VFS, "%s: Invalid uid value\n",
1987 goto cifs_parse_mount_err;
1989 uid_specified = true;
1992 if (get_option_uid(args, &vol->cred_uid)) {
1993 cifs_dbg(VFS, "%s: Invalid cruid value\n",
1995 goto cifs_parse_mount_err;
1999 if (get_option_gid(args, &vol->linux_gid)) {
2000 cifs_dbg(VFS, "%s: Invalid gid value\n",
2002 goto cifs_parse_mount_err;
2004 gid_specified = true;
2007 if (get_option_ul(args, &option)) {
2008 cifs_dbg(VFS, "%s: Invalid file_mode value\n",
2010 goto cifs_parse_mount_err;
2012 vol->file_mode = option;
2015 if (get_option_ul(args, &option)) {
2016 cifs_dbg(VFS, "%s: Invalid dir_mode value\n",
2018 goto cifs_parse_mount_err;
2020 vol->dir_mode = option;
2023 if (get_option_ul(args, &option) ||
2024 option > USHRT_MAX) {
2025 cifs_dbg(VFS, "%s: Invalid port value\n",
2027 goto cifs_parse_mount_err;
2029 port = (unsigned short)option;
2031 case Opt_min_enc_offload:
2032 if (get_option_ul(args, &option)) {
2033 cifs_dbg(VFS, "Invalid minimum encrypted read offload size (esize)\n");
2034 goto cifs_parse_mount_err;
2036 vol->min_offload = option;
2039 if (get_option_ul(args, &option)) {
2040 cifs_dbg(VFS, "%s: Invalid blocksize value\n",
2042 goto cifs_parse_mount_err;
2045 * inode blocksize realistically should never need to be
2046 * less than 16K or greater than 16M and default is 1MB.
2047 * Note that small inode block sizes (e.g. 64K) can lead
2048 * to very poor performance of common tools like cp and scp
2050 if ((option < CIFS_MAX_MSGSIZE) ||
2051 (option > (4 * SMB3_DEFAULT_IOSIZE))) {
2052 cifs_dbg(VFS, "%s: Invalid blocksize\n",
2054 goto cifs_parse_mount_err;
2056 vol->bsize = option;
2059 if (get_option_ul(args, &option)) {
2060 cifs_dbg(VFS, "%s: Invalid rsize value\n",
2062 goto cifs_parse_mount_err;
2064 vol->rsize = option;
2067 if (get_option_ul(args, &option)) {
2068 cifs_dbg(VFS, "%s: Invalid wsize value\n",
2070 goto cifs_parse_mount_err;
2072 vol->wsize = option;
2075 if (get_option_ul(args, &option)) {
2076 cifs_dbg(VFS, "%s: Invalid actimeo value\n",
2078 goto cifs_parse_mount_err;
2080 vol->actimeo = HZ * option;
2081 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
2082 cifs_dbg(VFS, "attribute cache timeout too large\n");
2083 goto cifs_parse_mount_err;
2086 case Opt_handletimeout:
2087 if (get_option_ul(args, &option)) {
2088 cifs_dbg(VFS, "%s: Invalid handletimeout value\n",
2090 goto cifs_parse_mount_err;
2092 vol->handle_timeout = option;
2093 if (vol->handle_timeout > SMB3_MAX_HANDLE_TIMEOUT) {
2094 cifs_dbg(VFS, "Invalid handle cache timeout, longer than 16 minutes\n");
2095 goto cifs_parse_mount_err;
2098 case Opt_echo_interval:
2099 if (get_option_ul(args, &option)) {
2100 cifs_dbg(VFS, "%s: Invalid echo interval value\n",
2102 goto cifs_parse_mount_err;
2104 vol->echo_interval = option;
2107 if (get_option_ul(args, &option)) {
2108 cifs_dbg(VFS, "%s: Invalid snapshot time\n",
2110 goto cifs_parse_mount_err;
2112 vol->snapshot_time = option;
2114 case Opt_max_credits:
2115 if (get_option_ul(args, &option) || (option < 20) ||
2117 cifs_dbg(VFS, "%s: Invalid max_credits value\n",
2119 goto cifs_parse_mount_err;
2121 vol->max_credits = option;
2124 /* String Arguments */
2126 case Opt_blank_user:
2127 /* null user, ie. anonymous authentication */
2129 vol->username = NULL;
2132 string = match_strdup(args);
2136 if (strnlen(string, CIFS_MAX_USERNAME_LEN) >
2137 CIFS_MAX_USERNAME_LEN) {
2138 pr_warn("CIFS: username too long\n");
2139 goto cifs_parse_mount_err;
2142 kfree(vol->username);
2143 vol->username = kstrdup(string, GFP_KERNEL);
2145 goto cifs_parse_mount_err;
2147 case Opt_blank_pass:
2148 /* passwords have to be handled differently
2149 * to allow the character used for deliminator
2150 * to be passed within them
2154 * Check if this is a case where the password
2155 * starts with a delimiter
2157 tmp_end = strchr(data, '=');
2159 if (!(tmp_end < end && tmp_end[1] == delim)) {
2160 /* No it is not. Set the password to NULL */
2161 kzfree(vol->password);
2162 vol->password = NULL;
2165 /* Fallthrough - to Opt_pass below.*/
2167 /* Obtain the value string */
2168 value = strchr(data, '=');
2171 /* Set tmp_end to end of the string */
2172 tmp_end = (char *) value + strlen(value);
2174 /* Check if following character is the deliminator
2175 * If yes, we have encountered a double deliminator
2176 * reset the NULL character to the deliminator
2178 if (tmp_end < end && tmp_end[1] == delim) {
2181 /* Keep iterating until we get to a single
2182 * deliminator OR the end
2184 while ((tmp_end = strchr(tmp_end, delim))
2185 != NULL && (tmp_end[1] == delim)) {
2186 tmp_end = (char *) &tmp_end[2];
2189 /* Reset var options to point to next element */
2192 options = (char *) &tmp_end[1];
2194 /* Reached the end of the mount option
2199 kzfree(vol->password);
2200 /* Now build new password string */
2201 temp_len = strlen(value);
2202 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
2203 if (vol->password == NULL) {
2204 pr_warn("CIFS: no memory for password\n");
2205 goto cifs_parse_mount_err;
2208 for (i = 0, j = 0; i < temp_len; i++, j++) {
2209 vol->password[j] = value[i];
2210 if ((value[i] == delim) &&
2211 value[i+1] == delim)
2212 /* skip the second deliminator */
2215 vol->password[j] = '\0';
2218 /* FIXME: should this be an error instead? */
2222 string = match_strdup(args);
2226 if (!cifs_convert_address(dstaddr, string,
2228 pr_err("CIFS: bad ip= option (%s).\n", string);
2229 goto cifs_parse_mount_err;
2234 string = match_strdup(args);
2238 if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
2239 == CIFS_MAX_DOMAINNAME_LEN) {
2240 pr_warn("CIFS: domain name too long\n");
2241 goto cifs_parse_mount_err;
2244 kfree(vol->domainname);
2245 vol->domainname = kstrdup(string, GFP_KERNEL);
2246 if (!vol->domainname) {
2247 pr_warn("CIFS: no memory for domainname\n");
2248 goto cifs_parse_mount_err;
2250 cifs_dbg(FYI, "Domain name set\n");
2253 string = match_strdup(args);
2257 if (!cifs_convert_address(
2258 (struct sockaddr *)&vol->srcaddr,
2259 string, strlen(string))) {
2260 pr_warn("CIFS: Could not parse srcaddr: %s\n",
2262 goto cifs_parse_mount_err;
2266 string = match_strdup(args);
2270 if (strnlen(string, 1024) >= 65) {
2271 pr_warn("CIFS: iocharset name too long.\n");
2272 goto cifs_parse_mount_err;
2275 if (strncasecmp(string, "default", 7) != 0) {
2276 kfree(vol->iocharset);
2277 vol->iocharset = kstrdup(string,
2279 if (!vol->iocharset) {
2280 pr_warn("CIFS: no memory for charset\n");
2281 goto cifs_parse_mount_err;
2284 /* if iocharset not set then load_nls_default
2287 cifs_dbg(FYI, "iocharset set to %s\n", string);
2289 case Opt_netbiosname:
2290 string = match_strdup(args);
2294 memset(vol->source_rfc1001_name, 0x20,
2297 * FIXME: are there cases in which a comma can
2298 * be valid in workstation netbios name (and
2299 * need special handling)?
2301 for (i = 0; i < RFC1001_NAME_LEN; i++) {
2302 /* don't ucase netbiosname for user */
2305 vol->source_rfc1001_name[i] = string[i];
2307 /* The string has 16th byte zero still from
2308 * set at top of the function
2310 if (i == RFC1001_NAME_LEN && string[i] != 0)
2311 pr_warn("CIFS: netbiosname longer than 15 truncated.\n");
2314 /* servernetbiosname specified override *SMBSERVER */
2315 string = match_strdup(args);
2319 /* last byte, type, is 0x20 for servr type */
2320 memset(vol->target_rfc1001_name, 0x20,
2321 RFC1001_NAME_LEN_WITH_NULL);
2323 /* BB are there cases in which a comma can be
2324 valid in this workstation netbios name
2325 (and need special handling)? */
2327 /* user or mount helper must uppercase the
2329 for (i = 0; i < 15; i++) {
2332 vol->target_rfc1001_name[i] = string[i];
2334 /* The string has 16th byte zero still from
2335 set at top of the function */
2336 if (i == RFC1001_NAME_LEN && string[i] != 0)
2337 pr_warn("CIFS: server netbiosname longer than 15 truncated.\n");
2340 /* version of mount userspace tools, not dialect */
2341 string = match_strdup(args);
2345 /* If interface changes in mount.cifs bump to new ver */
2346 if (strncasecmp(string, "1", 1) == 0) {
2347 if (strlen(string) > 1) {
2348 pr_warn("Bad mount helper ver=%s. Did "
2349 "you want SMB1 (CIFS) dialect "
2350 "and mean to type vers=1.0 "
2351 "instead?\n", string);
2352 goto cifs_parse_mount_err;
2354 /* This is the default */
2357 /* For all other value, error */
2358 pr_warn("CIFS: Invalid mount helper version specified\n");
2359 goto cifs_parse_mount_err;
2361 /* protocol version (dialect) */
2362 string = match_strdup(args);
2366 if (cifs_parse_smb_version(string, vol, is_smb3) != 0)
2367 goto cifs_parse_mount_err;
2371 string = match_strdup(args);
2375 if (cifs_parse_security_flavors(string, vol) != 0)
2376 goto cifs_parse_mount_err;
2379 string = match_strdup(args);
2383 if (cifs_parse_cache_flavor(string, vol) != 0)
2384 goto cifs_parse_mount_err;
2388 * An option we don't recognize. Save it off for later
2389 * if we haven't already found one
2395 /* Free up any allocated string */
2400 if (!sloppy && invalid) {
2401 pr_err("CIFS: Unknown mount option \"%s\"\n", invalid);
2402 goto cifs_parse_mount_err;
2405 if (vol->rdma && vol->vals->protocol_id < SMB30_PROT_ID) {
2406 cifs_dbg(VFS, "SMB Direct requires Version >=3.0\n");
2407 goto cifs_parse_mount_err;
2411 /* Muliuser mounts require CONFIG_KEYS support */
2412 if (vol->multiuser) {
2413 cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
2414 goto cifs_parse_mount_err;
2418 cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
2419 goto cifs_parse_mount_err;
2422 /* make sure UNC has a share name */
2423 if (!strchr(vol->UNC + 3, '\\')) {
2424 cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
2425 goto cifs_parse_mount_err;
2432 /* No ip= option specified? Try to get it from UNC */
2433 /* Use the address part of the UNC. */
2434 slash = strchr(&vol->UNC[2], '\\');
2435 len = slash - &vol->UNC[2];
2436 if (!cifs_convert_address(dstaddr, &vol->UNC[2], len)) {
2437 pr_err("Unable to determine destination address.\n");
2438 goto cifs_parse_mount_err;
2442 /* set the port that we got earlier */
2443 cifs_set_port(dstaddr, port);
2446 vol->override_uid = override_uid;
2447 else if (override_uid == 1)
2448 pr_notice("CIFS: ignoring forceuid mount option specified with no uid= option.\n");
2451 vol->override_gid = override_gid;
2452 else if (override_gid == 1)
2453 pr_notice("CIFS: ignoring forcegid mount option specified with no gid= option.\n");
2455 if (got_version == false)
2456 pr_warn("No dialect specified on mount. Default has changed to "
2457 "a more secure dialect, SMB2.1 or later (e.g. SMB3), from CIFS "
2458 "(SMB1). To use the less secure SMB1 dialect to access "
2459 "old servers which do not support SMB3 (or SMB2.1) specify vers=1.0"
2462 kfree(mountdata_copy);
2466 pr_warn("Could not allocate temporary buffer\n");
2467 cifs_parse_mount_err:
2469 kfree(mountdata_copy);
2473 /** Returns true if srcaddr isn't specified and rhs isn't
2474 * specified, or if srcaddr is specified and
2475 * matches the IP address of the rhs argument.
2478 srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
2480 switch (srcaddr->sa_family) {
2482 return (rhs->sa_family == AF_UNSPEC);
2484 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
2485 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
2486 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
2489 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
2490 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
2491 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
2495 return false; /* don't expect to be here */
2500 * If no port is specified in addr structure, we try to match with 445 port
2501 * and if it fails - with 139 ports. It should be called only if address
2502 * families of server and addr are equal.
2505 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
2507 __be16 port, *sport;
2509 /* SMBDirect manages its own ports, don't match it here */
2513 switch (addr->sa_family) {
2515 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
2516 port = ((struct sockaddr_in *) addr)->sin_port;
2519 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
2520 port = ((struct sockaddr_in6 *) addr)->sin6_port;
2528 port = htons(CIFS_PORT);
2532 port = htons(RFC1001_PORT);
2535 return port == *sport;
2539 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
2540 struct sockaddr *srcaddr)
2542 switch (addr->sa_family) {
2544 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
2545 struct sockaddr_in *srv_addr4 =
2546 (struct sockaddr_in *)&server->dstaddr;
2548 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
2553 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
2554 struct sockaddr_in6 *srv_addr6 =
2555 (struct sockaddr_in6 *)&server->dstaddr;
2557 if (!ipv6_addr_equal(&addr6->sin6_addr,
2558 &srv_addr6->sin6_addr))
2560 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
2566 return false; /* don't expect to be here */
2569 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
2576 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2579 * The select_sectype function should either return the vol->sectype
2580 * that was specified, or "Unspecified" if that sectype was not
2581 * compatible with the given NEGOTIATE request.
2583 if (server->ops->select_sectype(server, vol->sectype)
2588 * Now check if signing mode is acceptable. No need to check
2589 * global_secflags at this point since if MUST_SIGN is set then
2590 * the server->sign had better be too.
2592 if (vol->sign && !server->sign)
2598 static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
2600 struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2602 if (vol->nosharesock)
2605 /* If multidialect negotiation see if existing sessions match one */
2606 if (strcmp(vol->vals->version_string, SMB3ANY_VERSION_STRING) == 0) {
2607 if (server->vals->protocol_id < SMB30_PROT_ID)
2609 } else if (strcmp(vol->vals->version_string,
2610 SMBDEFAULT_VERSION_STRING) == 0) {
2611 if (server->vals->protocol_id < SMB21_PROT_ID)
2613 } else if ((server->vals != vol->vals) || (server->ops != vol->ops))
2616 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2619 if (!match_address(server, addr,
2620 (struct sockaddr *)&vol->srcaddr))
2623 if (!match_port(server, addr))
2626 if (!match_security(server, vol))
2629 if (server->echo_interval != vol->echo_interval * HZ)
2632 if (server->rdma != vol->rdma)
2635 if (server->ignore_signature != vol->ignore_signature)
2638 if (server->min_offload != vol->min_offload)
2644 struct TCP_Server_Info *
2645 cifs_find_tcp_session(struct smb_vol *vol)
2647 struct TCP_Server_Info *server;
2649 spin_lock(&cifs_tcp_ses_lock);
2650 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
2651 if (!match_server(server, vol))
2654 ++server->srv_count;
2655 spin_unlock(&cifs_tcp_ses_lock);
2656 cifs_dbg(FYI, "Existing tcp session with server found\n");
2659 spin_unlock(&cifs_tcp_ses_lock);
2664 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
2666 struct task_struct *task;
2668 spin_lock(&cifs_tcp_ses_lock);
2669 if (--server->srv_count > 0) {
2670 spin_unlock(&cifs_tcp_ses_lock);
2674 put_net(cifs_net_ns(server));
2676 list_del_init(&server->tcp_ses_list);
2677 spin_unlock(&cifs_tcp_ses_lock);
2679 cancel_delayed_work_sync(&server->echo);
2683 * Avoid deadlock here: reconnect work calls
2684 * cifs_put_tcp_session() at its end. Need to be sure
2685 * that reconnect work does nothing with server pointer after
2688 cancel_delayed_work(&server->reconnect);
2690 cancel_delayed_work_sync(&server->reconnect);
2692 spin_lock(&GlobalMid_Lock);
2693 server->tcpStatus = CifsExiting;
2694 spin_unlock(&GlobalMid_Lock);
2696 cifs_crypto_secmech_release(server);
2697 cifs_fscache_release_client_cookie(server);
2699 kfree(server->session_key.response);
2700 server->session_key.response = NULL;
2701 server->session_key.len = 0;
2703 task = xchg(&server->tsk, NULL);
2705 send_sig(SIGKILL, task, 1);
2708 static struct TCP_Server_Info *
2709 cifs_get_tcp_session(struct smb_vol *volume_info)
2711 struct TCP_Server_Info *tcp_ses = NULL;
2714 cifs_dbg(FYI, "UNC: %s\n", volume_info->UNC);
2716 /* see if we already have a matching tcp_ses */
2717 tcp_ses = cifs_find_tcp_session(volume_info);
2721 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2727 tcp_ses->ops = volume_info->ops;
2728 tcp_ses->vals = volume_info->vals;
2729 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2730 tcp_ses->hostname = extract_hostname(volume_info->UNC);
2731 if (IS_ERR(tcp_ses->hostname)) {
2732 rc = PTR_ERR(tcp_ses->hostname);
2733 goto out_err_crypto_release;
2736 tcp_ses->noblockcnt = volume_info->rootfs;
2737 tcp_ses->noblocksnd = volume_info->noblocksnd || volume_info->rootfs;
2738 tcp_ses->noautotune = volume_info->noautotune;
2739 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2740 tcp_ses->rdma = volume_info->rdma;
2741 tcp_ses->in_flight = 0;
2742 tcp_ses->max_in_flight = 0;
2743 tcp_ses->credits = 1;
2744 init_waitqueue_head(&tcp_ses->response_q);
2745 init_waitqueue_head(&tcp_ses->request_q);
2746 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2747 mutex_init(&tcp_ses->srv_mutex);
2748 memcpy(tcp_ses->workstation_RFC1001_name,
2749 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2750 memcpy(tcp_ses->server_RFC1001_name,
2751 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2752 tcp_ses->session_estab = false;
2753 tcp_ses->sequence_number = 0;
2754 tcp_ses->reconnect_instance = 1;
2755 tcp_ses->lstrp = jiffies;
2756 tcp_ses->compress_algorithm = cpu_to_le16(volume_info->compression);
2757 spin_lock_init(&tcp_ses->req_lock);
2758 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2759 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2760 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2761 INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
2762 mutex_init(&tcp_ses->reconnect_mutex);
2763 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2764 sizeof(tcp_ses->srcaddr));
2765 memcpy(&tcp_ses->dstaddr, &volume_info->dstaddr,
2766 sizeof(tcp_ses->dstaddr));
2767 generate_random_uuid(tcp_ses->client_guid);
2769 * at this point we are the only ones with the pointer
2770 * to the struct since the kernel thread not created yet
2771 * no need to spinlock this init of tcpStatus or srv_count
2773 tcp_ses->tcpStatus = CifsNew;
2774 ++tcp_ses->srv_count;
2776 if (volume_info->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
2777 volume_info->echo_interval <= SMB_ECHO_INTERVAL_MAX)
2778 tcp_ses->echo_interval = volume_info->echo_interval * HZ;
2780 tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
2781 if (tcp_ses->rdma) {
2782 #ifndef CONFIG_CIFS_SMB_DIRECT
2783 cifs_dbg(VFS, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
2785 goto out_err_crypto_release;
2787 tcp_ses->smbd_conn = smbd_get_connection(
2788 tcp_ses, (struct sockaddr *)&volume_info->dstaddr);
2789 if (tcp_ses->smbd_conn) {
2790 cifs_dbg(VFS, "RDMA transport established\n");
2792 goto smbd_connected;
2795 goto out_err_crypto_release;
2798 rc = ip_connect(tcp_ses);
2800 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
2801 goto out_err_crypto_release;
2805 * since we're in a cifs function already, we know that
2806 * this will succeed. No need for try_module_get().
2808 __module_get(THIS_MODULE);
2809 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2811 if (IS_ERR(tcp_ses->tsk)) {
2812 rc = PTR_ERR(tcp_ses->tsk);
2813 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
2814 module_put(THIS_MODULE);
2815 goto out_err_crypto_release;
2817 tcp_ses->min_offload = volume_info->min_offload;
2818 tcp_ses->tcpStatus = CifsNeedNegotiate;
2820 tcp_ses->nr_targets = 1;
2821 tcp_ses->ignore_signature = volume_info->ignore_signature;
2822 /* thread spawned, put it on the list */
2823 spin_lock(&cifs_tcp_ses_lock);
2824 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2825 spin_unlock(&cifs_tcp_ses_lock);
2827 cifs_fscache_get_client_cookie(tcp_ses);
2829 /* queue echo request delayed work */
2830 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
2834 out_err_crypto_release:
2835 cifs_crypto_secmech_release(tcp_ses);
2837 put_net(cifs_net_ns(tcp_ses));
2841 if (!IS_ERR(tcp_ses->hostname))
2842 kfree(tcp_ses->hostname);
2843 if (tcp_ses->ssocket)
2844 sock_release(tcp_ses->ssocket);
2850 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2852 if (vol->sectype != Unspecified &&
2853 vol->sectype != ses->sectype)
2856 switch (ses->sectype) {
2858 if (!uid_eq(vol->cred_uid, ses->cred_uid))
2862 /* NULL username means anonymous session */
2863 if (ses->user_name == NULL) {
2869 /* anything else takes username/password */
2870 if (strncmp(ses->user_name,
2871 vol->username ? vol->username : "",
2872 CIFS_MAX_USERNAME_LEN))
2874 if ((vol->username && strlen(vol->username) != 0) &&
2875 ses->password != NULL &&
2876 strncmp(ses->password,
2877 vol->password ? vol->password : "",
2878 CIFS_MAX_PASSWORD_LEN))
2885 * cifs_setup_ipc - helper to setup the IPC tcon for the session
2887 * A new IPC connection is made and stored in the session
2888 * tcon_ipc. The IPC tcon has the same lifetime as the session.
2891 cifs_setup_ipc(struct cifs_ses *ses, struct smb_vol *volume_info)
2894 struct cifs_tcon *tcon;
2895 struct nls_table *nls_codepage;
2896 char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0};
2898 struct TCP_Server_Info *server = ses->server;
2901 * If the mount request that resulted in the creation of the
2902 * session requires encryption, force IPC to be encrypted too.
2904 if (volume_info->seal) {
2905 if (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
2908 cifs_server_dbg(VFS,
2909 "IPC: server doesn't support encryption\n");
2914 tcon = tconInfoAlloc();
2918 scnprintf(unc, sizeof(unc), "\\\\%s\\IPC$", server->hostname);
2921 nls_codepage = load_nls_default();
2927 rc = server->ops->tree_connect(xid, ses, unc, tcon, nls_codepage);
2931 cifs_server_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
2936 cifs_dbg(FYI, "IPC tcon rc = %d ipc tid = %d\n", rc, tcon->tid);
2938 ses->tcon_ipc = tcon;
2940 unload_nls(nls_codepage);
2945 * cifs_free_ipc - helper to release the session IPC tcon
2947 * Needs to be called everytime a session is destroyed
2950 cifs_free_ipc(struct cifs_ses *ses)
2953 struct cifs_tcon *tcon = ses->tcon_ipc;
2958 if (ses->server->ops->tree_disconnect) {
2960 rc = ses->server->ops->tree_disconnect(xid, tcon);
2965 cifs_dbg(FYI, "failed to disconnect IPC tcon (rc=%d)\n", rc);
2968 ses->tcon_ipc = NULL;
2972 static struct cifs_ses *
2973 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
2975 struct cifs_ses *ses;
2977 spin_lock(&cifs_tcp_ses_lock);
2978 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
2979 if (ses->status == CifsExiting)
2981 if (!match_session(ses, vol))
2984 spin_unlock(&cifs_tcp_ses_lock);
2987 spin_unlock(&cifs_tcp_ses_lock);
2991 void cifs_put_smb_ses(struct cifs_ses *ses)
2993 unsigned int rc, xid;
2994 struct TCP_Server_Info *server = ses->server;
2996 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
2998 spin_lock(&cifs_tcp_ses_lock);
2999 if (ses->status == CifsExiting) {
3000 spin_unlock(&cifs_tcp_ses_lock);
3003 if (--ses->ses_count > 0) {
3004 spin_unlock(&cifs_tcp_ses_lock);
3007 if (ses->status == CifsGood)
3008 ses->status = CifsExiting;
3009 spin_unlock(&cifs_tcp_ses_lock);
3013 if (ses->status == CifsExiting && server->ops->logoff) {
3015 rc = server->ops->logoff(xid, ses);
3017 cifs_server_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
3022 spin_lock(&cifs_tcp_ses_lock);
3023 list_del_init(&ses->smb_ses_list);
3024 spin_unlock(&cifs_tcp_ses_lock);
3027 cifs_put_tcp_session(server, 0);
3032 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
3033 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
3035 /* Populate username and pw fields from keyring if possible */
3037 cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
3041 const char *delim, *payload;
3045 struct TCP_Server_Info *server = ses->server;
3046 struct sockaddr_in *sa;
3047 struct sockaddr_in6 *sa6;
3048 const struct user_key_payload *upayload;
3050 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
3054 /* try to find an address key first */
3055 switch (server->dstaddr.ss_family) {
3057 sa = (struct sockaddr_in *)&server->dstaddr;
3058 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
3061 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
3062 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
3065 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
3066 server->dstaddr.ss_family);
3071 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
3072 key = request_key(&key_type_logon, desc, "");
3074 if (!ses->domainName) {
3075 cifs_dbg(FYI, "domainName is NULL\n");
3080 /* didn't work, try to find a domain key */
3081 sprintf(desc, "cifs:d:%s", ses->domainName);
3082 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
3083 key = request_key(&key_type_logon, desc, "");
3091 down_read(&key->sem);
3092 upayload = user_key_payload_locked(key);
3093 if (IS_ERR_OR_NULL(upayload)) {
3094 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
3098 /* find first : in payload */
3099 payload = upayload->data;
3100 delim = strnchr(payload, upayload->datalen, ':');
3101 cifs_dbg(FYI, "payload=%s\n", payload);
3103 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
3109 len = delim - payload;
3110 if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
3111 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
3117 vol->username = kstrndup(payload, len, GFP_KERNEL);
3118 if (!vol->username) {
3119 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
3124 cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
3126 len = key->datalen - (len + 1);
3127 if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
3128 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
3130 kfree(vol->username);
3131 vol->username = NULL;
3136 vol->password = kstrndup(delim, len, GFP_KERNEL);
3137 if (!vol->password) {
3138 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
3141 kfree(vol->username);
3142 vol->username = NULL;
3147 * If we have a domain key then we must set the domainName in the
3150 if (is_domain && ses->domainName) {
3151 vol->domainname = kstrndup(ses->domainName,
3152 strlen(ses->domainName),
3154 if (!vol->domainname) {
3155 cifs_dbg(FYI, "Unable to allocate %zd bytes for "
3158 kfree(vol->username);
3159 vol->username = NULL;
3160 kzfree(vol->password);
3161 vol->password = NULL;
3171 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
3174 #else /* ! CONFIG_KEYS */
3176 cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
3177 struct cifs_ses *ses __attribute__((unused)))
3181 #endif /* CONFIG_KEYS */
3184 * cifs_get_smb_ses - get a session matching @volume_info data from @server
3186 * This function assumes it is being called from cifs_mount() where we
3187 * already got a server reference (server refcount +1). See
3188 * cifs_get_tcon() for refcount explanations.
3191 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
3195 struct cifs_ses *ses;
3196 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3197 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3201 ses = cifs_find_smb_ses(server, volume_info);
3203 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
3206 mutex_lock(&ses->session_mutex);
3207 rc = cifs_negotiate_protocol(xid, ses);
3209 mutex_unlock(&ses->session_mutex);
3210 /* problem -- put our ses reference */
3211 cifs_put_smb_ses(ses);
3215 if (ses->need_reconnect) {
3216 cifs_dbg(FYI, "Session needs reconnect\n");
3217 rc = cifs_setup_session(xid, ses,
3218 volume_info->local_nls);
3220 mutex_unlock(&ses->session_mutex);
3221 /* problem -- put our reference */
3222 cifs_put_smb_ses(ses);
3227 mutex_unlock(&ses->session_mutex);
3229 /* existing SMB ses has a server reference already */
3230 cifs_put_tcp_session(server, 0);
3235 cifs_dbg(FYI, "Existing smb sess not found\n");
3236 ses = sesInfoAlloc();
3240 /* new SMB session uses our server ref */
3241 ses->server = server;
3242 if (server->dstaddr.ss_family == AF_INET6)
3243 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
3245 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
3247 if (volume_info->username) {
3248 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
3249 if (!ses->user_name)
3253 /* volume_info->password freed at unmount */
3254 if (volume_info->password) {
3255 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
3259 if (volume_info->domainname) {
3260 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
3261 if (!ses->domainName)
3264 if (volume_info->domainauto)
3265 ses->domainAuto = volume_info->domainauto;
3266 ses->cred_uid = volume_info->cred_uid;
3267 ses->linux_uid = volume_info->linux_uid;
3269 ses->sectype = volume_info->sectype;
3270 ses->sign = volume_info->sign;
3271 mutex_lock(&ses->session_mutex);
3272 rc = cifs_negotiate_protocol(xid, ses);
3274 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
3275 mutex_unlock(&ses->session_mutex);
3279 /* success, put it on the list */
3280 spin_lock(&cifs_tcp_ses_lock);
3281 list_add(&ses->smb_ses_list, &server->smb_ses_list);
3282 spin_unlock(&cifs_tcp_ses_lock);
3286 cifs_setup_ipc(ses, volume_info);
3296 static int match_tcon(struct cifs_tcon *tcon, struct smb_vol *volume_info)
3298 if (tcon->tidStatus == CifsExiting)
3300 if (strncmp(tcon->treeName, volume_info->UNC, MAX_TREE_SIZE))
3302 if (tcon->seal != volume_info->seal)
3304 if (tcon->snapshot_time != volume_info->snapshot_time)
3306 if (tcon->handle_timeout != volume_info->handle_timeout)
3308 if (tcon->no_lease != volume_info->no_lease)
3313 static struct cifs_tcon *
3314 cifs_find_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3316 struct list_head *tmp;
3317 struct cifs_tcon *tcon;
3319 spin_lock(&cifs_tcp_ses_lock);
3320 list_for_each(tmp, &ses->tcon_list) {
3321 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
3322 if (!match_tcon(tcon, volume_info))
3325 spin_unlock(&cifs_tcp_ses_lock);
3328 spin_unlock(&cifs_tcp_ses_lock);
3333 cifs_put_tcon(struct cifs_tcon *tcon)
3336 struct cifs_ses *ses;
3339 * IPC tcon share the lifetime of their session and are
3340 * destroyed in the session put function
3342 if (tcon == NULL || tcon->ipc)
3346 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
3347 spin_lock(&cifs_tcp_ses_lock);
3348 if (--tcon->tc_count > 0) {
3349 spin_unlock(&cifs_tcp_ses_lock);
3353 list_del_init(&tcon->tcon_list);
3354 spin_unlock(&cifs_tcp_ses_lock);
3357 if (ses->server->ops->tree_disconnect)
3358 ses->server->ops->tree_disconnect(xid, tcon);
3361 cifs_fscache_release_super_cookie(tcon);
3363 cifs_put_smb_ses(ses);
3367 * cifs_get_tcon - get a tcon matching @volume_info data from @ses
3369 * - tcon refcount is the number of mount points using the tcon.
3370 * - ses refcount is the number of tcon using the session.
3372 * 1. This function assumes it is being called from cifs_mount() where
3373 * we already got a session reference (ses refcount +1).
3375 * 2. Since we're in the context of adding a mount point, the end
3376 * result should be either:
3378 * a) a new tcon already allocated with refcount=1 (1 mount point) and
3379 * its session refcount incremented (1 new tcon). This +1 was
3380 * already done in (1).
3382 * b) an existing tcon with refcount+1 (add a mount point to it) and
3383 * identical ses refcount (no new tcon). Because of (1) we need to
3384 * decrement the ses refcount.
3386 static struct cifs_tcon *
3387 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3390 struct cifs_tcon *tcon;
3392 tcon = cifs_find_tcon(ses, volume_info);
3395 * tcon has refcount already incremented but we need to
3396 * decrement extra ses reference gotten by caller (case b)
3398 cifs_dbg(FYI, "Found match on UNC path\n");
3399 cifs_put_smb_ses(ses);
3403 if (!ses->server->ops->tree_connect) {
3408 tcon = tconInfoAlloc();
3414 if (volume_info->snapshot_time) {
3415 if (ses->server->vals->protocol_id == 0) {
3417 "Use SMB2 or later for snapshot mount option\n");
3421 tcon->snapshot_time = volume_info->snapshot_time;
3424 if (volume_info->handle_timeout) {
3425 if (ses->server->vals->protocol_id == 0) {
3427 "Use SMB2.1 or later for handle timeout option\n");
3431 tcon->handle_timeout = volume_info->handle_timeout;
3435 if (volume_info->password) {
3436 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
3437 if (!tcon->password) {
3443 if (volume_info->seal) {
3444 if (ses->server->vals->protocol_id == 0) {
3446 "SMB3 or later required for encryption\n");
3449 } else if (tcon->ses->server->capabilities &
3450 SMB2_GLOBAL_CAP_ENCRYPTION)
3453 cifs_dbg(VFS, "Encryption is not supported on share\n");
3459 if (volume_info->linux_ext) {
3460 if (ses->server->posix_ext_supported) {
3461 tcon->posix_extensions = true;
3462 printk_once(KERN_WARNING
3463 "SMB3.11 POSIX Extensions are experimental\n");
3465 cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions.\n");
3472 * BB Do we need to wrap session_mutex around this TCon call and Unix
3473 * SetFS as we do on SessSetup and reconnect?
3476 rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
3477 volume_info->local_nls);
3479 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
3483 tcon->use_persistent = false;
3484 /* check if SMB2 or later, CIFS does not support persistent handles */
3485 if (volume_info->persistent) {
3486 if (ses->server->vals->protocol_id == 0) {
3488 "SMB3 or later required for persistent handles\n");
3491 } else if (ses->server->capabilities &
3492 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3493 tcon->use_persistent = true;
3494 else /* persistent handles requested but not supported */ {
3496 "Persistent handles not supported on share\n");
3500 } else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
3501 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3502 && (volume_info->nopersistent == false)) {
3503 cifs_dbg(FYI, "enabling persistent handles\n");
3504 tcon->use_persistent = true;
3505 } else if (volume_info->resilient) {
3506 if (ses->server->vals->protocol_id == 0) {
3508 "SMB2.1 or later required for resilient handles\n");
3512 tcon->use_resilient = true;
3515 /* If the user really knows what they are doing they can override */
3516 if (tcon->share_flags & SMB2_SHAREFLAG_NO_CACHING) {
3517 if (volume_info->cache_ro)
3518 cifs_dbg(VFS, "cache=ro requested on mount but NO_CACHING flag set on share\n");
3519 else if (volume_info->cache_rw)
3520 cifs_dbg(VFS, "cache=singleclient requested on mount but NO_CACHING flag set on share\n");
3524 * We can have only one retry value for a connection to a share so for
3525 * resources mounted more than once to the same server share the last
3526 * value passed in for the retry flag is used.
3528 tcon->retry = volume_info->retry;
3529 tcon->nocase = volume_info->nocase;
3530 tcon->nohandlecache = volume_info->nohandlecache;
3531 tcon->local_lease = volume_info->local_lease;
3532 tcon->no_lease = volume_info->no_lease;
3533 INIT_LIST_HEAD(&tcon->pending_opens);
3535 spin_lock(&cifs_tcp_ses_lock);
3536 list_add(&tcon->tcon_list, &ses->tcon_list);
3537 spin_unlock(&cifs_tcp_ses_lock);
3539 cifs_fscache_get_super_cookie(tcon);
3549 cifs_put_tlink(struct tcon_link *tlink)
3551 if (!tlink || IS_ERR(tlink))
3554 if (!atomic_dec_and_test(&tlink->tl_count) ||
3555 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
3556 tlink->tl_time = jiffies;
3560 if (!IS_ERR(tlink_tcon(tlink)))
3561 cifs_put_tcon(tlink_tcon(tlink));
3567 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3569 struct cifs_sb_info *old = CIFS_SB(sb);
3570 struct cifs_sb_info *new = mnt_data->cifs_sb;
3571 unsigned int oldflags = old->mnt_cifs_flags & CIFS_MOUNT_MASK;
3572 unsigned int newflags = new->mnt_cifs_flags & CIFS_MOUNT_MASK;
3574 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
3577 if (old->mnt_cifs_serverino_autodisabled)
3578 newflags &= ~CIFS_MOUNT_SERVER_INUM;
3580 if (oldflags != newflags)
3584 * We want to share sb only if we don't specify an r/wsize or
3585 * specified r/wsize is greater than or equal to existing one.
3587 if (new->wsize && new->wsize < old->wsize)
3590 if (new->rsize && new->rsize < old->rsize)
3593 if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))
3596 if (old->mnt_file_mode != new->mnt_file_mode ||
3597 old->mnt_dir_mode != new->mnt_dir_mode)
3600 if (strcmp(old->local_nls->charset, new->local_nls->charset))
3603 if (old->actimeo != new->actimeo)
3610 match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3612 struct cifs_sb_info *old = CIFS_SB(sb);
3613 struct cifs_sb_info *new = mnt_data->cifs_sb;
3614 bool old_set = old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH;
3615 bool new_set = new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH;
3617 if (old_set && new_set && !strcmp(new->prepath, old->prepath))
3619 else if (!old_set && !new_set)
3626 cifs_match_super(struct super_block *sb, void *data)
3628 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
3629 struct smb_vol *volume_info;
3630 struct cifs_sb_info *cifs_sb;
3631 struct TCP_Server_Info *tcp_srv;
3632 struct cifs_ses *ses;
3633 struct cifs_tcon *tcon;
3634 struct tcon_link *tlink;
3637 spin_lock(&cifs_tcp_ses_lock);
3638 cifs_sb = CIFS_SB(sb);
3639 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3640 if (IS_ERR(tlink)) {
3641 spin_unlock(&cifs_tcp_ses_lock);
3644 tcon = tlink_tcon(tlink);
3646 tcp_srv = ses->server;
3648 volume_info = mnt_data->vol;
3650 if (!match_server(tcp_srv, volume_info) ||
3651 !match_session(ses, volume_info) ||
3652 !match_tcon(tcon, volume_info) ||
3653 !match_prepath(sb, mnt_data)) {
3658 rc = compare_mount_options(sb, mnt_data);
3660 spin_unlock(&cifs_tcp_ses_lock);
3661 cifs_put_tlink(tlink);
3665 #ifdef CONFIG_DEBUG_LOCK_ALLOC
3666 static struct lock_class_key cifs_key[2];
3667 static struct lock_class_key cifs_slock_key[2];
3670 cifs_reclassify_socket4(struct socket *sock)
3672 struct sock *sk = sock->sk;
3673 BUG_ON(!sock_allow_reclassification(sk));
3674 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
3675 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
3679 cifs_reclassify_socket6(struct socket *sock)
3681 struct sock *sk = sock->sk;
3682 BUG_ON(!sock_allow_reclassification(sk));
3683 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
3684 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
3688 cifs_reclassify_socket4(struct socket *sock)
3693 cifs_reclassify_socket6(struct socket *sock)
3698 /* See RFC1001 section 14 on representation of Netbios names */
3699 static void rfc1002mangle(char *target, char *source, unsigned int length)
3703 for (i = 0, j = 0; i < (length); i++) {
3704 /* mask a nibble at a time and encode */
3705 target[j] = 'A' + (0x0F & (source[i] >> 4));
3706 target[j+1] = 'A' + (0x0F & source[i]);
3713 bind_socket(struct TCP_Server_Info *server)
3716 if (server->srcaddr.ss_family != AF_UNSPEC) {
3717 /* Bind to the specified local IP address */
3718 struct socket *socket = server->ssocket;
3719 rc = socket->ops->bind(socket,
3720 (struct sockaddr *) &server->srcaddr,
3721 sizeof(server->srcaddr));
3723 struct sockaddr_in *saddr4;
3724 struct sockaddr_in6 *saddr6;
3725 saddr4 = (struct sockaddr_in *)&server->srcaddr;
3726 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
3727 if (saddr6->sin6_family == AF_INET6)
3728 cifs_server_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
3729 &saddr6->sin6_addr, rc);
3731 cifs_server_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
3732 &saddr4->sin_addr.s_addr, rc);
3739 ip_rfc1001_connect(struct TCP_Server_Info *server)
3743 * some servers require RFC1001 sessinit before sending
3744 * negprot - BB check reconnection in case where second
3745 * sessinit is sent but no second negprot
3747 struct rfc1002_session_packet *ses_init_buf;
3748 struct smb_hdr *smb_buf;
3749 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
3752 ses_init_buf->trailer.session_req.called_len = 32;
3754 if (server->server_RFC1001_name[0] != 0)
3755 rfc1002mangle(ses_init_buf->trailer.
3756 session_req.called_name,
3757 server->server_RFC1001_name,
3758 RFC1001_NAME_LEN_WITH_NULL);
3760 rfc1002mangle(ses_init_buf->trailer.
3761 session_req.called_name,
3762 DEFAULT_CIFS_CALLED_NAME,
3763 RFC1001_NAME_LEN_WITH_NULL);
3765 ses_init_buf->trailer.session_req.calling_len = 32;
3768 * calling name ends in null (byte 16) from old smb
3771 if (server->workstation_RFC1001_name[0] != 0)
3772 rfc1002mangle(ses_init_buf->trailer.
3773 session_req.calling_name,
3774 server->workstation_RFC1001_name,
3775 RFC1001_NAME_LEN_WITH_NULL);
3777 rfc1002mangle(ses_init_buf->trailer.
3778 session_req.calling_name,
3780 RFC1001_NAME_LEN_WITH_NULL);
3782 ses_init_buf->trailer.session_req.scope1 = 0;
3783 ses_init_buf->trailer.session_req.scope2 = 0;
3784 smb_buf = (struct smb_hdr *)ses_init_buf;
3786 /* sizeof RFC1002_SESSION_REQUEST with no scope */
3787 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
3788 rc = smb_send(server, smb_buf, 0x44);
3789 kfree(ses_init_buf);
3791 * RFC1001 layer in at least one server
3792 * requires very short break before negprot
3793 * presumably because not expecting negprot
3794 * to follow so fast. This is a simple
3795 * solution that works without
3796 * complicating the code and causes no
3797 * significant slowing down on mount
3800 usleep_range(1000, 2000);
3803 * else the negprot may still work without this
3804 * even though malloc failed
3811 generic_ip_connect(struct TCP_Server_Info *server)
3816 struct socket *socket = server->ssocket;
3817 struct sockaddr *saddr;
3819 saddr = (struct sockaddr *) &server->dstaddr;
3821 if (server->dstaddr.ss_family == AF_INET6) {
3822 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
3823 slen = sizeof(struct sockaddr_in6);
3826 sport = ((struct sockaddr_in *) saddr)->sin_port;
3827 slen = sizeof(struct sockaddr_in);
3831 if (socket == NULL) {
3832 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3833 IPPROTO_TCP, &socket, 1);
3835 cifs_server_dbg(VFS, "Error %d creating socket\n", rc);
3836 server->ssocket = NULL;
3840 /* BB other socket options to set KEEPALIVE, NODELAY? */
3841 cifs_dbg(FYI, "Socket created\n");
3842 server->ssocket = socket;
3843 socket->sk->sk_allocation = GFP_NOFS;
3844 if (sfamily == AF_INET6)
3845 cifs_reclassify_socket6(socket);
3847 cifs_reclassify_socket4(socket);
3850 rc = bind_socket(server);
3855 * Eventually check for other socket options to change from
3856 * the default. sock_setsockopt not used because it expects
3859 socket->sk->sk_rcvtimeo = 7 * HZ;
3860 socket->sk->sk_sndtimeo = 5 * HZ;
3862 /* make the bufsizes depend on wsize/rsize and max requests */
3863 if (server->noautotune) {
3864 if (socket->sk->sk_sndbuf < (200 * 1024))
3865 socket->sk->sk_sndbuf = 200 * 1024;
3866 if (socket->sk->sk_rcvbuf < (140 * 1024))
3867 socket->sk->sk_rcvbuf = 140 * 1024;
3870 if (server->tcp_nodelay) {
3872 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
3873 (char *)&val, sizeof(val));
3875 cifs_dbg(FYI, "set TCP_NODELAY socket option error %d\n",
3879 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3880 socket->sk->sk_sndbuf,
3881 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3883 rc = socket->ops->connect(socket, saddr, slen,
3884 server->noblockcnt ? O_NONBLOCK : 0);
3886 if (rc == -EINPROGRESS)
3889 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3890 sock_release(socket);
3891 server->ssocket = NULL;
3895 if (sport == htons(RFC1001_PORT))
3896 rc = ip_rfc1001_connect(server);
3902 ip_connect(struct TCP_Server_Info *server)
3905 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3906 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3908 if (server->dstaddr.ss_family == AF_INET6)
3909 sport = &addr6->sin6_port;
3911 sport = &addr->sin_port;
3916 /* try with 445 port at first */
3917 *sport = htons(CIFS_PORT);
3919 rc = generic_ip_connect(server);
3923 /* if it failed, try with 139 port */
3924 *sport = htons(RFC1001_PORT);
3927 return generic_ip_connect(server);
3930 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
3931 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
3933 /* if we are reconnecting then should we check to see if
3934 * any requested capabilities changed locally e.g. via
3935 * remount but we can not do much about it here
3936 * if they have (even if we could detect it by the following)
3937 * Perhaps we could add a backpointer to array of sb from tcon
3938 * or if we change to make all sb to same share the same
3939 * sb as NFS - then we only have one backpointer to sb.
3940 * What if we wanted to mount the server share twice once with
3941 * and once without posixacls or posix paths? */
3942 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3944 if (vol_info && vol_info->no_linux_ext) {
3945 tcon->fsUnixInfo.Capability = 0;
3946 tcon->unix_ext = 0; /* Unix Extensions disabled */
3947 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
3949 } else if (vol_info)
3950 tcon->unix_ext = 1; /* Unix Extensions supported */
3952 if (tcon->unix_ext == 0) {
3953 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
3957 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
3958 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3959 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
3960 /* check for reconnect case in which we do not
3961 want to change the mount behavior if we can avoid it */
3962 if (vol_info == NULL) {
3963 /* turn off POSIX ACL and PATHNAMES if not set
3964 originally at mount time */
3965 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
3966 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3967 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3968 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3969 cifs_dbg(VFS, "POSIXPATH support change\n");
3970 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3971 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3972 cifs_dbg(VFS, "possible reconnect error\n");
3973 cifs_dbg(VFS, "server disabled POSIX path support\n");
3977 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3978 cifs_dbg(VFS, "per-share encryption not supported yet\n");
3980 cap &= CIFS_UNIX_CAP_MASK;
3981 if (vol_info && vol_info->no_psx_acl)
3982 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3983 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
3984 cifs_dbg(FYI, "negotiated posix acl support\n");
3986 cifs_sb->mnt_cifs_flags |=
3987 CIFS_MOUNT_POSIXACL;
3990 if (vol_info && vol_info->posix_paths == 0)
3991 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3992 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
3993 cifs_dbg(FYI, "negotiate posix pathnames\n");
3995 cifs_sb->mnt_cifs_flags |=
3996 CIFS_MOUNT_POSIX_PATHS;
3999 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
4000 #ifdef CONFIG_CIFS_DEBUG2
4001 if (cap & CIFS_UNIX_FCNTL_CAP)
4002 cifs_dbg(FYI, "FCNTL cap\n");
4003 if (cap & CIFS_UNIX_EXTATTR_CAP)
4004 cifs_dbg(FYI, "EXTATTR cap\n");
4005 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
4006 cifs_dbg(FYI, "POSIX path cap\n");
4007 if (cap & CIFS_UNIX_XATTR_CAP)
4008 cifs_dbg(FYI, "XATTR cap\n");
4009 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
4010 cifs_dbg(FYI, "POSIX ACL cap\n");
4011 if (cap & CIFS_UNIX_LARGE_READ_CAP)
4012 cifs_dbg(FYI, "very large read cap\n");
4013 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
4014 cifs_dbg(FYI, "very large write cap\n");
4015 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
4016 cifs_dbg(FYI, "transport encryption cap\n");
4017 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
4018 cifs_dbg(FYI, "mandatory transport encryption cap\n");
4019 #endif /* CIFS_DEBUG2 */
4020 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
4021 if (vol_info == NULL) {
4022 cifs_dbg(FYI, "resetting capabilities failed\n");
4024 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");
4030 int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
4031 struct cifs_sb_info *cifs_sb)
4033 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
4035 spin_lock_init(&cifs_sb->tlink_tree_lock);
4036 cifs_sb->tlink_tree = RB_ROOT;
4038 cifs_sb->bsize = pvolume_info->bsize;
4040 * Temporarily set r/wsize for matching superblock. If we end up using
4041 * new sb then client will later negotiate it downward if needed.
4043 cifs_sb->rsize = pvolume_info->rsize;
4044 cifs_sb->wsize = pvolume_info->wsize;
4046 cifs_sb->mnt_uid = pvolume_info->linux_uid;
4047 cifs_sb->mnt_gid = pvolume_info->linux_gid;
4048 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
4049 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
4050 cifs_dbg(FYI, "file mode: 0x%hx dir mode: 0x%hx\n",
4051 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
4053 cifs_sb->actimeo = pvolume_info->actimeo;
4054 cifs_sb->local_nls = pvolume_info->local_nls;
4056 if (pvolume_info->nodfs)
4057 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_DFS;
4058 if (pvolume_info->noperm)
4059 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
4060 if (pvolume_info->setuids)
4061 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
4062 if (pvolume_info->setuidfromacl)
4063 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
4064 if (pvolume_info->server_ino)
4065 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
4066 if (pvolume_info->remap)
4067 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
4068 if (pvolume_info->sfu_remap)
4069 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
4070 if (pvolume_info->no_xattr)
4071 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
4072 if (pvolume_info->sfu_emul)
4073 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
4074 if (pvolume_info->nobrl)
4075 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
4076 if (pvolume_info->nohandlecache)
4077 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_HANDLE_CACHE;
4078 if (pvolume_info->nostrictsync)
4079 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
4080 if (pvolume_info->mand_lock)
4081 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
4082 if (pvolume_info->rwpidforward)
4083 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
4084 if (pvolume_info->mode_ace)
4085 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MODE_FROM_SID;
4086 if (pvolume_info->cifs_acl)
4087 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
4088 if (pvolume_info->backupuid_specified) {
4089 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
4090 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
4092 if (pvolume_info->backupgid_specified) {
4093 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
4094 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
4096 if (pvolume_info->override_uid)
4097 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
4098 if (pvolume_info->override_gid)
4099 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
4100 if (pvolume_info->dynperm)
4101 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
4102 if (pvolume_info->fsc)
4103 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
4104 if (pvolume_info->multiuser)
4105 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
4106 CIFS_MOUNT_NO_PERM);
4107 if (pvolume_info->strict_io)
4108 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
4109 if (pvolume_info->direct_io) {
4110 cifs_dbg(FYI, "mounting share using direct i/o\n");
4111 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
4113 if (pvolume_info->cache_ro) {
4114 cifs_dbg(VFS, "mounting share with read only caching. Ensure that the share will not be modified while in use.\n");
4115 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RO_CACHE;
4116 } else if (pvolume_info->cache_rw) {
4117 cifs_dbg(VFS, "mounting share in single client RW caching mode. Ensure that no other systems will be accessing the share.\n");
4118 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_RO_CACHE |
4119 CIFS_MOUNT_RW_CACHE);
4121 if (pvolume_info->mfsymlinks) {
4122 if (pvolume_info->sfu_emul) {
4124 * Our SFU ("Services for Unix" emulation does not allow
4125 * creating symlinks but does allow reading existing SFU
4126 * symlinks (it does allow both creating and reading SFU
4127 * style mknod and FIFOs though). When "mfsymlinks" and
4128 * "sfu" are both enabled at the same time, it allows
4129 * reading both types of symlinks, but will only create
4130 * them with mfsymlinks format. This allows better
4131 * Apple compatibility (probably better for Samba too)
4132 * while still recognizing old Windows style symlinks.
4134 cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
4136 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
4139 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
4140 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
4142 if (pvolume_info->prepath) {
4143 cifs_sb->prepath = kstrdup(pvolume_info->prepath, GFP_KERNEL);
4144 if (cifs_sb->prepath == NULL)
4152 cifs_cleanup_volume_info_contents(struct smb_vol *volume_info)
4154 kfree(volume_info->username);
4155 kzfree(volume_info->password);
4156 kfree(volume_info->UNC);
4157 kfree(volume_info->domainname);
4158 kfree(volume_info->iocharset);
4159 kfree(volume_info->prepath);
4163 cifs_cleanup_volume_info(struct smb_vol *volume_info)
4167 cifs_cleanup_volume_info_contents(volume_info);
4171 /* Release all succeed connections */
4172 static inline void mount_put_conns(struct cifs_sb_info *cifs_sb,
4174 struct TCP_Server_Info *server,
4175 struct cifs_ses *ses, struct cifs_tcon *tcon)
4180 cifs_put_tcon(tcon);
4182 cifs_put_smb_ses(ses);
4184 cifs_put_tcp_session(server, 0);
4185 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
4189 /* Get connections for tcp, ses and tcon */
4190 static int mount_get_conns(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
4192 struct TCP_Server_Info **nserver,
4193 struct cifs_ses **nses, struct cifs_tcon **ntcon)
4196 struct TCP_Server_Info *server;
4197 struct cifs_ses *ses;
4198 struct cifs_tcon *tcon;
4206 /* get a reference to a tcp session */
4207 server = cifs_get_tcp_session(vol);
4208 if (IS_ERR(server)) {
4209 rc = PTR_ERR(server);
4215 if ((vol->max_credits < 20) || (vol->max_credits > 60000))
4216 server->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
4218 server->max_credits = vol->max_credits;
4220 /* get a reference to a SMB session */
4221 ses = cifs_get_smb_ses(server, vol);
4229 if ((vol->persistent == true) && (!(ses->server->capabilities &
4230 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES))) {
4231 cifs_server_dbg(VFS, "persistent handles not supported by server\n");
4235 /* search for existing tcon to this server share */
4236 tcon = cifs_get_tcon(ses, vol);
4244 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
4245 if (tcon->posix_extensions)
4246 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
4248 /* tell server which Unix caps we support */
4249 if (cap_unix(tcon->ses)) {
4251 * reset of caps checks mount to see if unix extensions disabled
4252 * for just this mount.
4254 reset_cifs_unix_caps(*xid, tcon, cifs_sb, vol);
4255 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
4256 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
4257 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP))
4260 tcon->unix_ext = 0; /* server does not support them */
4262 /* do not care if a following call succeed - informational */
4263 if (!tcon->pipe && server->ops->qfs_tcon) {
4264 server->ops->qfs_tcon(*xid, tcon);
4265 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE) {
4266 if (tcon->fsDevInfo.DeviceCharacteristics &
4267 cpu_to_le32(FILE_READ_ONLY_DEVICE))
4268 cifs_dbg(VFS, "mounted to read only share\n");
4269 else if ((cifs_sb->mnt_cifs_flags &
4270 CIFS_MOUNT_RW_CACHE) == 0)
4271 cifs_dbg(VFS, "read only mount of RW share\n");
4272 /* no need to log a RW mount of a typical RW share */
4276 cifs_sb->wsize = server->ops->negotiate_wsize(tcon, vol);
4277 cifs_sb->rsize = server->ops->negotiate_rsize(tcon, vol);
4282 static int mount_setup_tlink(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
4283 struct cifs_tcon *tcon)
4285 struct tcon_link *tlink;
4287 /* hang the tcon off of the superblock */
4288 tlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4292 tlink->tl_uid = ses->linux_uid;
4293 tlink->tl_tcon = tcon;
4294 tlink->tl_time = jiffies;
4295 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
4296 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4298 cifs_sb->master_tlink = tlink;
4299 spin_lock(&cifs_sb->tlink_tree_lock);
4300 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4301 spin_unlock(&cifs_sb->tlink_tree_lock);
4303 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4308 #ifdef CONFIG_CIFS_DFS_UPCALL
4310 * cifs_build_path_to_root returns full path to root when we do not have an
4311 * exiting connection (tcon)
4314 build_unc_path_to_root(const struct smb_vol *vol,
4315 const struct cifs_sb_info *cifs_sb, bool useppath)
4317 char *full_path, *pos;
4318 unsigned int pplen = useppath && vol->prepath ?
4319 strlen(vol->prepath) + 1 : 0;
4320 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
4322 if (unc_len > MAX_TREE_SIZE)
4323 return ERR_PTR(-EINVAL);
4325 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
4326 if (full_path == NULL)
4327 return ERR_PTR(-ENOMEM);
4329 memcpy(full_path, vol->UNC, unc_len);
4330 pos = full_path + unc_len;
4333 *pos = CIFS_DIR_SEP(cifs_sb);
4334 memcpy(pos + 1, vol->prepath, pplen);
4338 *pos = '\0'; /* add trailing null */
4339 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
4340 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
4345 * expand_dfs_referral - Perform a dfs referral query and update the cifs_sb
4348 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
4349 * to a string containing updated options for the submount. Otherwise it
4350 * will be left untouched.
4352 * Returns the rc from get_dfs_path to the caller, which can be used to
4353 * determine whether there were referrals.
4356 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
4357 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
4361 struct dfs_info3_param referral = {0};
4362 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
4364 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4367 full_path = build_unc_path_to_root(volume_info, cifs_sb, true);
4368 if (IS_ERR(full_path))
4369 return PTR_ERR(full_path);
4371 /* For DFS paths, skip the first '\' of the UNC */
4372 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
4374 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4375 ref_path, &referral, NULL);
4377 char *fake_devname = NULL;
4379 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
4380 full_path + 1, &referral,
4382 free_dfs_info_param(&referral);
4384 if (IS_ERR(mdata)) {
4385 rc = PTR_ERR(mdata);
4388 cifs_cleanup_volume_info_contents(volume_info);
4389 rc = cifs_setup_volume_info(volume_info, mdata,
4390 fake_devname, false);
4392 kfree(fake_devname);
4393 kfree(cifs_sb->mountdata);
4394 cifs_sb->mountdata = mdata;
4400 static inline int get_next_dfs_tgt(const char *path,
4401 struct dfs_cache_tgt_list *tgt_list,
4402 struct dfs_cache_tgt_iterator **tgt_it)
4405 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
4407 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
4408 return !*tgt_it ? -EHOSTDOWN : 0;
4411 static int update_vol_info(const struct dfs_cache_tgt_iterator *tgt_it,
4412 struct smb_vol *fake_vol, struct smb_vol *vol)
4414 const char *tgt = dfs_cache_get_tgt_name(tgt_it);
4415 int len = strlen(tgt) + 2;
4418 new_unc = kmalloc(len, GFP_KERNEL);
4421 scnprintf(new_unc, len, "\\%s", tgt);
4426 if (fake_vol->prepath) {
4427 kfree(vol->prepath);
4428 vol->prepath = fake_vol->prepath;
4429 fake_vol->prepath = NULL;
4431 memcpy(&vol->dstaddr, &fake_vol->dstaddr, sizeof(vol->dstaddr));
4436 static int setup_dfs_tgt_conn(const char *path,
4437 const struct dfs_cache_tgt_iterator *tgt_it,
4438 struct cifs_sb_info *cifs_sb,
4439 struct smb_vol *vol,
4441 struct TCP_Server_Info **server,
4442 struct cifs_ses **ses,
4443 struct cifs_tcon **tcon)
4446 struct dfs_info3_param ref = {0};
4447 char *mdata = NULL, *fake_devname = NULL;
4448 struct smb_vol fake_vol = {NULL};
4450 cifs_dbg(FYI, "%s: dfs path: %s\n", __func__, path);
4452 rc = dfs_cache_get_tgt_referral(path, tgt_it, &ref);
4456 mdata = cifs_compose_mount_options(cifs_sb->mountdata, path, &ref,
4458 free_dfs_info_param(&ref);
4460 if (IS_ERR(mdata)) {
4461 rc = PTR_ERR(mdata);
4464 cifs_dbg(FYI, "%s: fake_devname: %s\n", __func__, fake_devname);
4465 rc = cifs_setup_volume_info(&fake_vol, mdata, fake_devname,
4469 kfree(fake_devname);
4473 * We use a 'fake_vol' here because we need pass it down to the
4474 * mount_{get,put} functions to test connection against new DFS
4477 mount_put_conns(cifs_sb, *xid, *server, *ses, *tcon);
4478 rc = mount_get_conns(&fake_vol, cifs_sb, xid, server, ses,
4482 * We were able to connect to new target server.
4483 * Update current volume info with new target server.
4485 rc = update_vol_info(tgt_it, &fake_vol, vol);
4488 cifs_cleanup_volume_info_contents(&fake_vol);
4492 static int mount_do_dfs_failover(const char *path,
4493 struct cifs_sb_info *cifs_sb,
4494 struct smb_vol *vol,
4495 struct cifs_ses *root_ses,
4497 struct TCP_Server_Info **server,
4498 struct cifs_ses **ses,
4499 struct cifs_tcon **tcon)
4502 struct dfs_cache_tgt_list tgt_list;
4503 struct dfs_cache_tgt_iterator *tgt_it = NULL;
4505 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4508 rc = dfs_cache_noreq_find(path, NULL, &tgt_list);
4513 /* Get next DFS target server - if any */
4514 rc = get_next_dfs_tgt(path, &tgt_list, &tgt_it);
4517 /* Connect to next DFS target */
4518 rc = setup_dfs_tgt_conn(path, tgt_it, cifs_sb, vol, xid, server,
4520 if (!rc || rc == -EACCES || rc == -EOPNOTSUPP)
4525 * Update DFS target hint in DFS referral cache with the target
4526 * server we successfully reconnected to.
4528 rc = dfs_cache_update_tgthint(*xid, root_ses ? root_ses : *ses,
4530 cifs_remap(cifs_sb), path,
4533 dfs_cache_free_tgts(&tgt_list);
4539 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
4540 const char *devname, bool is_smb3)
4544 if (cifs_parse_mount_options(mount_data, devname, volume_info, is_smb3))
4547 if (volume_info->nullauth) {
4548 cifs_dbg(FYI, "Anonymous login\n");
4549 kfree(volume_info->username);
4550 volume_info->username = NULL;
4551 } else if (volume_info->username) {
4552 /* BB fixme parse for domain name here */
4553 cifs_dbg(FYI, "Username: %s\n", volume_info->username);
4555 cifs_dbg(VFS, "No username specified\n");
4556 /* In userspace mount helper we can get user name from alternate
4557 locations such as env variables and files on disk */
4561 /* this is needed for ASCII cp to Unicode converts */
4562 if (volume_info->iocharset == NULL) {
4563 /* load_nls_default cannot return null */
4564 volume_info->local_nls = load_nls_default();
4566 volume_info->local_nls = load_nls(volume_info->iocharset);
4567 if (volume_info->local_nls == NULL) {
4568 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
4569 volume_info->iocharset);
4578 cifs_get_volume_info(char *mount_data, const char *devname, bool is_smb3)
4581 struct smb_vol *volume_info;
4583 volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
4585 return ERR_PTR(-ENOMEM);
4587 rc = cifs_setup_volume_info(volume_info, mount_data, devname, is_smb3);
4589 cifs_cleanup_volume_info(volume_info);
4590 volume_info = ERR_PTR(rc);
4597 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
4599 struct cifs_tcon *tcon,
4600 struct cifs_sb_info *cifs_sb,
4607 int skip = added_treename ? 1 : 0;
4609 sep = CIFS_DIR_SEP(cifs_sb);
4612 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
4614 /* skip separators */
4619 /* next separator */
4620 while (*s && *s != sep)
4623 * if the treename is added, we then have to skip the first
4624 * part within the separators
4631 * temporarily null-terminate the path at the end of
4632 * the current component
4636 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4644 * Check if path is remote (e.g. a DFS share). Return -EREMOTE if it is,
4647 static int is_path_remote(struct cifs_sb_info *cifs_sb, struct smb_vol *vol,
4648 const unsigned int xid,
4649 struct TCP_Server_Info *server,
4650 struct cifs_tcon *tcon)
4655 if (!server->ops->is_path_accessible)
4659 * cifs_build_path_to_root works only when we have a valid tcon
4661 full_path = cifs_build_path_to_root(vol, cifs_sb, tcon,
4662 tcon->Flags & SMB_SHARE_IS_IN_DFS);
4663 if (full_path == NULL)
4666 cifs_dbg(FYI, "%s: full_path: %s\n", __func__, full_path);
4668 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4670 if (rc != 0 && rc != -EREMOTE) {
4675 if (rc != -EREMOTE) {
4676 rc = cifs_are_all_path_components_accessible(server, xid, tcon,
4677 cifs_sb, full_path, tcon->Flags & SMB_SHARE_IS_IN_DFS);
4679 cifs_server_dbg(VFS, "cannot query dirs between root and final path, "
4680 "enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
4681 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
4690 #ifdef CONFIG_CIFS_DFS_UPCALL
4691 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4695 struct cifs_ses *ses;
4696 struct cifs_tcon *root_tcon = NULL;
4697 struct cifs_tcon *tcon = NULL;
4698 struct TCP_Server_Info *server;
4699 char *root_path = NULL, *full_path = NULL;
4700 char *old_mountdata, *origin_mountdata = NULL;
4703 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4705 /* If not a standalone DFS root, then check if path is remote */
4706 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls,
4707 cifs_remap(cifs_sb), vol->UNC + 1, NULL,
4710 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4718 * If first DFS target server went offline and we failed to connect it,
4719 * server and ses pointers are NULL at this point, though we still have
4720 * chance to get a cached DFS referral in expand_dfs_referral() and
4721 * retry next target available in it.
4723 * If a NULL ses ptr is passed to dfs_cache_find(), a lookup will be
4724 * performed against DFS path and *no* requests will be sent to server
4725 * for any new DFS referrals. Hence it's safe to skip checking whether
4726 * server or ses ptr is NULL.
4728 if (rc == -EACCES || rc == -EOPNOTSUPP)
4731 root_path = build_unc_path_to_root(vol, cifs_sb, false);
4732 if (IS_ERR(root_path)) {
4733 rc = PTR_ERR(root_path);
4738 full_path = build_unc_path_to_root(vol, cifs_sb, true);
4739 if (IS_ERR(full_path)) {
4740 rc = PTR_ERR(full_path);
4745 * Perform an unconditional check for whether there are DFS
4746 * referrals for this path without prefix, to provide support
4747 * for DFS referrals from w2k8 servers which don't seem to respond
4748 * with PATH_NOT_COVERED to requests that include the prefix.
4749 * Chase the referral if found, otherwise continue normally.
4751 old_mountdata = cifs_sb->mountdata;
4752 (void)expand_dfs_referral(xid, ses, vol, cifs_sb, false);
4754 if (cifs_sb->mountdata == NULL) {
4759 /* Save DFS root volume information for DFS refresh worker */
4760 origin_mountdata = kstrndup(cifs_sb->mountdata,
4761 strlen(cifs_sb->mountdata), GFP_KERNEL);
4762 if (!origin_mountdata) {
4767 if (cifs_sb->mountdata != old_mountdata) {
4768 /* If we were redirected, reconnect to new target server */
4769 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4770 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4773 if (rc == -EACCES || rc == -EOPNOTSUPP)
4775 /* Perform DFS failover to any other DFS targets */
4776 rc = mount_do_dfs_failover(root_path + 1, cifs_sb, vol, NULL,
4777 &xid, &server, &ses, &tcon);
4783 root_path = build_unc_path_to_root(vol, cifs_sb, false);
4784 if (IS_ERR(root_path)) {
4785 rc = PTR_ERR(root_path);
4789 /* Cache out resolved root server */
4790 (void)dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4791 root_path + 1, NULL, NULL);
4793 * Save root tcon for additional DFS requests to update or create a new
4794 * DFS cache entry, or even perform DFS failover.
4796 spin_lock(&cifs_tcp_ses_lock);
4798 tcon->dfs_path = root_path;
4800 tcon->remap = cifs_remap(cifs_sb);
4801 spin_unlock(&cifs_tcp_ses_lock);
4805 for (count = 1; ;) {
4807 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4808 if (!rc || rc != -EREMOTE)
4812 * BB: when we implement proper loop detection,
4813 * we will remove this check. But now we need it
4814 * to prevent an indefinite loop if 'DFS tree' is
4815 * misconfigured (i.e. has loops).
4817 if (count++ > MAX_NESTED_LINKS) {
4823 full_path = build_unc_path_to_root(vol, cifs_sb, true);
4824 if (IS_ERR(full_path)) {
4825 rc = PTR_ERR(full_path);
4830 old_mountdata = cifs_sb->mountdata;
4831 rc = expand_dfs_referral(xid, root_tcon->ses, vol, cifs_sb,
4836 if (cifs_sb->mountdata != old_mountdata) {
4837 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4838 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses,
4842 if (rc == -EACCES || rc == -EOPNOTSUPP)
4844 /* Perform DFS failover to any other DFS targets */
4845 rc = mount_do_dfs_failover(full_path + 1, cifs_sb, vol,
4846 root_tcon->ses, &xid,
4847 &server, &ses, &tcon);
4848 if (rc == -EACCES || rc == -EOPNOTSUPP || !server ||
4853 cifs_put_tcon(root_tcon);
4858 spin_lock(&cifs_tcp_ses_lock);
4859 if (!tcon->dfs_path) {
4860 /* Save full path in new tcon to do failover when reconnecting tcons */
4861 tcon->dfs_path = full_path;
4863 tcon->remap = cifs_remap(cifs_sb);
4865 cifs_sb->origin_fullpath = kstrndup(tcon->dfs_path,
4866 strlen(tcon->dfs_path),
4868 if (!cifs_sb->origin_fullpath) {
4869 spin_unlock(&cifs_tcp_ses_lock);
4873 spin_unlock(&cifs_tcp_ses_lock);
4875 rc = dfs_cache_add_vol(origin_mountdata, vol, cifs_sb->origin_fullpath);
4877 kfree(cifs_sb->origin_fullpath);
4881 * After reconnecting to a different server, unique ids won't
4882 * match anymore, so we disable serverino. This prevents
4883 * dentry revalidation to think the dentry are stale (ESTALE).
4885 cifs_autodisable_serverino(cifs_sb);
4888 return mount_setup_tlink(cifs_sb, ses, tcon);
4893 kfree(origin_mountdata);
4894 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4898 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4902 struct cifs_ses *ses;
4903 struct cifs_tcon *tcon;
4904 struct TCP_Server_Info *server;
4906 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4911 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4920 return mount_setup_tlink(cifs_sb, ses, tcon);
4923 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4929 * Issue a TREE_CONNECT request.
4932 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
4933 const char *tree, struct cifs_tcon *tcon,
4934 const struct nls_table *nls_codepage)
4936 struct smb_hdr *smb_buffer;
4937 struct smb_hdr *smb_buffer_response;
4940 unsigned char *bcc_ptr;
4943 __u16 bytes_left, count;
4948 smb_buffer = cifs_buf_get();
4949 if (smb_buffer == NULL)
4952 smb_buffer_response = smb_buffer;
4954 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
4955 NULL /*no tid */ , 4 /*wct */ );
4957 smb_buffer->Mid = get_next_mid(ses->server);
4958 smb_buffer->Uid = ses->Suid;
4959 pSMB = (TCONX_REQ *) smb_buffer;
4960 pSMBr = (TCONX_RSP *) smb_buffer_response;
4962 pSMB->AndXCommand = 0xFF;
4963 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
4964 bcc_ptr = &pSMB->Password[0];
4965 if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
4966 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
4967 *bcc_ptr = 0; /* password is null byte */
4968 bcc_ptr++; /* skip password */
4969 /* already aligned so no need to do it below */
4971 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
4972 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
4973 specified as required (when that support is added to
4974 the vfs in the future) as only NTLM or the much
4975 weaker LANMAN (which we do not send by default) is accepted
4976 by Samba (not sure whether other servers allow
4977 NTLMv2 password here) */
4978 #ifdef CONFIG_CIFS_WEAK_PW_HASH
4979 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
4980 (ses->sectype == LANMAN))
4981 calc_lanman_hash(tcon->password, ses->server->cryptkey,
4982 ses->server->sec_mode &
4983 SECMODE_PW_ENCRYPT ? true : false,
4986 #endif /* CIFS_WEAK_PW_HASH */
4987 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
4988 bcc_ptr, nls_codepage);
4990 cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
4992 cifs_buf_release(smb_buffer);
4996 bcc_ptr += CIFS_AUTH_RESP_SIZE;
4997 if (ses->capabilities & CAP_UNICODE) {
4998 /* must align unicode strings */
4999 *bcc_ptr = 0; /* null byte password */
5004 if (ses->server->sign)
5005 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
5007 if (ses->capabilities & CAP_STATUS32) {
5008 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
5010 if (ses->capabilities & CAP_DFS) {
5011 smb_buffer->Flags2 |= SMBFLG2_DFS;
5013 if (ses->capabilities & CAP_UNICODE) {
5014 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
5016 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
5017 6 /* max utf8 char length in bytes */ *
5018 (/* server len*/ + 256 /* share len */), nls_codepage);
5019 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
5020 bcc_ptr += 2; /* skip trailing null */
5021 } else { /* ASCII */
5022 strcpy(bcc_ptr, tree);
5023 bcc_ptr += strlen(tree) + 1;
5025 strcpy(bcc_ptr, "?????");
5026 bcc_ptr += strlen("?????");
5028 count = bcc_ptr - &pSMB->Password[0];
5029 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
5030 pSMB->hdr.smb_buf_length) + count);
5031 pSMB->ByteCount = cpu_to_le16(count);
5033 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
5036 /* above now done in SendReceive */
5040 tcon->tidStatus = CifsGood;
5041 tcon->need_reconnect = false;
5042 tcon->tid = smb_buffer_response->Tid;
5043 bcc_ptr = pByteArea(smb_buffer_response);
5044 bytes_left = get_bcc(smb_buffer_response);
5045 length = strnlen(bcc_ptr, bytes_left - 2);
5046 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
5052 /* skip service field (NB: this field is always ASCII) */
5054 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
5055 (bcc_ptr[2] == 'C')) {
5056 cifs_dbg(FYI, "IPC connection\n");
5060 } else if (length == 2) {
5061 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
5062 /* the most common case */
5063 cifs_dbg(FYI, "disk share connection\n");
5066 bcc_ptr += length + 1;
5067 bytes_left -= (length + 1);
5068 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
5070 /* mostly informational -- no need to fail on error here */
5071 kfree(tcon->nativeFileSystem);
5072 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
5073 bytes_left, is_unicode,
5076 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
5078 if ((smb_buffer_response->WordCount == 3) ||
5079 (smb_buffer_response->WordCount == 7))
5080 /* field is in same location */
5081 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
5084 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
5087 cifs_buf_release(smb_buffer);
5091 static void delayed_free(struct rcu_head *p)
5093 struct cifs_sb_info *sbi = container_of(p, struct cifs_sb_info, rcu);
5094 unload_nls(sbi->local_nls);
5099 cifs_umount(struct cifs_sb_info *cifs_sb)
5101 struct rb_root *root = &cifs_sb->tlink_tree;
5102 struct rb_node *node;
5103 struct tcon_link *tlink;
5105 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
5107 spin_lock(&cifs_sb->tlink_tree_lock);
5108 while ((node = rb_first(root))) {
5109 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
5110 cifs_get_tlink(tlink);
5111 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
5112 rb_erase(node, root);
5114 spin_unlock(&cifs_sb->tlink_tree_lock);
5115 cifs_put_tlink(tlink);
5116 spin_lock(&cifs_sb->tlink_tree_lock);
5118 spin_unlock(&cifs_sb->tlink_tree_lock);
5120 kfree(cifs_sb->mountdata);
5121 kfree(cifs_sb->prepath);
5122 #ifdef CONFIG_CIFS_DFS_UPCALL
5123 dfs_cache_del_vol(cifs_sb->origin_fullpath);
5124 kfree(cifs_sb->origin_fullpath);
5126 call_rcu(&cifs_sb->rcu, delayed_free);
5130 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
5133 struct TCP_Server_Info *server = ses->server;
5135 if (!server->ops->need_neg || !server->ops->negotiate)
5138 /* only send once per connect */
5139 if (!server->ops->need_neg(server))
5142 rc = server->ops->negotiate(xid, ses);
5144 spin_lock(&GlobalMid_Lock);
5145 if (server->tcpStatus == CifsNeedNegotiate)
5146 server->tcpStatus = CifsGood;
5149 spin_unlock(&GlobalMid_Lock);
5156 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
5157 struct nls_table *nls_info)
5160 struct TCP_Server_Info *server = ses->server;
5162 ses->capabilities = server->capabilities;
5163 if (linuxExtEnabled == 0)
5164 ses->capabilities &= (~server->vals->cap_unix);
5166 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
5167 server->sec_mode, server->capabilities, server->timeAdj);
5169 if (ses->auth_key.response) {
5170 cifs_dbg(FYI, "Free previous auth_key.response = %p\n",
5171 ses->auth_key.response);
5172 kfree(ses->auth_key.response);
5173 ses->auth_key.response = NULL;
5174 ses->auth_key.len = 0;
5177 if (server->ops->sess_setup)
5178 rc = server->ops->sess_setup(xid, ses, nls_info);
5181 cifs_server_dbg(VFS, "Send error in SessSetup = %d\n", rc);
5187 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
5189 vol->sectype = ses->sectype;
5191 /* krb5 is special, since we don't need username or pw */
5192 if (vol->sectype == Kerberos)
5195 return cifs_set_cifscreds(vol, ses);
5198 static struct cifs_tcon *
5199 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
5202 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
5203 struct cifs_ses *ses;
5204 struct cifs_tcon *tcon = NULL;
5205 struct smb_vol *vol_info;
5207 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
5208 if (vol_info == NULL)
5209 return ERR_PTR(-ENOMEM);
5211 vol_info->local_nls = cifs_sb->local_nls;
5212 vol_info->linux_uid = fsuid;
5213 vol_info->cred_uid = fsuid;
5214 vol_info->UNC = master_tcon->treeName;
5215 vol_info->retry = master_tcon->retry;
5216 vol_info->nocase = master_tcon->nocase;
5217 vol_info->nohandlecache = master_tcon->nohandlecache;
5218 vol_info->local_lease = master_tcon->local_lease;
5219 vol_info->no_linux_ext = !master_tcon->unix_ext;
5220 vol_info->sectype = master_tcon->ses->sectype;
5221 vol_info->sign = master_tcon->ses->sign;
5223 rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
5229 /* get a reference for the same TCP session */
5230 spin_lock(&cifs_tcp_ses_lock);
5231 ++master_tcon->ses->server->srv_count;
5232 spin_unlock(&cifs_tcp_ses_lock);
5234 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
5236 tcon = (struct cifs_tcon *)ses;
5237 cifs_put_tcp_session(master_tcon->ses->server, 0);
5241 tcon = cifs_get_tcon(ses, vol_info);
5243 cifs_put_smb_ses(ses);
5247 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
5248 if (tcon->posix_extensions)
5249 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
5252 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
5255 kfree(vol_info->username);
5256 kzfree(vol_info->password);
5263 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
5265 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
5268 /* find and return a tlink with given uid */
5269 static struct tcon_link *
5270 tlink_rb_search(struct rb_root *root, kuid_t uid)
5272 struct rb_node *node = root->rb_node;
5273 struct tcon_link *tlink;
5276 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
5278 if (uid_gt(tlink->tl_uid, uid))
5279 node = node->rb_left;
5280 else if (uid_lt(tlink->tl_uid, uid))
5281 node = node->rb_right;
5288 /* insert a tcon_link into the tree */
5290 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
5292 struct rb_node **new = &(root->rb_node), *parent = NULL;
5293 struct tcon_link *tlink;
5296 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
5299 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
5300 new = &((*new)->rb_left);
5302 new = &((*new)->rb_right);
5305 rb_link_node(&new_tlink->tl_rbnode, parent, new);
5306 rb_insert_color(&new_tlink->tl_rbnode, root);
5310 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
5313 * If the superblock doesn't refer to a multiuser mount, then just return
5314 * the master tcon for the mount.
5316 * First, search the rbtree for an existing tcon for this fsuid. If one
5317 * exists, then check to see if it's pending construction. If it is then wait
5318 * for construction to complete. Once it's no longer pending, check to see if
5319 * it failed and either return an error or retry construction, depending on
5322 * If one doesn't exist then insert a new tcon_link struct into the tree and
5323 * try to construct a new one.
5326 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
5329 kuid_t fsuid = current_fsuid();
5330 struct tcon_link *tlink, *newtlink;
5332 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
5333 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
5335 spin_lock(&cifs_sb->tlink_tree_lock);
5336 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5338 cifs_get_tlink(tlink);
5339 spin_unlock(&cifs_sb->tlink_tree_lock);
5341 if (tlink == NULL) {
5342 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
5343 if (newtlink == NULL)
5344 return ERR_PTR(-ENOMEM);
5345 newtlink->tl_uid = fsuid;
5346 newtlink->tl_tcon = ERR_PTR(-EACCES);
5347 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
5348 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
5349 cifs_get_tlink(newtlink);
5351 spin_lock(&cifs_sb->tlink_tree_lock);
5352 /* was one inserted after previous search? */
5353 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5355 cifs_get_tlink(tlink);
5356 spin_unlock(&cifs_sb->tlink_tree_lock);
5358 goto wait_for_construction;
5361 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
5362 spin_unlock(&cifs_sb->tlink_tree_lock);
5364 wait_for_construction:
5365 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
5366 TASK_INTERRUPTIBLE);
5368 cifs_put_tlink(tlink);
5369 return ERR_PTR(-ERESTARTSYS);
5372 /* if it's good, return it */
5373 if (!IS_ERR(tlink->tl_tcon))
5376 /* return error if we tried this already recently */
5377 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
5378 cifs_put_tlink(tlink);
5379 return ERR_PTR(-EACCES);
5382 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
5383 goto wait_for_construction;
5386 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
5387 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
5388 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
5390 if (IS_ERR(tlink->tl_tcon)) {
5391 cifs_put_tlink(tlink);
5392 return ERR_PTR(-EACCES);
5399 * periodic workqueue job that scans tcon_tree for a superblock and closes
5403 cifs_prune_tlinks(struct work_struct *work)
5405 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
5407 struct rb_root *root = &cifs_sb->tlink_tree;
5408 struct rb_node *node;
5409 struct rb_node *tmp;
5410 struct tcon_link *tlink;
5413 * Because we drop the spinlock in the loop in order to put the tlink
5414 * it's not guarded against removal of links from the tree. The only
5415 * places that remove entries from the tree are this function and
5416 * umounts. Because this function is non-reentrant and is canceled
5417 * before umount can proceed, this is safe.
5419 spin_lock(&cifs_sb->tlink_tree_lock);
5420 node = rb_first(root);
5421 while (node != NULL) {
5423 node = rb_next(tmp);
5424 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
5426 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
5427 atomic_read(&tlink->tl_count) != 0 ||
5428 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
5431 cifs_get_tlink(tlink);
5432 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
5433 rb_erase(tmp, root);
5435 spin_unlock(&cifs_sb->tlink_tree_lock);
5436 cifs_put_tlink(tlink);
5437 spin_lock(&cifs_sb->tlink_tree_lock);
5439 spin_unlock(&cifs_sb->tlink_tree_lock);
5441 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,