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 kref_get(&mid_entry->refcount);
568 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
569 mid_entry->mid_state = MID_RETRY_NEEDED;
570 list_move(&mid_entry->qhead, &retry_list);
571 mid_entry->mid_flags |= MID_DELETED;
573 spin_unlock(&GlobalMid_Lock);
574 mutex_unlock(&server->srv_mutex);
576 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
577 list_for_each_safe(tmp, tmp2, &retry_list) {
578 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
579 list_del_init(&mid_entry->qhead);
580 mid_entry->callback(mid_entry);
581 cifs_mid_q_entry_release(mid_entry);
584 if (cifs_rdma_enabled(server)) {
585 mutex_lock(&server->srv_mutex);
586 smbd_destroy(server);
587 mutex_unlock(&server->srv_mutex);
593 mutex_lock(&server->srv_mutex);
595 * Set up next DFS target server (if any) for reconnect. If DFS
596 * feature is disabled, then we will retry last server we
597 * connected to before.
599 if (cifs_rdma_enabled(server))
600 rc = smbd_reconnect(server);
602 rc = generic_ip_connect(server);
604 cifs_dbg(FYI, "reconnect error %d\n", rc);
605 #ifdef CONFIG_CIFS_DFS_UPCALL
606 reconn_inval_dfs_target(server, cifs_sb, &tgt_list,
609 rc = reconn_set_ipaddr(server);
611 cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
614 mutex_unlock(&server->srv_mutex);
617 atomic_inc(&tcpSesReconnectCount);
618 set_credits(server, 1);
619 spin_lock(&GlobalMid_Lock);
620 if (server->tcpStatus != CifsExiting)
621 server->tcpStatus = CifsNeedNegotiate;
622 spin_unlock(&GlobalMid_Lock);
623 mutex_unlock(&server->srv_mutex);
625 } while (server->tcpStatus == CifsNeedReconnect);
627 #ifdef CONFIG_CIFS_DFS_UPCALL
629 rc = dfs_cache_noreq_update_tgthint(cifs_sb->origin_fullpath + 1,
632 cifs_server_dbg(VFS, "%s: failed to update DFS target hint: rc = %d\n",
635 rc = dfs_cache_update_vol(cifs_sb->origin_fullpath, server);
637 cifs_server_dbg(VFS, "%s: failed to update vol info in DFS cache: rc = %d\n",
640 dfs_cache_free_tgts(&tgt_list);
643 if (server->tcpStatus == CifsNeedNegotiate)
644 mod_delayed_work(cifsiod_wq, &server->echo, 0);
650 cifs_echo_request(struct work_struct *work)
653 struct TCP_Server_Info *server = container_of(work,
654 struct TCP_Server_Info, echo.work);
655 unsigned long echo_interval;
658 * If we need to renegotiate, set echo interval to zero to
659 * immediately call echo service where we can renegotiate.
661 if (server->tcpStatus == CifsNeedNegotiate)
664 echo_interval = server->echo_interval;
667 * We cannot send an echo if it is disabled.
668 * Also, no need to ping if we got a response recently.
671 if (server->tcpStatus == CifsNeedReconnect ||
672 server->tcpStatus == CifsExiting ||
673 server->tcpStatus == CifsNew ||
674 (server->ops->can_echo && !server->ops->can_echo(server)) ||
675 time_before(jiffies, server->lstrp + echo_interval - HZ))
678 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
680 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
684 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
688 allocate_buffers(struct TCP_Server_Info *server)
690 if (!server->bigbuf) {
691 server->bigbuf = (char *)cifs_buf_get();
692 if (!server->bigbuf) {
693 cifs_server_dbg(VFS, "No memory for large SMB response\n");
695 /* retry will check if exiting */
698 } else if (server->large_buf) {
699 /* we are reusing a dirty large buf, clear its start */
700 memset(server->bigbuf, 0, HEADER_SIZE(server));
703 if (!server->smallbuf) {
704 server->smallbuf = (char *)cifs_small_buf_get();
705 if (!server->smallbuf) {
706 cifs_server_dbg(VFS, "No memory for SMB response\n");
708 /* retry will check if exiting */
711 /* beginning of smb buffer is cleared in our buf_get */
713 /* if existing small buf clear beginning */
714 memset(server->smallbuf, 0, HEADER_SIZE(server));
721 server_unresponsive(struct TCP_Server_Info *server)
724 * We need to wait 3 echo intervals to make sure we handle such
726 * 1s client sends a normal SMB request
727 * 2s client gets a response
728 * 30s echo workqueue job pops, and decides we got a response recently
729 * and don't need to send another
731 * 65s kernel_recvmsg times out, and we see that we haven't gotten
732 * a response in >60s.
734 if ((server->tcpStatus == CifsGood ||
735 server->tcpStatus == CifsNeedNegotiate) &&
736 time_after(jiffies, server->lstrp + 3 * server->echo_interval)) {
737 cifs_server_dbg(VFS, "has not responded in %lu seconds. Reconnecting...\n",
738 (3 * server->echo_interval) / HZ);
739 cifs_reconnect(server);
740 wake_up(&server->response_q);
748 zero_credits(struct TCP_Server_Info *server)
752 spin_lock(&server->req_lock);
753 val = server->credits + server->echo_credits + server->oplock_credits;
754 if (server->in_flight == 0 && val == 0) {
755 spin_unlock(&server->req_lock);
758 spin_unlock(&server->req_lock);
763 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
768 smb_msg->msg_control = NULL;
769 smb_msg->msg_controllen = 0;
771 for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
774 /* reconnect if no credits and no requests in flight */
775 if (zero_credits(server)) {
776 cifs_reconnect(server);
777 return -ECONNABORTED;
780 if (server_unresponsive(server))
781 return -ECONNABORTED;
782 if (cifs_rdma_enabled(server) && server->smbd_conn)
783 length = smbd_recv(server->smbd_conn, smb_msg);
785 length = sock_recvmsg(server->ssocket, smb_msg, 0);
787 if (server->tcpStatus == CifsExiting)
790 if (server->tcpStatus == CifsNeedReconnect) {
791 cifs_reconnect(server);
792 return -ECONNABORTED;
795 if (length == -ERESTARTSYS ||
799 * Minimum sleep to prevent looping, allowing socket
800 * to clear and app threads to set tcpStatus
801 * CifsNeedReconnect if server hung.
803 usleep_range(1000, 2000);
809 cifs_dbg(FYI, "Received no data or error: %d\n", length);
810 cifs_reconnect(server);
811 return -ECONNABORTED;
818 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
819 unsigned int to_read)
821 struct msghdr smb_msg;
822 struct kvec iov = {.iov_base = buf, .iov_len = to_read};
823 iov_iter_kvec(&smb_msg.msg_iter, READ, &iov, 1, to_read);
825 return cifs_readv_from_socket(server, &smb_msg);
829 cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
830 unsigned int page_offset, unsigned int to_read)
832 struct msghdr smb_msg;
833 struct bio_vec bv = {
834 .bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
835 iov_iter_bvec(&smb_msg.msg_iter, READ, &bv, 1, to_read);
836 return cifs_readv_from_socket(server, &smb_msg);
840 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
843 * The first byte big endian of the length field,
844 * is actually not part of the length but the type
845 * with the most common, zero, as regular data.
848 case RFC1002_SESSION_MESSAGE:
849 /* Regular SMB response */
851 case RFC1002_SESSION_KEEP_ALIVE:
852 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
854 case RFC1002_POSITIVE_SESSION_RESPONSE:
855 cifs_dbg(FYI, "RFC 1002 positive session response\n");
857 case RFC1002_NEGATIVE_SESSION_RESPONSE:
859 * We get this from Windows 98 instead of an error on
860 * SMB negprot response.
862 cifs_dbg(FYI, "RFC 1002 negative session response\n");
863 /* give server a second to clean up */
866 * Always try 445 first on reconnect since we get NACK
867 * on some if we ever connected to port 139 (the NACK
868 * is since we do not begin with RFC1001 session
871 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
872 cifs_reconnect(server);
873 wake_up(&server->response_q);
876 cifs_server_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
877 cifs_reconnect(server);
884 dequeue_mid(struct mid_q_entry *mid, bool malformed)
886 #ifdef CONFIG_CIFS_STATS2
887 mid->when_received = jiffies;
889 spin_lock(&GlobalMid_Lock);
891 mid->mid_state = MID_RESPONSE_RECEIVED;
893 mid->mid_state = MID_RESPONSE_MALFORMED;
895 * Trying to handle/dequeue a mid after the send_recv()
896 * function has finished processing it is a bug.
898 if (mid->mid_flags & MID_DELETED)
899 printk_once(KERN_WARNING
900 "trying to dequeue a deleted mid\n");
902 list_del_init(&mid->qhead);
903 mid->mid_flags |= MID_DELETED;
905 spin_unlock(&GlobalMid_Lock);
909 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
910 char *buf, int malformed)
912 if (server->ops->check_trans2 &&
913 server->ops->check_trans2(mid, server, buf, malformed))
916 mid->large_buf = server->large_buf;
917 /* Was previous buf put in mpx struct for multi-rsp? */
918 if (!mid->multiRsp) {
919 /* smb buffer will be freed by user thread */
920 if (server->large_buf)
921 server->bigbuf = NULL;
923 server->smallbuf = NULL;
925 dequeue_mid(mid, malformed);
928 static void clean_demultiplex_info(struct TCP_Server_Info *server)
932 /* take it off the list, if it's not already */
933 spin_lock(&cifs_tcp_ses_lock);
934 list_del_init(&server->tcp_ses_list);
935 spin_unlock(&cifs_tcp_ses_lock);
937 spin_lock(&GlobalMid_Lock);
938 server->tcpStatus = CifsExiting;
939 spin_unlock(&GlobalMid_Lock);
940 wake_up_all(&server->response_q);
942 /* check if we have blocked requests that need to free */
943 spin_lock(&server->req_lock);
944 if (server->credits <= 0)
946 spin_unlock(&server->req_lock);
948 * Although there should not be any requests blocked on this queue it
949 * can not hurt to be paranoid and try to wake up requests that may
950 * haven been blocked when more than 50 at time were on the wire to the
951 * same server - they now will see the session is in exit state and get
952 * out of SendReceive.
954 wake_up_all(&server->request_q);
955 /* give those requests time to exit */
957 if (cifs_rdma_enabled(server))
958 smbd_destroy(server);
959 if (server->ssocket) {
960 sock_release(server->ssocket);
961 server->ssocket = NULL;
964 if (!list_empty(&server->pending_mid_q)) {
965 struct list_head dispose_list;
966 struct mid_q_entry *mid_entry;
967 struct list_head *tmp, *tmp2;
969 INIT_LIST_HEAD(&dispose_list);
970 spin_lock(&GlobalMid_Lock);
971 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
972 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
973 cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
974 kref_get(&mid_entry->refcount);
975 mid_entry->mid_state = MID_SHUTDOWN;
976 list_move(&mid_entry->qhead, &dispose_list);
977 mid_entry->mid_flags |= MID_DELETED;
979 spin_unlock(&GlobalMid_Lock);
981 /* now walk dispose list and issue callbacks */
982 list_for_each_safe(tmp, tmp2, &dispose_list) {
983 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
984 cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
985 list_del_init(&mid_entry->qhead);
986 mid_entry->callback(mid_entry);
987 cifs_mid_q_entry_release(mid_entry);
989 /* 1/8th of sec is more than enough time for them to exit */
993 if (!list_empty(&server->pending_mid_q)) {
995 * mpx threads have not exited yet give them at least the smb
996 * send timeout time for long ops.
998 * Due to delays on oplock break requests, we need to wait at
999 * least 45 seconds before giving up on a request getting a
1000 * response and going ahead and killing cifsd.
1002 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
1005 * If threads still have not exited they are probably never
1006 * coming home not much else we can do but free the memory.
1010 kfree(server->hostname);
1013 length = atomic_dec_return(&tcpSesAllocCount);
1015 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
1019 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1022 char *buf = server->smallbuf;
1023 unsigned int pdu_length = server->pdu_size;
1025 /* make sure this will fit in a large buffer */
1026 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
1027 server->vals->header_preamble_size) {
1028 cifs_server_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
1029 cifs_reconnect(server);
1030 wake_up(&server->response_q);
1031 return -ECONNABORTED;
1034 /* switch to large buffer if too big for a small one */
1035 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
1036 server->large_buf = true;
1037 memcpy(server->bigbuf, buf, server->total_read);
1038 buf = server->bigbuf;
1041 /* now read the rest */
1042 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
1043 pdu_length - HEADER_SIZE(server) + 1
1044 + server->vals->header_preamble_size);
1048 server->total_read += length;
1050 dump_smb(buf, server->total_read);
1052 return cifs_handle_standard(server, mid);
1056 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1058 char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
1062 * We know that we received enough to get to the MID as we
1063 * checked the pdu_length earlier. Now check to see
1064 * if the rest of the header is OK. We borrow the length
1065 * var for the rest of the loop to avoid a new stack var.
1067 * 48 bytes is enough to display the header and a little bit
1068 * into the payload for debugging purposes.
1070 length = server->ops->check_message(buf, server->total_read, server);
1072 cifs_dump_mem("Bad SMB: ", buf,
1073 min_t(unsigned int, server->total_read, 48));
1075 if (server->ops->is_session_expired &&
1076 server->ops->is_session_expired(buf)) {
1077 cifs_reconnect(server);
1078 wake_up(&server->response_q);
1082 if (server->ops->is_status_pending &&
1083 server->ops->is_status_pending(buf, server))
1089 handle_mid(mid, server, buf, length);
1094 smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
1096 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
1099 * SMB1 does not use credits.
1101 if (server->vals->header_preamble_size)
1104 if (shdr->CreditRequest) {
1105 spin_lock(&server->req_lock);
1106 server->credits += le16_to_cpu(shdr->CreditRequest);
1107 spin_unlock(&server->req_lock);
1108 wake_up(&server->request_q);
1114 cifs_demultiplex_thread(void *p)
1116 int i, num_mids, length;
1117 struct TCP_Server_Info *server = p;
1118 unsigned int pdu_length;
1119 unsigned int next_offset;
1121 struct task_struct *task_to_wake = NULL;
1122 struct mid_q_entry *mids[MAX_COMPOUND];
1123 char *bufs[MAX_COMPOUND];
1125 current->flags |= PF_MEMALLOC;
1126 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
1128 length = atomic_inc_return(&tcpSesAllocCount);
1130 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
1133 allow_kernel_signal(SIGKILL);
1134 while (server->tcpStatus != CifsExiting) {
1135 if (try_to_freeze())
1138 if (!allocate_buffers(server))
1141 server->large_buf = false;
1142 buf = server->smallbuf;
1143 pdu_length = 4; /* enough to get RFC1001 header */
1145 length = cifs_read_from_socket(server, buf, pdu_length);
1149 if (server->vals->header_preamble_size == 0)
1150 server->total_read = 0;
1152 server->total_read = length;
1155 * The right amount was read from socket - 4 bytes,
1156 * so we can now interpret the length field.
1158 pdu_length = get_rfc1002_length(buf);
1160 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
1161 if (!is_smb_response(server, buf[0]))
1164 server->pdu_size = pdu_length;
1166 /* make sure we have enough to get to the MID */
1167 if (server->pdu_size < HEADER_SIZE(server) - 1 -
1168 server->vals->header_preamble_size) {
1169 cifs_server_dbg(VFS, "SMB response too short (%u bytes)\n",
1171 cifs_reconnect(server);
1172 wake_up(&server->response_q);
1176 /* read down to the MID */
1177 length = cifs_read_from_socket(server,
1178 buf + server->vals->header_preamble_size,
1179 HEADER_SIZE(server) - 1
1180 - server->vals->header_preamble_size);
1183 server->total_read += length;
1185 if (server->ops->next_header) {
1186 next_offset = server->ops->next_header(buf);
1188 server->pdu_size = next_offset;
1191 memset(mids, 0, sizeof(mids));
1192 memset(bufs, 0, sizeof(bufs));
1195 if (server->ops->is_transform_hdr &&
1196 server->ops->receive_transform &&
1197 server->ops->is_transform_hdr(buf)) {
1198 length = server->ops->receive_transform(server,
1203 mids[0] = server->ops->find_mid(server, buf);
1207 if (!mids[0] || !mids[0]->receive)
1208 length = standard_receive3(server, mids[0]);
1210 length = mids[0]->receive(server, mids[0]);
1214 for (i = 0; i < num_mids; i++)
1216 cifs_mid_q_entry_release(mids[i]);
1220 server->lstrp = jiffies;
1222 for (i = 0; i < num_mids; i++) {
1223 if (mids[i] != NULL) {
1224 mids[i]->resp_buf_size = server->pdu_size;
1225 if ((mids[i]->mid_flags & MID_WAIT_CANCELLED) &&
1226 mids[i]->mid_state == MID_RESPONSE_RECEIVED &&
1227 server->ops->handle_cancelled_mid)
1228 server->ops->handle_cancelled_mid(
1232 if (!mids[i]->multiRsp || mids[i]->multiEnd)
1233 mids[i]->callback(mids[i]);
1235 cifs_mid_q_entry_release(mids[i]);
1236 } else if (server->ops->is_oplock_break &&
1237 server->ops->is_oplock_break(bufs[i],
1239 smb2_add_credits_from_hdr(bufs[i], server);
1240 cifs_dbg(FYI, "Received oplock break\n");
1242 cifs_server_dbg(VFS, "No task to wake, unknown frame "
1243 "received! NumMids %d\n",
1244 atomic_read(&midCount));
1245 cifs_dump_mem("Received Data is: ", bufs[i],
1246 HEADER_SIZE(server));
1247 smb2_add_credits_from_hdr(bufs[i], server);
1248 #ifdef CONFIG_CIFS_DEBUG2
1249 if (server->ops->dump_detail)
1250 server->ops->dump_detail(bufs[i],
1252 cifs_dump_mids(server);
1253 #endif /* CIFS_DEBUG2 */
1257 if (pdu_length > server->pdu_size) {
1258 if (!allocate_buffers(server))
1260 pdu_length -= server->pdu_size;
1261 server->total_read = 0;
1262 server->large_buf = false;
1263 buf = server->smallbuf;
1266 } /* end while !EXITING */
1268 /* buffer usually freed in free_mid - need to free it here on exit */
1269 cifs_buf_release(server->bigbuf);
1270 if (server->smallbuf) /* no sense logging a debug message if NULL */
1271 cifs_small_buf_release(server->smallbuf);
1273 task_to_wake = xchg(&server->tsk, NULL);
1274 clean_demultiplex_info(server);
1276 /* if server->tsk was NULL then wait for a signal before exiting */
1277 if (!task_to_wake) {
1278 set_current_state(TASK_INTERRUPTIBLE);
1279 while (!signal_pending(current)) {
1281 set_current_state(TASK_INTERRUPTIBLE);
1283 set_current_state(TASK_RUNNING);
1286 module_put_and_exit(0);
1289 /* extract the host portion of the UNC string */
1291 extract_hostname(const char *unc)
1297 /* skip double chars at beginning of string */
1298 /* BB: check validity of these bytes? */
1299 if (strlen(unc) < 3)
1300 return ERR_PTR(-EINVAL);
1301 for (src = unc; *src && *src == '\\'; src++)
1304 return ERR_PTR(-EINVAL);
1306 /* delimiter between hostname and sharename is always '\\' now */
1307 delim = strchr(src, '\\');
1309 return ERR_PTR(-EINVAL);
1312 dst = kmalloc((len + 1), GFP_KERNEL);
1314 return ERR_PTR(-ENOMEM);
1316 memcpy(dst, src, len);
1322 static int get_option_ul(substring_t args[], unsigned long *option)
1327 string = match_strdup(args);
1330 rc = kstrtoul(string, 0, option);
1336 static int get_option_uid(substring_t args[], kuid_t *result)
1338 unsigned long value;
1342 rc = get_option_ul(args, &value);
1346 uid = make_kuid(current_user_ns(), value);
1347 if (!uid_valid(uid))
1354 static int get_option_gid(substring_t args[], kgid_t *result)
1356 unsigned long value;
1360 rc = get_option_ul(args, &value);
1364 gid = make_kgid(current_user_ns(), value);
1365 if (!gid_valid(gid))
1372 static int cifs_parse_security_flavors(char *value,
1373 struct smb_vol *vol)
1376 substring_t args[MAX_OPT_ARGS];
1379 * With mount options, the last one should win. Reset any existing
1380 * settings back to default.
1382 vol->sectype = Unspecified;
1385 switch (match_token(value, cifs_secflavor_tokens, args)) {
1387 cifs_dbg(VFS, "sec=krb5p is not supported!\n");
1393 vol->sectype = Kerberos;
1395 case Opt_sec_ntlmsspi:
1398 case Opt_sec_ntlmssp:
1399 vol->sectype = RawNTLMSSP;
1405 vol->sectype = NTLM;
1407 case Opt_sec_ntlmv2i:
1410 case Opt_sec_ntlmv2:
1411 vol->sectype = NTLMv2;
1413 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1414 case Opt_sec_lanman:
1415 vol->sectype = LANMAN;
1422 cifs_dbg(VFS, "bad security option: %s\n", value);
1430 cifs_parse_cache_flavor(char *value, struct smb_vol *vol)
1432 substring_t args[MAX_OPT_ARGS];
1434 switch (match_token(value, cifs_cacheflavor_tokens, args)) {
1435 case Opt_cache_loose:
1436 vol->direct_io = false;
1437 vol->strict_io = false;
1438 vol->cache_ro = false;
1439 vol->cache_rw = false;
1441 case Opt_cache_strict:
1442 vol->direct_io = false;
1443 vol->strict_io = true;
1444 vol->cache_ro = false;
1445 vol->cache_rw = false;
1447 case Opt_cache_none:
1448 vol->direct_io = true;
1449 vol->strict_io = false;
1450 vol->cache_ro = false;
1451 vol->cache_rw = false;
1454 vol->direct_io = false;
1455 vol->strict_io = false;
1456 vol->cache_ro = true;
1457 vol->cache_rw = false;
1460 vol->direct_io = false;
1461 vol->strict_io = false;
1462 vol->cache_ro = false;
1463 vol->cache_rw = true;
1466 cifs_dbg(VFS, "bad cache= option: %s\n", value);
1473 cifs_parse_smb_version(char *value, struct smb_vol *vol, bool is_smb3)
1475 substring_t args[MAX_OPT_ARGS];
1477 switch (match_token(value, cifs_smb_version_tokens, args)) {
1478 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1480 if (disable_legacy_dialects) {
1481 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1485 cifs_dbg(VFS, "vers=1.0 (cifs) not permitted when mounting with smb3\n");
1488 vol->ops = &smb1_operations;
1489 vol->vals = &smb1_values;
1492 if (disable_legacy_dialects) {
1493 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1497 cifs_dbg(VFS, "vers=2.0 not permitted when mounting with smb3\n");
1500 vol->ops = &smb20_operations;
1501 vol->vals = &smb20_values;
1505 cifs_dbg(VFS, "vers=1.0 (cifs) mount not permitted when legacy dialects disabled\n");
1508 cifs_dbg(VFS, "vers=2.0 mount not permitted when legacy dialects disabled\n");
1510 #endif /* CIFS_ALLOW_INSECURE_LEGACY */
1512 vol->ops = &smb21_operations;
1513 vol->vals = &smb21_values;
1516 vol->ops = &smb30_operations;
1517 vol->vals = &smb30_values;
1520 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1521 vol->vals = &smb302_values;
1524 vol->ops = &smb311_operations;
1525 vol->vals = &smb311_values;
1528 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1529 vol->vals = &smb3any_values;
1532 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1533 vol->vals = &smbdefault_values;
1536 cifs_dbg(VFS, "Unknown vers= option specified: %s\n", value);
1543 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1544 * fields with the result. Returns 0 on success and an error otherwise.
1547 cifs_parse_devname(const char *devname, struct smb_vol *vol)
1550 const char *delims = "/\\";
1553 if (unlikely(!devname || !*devname)) {
1554 cifs_dbg(VFS, "Device name not specified.\n");
1558 /* make sure we have a valid UNC double delimiter prefix */
1559 len = strspn(devname, delims);
1563 /* find delimiter between host and sharename */
1564 pos = strpbrk(devname + 2, delims);
1568 /* skip past delimiter */
1571 /* now go until next delimiter or end of string */
1572 len = strcspn(pos, delims);
1574 /* move "pos" up to delimiter or NULL */
1576 vol->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
1580 convert_delimiter(vol->UNC, '\\');
1582 /* skip any delimiter */
1583 if (*pos == '/' || *pos == '\\')
1586 /* If pos is NULL then no prepath */
1590 vol->prepath = kstrdup(pos, GFP_KERNEL);
1598 cifs_parse_mount_options(const char *mountdata, const char *devname,
1599 struct smb_vol *vol, bool is_smb3)
1602 char *mountdata_copy = NULL, *options;
1603 unsigned int temp_len, i, j;
1605 short int override_uid = -1;
1606 short int override_gid = -1;
1607 bool uid_specified = false;
1608 bool gid_specified = false;
1609 bool sloppy = false;
1610 char *invalid = NULL;
1611 char *nodename = utsname()->nodename;
1612 char *string = NULL;
1613 char *tmp_end, *value;
1615 bool got_ip = false;
1616 bool got_version = false;
1617 unsigned short port = 0;
1618 struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1622 delim = separator[0];
1624 /* ensure we always start with zeroed-out smb_vol */
1625 memset(vol, 0, sizeof(*vol));
1628 * does not have to be perfect mapping since field is
1629 * informational, only used for servers that do not support
1630 * port 445 and it can be overridden at mount time
1632 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1633 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1634 vol->source_rfc1001_name[i] = toupper(nodename[i]);
1636 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1637 /* null target name indicates to use *SMBSERVR default called name
1638 if we end up sending RFC1001 session initialize */
1639 vol->target_rfc1001_name[0] = 0;
1640 vol->cred_uid = current_uid();
1641 vol->linux_uid = current_uid();
1642 vol->linux_gid = current_gid();
1643 vol->bsize = 1024 * 1024; /* can improve cp performance significantly */
1645 * default to SFM style remapping of seven reserved characters
1646 * unless user overrides it or we negotiate CIFS POSIX where
1647 * it is unnecessary. Can not simultaneously use more than one mapping
1648 * since then readdir could list files that open could not open
1652 /* default to only allowing write access to owner of the mount */
1653 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1655 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1656 /* default is always to request posix paths. */
1657 vol->posix_paths = 1;
1658 /* default to using server inode numbers where available */
1659 vol->server_ino = 1;
1661 /* default is to use strict cifs caching semantics */
1662 vol->strict_io = true;
1664 vol->actimeo = CIFS_DEF_ACTIMEO;
1666 /* Most clients set timeout to 0, allows server to use its default */
1667 vol->handle_timeout = 0; /* See MS-SMB2 spec section 2.2.14.2.12 */
1669 /* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1670 vol->ops = &smb30_operations;
1671 vol->vals = &smbdefault_values;
1673 vol->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1676 goto cifs_parse_mount_err;
1678 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1679 if (!mountdata_copy)
1680 goto cifs_parse_mount_err;
1682 options = mountdata_copy;
1683 end = options + strlen(options);
1685 if (strncmp(options, "sep=", 4) == 0) {
1686 if (options[4] != 0) {
1687 separator[0] = options[4];
1690 cifs_dbg(FYI, "Null separator not allowed\n");
1693 vol->backupuid_specified = false; /* no backup intent for a user */
1694 vol->backupgid_specified = false; /* no backup intent for a group */
1696 switch (cifs_parse_devname(devname, vol)) {
1700 cifs_dbg(VFS, "Unable to allocate memory for devname.\n");
1701 goto cifs_parse_mount_err;
1703 cifs_dbg(VFS, "Malformed UNC in devname.\n");
1704 goto cifs_parse_mount_err;
1706 cifs_dbg(VFS, "Unknown error parsing devname.\n");
1707 goto cifs_parse_mount_err;
1710 while ((data = strsep(&options, separator)) != NULL) {
1711 substring_t args[MAX_OPT_ARGS];
1712 unsigned long option;
1718 token = match_token(data, cifs_mount_option_tokens, args);
1722 /* Ingnore the following */
1726 /* Boolean values */
1727 case Opt_user_xattr:
1730 case Opt_nouser_xattr:
1736 case Opt_noforceuid:
1742 case Opt_noforcegid:
1745 case Opt_noblocksend:
1746 vol->noblocksnd = 1;
1748 case Opt_noautotune:
1749 vol->noautotune = 1;
1767 vol->sfu_remap = true;
1768 vol->remap = false; /* disable SFM mapping */
1770 case Opt_nomapchars:
1771 vol->sfu_remap = false;
1775 vol->sfu_remap = false; /* disable SFU mapping */
1777 case Opt_nomapposix:
1790 #ifdef CONFIG_CIFS_ROOT
1794 case Opt_posixpaths:
1795 vol->posix_paths = 1;
1797 case Opt_noposixpaths:
1798 vol->posix_paths = 0;
1803 "conflicting unix mount options\n");
1804 vol->no_linux_ext = 1;
1807 if (vol->no_linux_ext)
1809 "conflicting unix mount options\n");
1821 * turn off mandatory locking in mode
1822 * if remote locking is turned off since the
1823 * local vfs will do advisory
1825 if (vol->file_mode ==
1826 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1827 vol->file_mode = S_IALLUGO;
1829 case Opt_nohandlecache:
1830 vol->nohandlecache = 1;
1832 case Opt_handlecache:
1833 vol->nohandlecache = 0;
1835 case Opt_forcemandatorylock:
1844 case Opt_setuidfromacl:
1845 vol->setuidfromacl = 1;
1848 vol->dynperm = true;
1851 vol->dynperm = false;
1865 case Opt_nostrictsync:
1866 vol->nostrictsync = 1;
1868 case Opt_strictsync:
1869 vol->nostrictsync = 0;
1872 vol->server_ino = 1;
1874 case Opt_noserverino:
1875 vol->server_ino = 0;
1877 case Opt_rwpidforward:
1878 vol->rwpidforward = 1;
1890 vol->no_psx_acl = 0;
1893 vol->no_psx_acl = 1;
1895 case Opt_locallease:
1896 vol->local_lease = 1;
1901 case Opt_ignore_signature:
1903 vol->ignore_signature = true;
1906 /* we do not do the following in secFlags because seal
1907 * is a per tree connection (mount) not a per socket
1908 * or per-smb connection option in the protocol
1909 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1914 pr_warn("CIFS: Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1917 #ifndef CONFIG_CIFS_FSCACHE
1918 cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1919 goto cifs_parse_mount_err;
1923 case Opt_mfsymlinks:
1924 vol->mfsymlinks = true;
1927 vol->multiuser = true;
1932 case Opt_nosharesock:
1933 vol->nosharesock = true;
1935 case Opt_nopersistent:
1936 vol->nopersistent = true;
1937 if (vol->persistent) {
1939 "persistenthandles mount options conflict\n");
1940 goto cifs_parse_mount_err;
1943 case Opt_persistent:
1944 vol->persistent = true;
1945 if ((vol->nopersistent) || (vol->resilient)) {
1947 "persistenthandles mount options conflict\n");
1948 goto cifs_parse_mount_err;
1952 vol->resilient = true;
1953 if (vol->persistent) {
1955 "persistenthandles mount options conflict\n");
1956 goto cifs_parse_mount_err;
1959 case Opt_noresilient:
1960 vol->resilient = false; /* already the default */
1962 case Opt_domainauto:
1963 vol->domainauto = true;
1969 vol->compression = UNKNOWN_TYPE;
1971 "SMB3 compression support is experimental\n");
1974 /* Numeric Values */
1976 if (get_option_uid(args, &vol->backupuid)) {
1977 cifs_dbg(VFS, "%s: Invalid backupuid value\n",
1979 goto cifs_parse_mount_err;
1981 vol->backupuid_specified = true;
1984 if (get_option_gid(args, &vol->backupgid)) {
1985 cifs_dbg(VFS, "%s: Invalid backupgid value\n",
1987 goto cifs_parse_mount_err;
1989 vol->backupgid_specified = true;
1992 if (get_option_uid(args, &vol->linux_uid)) {
1993 cifs_dbg(VFS, "%s: Invalid uid value\n",
1995 goto cifs_parse_mount_err;
1997 uid_specified = true;
2000 if (get_option_uid(args, &vol->cred_uid)) {
2001 cifs_dbg(VFS, "%s: Invalid cruid value\n",
2003 goto cifs_parse_mount_err;
2007 if (get_option_gid(args, &vol->linux_gid)) {
2008 cifs_dbg(VFS, "%s: Invalid gid value\n",
2010 goto cifs_parse_mount_err;
2012 gid_specified = true;
2015 if (get_option_ul(args, &option)) {
2016 cifs_dbg(VFS, "%s: Invalid file_mode value\n",
2018 goto cifs_parse_mount_err;
2020 vol->file_mode = option;
2023 if (get_option_ul(args, &option)) {
2024 cifs_dbg(VFS, "%s: Invalid dir_mode value\n",
2026 goto cifs_parse_mount_err;
2028 vol->dir_mode = option;
2031 if (get_option_ul(args, &option) ||
2032 option > USHRT_MAX) {
2033 cifs_dbg(VFS, "%s: Invalid port value\n",
2035 goto cifs_parse_mount_err;
2037 port = (unsigned short)option;
2039 case Opt_min_enc_offload:
2040 if (get_option_ul(args, &option)) {
2041 cifs_dbg(VFS, "Invalid minimum encrypted read offload size (esize)\n");
2042 goto cifs_parse_mount_err;
2044 vol->min_offload = option;
2047 if (get_option_ul(args, &option)) {
2048 cifs_dbg(VFS, "%s: Invalid blocksize value\n",
2050 goto cifs_parse_mount_err;
2053 * inode blocksize realistically should never need to be
2054 * less than 16K or greater than 16M and default is 1MB.
2055 * Note that small inode block sizes (e.g. 64K) can lead
2056 * to very poor performance of common tools like cp and scp
2058 if ((option < CIFS_MAX_MSGSIZE) ||
2059 (option > (4 * SMB3_DEFAULT_IOSIZE))) {
2060 cifs_dbg(VFS, "%s: Invalid blocksize\n",
2062 goto cifs_parse_mount_err;
2064 vol->bsize = option;
2067 if (get_option_ul(args, &option)) {
2068 cifs_dbg(VFS, "%s: Invalid rsize value\n",
2070 goto cifs_parse_mount_err;
2072 vol->rsize = option;
2075 if (get_option_ul(args, &option)) {
2076 cifs_dbg(VFS, "%s: Invalid wsize value\n",
2078 goto cifs_parse_mount_err;
2080 vol->wsize = option;
2083 if (get_option_ul(args, &option)) {
2084 cifs_dbg(VFS, "%s: Invalid actimeo value\n",
2086 goto cifs_parse_mount_err;
2088 vol->actimeo = HZ * option;
2089 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
2090 cifs_dbg(VFS, "attribute cache timeout too large\n");
2091 goto cifs_parse_mount_err;
2094 case Opt_handletimeout:
2095 if (get_option_ul(args, &option)) {
2096 cifs_dbg(VFS, "%s: Invalid handletimeout value\n",
2098 goto cifs_parse_mount_err;
2100 vol->handle_timeout = option;
2101 if (vol->handle_timeout > SMB3_MAX_HANDLE_TIMEOUT) {
2102 cifs_dbg(VFS, "Invalid handle cache timeout, longer than 16 minutes\n");
2103 goto cifs_parse_mount_err;
2106 case Opt_echo_interval:
2107 if (get_option_ul(args, &option)) {
2108 cifs_dbg(VFS, "%s: Invalid echo interval value\n",
2110 goto cifs_parse_mount_err;
2112 vol->echo_interval = option;
2115 if (get_option_ul(args, &option)) {
2116 cifs_dbg(VFS, "%s: Invalid snapshot time\n",
2118 goto cifs_parse_mount_err;
2120 vol->snapshot_time = option;
2122 case Opt_max_credits:
2123 if (get_option_ul(args, &option) || (option < 20) ||
2125 cifs_dbg(VFS, "%s: Invalid max_credits value\n",
2127 goto cifs_parse_mount_err;
2129 vol->max_credits = option;
2132 /* String Arguments */
2134 case Opt_blank_user:
2135 /* null user, ie. anonymous authentication */
2137 vol->username = NULL;
2140 string = match_strdup(args);
2144 if (strnlen(string, CIFS_MAX_USERNAME_LEN) >
2145 CIFS_MAX_USERNAME_LEN) {
2146 pr_warn("CIFS: username too long\n");
2147 goto cifs_parse_mount_err;
2150 kfree(vol->username);
2151 vol->username = kstrdup(string, GFP_KERNEL);
2153 goto cifs_parse_mount_err;
2155 case Opt_blank_pass:
2156 /* passwords have to be handled differently
2157 * to allow the character used for deliminator
2158 * to be passed within them
2162 * Check if this is a case where the password
2163 * starts with a delimiter
2165 tmp_end = strchr(data, '=');
2167 if (!(tmp_end < end && tmp_end[1] == delim)) {
2168 /* No it is not. Set the password to NULL */
2169 kzfree(vol->password);
2170 vol->password = NULL;
2173 /* Fallthrough - to Opt_pass below.*/
2175 /* Obtain the value string */
2176 value = strchr(data, '=');
2179 /* Set tmp_end to end of the string */
2180 tmp_end = (char *) value + strlen(value);
2182 /* Check if following character is the deliminator
2183 * If yes, we have encountered a double deliminator
2184 * reset the NULL character to the deliminator
2186 if (tmp_end < end && tmp_end[1] == delim) {
2189 /* Keep iterating until we get to a single
2190 * deliminator OR the end
2192 while ((tmp_end = strchr(tmp_end, delim))
2193 != NULL && (tmp_end[1] == delim)) {
2194 tmp_end = (char *) &tmp_end[2];
2197 /* Reset var options to point to next element */
2200 options = (char *) &tmp_end[1];
2202 /* Reached the end of the mount option
2207 kzfree(vol->password);
2208 /* Now build new password string */
2209 temp_len = strlen(value);
2210 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
2211 if (vol->password == NULL) {
2212 pr_warn("CIFS: no memory for password\n");
2213 goto cifs_parse_mount_err;
2216 for (i = 0, j = 0; i < temp_len; i++, j++) {
2217 vol->password[j] = value[i];
2218 if ((value[i] == delim) &&
2219 value[i+1] == delim)
2220 /* skip the second deliminator */
2223 vol->password[j] = '\0';
2226 /* FIXME: should this be an error instead? */
2230 string = match_strdup(args);
2234 if (!cifs_convert_address(dstaddr, string,
2236 pr_err("CIFS: bad ip= option (%s).\n", string);
2237 goto cifs_parse_mount_err;
2242 string = match_strdup(args);
2246 if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
2247 == CIFS_MAX_DOMAINNAME_LEN) {
2248 pr_warn("CIFS: domain name too long\n");
2249 goto cifs_parse_mount_err;
2252 kfree(vol->domainname);
2253 vol->domainname = kstrdup(string, GFP_KERNEL);
2254 if (!vol->domainname) {
2255 pr_warn("CIFS: no memory for domainname\n");
2256 goto cifs_parse_mount_err;
2258 cifs_dbg(FYI, "Domain name set\n");
2261 string = match_strdup(args);
2265 if (!cifs_convert_address(
2266 (struct sockaddr *)&vol->srcaddr,
2267 string, strlen(string))) {
2268 pr_warn("CIFS: Could not parse srcaddr: %s\n",
2270 goto cifs_parse_mount_err;
2274 string = match_strdup(args);
2278 if (strnlen(string, 1024) >= 65) {
2279 pr_warn("CIFS: iocharset name too long.\n");
2280 goto cifs_parse_mount_err;
2283 if (strncasecmp(string, "default", 7) != 0) {
2284 kfree(vol->iocharset);
2285 vol->iocharset = kstrdup(string,
2287 if (!vol->iocharset) {
2288 pr_warn("CIFS: no memory for charset\n");
2289 goto cifs_parse_mount_err;
2292 /* if iocharset not set then load_nls_default
2295 cifs_dbg(FYI, "iocharset set to %s\n", string);
2297 case Opt_netbiosname:
2298 string = match_strdup(args);
2302 memset(vol->source_rfc1001_name, 0x20,
2305 * FIXME: are there cases in which a comma can
2306 * be valid in workstation netbios name (and
2307 * need special handling)?
2309 for (i = 0; i < RFC1001_NAME_LEN; i++) {
2310 /* don't ucase netbiosname for user */
2313 vol->source_rfc1001_name[i] = string[i];
2315 /* The string has 16th byte zero still from
2316 * set at top of the function
2318 if (i == RFC1001_NAME_LEN && string[i] != 0)
2319 pr_warn("CIFS: netbiosname longer than 15 truncated.\n");
2322 /* servernetbiosname specified override *SMBSERVER */
2323 string = match_strdup(args);
2327 /* last byte, type, is 0x20 for servr type */
2328 memset(vol->target_rfc1001_name, 0x20,
2329 RFC1001_NAME_LEN_WITH_NULL);
2331 /* BB are there cases in which a comma can be
2332 valid in this workstation netbios name
2333 (and need special handling)? */
2335 /* user or mount helper must uppercase the
2337 for (i = 0; i < 15; i++) {
2340 vol->target_rfc1001_name[i] = string[i];
2342 /* The string has 16th byte zero still from
2343 set at top of the function */
2344 if (i == RFC1001_NAME_LEN && string[i] != 0)
2345 pr_warn("CIFS: server netbiosname longer than 15 truncated.\n");
2348 /* version of mount userspace tools, not dialect */
2349 string = match_strdup(args);
2353 /* If interface changes in mount.cifs bump to new ver */
2354 if (strncasecmp(string, "1", 1) == 0) {
2355 if (strlen(string) > 1) {
2356 pr_warn("Bad mount helper ver=%s. Did "
2357 "you want SMB1 (CIFS) dialect "
2358 "and mean to type vers=1.0 "
2359 "instead?\n", string);
2360 goto cifs_parse_mount_err;
2362 /* This is the default */
2365 /* For all other value, error */
2366 pr_warn("CIFS: Invalid mount helper version specified\n");
2367 goto cifs_parse_mount_err;
2369 /* protocol version (dialect) */
2370 string = match_strdup(args);
2374 if (cifs_parse_smb_version(string, vol, is_smb3) != 0)
2375 goto cifs_parse_mount_err;
2379 string = match_strdup(args);
2383 if (cifs_parse_security_flavors(string, vol) != 0)
2384 goto cifs_parse_mount_err;
2387 string = match_strdup(args);
2391 if (cifs_parse_cache_flavor(string, vol) != 0)
2392 goto cifs_parse_mount_err;
2396 * An option we don't recognize. Save it off for later
2397 * if we haven't already found one
2403 /* Free up any allocated string */
2408 if (!sloppy && invalid) {
2409 pr_err("CIFS: Unknown mount option \"%s\"\n", invalid);
2410 goto cifs_parse_mount_err;
2413 if (vol->rdma && vol->vals->protocol_id < SMB30_PROT_ID) {
2414 cifs_dbg(VFS, "SMB Direct requires Version >=3.0\n");
2415 goto cifs_parse_mount_err;
2419 /* Muliuser mounts require CONFIG_KEYS support */
2420 if (vol->multiuser) {
2421 cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
2422 goto cifs_parse_mount_err;
2426 cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
2427 goto cifs_parse_mount_err;
2430 /* make sure UNC has a share name */
2431 if (!strchr(vol->UNC + 3, '\\')) {
2432 cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
2433 goto cifs_parse_mount_err;
2440 /* No ip= option specified? Try to get it from UNC */
2441 /* Use the address part of the UNC. */
2442 slash = strchr(&vol->UNC[2], '\\');
2443 len = slash - &vol->UNC[2];
2444 if (!cifs_convert_address(dstaddr, &vol->UNC[2], len)) {
2445 pr_err("Unable to determine destination address.\n");
2446 goto cifs_parse_mount_err;
2450 /* set the port that we got earlier */
2451 cifs_set_port(dstaddr, port);
2454 vol->override_uid = override_uid;
2455 else if (override_uid == 1)
2456 pr_notice("CIFS: ignoring forceuid mount option specified with no uid= option.\n");
2459 vol->override_gid = override_gid;
2460 else if (override_gid == 1)
2461 pr_notice("CIFS: ignoring forcegid mount option specified with no gid= option.\n");
2463 if (got_version == false)
2464 pr_warn("No dialect specified on mount. Default has changed to "
2465 "a more secure dialect, SMB2.1 or later (e.g. SMB3), from CIFS "
2466 "(SMB1). To use the less secure SMB1 dialect to access "
2467 "old servers which do not support SMB3 (or SMB2.1) specify vers=1.0"
2470 kfree(mountdata_copy);
2474 pr_warn("Could not allocate temporary buffer\n");
2475 cifs_parse_mount_err:
2477 kfree(mountdata_copy);
2481 /** Returns true if srcaddr isn't specified and rhs isn't
2482 * specified, or if srcaddr is specified and
2483 * matches the IP address of the rhs argument.
2486 srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
2488 switch (srcaddr->sa_family) {
2490 return (rhs->sa_family == AF_UNSPEC);
2492 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
2493 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
2494 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
2497 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
2498 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
2499 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
2503 return false; /* don't expect to be here */
2508 * If no port is specified in addr structure, we try to match with 445 port
2509 * and if it fails - with 139 ports. It should be called only if address
2510 * families of server and addr are equal.
2513 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
2515 __be16 port, *sport;
2517 /* SMBDirect manages its own ports, don't match it here */
2521 switch (addr->sa_family) {
2523 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
2524 port = ((struct sockaddr_in *) addr)->sin_port;
2527 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
2528 port = ((struct sockaddr_in6 *) addr)->sin6_port;
2536 port = htons(CIFS_PORT);
2540 port = htons(RFC1001_PORT);
2543 return port == *sport;
2547 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
2548 struct sockaddr *srcaddr)
2550 switch (addr->sa_family) {
2552 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
2553 struct sockaddr_in *srv_addr4 =
2554 (struct sockaddr_in *)&server->dstaddr;
2556 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
2561 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
2562 struct sockaddr_in6 *srv_addr6 =
2563 (struct sockaddr_in6 *)&server->dstaddr;
2565 if (!ipv6_addr_equal(&addr6->sin6_addr,
2566 &srv_addr6->sin6_addr))
2568 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
2574 return false; /* don't expect to be here */
2577 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
2584 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2587 * The select_sectype function should either return the vol->sectype
2588 * that was specified, or "Unspecified" if that sectype was not
2589 * compatible with the given NEGOTIATE request.
2591 if (server->ops->select_sectype(server, vol->sectype)
2596 * Now check if signing mode is acceptable. No need to check
2597 * global_secflags at this point since if MUST_SIGN is set then
2598 * the server->sign had better be too.
2600 if (vol->sign && !server->sign)
2606 static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
2608 struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2610 if (vol->nosharesock)
2613 /* If multidialect negotiation see if existing sessions match one */
2614 if (strcmp(vol->vals->version_string, SMB3ANY_VERSION_STRING) == 0) {
2615 if (server->vals->protocol_id < SMB30_PROT_ID)
2617 } else if (strcmp(vol->vals->version_string,
2618 SMBDEFAULT_VERSION_STRING) == 0) {
2619 if (server->vals->protocol_id < SMB21_PROT_ID)
2621 } else if ((server->vals != vol->vals) || (server->ops != vol->ops))
2624 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2627 if (!match_address(server, addr,
2628 (struct sockaddr *)&vol->srcaddr))
2631 if (!match_port(server, addr))
2634 if (!match_security(server, vol))
2637 if (server->echo_interval != vol->echo_interval * HZ)
2640 if (server->rdma != vol->rdma)
2643 if (server->ignore_signature != vol->ignore_signature)
2646 if (server->min_offload != vol->min_offload)
2652 struct TCP_Server_Info *
2653 cifs_find_tcp_session(struct smb_vol *vol)
2655 struct TCP_Server_Info *server;
2657 spin_lock(&cifs_tcp_ses_lock);
2658 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
2659 if (!match_server(server, vol))
2662 ++server->srv_count;
2663 spin_unlock(&cifs_tcp_ses_lock);
2664 cifs_dbg(FYI, "Existing tcp session with server found\n");
2667 spin_unlock(&cifs_tcp_ses_lock);
2672 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
2674 struct task_struct *task;
2676 spin_lock(&cifs_tcp_ses_lock);
2677 if (--server->srv_count > 0) {
2678 spin_unlock(&cifs_tcp_ses_lock);
2682 put_net(cifs_net_ns(server));
2684 list_del_init(&server->tcp_ses_list);
2685 spin_unlock(&cifs_tcp_ses_lock);
2687 cancel_delayed_work_sync(&server->echo);
2691 * Avoid deadlock here: reconnect work calls
2692 * cifs_put_tcp_session() at its end. Need to be sure
2693 * that reconnect work does nothing with server pointer after
2696 cancel_delayed_work(&server->reconnect);
2698 cancel_delayed_work_sync(&server->reconnect);
2700 spin_lock(&GlobalMid_Lock);
2701 server->tcpStatus = CifsExiting;
2702 spin_unlock(&GlobalMid_Lock);
2704 cifs_crypto_secmech_release(server);
2705 cifs_fscache_release_client_cookie(server);
2707 kfree(server->session_key.response);
2708 server->session_key.response = NULL;
2709 server->session_key.len = 0;
2711 task = xchg(&server->tsk, NULL);
2713 send_sig(SIGKILL, task, 1);
2716 static struct TCP_Server_Info *
2717 cifs_get_tcp_session(struct smb_vol *volume_info)
2719 struct TCP_Server_Info *tcp_ses = NULL;
2722 cifs_dbg(FYI, "UNC: %s\n", volume_info->UNC);
2724 /* see if we already have a matching tcp_ses */
2725 tcp_ses = cifs_find_tcp_session(volume_info);
2729 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2735 tcp_ses->ops = volume_info->ops;
2736 tcp_ses->vals = volume_info->vals;
2737 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2738 tcp_ses->hostname = extract_hostname(volume_info->UNC);
2739 if (IS_ERR(tcp_ses->hostname)) {
2740 rc = PTR_ERR(tcp_ses->hostname);
2741 goto out_err_crypto_release;
2744 tcp_ses->noblockcnt = volume_info->rootfs;
2745 tcp_ses->noblocksnd = volume_info->noblocksnd || volume_info->rootfs;
2746 tcp_ses->noautotune = volume_info->noautotune;
2747 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2748 tcp_ses->rdma = volume_info->rdma;
2749 tcp_ses->in_flight = 0;
2750 tcp_ses->max_in_flight = 0;
2751 tcp_ses->credits = 1;
2752 init_waitqueue_head(&tcp_ses->response_q);
2753 init_waitqueue_head(&tcp_ses->request_q);
2754 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2755 mutex_init(&tcp_ses->srv_mutex);
2756 memcpy(tcp_ses->workstation_RFC1001_name,
2757 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2758 memcpy(tcp_ses->server_RFC1001_name,
2759 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2760 tcp_ses->session_estab = false;
2761 tcp_ses->sequence_number = 0;
2762 tcp_ses->reconnect_instance = 1;
2763 tcp_ses->lstrp = jiffies;
2764 tcp_ses->compress_algorithm = cpu_to_le16(volume_info->compression);
2765 spin_lock_init(&tcp_ses->req_lock);
2766 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2767 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2768 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2769 INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
2770 mutex_init(&tcp_ses->reconnect_mutex);
2771 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2772 sizeof(tcp_ses->srcaddr));
2773 memcpy(&tcp_ses->dstaddr, &volume_info->dstaddr,
2774 sizeof(tcp_ses->dstaddr));
2775 generate_random_uuid(tcp_ses->client_guid);
2777 * at this point we are the only ones with the pointer
2778 * to the struct since the kernel thread not created yet
2779 * no need to spinlock this init of tcpStatus or srv_count
2781 tcp_ses->tcpStatus = CifsNew;
2782 ++tcp_ses->srv_count;
2784 if (volume_info->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
2785 volume_info->echo_interval <= SMB_ECHO_INTERVAL_MAX)
2786 tcp_ses->echo_interval = volume_info->echo_interval * HZ;
2788 tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
2789 if (tcp_ses->rdma) {
2790 #ifndef CONFIG_CIFS_SMB_DIRECT
2791 cifs_dbg(VFS, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
2793 goto out_err_crypto_release;
2795 tcp_ses->smbd_conn = smbd_get_connection(
2796 tcp_ses, (struct sockaddr *)&volume_info->dstaddr);
2797 if (tcp_ses->smbd_conn) {
2798 cifs_dbg(VFS, "RDMA transport established\n");
2800 goto smbd_connected;
2803 goto out_err_crypto_release;
2806 rc = ip_connect(tcp_ses);
2808 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
2809 goto out_err_crypto_release;
2813 * since we're in a cifs function already, we know that
2814 * this will succeed. No need for try_module_get().
2816 __module_get(THIS_MODULE);
2817 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2819 if (IS_ERR(tcp_ses->tsk)) {
2820 rc = PTR_ERR(tcp_ses->tsk);
2821 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
2822 module_put(THIS_MODULE);
2823 goto out_err_crypto_release;
2825 tcp_ses->min_offload = volume_info->min_offload;
2826 tcp_ses->tcpStatus = CifsNeedNegotiate;
2828 tcp_ses->nr_targets = 1;
2829 tcp_ses->ignore_signature = volume_info->ignore_signature;
2830 /* thread spawned, put it on the list */
2831 spin_lock(&cifs_tcp_ses_lock);
2832 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2833 spin_unlock(&cifs_tcp_ses_lock);
2835 cifs_fscache_get_client_cookie(tcp_ses);
2837 /* queue echo request delayed work */
2838 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
2842 out_err_crypto_release:
2843 cifs_crypto_secmech_release(tcp_ses);
2845 put_net(cifs_net_ns(tcp_ses));
2849 if (!IS_ERR(tcp_ses->hostname))
2850 kfree(tcp_ses->hostname);
2851 if (tcp_ses->ssocket)
2852 sock_release(tcp_ses->ssocket);
2858 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2860 if (vol->sectype != Unspecified &&
2861 vol->sectype != ses->sectype)
2864 switch (ses->sectype) {
2866 if (!uid_eq(vol->cred_uid, ses->cred_uid))
2870 /* NULL username means anonymous session */
2871 if (ses->user_name == NULL) {
2877 /* anything else takes username/password */
2878 if (strncmp(ses->user_name,
2879 vol->username ? vol->username : "",
2880 CIFS_MAX_USERNAME_LEN))
2882 if ((vol->username && strlen(vol->username) != 0) &&
2883 ses->password != NULL &&
2884 strncmp(ses->password,
2885 vol->password ? vol->password : "",
2886 CIFS_MAX_PASSWORD_LEN))
2893 * cifs_setup_ipc - helper to setup the IPC tcon for the session
2895 * A new IPC connection is made and stored in the session
2896 * tcon_ipc. The IPC tcon has the same lifetime as the session.
2899 cifs_setup_ipc(struct cifs_ses *ses, struct smb_vol *volume_info)
2902 struct cifs_tcon *tcon;
2903 struct nls_table *nls_codepage;
2904 char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0};
2906 struct TCP_Server_Info *server = ses->server;
2909 * If the mount request that resulted in the creation of the
2910 * session requires encryption, force IPC to be encrypted too.
2912 if (volume_info->seal) {
2913 if (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
2916 cifs_server_dbg(VFS,
2917 "IPC: server doesn't support encryption\n");
2922 tcon = tconInfoAlloc();
2926 scnprintf(unc, sizeof(unc), "\\\\%s\\IPC$", server->hostname);
2929 nls_codepage = load_nls_default();
2935 rc = server->ops->tree_connect(xid, ses, unc, tcon, nls_codepage);
2939 cifs_server_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
2944 cifs_dbg(FYI, "IPC tcon rc = %d ipc tid = %d\n", rc, tcon->tid);
2946 ses->tcon_ipc = tcon;
2948 unload_nls(nls_codepage);
2953 * cifs_free_ipc - helper to release the session IPC tcon
2955 * Needs to be called everytime a session is destroyed
2958 cifs_free_ipc(struct cifs_ses *ses)
2961 struct cifs_tcon *tcon = ses->tcon_ipc;
2966 if (ses->server->ops->tree_disconnect) {
2968 rc = ses->server->ops->tree_disconnect(xid, tcon);
2973 cifs_dbg(FYI, "failed to disconnect IPC tcon (rc=%d)\n", rc);
2976 ses->tcon_ipc = NULL;
2980 static struct cifs_ses *
2981 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
2983 struct cifs_ses *ses;
2985 spin_lock(&cifs_tcp_ses_lock);
2986 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
2987 if (ses->status == CifsExiting)
2989 if (!match_session(ses, vol))
2992 spin_unlock(&cifs_tcp_ses_lock);
2995 spin_unlock(&cifs_tcp_ses_lock);
2999 void cifs_put_smb_ses(struct cifs_ses *ses)
3001 unsigned int rc, xid;
3002 struct TCP_Server_Info *server = ses->server;
3004 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
3006 spin_lock(&cifs_tcp_ses_lock);
3007 if (ses->status == CifsExiting) {
3008 spin_unlock(&cifs_tcp_ses_lock);
3011 if (--ses->ses_count > 0) {
3012 spin_unlock(&cifs_tcp_ses_lock);
3015 if (ses->status == CifsGood)
3016 ses->status = CifsExiting;
3017 spin_unlock(&cifs_tcp_ses_lock);
3021 if (ses->status == CifsExiting && server->ops->logoff) {
3023 rc = server->ops->logoff(xid, ses);
3025 cifs_server_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
3030 spin_lock(&cifs_tcp_ses_lock);
3031 list_del_init(&ses->smb_ses_list);
3032 spin_unlock(&cifs_tcp_ses_lock);
3035 cifs_put_tcp_session(server, 0);
3040 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
3041 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
3043 /* Populate username and pw fields from keyring if possible */
3045 cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
3049 const char *delim, *payload;
3053 struct TCP_Server_Info *server = ses->server;
3054 struct sockaddr_in *sa;
3055 struct sockaddr_in6 *sa6;
3056 const struct user_key_payload *upayload;
3058 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
3062 /* try to find an address key first */
3063 switch (server->dstaddr.ss_family) {
3065 sa = (struct sockaddr_in *)&server->dstaddr;
3066 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
3069 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
3070 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
3073 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
3074 server->dstaddr.ss_family);
3079 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
3080 key = request_key(&key_type_logon, desc, "");
3082 if (!ses->domainName) {
3083 cifs_dbg(FYI, "domainName is NULL\n");
3088 /* didn't work, try to find a domain key */
3089 sprintf(desc, "cifs:d:%s", ses->domainName);
3090 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
3091 key = request_key(&key_type_logon, desc, "");
3099 down_read(&key->sem);
3100 upayload = user_key_payload_locked(key);
3101 if (IS_ERR_OR_NULL(upayload)) {
3102 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
3106 /* find first : in payload */
3107 payload = upayload->data;
3108 delim = strnchr(payload, upayload->datalen, ':');
3109 cifs_dbg(FYI, "payload=%s\n", payload);
3111 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
3117 len = delim - payload;
3118 if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
3119 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
3125 vol->username = kstrndup(payload, len, GFP_KERNEL);
3126 if (!vol->username) {
3127 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
3132 cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
3134 len = key->datalen - (len + 1);
3135 if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
3136 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
3138 kfree(vol->username);
3139 vol->username = NULL;
3144 vol->password = kstrndup(delim, len, GFP_KERNEL);
3145 if (!vol->password) {
3146 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
3149 kfree(vol->username);
3150 vol->username = NULL;
3155 * If we have a domain key then we must set the domainName in the
3158 if (is_domain && ses->domainName) {
3159 vol->domainname = kstrndup(ses->domainName,
3160 strlen(ses->domainName),
3162 if (!vol->domainname) {
3163 cifs_dbg(FYI, "Unable to allocate %zd bytes for "
3166 kfree(vol->username);
3167 vol->username = NULL;
3168 kzfree(vol->password);
3169 vol->password = NULL;
3179 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
3182 #else /* ! CONFIG_KEYS */
3184 cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
3185 struct cifs_ses *ses __attribute__((unused)))
3189 #endif /* CONFIG_KEYS */
3192 * cifs_get_smb_ses - get a session matching @volume_info data from @server
3194 * This function assumes it is being called from cifs_mount() where we
3195 * already got a server reference (server refcount +1). See
3196 * cifs_get_tcon() for refcount explanations.
3199 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
3203 struct cifs_ses *ses;
3204 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3205 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3209 ses = cifs_find_smb_ses(server, volume_info);
3211 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
3214 mutex_lock(&ses->session_mutex);
3215 rc = cifs_negotiate_protocol(xid, ses);
3217 mutex_unlock(&ses->session_mutex);
3218 /* problem -- put our ses reference */
3219 cifs_put_smb_ses(ses);
3223 if (ses->need_reconnect) {
3224 cifs_dbg(FYI, "Session needs reconnect\n");
3225 rc = cifs_setup_session(xid, ses,
3226 volume_info->local_nls);
3228 mutex_unlock(&ses->session_mutex);
3229 /* problem -- put our reference */
3230 cifs_put_smb_ses(ses);
3235 mutex_unlock(&ses->session_mutex);
3237 /* existing SMB ses has a server reference already */
3238 cifs_put_tcp_session(server, 0);
3243 cifs_dbg(FYI, "Existing smb sess not found\n");
3244 ses = sesInfoAlloc();
3248 /* new SMB session uses our server ref */
3249 ses->server = server;
3250 if (server->dstaddr.ss_family == AF_INET6)
3251 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
3253 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
3255 if (volume_info->username) {
3256 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
3257 if (!ses->user_name)
3261 /* volume_info->password freed at unmount */
3262 if (volume_info->password) {
3263 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
3267 if (volume_info->domainname) {
3268 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
3269 if (!ses->domainName)
3272 if (volume_info->domainauto)
3273 ses->domainAuto = volume_info->domainauto;
3274 ses->cred_uid = volume_info->cred_uid;
3275 ses->linux_uid = volume_info->linux_uid;
3277 ses->sectype = volume_info->sectype;
3278 ses->sign = volume_info->sign;
3279 mutex_lock(&ses->session_mutex);
3280 rc = cifs_negotiate_protocol(xid, ses);
3282 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
3283 mutex_unlock(&ses->session_mutex);
3287 /* success, put it on the list */
3288 spin_lock(&cifs_tcp_ses_lock);
3289 list_add(&ses->smb_ses_list, &server->smb_ses_list);
3290 spin_unlock(&cifs_tcp_ses_lock);
3294 cifs_setup_ipc(ses, volume_info);
3304 static int match_tcon(struct cifs_tcon *tcon, struct smb_vol *volume_info)
3306 if (tcon->tidStatus == CifsExiting)
3308 if (strncmp(tcon->treeName, volume_info->UNC, MAX_TREE_SIZE))
3310 if (tcon->seal != volume_info->seal)
3312 if (tcon->snapshot_time != volume_info->snapshot_time)
3314 if (tcon->handle_timeout != volume_info->handle_timeout)
3316 if (tcon->no_lease != volume_info->no_lease)
3321 static struct cifs_tcon *
3322 cifs_find_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3324 struct list_head *tmp;
3325 struct cifs_tcon *tcon;
3327 spin_lock(&cifs_tcp_ses_lock);
3328 list_for_each(tmp, &ses->tcon_list) {
3329 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
3330 if (!match_tcon(tcon, volume_info))
3333 spin_unlock(&cifs_tcp_ses_lock);
3336 spin_unlock(&cifs_tcp_ses_lock);
3341 cifs_put_tcon(struct cifs_tcon *tcon)
3344 struct cifs_ses *ses;
3347 * IPC tcon share the lifetime of their session and are
3348 * destroyed in the session put function
3350 if (tcon == NULL || tcon->ipc)
3354 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
3355 spin_lock(&cifs_tcp_ses_lock);
3356 if (--tcon->tc_count > 0) {
3357 spin_unlock(&cifs_tcp_ses_lock);
3361 list_del_init(&tcon->tcon_list);
3362 spin_unlock(&cifs_tcp_ses_lock);
3365 if (ses->server->ops->tree_disconnect)
3366 ses->server->ops->tree_disconnect(xid, tcon);
3369 cifs_fscache_release_super_cookie(tcon);
3371 cifs_put_smb_ses(ses);
3375 * cifs_get_tcon - get a tcon matching @volume_info data from @ses
3377 * - tcon refcount is the number of mount points using the tcon.
3378 * - ses refcount is the number of tcon using the session.
3380 * 1. This function assumes it is being called from cifs_mount() where
3381 * we already got a session reference (ses refcount +1).
3383 * 2. Since we're in the context of adding a mount point, the end
3384 * result should be either:
3386 * a) a new tcon already allocated with refcount=1 (1 mount point) and
3387 * its session refcount incremented (1 new tcon). This +1 was
3388 * already done in (1).
3390 * b) an existing tcon with refcount+1 (add a mount point to it) and
3391 * identical ses refcount (no new tcon). Because of (1) we need to
3392 * decrement the ses refcount.
3394 static struct cifs_tcon *
3395 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3398 struct cifs_tcon *tcon;
3400 tcon = cifs_find_tcon(ses, volume_info);
3403 * tcon has refcount already incremented but we need to
3404 * decrement extra ses reference gotten by caller (case b)
3406 cifs_dbg(FYI, "Found match on UNC path\n");
3407 cifs_put_smb_ses(ses);
3411 if (!ses->server->ops->tree_connect) {
3416 tcon = tconInfoAlloc();
3422 if (volume_info->snapshot_time) {
3423 if (ses->server->vals->protocol_id == 0) {
3425 "Use SMB2 or later for snapshot mount option\n");
3429 tcon->snapshot_time = volume_info->snapshot_time;
3432 if (volume_info->handle_timeout) {
3433 if (ses->server->vals->protocol_id == 0) {
3435 "Use SMB2.1 or later for handle timeout option\n");
3439 tcon->handle_timeout = volume_info->handle_timeout;
3443 if (volume_info->password) {
3444 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
3445 if (!tcon->password) {
3451 if (volume_info->seal) {
3452 if (ses->server->vals->protocol_id == 0) {
3454 "SMB3 or later required for encryption\n");
3457 } else if (tcon->ses->server->capabilities &
3458 SMB2_GLOBAL_CAP_ENCRYPTION)
3461 cifs_dbg(VFS, "Encryption is not supported on share\n");
3467 if (volume_info->linux_ext) {
3468 if (ses->server->posix_ext_supported) {
3469 tcon->posix_extensions = true;
3470 printk_once(KERN_WARNING
3471 "SMB3.11 POSIX Extensions are experimental\n");
3473 cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions.\n");
3480 * BB Do we need to wrap session_mutex around this TCon call and Unix
3481 * SetFS as we do on SessSetup and reconnect?
3484 rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
3485 volume_info->local_nls);
3487 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
3491 tcon->use_persistent = false;
3492 /* check if SMB2 or later, CIFS does not support persistent handles */
3493 if (volume_info->persistent) {
3494 if (ses->server->vals->protocol_id == 0) {
3496 "SMB3 or later required for persistent handles\n");
3499 } else if (ses->server->capabilities &
3500 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3501 tcon->use_persistent = true;
3502 else /* persistent handles requested but not supported */ {
3504 "Persistent handles not supported on share\n");
3508 } else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
3509 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3510 && (volume_info->nopersistent == false)) {
3511 cifs_dbg(FYI, "enabling persistent handles\n");
3512 tcon->use_persistent = true;
3513 } else if (volume_info->resilient) {
3514 if (ses->server->vals->protocol_id == 0) {
3516 "SMB2.1 or later required for resilient handles\n");
3520 tcon->use_resilient = true;
3523 /* If the user really knows what they are doing they can override */
3524 if (tcon->share_flags & SMB2_SHAREFLAG_NO_CACHING) {
3525 if (volume_info->cache_ro)
3526 cifs_dbg(VFS, "cache=ro requested on mount but NO_CACHING flag set on share\n");
3527 else if (volume_info->cache_rw)
3528 cifs_dbg(VFS, "cache=singleclient requested on mount but NO_CACHING flag set on share\n");
3532 * We can have only one retry value for a connection to a share so for
3533 * resources mounted more than once to the same server share the last
3534 * value passed in for the retry flag is used.
3536 tcon->retry = volume_info->retry;
3537 tcon->nocase = volume_info->nocase;
3538 tcon->nohandlecache = volume_info->nohandlecache;
3539 tcon->local_lease = volume_info->local_lease;
3540 tcon->no_lease = volume_info->no_lease;
3541 INIT_LIST_HEAD(&tcon->pending_opens);
3543 spin_lock(&cifs_tcp_ses_lock);
3544 list_add(&tcon->tcon_list, &ses->tcon_list);
3545 spin_unlock(&cifs_tcp_ses_lock);
3547 cifs_fscache_get_super_cookie(tcon);
3557 cifs_put_tlink(struct tcon_link *tlink)
3559 if (!tlink || IS_ERR(tlink))
3562 if (!atomic_dec_and_test(&tlink->tl_count) ||
3563 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
3564 tlink->tl_time = jiffies;
3568 if (!IS_ERR(tlink_tcon(tlink)))
3569 cifs_put_tcon(tlink_tcon(tlink));
3575 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3577 struct cifs_sb_info *old = CIFS_SB(sb);
3578 struct cifs_sb_info *new = mnt_data->cifs_sb;
3579 unsigned int oldflags = old->mnt_cifs_flags & CIFS_MOUNT_MASK;
3580 unsigned int newflags = new->mnt_cifs_flags & CIFS_MOUNT_MASK;
3582 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
3585 if (old->mnt_cifs_serverino_autodisabled)
3586 newflags &= ~CIFS_MOUNT_SERVER_INUM;
3588 if (oldflags != newflags)
3592 * We want to share sb only if we don't specify an r/wsize or
3593 * specified r/wsize is greater than or equal to existing one.
3595 if (new->wsize && new->wsize < old->wsize)
3598 if (new->rsize && new->rsize < old->rsize)
3601 if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))
3604 if (old->mnt_file_mode != new->mnt_file_mode ||
3605 old->mnt_dir_mode != new->mnt_dir_mode)
3608 if (strcmp(old->local_nls->charset, new->local_nls->charset))
3611 if (old->actimeo != new->actimeo)
3618 match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3620 struct cifs_sb_info *old = CIFS_SB(sb);
3621 struct cifs_sb_info *new = mnt_data->cifs_sb;
3622 bool old_set = old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH;
3623 bool new_set = new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH;
3625 if (old_set && new_set && !strcmp(new->prepath, old->prepath))
3627 else if (!old_set && !new_set)
3634 cifs_match_super(struct super_block *sb, void *data)
3636 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
3637 struct smb_vol *volume_info;
3638 struct cifs_sb_info *cifs_sb;
3639 struct TCP_Server_Info *tcp_srv;
3640 struct cifs_ses *ses;
3641 struct cifs_tcon *tcon;
3642 struct tcon_link *tlink;
3645 spin_lock(&cifs_tcp_ses_lock);
3646 cifs_sb = CIFS_SB(sb);
3647 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3648 if (IS_ERR(tlink)) {
3649 spin_unlock(&cifs_tcp_ses_lock);
3652 tcon = tlink_tcon(tlink);
3654 tcp_srv = ses->server;
3656 volume_info = mnt_data->vol;
3658 if (!match_server(tcp_srv, volume_info) ||
3659 !match_session(ses, volume_info) ||
3660 !match_tcon(tcon, volume_info) ||
3661 !match_prepath(sb, mnt_data)) {
3666 rc = compare_mount_options(sb, mnt_data);
3668 spin_unlock(&cifs_tcp_ses_lock);
3669 cifs_put_tlink(tlink);
3673 #ifdef CONFIG_DEBUG_LOCK_ALLOC
3674 static struct lock_class_key cifs_key[2];
3675 static struct lock_class_key cifs_slock_key[2];
3678 cifs_reclassify_socket4(struct socket *sock)
3680 struct sock *sk = sock->sk;
3681 BUG_ON(!sock_allow_reclassification(sk));
3682 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
3683 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
3687 cifs_reclassify_socket6(struct socket *sock)
3689 struct sock *sk = sock->sk;
3690 BUG_ON(!sock_allow_reclassification(sk));
3691 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
3692 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
3696 cifs_reclassify_socket4(struct socket *sock)
3701 cifs_reclassify_socket6(struct socket *sock)
3706 /* See RFC1001 section 14 on representation of Netbios names */
3707 static void rfc1002mangle(char *target, char *source, unsigned int length)
3711 for (i = 0, j = 0; i < (length); i++) {
3712 /* mask a nibble at a time and encode */
3713 target[j] = 'A' + (0x0F & (source[i] >> 4));
3714 target[j+1] = 'A' + (0x0F & source[i]);
3721 bind_socket(struct TCP_Server_Info *server)
3724 if (server->srcaddr.ss_family != AF_UNSPEC) {
3725 /* Bind to the specified local IP address */
3726 struct socket *socket = server->ssocket;
3727 rc = socket->ops->bind(socket,
3728 (struct sockaddr *) &server->srcaddr,
3729 sizeof(server->srcaddr));
3731 struct sockaddr_in *saddr4;
3732 struct sockaddr_in6 *saddr6;
3733 saddr4 = (struct sockaddr_in *)&server->srcaddr;
3734 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
3735 if (saddr6->sin6_family == AF_INET6)
3736 cifs_server_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
3737 &saddr6->sin6_addr, rc);
3739 cifs_server_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
3740 &saddr4->sin_addr.s_addr, rc);
3747 ip_rfc1001_connect(struct TCP_Server_Info *server)
3751 * some servers require RFC1001 sessinit before sending
3752 * negprot - BB check reconnection in case where second
3753 * sessinit is sent but no second negprot
3755 struct rfc1002_session_packet *ses_init_buf;
3756 struct smb_hdr *smb_buf;
3757 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
3760 ses_init_buf->trailer.session_req.called_len = 32;
3762 if (server->server_RFC1001_name[0] != 0)
3763 rfc1002mangle(ses_init_buf->trailer.
3764 session_req.called_name,
3765 server->server_RFC1001_name,
3766 RFC1001_NAME_LEN_WITH_NULL);
3768 rfc1002mangle(ses_init_buf->trailer.
3769 session_req.called_name,
3770 DEFAULT_CIFS_CALLED_NAME,
3771 RFC1001_NAME_LEN_WITH_NULL);
3773 ses_init_buf->trailer.session_req.calling_len = 32;
3776 * calling name ends in null (byte 16) from old smb
3779 if (server->workstation_RFC1001_name[0] != 0)
3780 rfc1002mangle(ses_init_buf->trailer.
3781 session_req.calling_name,
3782 server->workstation_RFC1001_name,
3783 RFC1001_NAME_LEN_WITH_NULL);
3785 rfc1002mangle(ses_init_buf->trailer.
3786 session_req.calling_name,
3788 RFC1001_NAME_LEN_WITH_NULL);
3790 ses_init_buf->trailer.session_req.scope1 = 0;
3791 ses_init_buf->trailer.session_req.scope2 = 0;
3792 smb_buf = (struct smb_hdr *)ses_init_buf;
3794 /* sizeof RFC1002_SESSION_REQUEST with no scope */
3795 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
3796 rc = smb_send(server, smb_buf, 0x44);
3797 kfree(ses_init_buf);
3799 * RFC1001 layer in at least one server
3800 * requires very short break before negprot
3801 * presumably because not expecting negprot
3802 * to follow so fast. This is a simple
3803 * solution that works without
3804 * complicating the code and causes no
3805 * significant slowing down on mount
3808 usleep_range(1000, 2000);
3811 * else the negprot may still work without this
3812 * even though malloc failed
3819 generic_ip_connect(struct TCP_Server_Info *server)
3824 struct socket *socket = server->ssocket;
3825 struct sockaddr *saddr;
3827 saddr = (struct sockaddr *) &server->dstaddr;
3829 if (server->dstaddr.ss_family == AF_INET6) {
3830 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
3831 slen = sizeof(struct sockaddr_in6);
3834 sport = ((struct sockaddr_in *) saddr)->sin_port;
3835 slen = sizeof(struct sockaddr_in);
3839 if (socket == NULL) {
3840 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3841 IPPROTO_TCP, &socket, 1);
3843 cifs_server_dbg(VFS, "Error %d creating socket\n", rc);
3844 server->ssocket = NULL;
3848 /* BB other socket options to set KEEPALIVE, NODELAY? */
3849 cifs_dbg(FYI, "Socket created\n");
3850 server->ssocket = socket;
3851 socket->sk->sk_allocation = GFP_NOFS;
3852 if (sfamily == AF_INET6)
3853 cifs_reclassify_socket6(socket);
3855 cifs_reclassify_socket4(socket);
3858 rc = bind_socket(server);
3863 * Eventually check for other socket options to change from
3864 * the default. sock_setsockopt not used because it expects
3867 socket->sk->sk_rcvtimeo = 7 * HZ;
3868 socket->sk->sk_sndtimeo = 5 * HZ;
3870 /* make the bufsizes depend on wsize/rsize and max requests */
3871 if (server->noautotune) {
3872 if (socket->sk->sk_sndbuf < (200 * 1024))
3873 socket->sk->sk_sndbuf = 200 * 1024;
3874 if (socket->sk->sk_rcvbuf < (140 * 1024))
3875 socket->sk->sk_rcvbuf = 140 * 1024;
3878 if (server->tcp_nodelay) {
3880 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
3881 (char *)&val, sizeof(val));
3883 cifs_dbg(FYI, "set TCP_NODELAY socket option error %d\n",
3887 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3888 socket->sk->sk_sndbuf,
3889 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3891 rc = socket->ops->connect(socket, saddr, slen,
3892 server->noblockcnt ? O_NONBLOCK : 0);
3894 * When mounting SMB root file systems, we do not want to block in
3895 * connect. Otherwise bail out and then let cifs_reconnect() perform
3896 * reconnect failover - if possible.
3898 if (server->noblockcnt && rc == -EINPROGRESS)
3901 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3902 sock_release(socket);
3903 server->ssocket = NULL;
3907 if (sport == htons(RFC1001_PORT))
3908 rc = ip_rfc1001_connect(server);
3914 ip_connect(struct TCP_Server_Info *server)
3917 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3918 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3920 if (server->dstaddr.ss_family == AF_INET6)
3921 sport = &addr6->sin6_port;
3923 sport = &addr->sin_port;
3928 /* try with 445 port at first */
3929 *sport = htons(CIFS_PORT);
3931 rc = generic_ip_connect(server);
3935 /* if it failed, try with 139 port */
3936 *sport = htons(RFC1001_PORT);
3939 return generic_ip_connect(server);
3942 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
3943 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
3945 /* if we are reconnecting then should we check to see if
3946 * any requested capabilities changed locally e.g. via
3947 * remount but we can not do much about it here
3948 * if they have (even if we could detect it by the following)
3949 * Perhaps we could add a backpointer to array of sb from tcon
3950 * or if we change to make all sb to same share the same
3951 * sb as NFS - then we only have one backpointer to sb.
3952 * What if we wanted to mount the server share twice once with
3953 * and once without posixacls or posix paths? */
3954 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3956 if (vol_info && vol_info->no_linux_ext) {
3957 tcon->fsUnixInfo.Capability = 0;
3958 tcon->unix_ext = 0; /* Unix Extensions disabled */
3959 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
3961 } else if (vol_info)
3962 tcon->unix_ext = 1; /* Unix Extensions supported */
3964 if (tcon->unix_ext == 0) {
3965 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
3969 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
3970 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3971 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
3972 /* check for reconnect case in which we do not
3973 want to change the mount behavior if we can avoid it */
3974 if (vol_info == NULL) {
3975 /* turn off POSIX ACL and PATHNAMES if not set
3976 originally at mount time */
3977 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
3978 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3979 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3980 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3981 cifs_dbg(VFS, "POSIXPATH support change\n");
3982 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3983 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3984 cifs_dbg(VFS, "possible reconnect error\n");
3985 cifs_dbg(VFS, "server disabled POSIX path support\n");
3989 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3990 cifs_dbg(VFS, "per-share encryption not supported yet\n");
3992 cap &= CIFS_UNIX_CAP_MASK;
3993 if (vol_info && vol_info->no_psx_acl)
3994 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3995 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
3996 cifs_dbg(FYI, "negotiated posix acl support\n");
3998 cifs_sb->mnt_cifs_flags |=
3999 CIFS_MOUNT_POSIXACL;
4002 if (vol_info && vol_info->posix_paths == 0)
4003 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
4004 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
4005 cifs_dbg(FYI, "negotiate posix pathnames\n");
4007 cifs_sb->mnt_cifs_flags |=
4008 CIFS_MOUNT_POSIX_PATHS;
4011 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
4012 #ifdef CONFIG_CIFS_DEBUG2
4013 if (cap & CIFS_UNIX_FCNTL_CAP)
4014 cifs_dbg(FYI, "FCNTL cap\n");
4015 if (cap & CIFS_UNIX_EXTATTR_CAP)
4016 cifs_dbg(FYI, "EXTATTR cap\n");
4017 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
4018 cifs_dbg(FYI, "POSIX path cap\n");
4019 if (cap & CIFS_UNIX_XATTR_CAP)
4020 cifs_dbg(FYI, "XATTR cap\n");
4021 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
4022 cifs_dbg(FYI, "POSIX ACL cap\n");
4023 if (cap & CIFS_UNIX_LARGE_READ_CAP)
4024 cifs_dbg(FYI, "very large read cap\n");
4025 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
4026 cifs_dbg(FYI, "very large write cap\n");
4027 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
4028 cifs_dbg(FYI, "transport encryption cap\n");
4029 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
4030 cifs_dbg(FYI, "mandatory transport encryption cap\n");
4031 #endif /* CIFS_DEBUG2 */
4032 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
4033 if (vol_info == NULL) {
4034 cifs_dbg(FYI, "resetting capabilities failed\n");
4036 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");
4042 int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
4043 struct cifs_sb_info *cifs_sb)
4045 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
4047 spin_lock_init(&cifs_sb->tlink_tree_lock);
4048 cifs_sb->tlink_tree = RB_ROOT;
4050 cifs_sb->bsize = pvolume_info->bsize;
4052 * Temporarily set r/wsize for matching superblock. If we end up using
4053 * new sb then client will later negotiate it downward if needed.
4055 cifs_sb->rsize = pvolume_info->rsize;
4056 cifs_sb->wsize = pvolume_info->wsize;
4058 cifs_sb->mnt_uid = pvolume_info->linux_uid;
4059 cifs_sb->mnt_gid = pvolume_info->linux_gid;
4060 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
4061 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
4062 cifs_dbg(FYI, "file mode: 0x%hx dir mode: 0x%hx\n",
4063 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
4065 cifs_sb->actimeo = pvolume_info->actimeo;
4066 cifs_sb->local_nls = pvolume_info->local_nls;
4068 if (pvolume_info->nodfs)
4069 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_DFS;
4070 if (pvolume_info->noperm)
4071 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
4072 if (pvolume_info->setuids)
4073 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
4074 if (pvolume_info->setuidfromacl)
4075 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
4076 if (pvolume_info->server_ino)
4077 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
4078 if (pvolume_info->remap)
4079 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
4080 if (pvolume_info->sfu_remap)
4081 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
4082 if (pvolume_info->no_xattr)
4083 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
4084 if (pvolume_info->sfu_emul)
4085 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
4086 if (pvolume_info->nobrl)
4087 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
4088 if (pvolume_info->nohandlecache)
4089 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_HANDLE_CACHE;
4090 if (pvolume_info->nostrictsync)
4091 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
4092 if (pvolume_info->mand_lock)
4093 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
4094 if (pvolume_info->rwpidforward)
4095 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
4096 if (pvolume_info->mode_ace)
4097 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MODE_FROM_SID;
4098 if (pvolume_info->cifs_acl)
4099 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
4100 if (pvolume_info->backupuid_specified) {
4101 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
4102 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
4104 if (pvolume_info->backupgid_specified) {
4105 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
4106 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
4108 if (pvolume_info->override_uid)
4109 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
4110 if (pvolume_info->override_gid)
4111 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
4112 if (pvolume_info->dynperm)
4113 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
4114 if (pvolume_info->fsc)
4115 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
4116 if (pvolume_info->multiuser)
4117 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
4118 CIFS_MOUNT_NO_PERM);
4119 if (pvolume_info->strict_io)
4120 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
4121 if (pvolume_info->direct_io) {
4122 cifs_dbg(FYI, "mounting share using direct i/o\n");
4123 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
4125 if (pvolume_info->cache_ro) {
4126 cifs_dbg(VFS, "mounting share with read only caching. Ensure that the share will not be modified while in use.\n");
4127 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RO_CACHE;
4128 } else if (pvolume_info->cache_rw) {
4129 cifs_dbg(VFS, "mounting share in single client RW caching mode. Ensure that no other systems will be accessing the share.\n");
4130 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_RO_CACHE |
4131 CIFS_MOUNT_RW_CACHE);
4133 if (pvolume_info->mfsymlinks) {
4134 if (pvolume_info->sfu_emul) {
4136 * Our SFU ("Services for Unix" emulation does not allow
4137 * creating symlinks but does allow reading existing SFU
4138 * symlinks (it does allow both creating and reading SFU
4139 * style mknod and FIFOs though). When "mfsymlinks" and
4140 * "sfu" are both enabled at the same time, it allows
4141 * reading both types of symlinks, but will only create
4142 * them with mfsymlinks format. This allows better
4143 * Apple compatibility (probably better for Samba too)
4144 * while still recognizing old Windows style symlinks.
4146 cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
4148 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
4151 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
4152 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
4154 if (pvolume_info->prepath) {
4155 cifs_sb->prepath = kstrdup(pvolume_info->prepath, GFP_KERNEL);
4156 if (cifs_sb->prepath == NULL)
4164 cifs_cleanup_volume_info_contents(struct smb_vol *volume_info)
4166 kfree(volume_info->username);
4167 kzfree(volume_info->password);
4168 kfree(volume_info->UNC);
4169 kfree(volume_info->domainname);
4170 kfree(volume_info->iocharset);
4171 kfree(volume_info->prepath);
4175 cifs_cleanup_volume_info(struct smb_vol *volume_info)
4179 cifs_cleanup_volume_info_contents(volume_info);
4183 /* Release all succeed connections */
4184 static inline void mount_put_conns(struct cifs_sb_info *cifs_sb,
4186 struct TCP_Server_Info *server,
4187 struct cifs_ses *ses, struct cifs_tcon *tcon)
4192 cifs_put_tcon(tcon);
4194 cifs_put_smb_ses(ses);
4196 cifs_put_tcp_session(server, 0);
4197 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
4201 /* Get connections for tcp, ses and tcon */
4202 static int mount_get_conns(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
4204 struct TCP_Server_Info **nserver,
4205 struct cifs_ses **nses, struct cifs_tcon **ntcon)
4208 struct TCP_Server_Info *server;
4209 struct cifs_ses *ses;
4210 struct cifs_tcon *tcon;
4218 /* get a reference to a tcp session */
4219 server = cifs_get_tcp_session(vol);
4220 if (IS_ERR(server)) {
4221 rc = PTR_ERR(server);
4227 if ((vol->max_credits < 20) || (vol->max_credits > 60000))
4228 server->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
4230 server->max_credits = vol->max_credits;
4232 /* get a reference to a SMB session */
4233 ses = cifs_get_smb_ses(server, vol);
4241 if ((vol->persistent == true) && (!(ses->server->capabilities &
4242 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES))) {
4243 cifs_server_dbg(VFS, "persistent handles not supported by server\n");
4247 /* search for existing tcon to this server share */
4248 tcon = cifs_get_tcon(ses, vol);
4256 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
4257 if (tcon->posix_extensions)
4258 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
4260 /* tell server which Unix caps we support */
4261 if (cap_unix(tcon->ses)) {
4263 * reset of caps checks mount to see if unix extensions disabled
4264 * for just this mount.
4266 reset_cifs_unix_caps(*xid, tcon, cifs_sb, vol);
4267 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
4268 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
4269 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP))
4272 tcon->unix_ext = 0; /* server does not support them */
4274 /* do not care if a following call succeed - informational */
4275 if (!tcon->pipe && server->ops->qfs_tcon) {
4276 server->ops->qfs_tcon(*xid, tcon);
4277 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE) {
4278 if (tcon->fsDevInfo.DeviceCharacteristics &
4279 cpu_to_le32(FILE_READ_ONLY_DEVICE))
4280 cifs_dbg(VFS, "mounted to read only share\n");
4281 else if ((cifs_sb->mnt_cifs_flags &
4282 CIFS_MOUNT_RW_CACHE) == 0)
4283 cifs_dbg(VFS, "read only mount of RW share\n");
4284 /* no need to log a RW mount of a typical RW share */
4288 cifs_sb->wsize = server->ops->negotiate_wsize(tcon, vol);
4289 cifs_sb->rsize = server->ops->negotiate_rsize(tcon, vol);
4294 static int mount_setup_tlink(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
4295 struct cifs_tcon *tcon)
4297 struct tcon_link *tlink;
4299 /* hang the tcon off of the superblock */
4300 tlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4304 tlink->tl_uid = ses->linux_uid;
4305 tlink->tl_tcon = tcon;
4306 tlink->tl_time = jiffies;
4307 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
4308 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4310 cifs_sb->master_tlink = tlink;
4311 spin_lock(&cifs_sb->tlink_tree_lock);
4312 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4313 spin_unlock(&cifs_sb->tlink_tree_lock);
4315 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4320 #ifdef CONFIG_CIFS_DFS_UPCALL
4322 * cifs_build_path_to_root returns full path to root when we do not have an
4323 * exiting connection (tcon)
4326 build_unc_path_to_root(const struct smb_vol *vol,
4327 const struct cifs_sb_info *cifs_sb, bool useppath)
4329 char *full_path, *pos;
4330 unsigned int pplen = useppath && vol->prepath ?
4331 strlen(vol->prepath) + 1 : 0;
4332 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
4334 if (unc_len > MAX_TREE_SIZE)
4335 return ERR_PTR(-EINVAL);
4337 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
4338 if (full_path == NULL)
4339 return ERR_PTR(-ENOMEM);
4341 memcpy(full_path, vol->UNC, unc_len);
4342 pos = full_path + unc_len;
4345 *pos = CIFS_DIR_SEP(cifs_sb);
4346 memcpy(pos + 1, vol->prepath, pplen);
4350 *pos = '\0'; /* add trailing null */
4351 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
4352 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
4357 * expand_dfs_referral - Perform a dfs referral query and update the cifs_sb
4360 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
4361 * to a string containing updated options for the submount. Otherwise it
4362 * will be left untouched.
4364 * Returns the rc from get_dfs_path to the caller, which can be used to
4365 * determine whether there were referrals.
4368 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
4369 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
4373 struct dfs_info3_param referral = {0};
4374 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
4376 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4379 full_path = build_unc_path_to_root(volume_info, cifs_sb, true);
4380 if (IS_ERR(full_path))
4381 return PTR_ERR(full_path);
4383 /* For DFS paths, skip the first '\' of the UNC */
4384 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
4386 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4387 ref_path, &referral, NULL);
4389 char *fake_devname = NULL;
4391 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
4392 full_path + 1, &referral,
4394 free_dfs_info_param(&referral);
4396 if (IS_ERR(mdata)) {
4397 rc = PTR_ERR(mdata);
4400 cifs_cleanup_volume_info_contents(volume_info);
4401 rc = cifs_setup_volume_info(volume_info, mdata,
4402 fake_devname, false);
4404 kfree(fake_devname);
4405 kfree(cifs_sb->mountdata);
4406 cifs_sb->mountdata = mdata;
4412 static inline int get_next_dfs_tgt(const char *path,
4413 struct dfs_cache_tgt_list *tgt_list,
4414 struct dfs_cache_tgt_iterator **tgt_it)
4417 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
4419 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
4420 return !*tgt_it ? -EHOSTDOWN : 0;
4423 static int update_vol_info(const struct dfs_cache_tgt_iterator *tgt_it,
4424 struct smb_vol *fake_vol, struct smb_vol *vol)
4426 const char *tgt = dfs_cache_get_tgt_name(tgt_it);
4427 int len = strlen(tgt) + 2;
4430 new_unc = kmalloc(len, GFP_KERNEL);
4433 scnprintf(new_unc, len, "\\%s", tgt);
4438 if (fake_vol->prepath) {
4439 kfree(vol->prepath);
4440 vol->prepath = fake_vol->prepath;
4441 fake_vol->prepath = NULL;
4443 memcpy(&vol->dstaddr, &fake_vol->dstaddr, sizeof(vol->dstaddr));
4448 static int setup_dfs_tgt_conn(const char *path,
4449 const struct dfs_cache_tgt_iterator *tgt_it,
4450 struct cifs_sb_info *cifs_sb,
4451 struct smb_vol *vol,
4453 struct TCP_Server_Info **server,
4454 struct cifs_ses **ses,
4455 struct cifs_tcon **tcon)
4458 struct dfs_info3_param ref = {0};
4459 char *mdata = NULL, *fake_devname = NULL;
4460 struct smb_vol fake_vol = {NULL};
4462 cifs_dbg(FYI, "%s: dfs path: %s\n", __func__, path);
4464 rc = dfs_cache_get_tgt_referral(path, tgt_it, &ref);
4468 mdata = cifs_compose_mount_options(cifs_sb->mountdata, path, &ref,
4470 free_dfs_info_param(&ref);
4472 if (IS_ERR(mdata)) {
4473 rc = PTR_ERR(mdata);
4476 cifs_dbg(FYI, "%s: fake_devname: %s\n", __func__, fake_devname);
4477 rc = cifs_setup_volume_info(&fake_vol, mdata, fake_devname,
4481 kfree(fake_devname);
4485 * We use a 'fake_vol' here because we need pass it down to the
4486 * mount_{get,put} functions to test connection against new DFS
4489 mount_put_conns(cifs_sb, *xid, *server, *ses, *tcon);
4490 rc = mount_get_conns(&fake_vol, cifs_sb, xid, server, ses,
4494 * We were able to connect to new target server.
4495 * Update current volume info with new target server.
4497 rc = update_vol_info(tgt_it, &fake_vol, vol);
4500 cifs_cleanup_volume_info_contents(&fake_vol);
4504 static int mount_do_dfs_failover(const char *path,
4505 struct cifs_sb_info *cifs_sb,
4506 struct smb_vol *vol,
4507 struct cifs_ses *root_ses,
4509 struct TCP_Server_Info **server,
4510 struct cifs_ses **ses,
4511 struct cifs_tcon **tcon)
4514 struct dfs_cache_tgt_list tgt_list;
4515 struct dfs_cache_tgt_iterator *tgt_it = NULL;
4517 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4520 rc = dfs_cache_noreq_find(path, NULL, &tgt_list);
4525 /* Get next DFS target server - if any */
4526 rc = get_next_dfs_tgt(path, &tgt_list, &tgt_it);
4529 /* Connect to next DFS target */
4530 rc = setup_dfs_tgt_conn(path, tgt_it, cifs_sb, vol, xid, server,
4532 if (!rc || rc == -EACCES || rc == -EOPNOTSUPP)
4537 * Update DFS target hint in DFS referral cache with the target
4538 * server we successfully reconnected to.
4540 rc = dfs_cache_update_tgthint(*xid, root_ses ? root_ses : *ses,
4542 cifs_remap(cifs_sb), path,
4545 dfs_cache_free_tgts(&tgt_list);
4551 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
4552 const char *devname, bool is_smb3)
4556 if (cifs_parse_mount_options(mount_data, devname, volume_info, is_smb3))
4559 if (volume_info->nullauth) {
4560 cifs_dbg(FYI, "Anonymous login\n");
4561 kfree(volume_info->username);
4562 volume_info->username = NULL;
4563 } else if (volume_info->username) {
4564 /* BB fixme parse for domain name here */
4565 cifs_dbg(FYI, "Username: %s\n", volume_info->username);
4567 cifs_dbg(VFS, "No username specified\n");
4568 /* In userspace mount helper we can get user name from alternate
4569 locations such as env variables and files on disk */
4573 /* this is needed for ASCII cp to Unicode converts */
4574 if (volume_info->iocharset == NULL) {
4575 /* load_nls_default cannot return null */
4576 volume_info->local_nls = load_nls_default();
4578 volume_info->local_nls = load_nls(volume_info->iocharset);
4579 if (volume_info->local_nls == NULL) {
4580 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
4581 volume_info->iocharset);
4590 cifs_get_volume_info(char *mount_data, const char *devname, bool is_smb3)
4593 struct smb_vol *volume_info;
4595 volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
4597 return ERR_PTR(-ENOMEM);
4599 rc = cifs_setup_volume_info(volume_info, mount_data, devname, is_smb3);
4601 cifs_cleanup_volume_info(volume_info);
4602 volume_info = ERR_PTR(rc);
4609 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
4611 struct cifs_tcon *tcon,
4612 struct cifs_sb_info *cifs_sb,
4619 int skip = added_treename ? 1 : 0;
4621 sep = CIFS_DIR_SEP(cifs_sb);
4624 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
4626 /* skip separators */
4631 /* next separator */
4632 while (*s && *s != sep)
4635 * if the treename is added, we then have to skip the first
4636 * part within the separators
4643 * temporarily null-terminate the path at the end of
4644 * the current component
4648 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4656 * Check if path is remote (e.g. a DFS share). Return -EREMOTE if it is,
4659 static int is_path_remote(struct cifs_sb_info *cifs_sb, struct smb_vol *vol,
4660 const unsigned int xid,
4661 struct TCP_Server_Info *server,
4662 struct cifs_tcon *tcon)
4667 if (!server->ops->is_path_accessible)
4671 * cifs_build_path_to_root works only when we have a valid tcon
4673 full_path = cifs_build_path_to_root(vol, cifs_sb, tcon,
4674 tcon->Flags & SMB_SHARE_IS_IN_DFS);
4675 if (full_path == NULL)
4678 cifs_dbg(FYI, "%s: full_path: %s\n", __func__, full_path);
4680 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4682 if (rc != 0 && rc != -EREMOTE) {
4687 if (rc != -EREMOTE) {
4688 rc = cifs_are_all_path_components_accessible(server, xid, tcon,
4689 cifs_sb, full_path, tcon->Flags & SMB_SHARE_IS_IN_DFS);
4691 cifs_server_dbg(VFS, "cannot query dirs between root and final path, "
4692 "enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
4693 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
4702 #ifdef CONFIG_CIFS_DFS_UPCALL
4703 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4707 struct cifs_ses *ses;
4708 struct cifs_tcon *root_tcon = NULL;
4709 struct cifs_tcon *tcon = NULL;
4710 struct TCP_Server_Info *server;
4711 char *root_path = NULL, *full_path = NULL;
4712 char *old_mountdata, *origin_mountdata = NULL;
4715 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4717 /* If not a standalone DFS root, then check if path is remote */
4718 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls,
4719 cifs_remap(cifs_sb), vol->UNC + 1, NULL,
4722 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4730 * If first DFS target server went offline and we failed to connect it,
4731 * server and ses pointers are NULL at this point, though we still have
4732 * chance to get a cached DFS referral in expand_dfs_referral() and
4733 * retry next target available in it.
4735 * If a NULL ses ptr is passed to dfs_cache_find(), a lookup will be
4736 * performed against DFS path and *no* requests will be sent to server
4737 * for any new DFS referrals. Hence it's safe to skip checking whether
4738 * server or ses ptr is NULL.
4740 if (rc == -EACCES || rc == -EOPNOTSUPP)
4743 root_path = build_unc_path_to_root(vol, cifs_sb, false);
4744 if (IS_ERR(root_path)) {
4745 rc = PTR_ERR(root_path);
4750 full_path = build_unc_path_to_root(vol, cifs_sb, true);
4751 if (IS_ERR(full_path)) {
4752 rc = PTR_ERR(full_path);
4757 * Perform an unconditional check for whether there are DFS
4758 * referrals for this path without prefix, to provide support
4759 * for DFS referrals from w2k8 servers which don't seem to respond
4760 * with PATH_NOT_COVERED to requests that include the prefix.
4761 * Chase the referral if found, otherwise continue normally.
4763 old_mountdata = cifs_sb->mountdata;
4764 (void)expand_dfs_referral(xid, ses, vol, cifs_sb, false);
4766 if (cifs_sb->mountdata == NULL) {
4771 /* Save DFS root volume information for DFS refresh worker */
4772 origin_mountdata = kstrndup(cifs_sb->mountdata,
4773 strlen(cifs_sb->mountdata), GFP_KERNEL);
4774 if (!origin_mountdata) {
4779 if (cifs_sb->mountdata != old_mountdata) {
4780 /* If we were redirected, reconnect to new target server */
4781 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4782 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4785 if (rc == -EACCES || rc == -EOPNOTSUPP)
4787 /* Perform DFS failover to any other DFS targets */
4788 rc = mount_do_dfs_failover(root_path + 1, cifs_sb, vol, NULL,
4789 &xid, &server, &ses, &tcon);
4795 root_path = build_unc_path_to_root(vol, cifs_sb, false);
4796 if (IS_ERR(root_path)) {
4797 rc = PTR_ERR(root_path);
4801 /* Cache out resolved root server */
4802 (void)dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4803 root_path + 1, NULL, NULL);
4805 * Save root tcon for additional DFS requests to update or create a new
4806 * DFS cache entry, or even perform DFS failover.
4808 spin_lock(&cifs_tcp_ses_lock);
4810 tcon->dfs_path = root_path;
4812 tcon->remap = cifs_remap(cifs_sb);
4813 spin_unlock(&cifs_tcp_ses_lock);
4817 for (count = 1; ;) {
4819 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4820 if (!rc || rc != -EREMOTE)
4824 * BB: when we implement proper loop detection,
4825 * we will remove this check. But now we need it
4826 * to prevent an indefinite loop if 'DFS tree' is
4827 * misconfigured (i.e. has loops).
4829 if (count++ > MAX_NESTED_LINKS) {
4835 full_path = build_unc_path_to_root(vol, cifs_sb, true);
4836 if (IS_ERR(full_path)) {
4837 rc = PTR_ERR(full_path);
4842 old_mountdata = cifs_sb->mountdata;
4843 rc = expand_dfs_referral(xid, root_tcon->ses, vol, cifs_sb,
4848 if (cifs_sb->mountdata != old_mountdata) {
4849 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4850 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses,
4854 if (rc == -EACCES || rc == -EOPNOTSUPP)
4856 /* Perform DFS failover to any other DFS targets */
4857 rc = mount_do_dfs_failover(full_path + 1, cifs_sb, vol,
4858 root_tcon->ses, &xid,
4859 &server, &ses, &tcon);
4860 if (rc == -EACCES || rc == -EOPNOTSUPP || !server ||
4865 cifs_put_tcon(root_tcon);
4870 spin_lock(&cifs_tcp_ses_lock);
4871 if (!tcon->dfs_path) {
4872 /* Save full path in new tcon to do failover when reconnecting tcons */
4873 tcon->dfs_path = full_path;
4875 tcon->remap = cifs_remap(cifs_sb);
4877 cifs_sb->origin_fullpath = kstrndup(tcon->dfs_path,
4878 strlen(tcon->dfs_path),
4880 if (!cifs_sb->origin_fullpath) {
4881 spin_unlock(&cifs_tcp_ses_lock);
4885 spin_unlock(&cifs_tcp_ses_lock);
4887 rc = dfs_cache_add_vol(origin_mountdata, vol, cifs_sb->origin_fullpath);
4889 kfree(cifs_sb->origin_fullpath);
4893 * After reconnecting to a different server, unique ids won't
4894 * match anymore, so we disable serverino. This prevents
4895 * dentry revalidation to think the dentry are stale (ESTALE).
4897 cifs_autodisable_serverino(cifs_sb);
4900 return mount_setup_tlink(cifs_sb, ses, tcon);
4905 kfree(origin_mountdata);
4906 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4910 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4914 struct cifs_ses *ses;
4915 struct cifs_tcon *tcon;
4916 struct TCP_Server_Info *server;
4918 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4923 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4932 return mount_setup_tlink(cifs_sb, ses, tcon);
4935 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4941 * Issue a TREE_CONNECT request.
4944 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
4945 const char *tree, struct cifs_tcon *tcon,
4946 const struct nls_table *nls_codepage)
4948 struct smb_hdr *smb_buffer;
4949 struct smb_hdr *smb_buffer_response;
4952 unsigned char *bcc_ptr;
4955 __u16 bytes_left, count;
4960 smb_buffer = cifs_buf_get();
4961 if (smb_buffer == NULL)
4964 smb_buffer_response = smb_buffer;
4966 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
4967 NULL /*no tid */ , 4 /*wct */ );
4969 smb_buffer->Mid = get_next_mid(ses->server);
4970 smb_buffer->Uid = ses->Suid;
4971 pSMB = (TCONX_REQ *) smb_buffer;
4972 pSMBr = (TCONX_RSP *) smb_buffer_response;
4974 pSMB->AndXCommand = 0xFF;
4975 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
4976 bcc_ptr = &pSMB->Password[0];
4977 if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
4978 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
4979 *bcc_ptr = 0; /* password is null byte */
4980 bcc_ptr++; /* skip password */
4981 /* already aligned so no need to do it below */
4983 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
4984 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
4985 specified as required (when that support is added to
4986 the vfs in the future) as only NTLM or the much
4987 weaker LANMAN (which we do not send by default) is accepted
4988 by Samba (not sure whether other servers allow
4989 NTLMv2 password here) */
4990 #ifdef CONFIG_CIFS_WEAK_PW_HASH
4991 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
4992 (ses->sectype == LANMAN))
4993 calc_lanman_hash(tcon->password, ses->server->cryptkey,
4994 ses->server->sec_mode &
4995 SECMODE_PW_ENCRYPT ? true : false,
4998 #endif /* CIFS_WEAK_PW_HASH */
4999 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
5000 bcc_ptr, nls_codepage);
5002 cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
5004 cifs_buf_release(smb_buffer);
5008 bcc_ptr += CIFS_AUTH_RESP_SIZE;
5009 if (ses->capabilities & CAP_UNICODE) {
5010 /* must align unicode strings */
5011 *bcc_ptr = 0; /* null byte password */
5016 if (ses->server->sign)
5017 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
5019 if (ses->capabilities & CAP_STATUS32) {
5020 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
5022 if (ses->capabilities & CAP_DFS) {
5023 smb_buffer->Flags2 |= SMBFLG2_DFS;
5025 if (ses->capabilities & CAP_UNICODE) {
5026 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
5028 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
5029 6 /* max utf8 char length in bytes */ *
5030 (/* server len*/ + 256 /* share len */), nls_codepage);
5031 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
5032 bcc_ptr += 2; /* skip trailing null */
5033 } else { /* ASCII */
5034 strcpy(bcc_ptr, tree);
5035 bcc_ptr += strlen(tree) + 1;
5037 strcpy(bcc_ptr, "?????");
5038 bcc_ptr += strlen("?????");
5040 count = bcc_ptr - &pSMB->Password[0];
5041 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
5042 pSMB->hdr.smb_buf_length) + count);
5043 pSMB->ByteCount = cpu_to_le16(count);
5045 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
5048 /* above now done in SendReceive */
5052 tcon->tidStatus = CifsGood;
5053 tcon->need_reconnect = false;
5054 tcon->tid = smb_buffer_response->Tid;
5055 bcc_ptr = pByteArea(smb_buffer_response);
5056 bytes_left = get_bcc(smb_buffer_response);
5057 length = strnlen(bcc_ptr, bytes_left - 2);
5058 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
5064 /* skip service field (NB: this field is always ASCII) */
5066 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
5067 (bcc_ptr[2] == 'C')) {
5068 cifs_dbg(FYI, "IPC connection\n");
5072 } else if (length == 2) {
5073 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
5074 /* the most common case */
5075 cifs_dbg(FYI, "disk share connection\n");
5078 bcc_ptr += length + 1;
5079 bytes_left -= (length + 1);
5080 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
5082 /* mostly informational -- no need to fail on error here */
5083 kfree(tcon->nativeFileSystem);
5084 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
5085 bytes_left, is_unicode,
5088 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
5090 if ((smb_buffer_response->WordCount == 3) ||
5091 (smb_buffer_response->WordCount == 7))
5092 /* field is in same location */
5093 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
5096 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
5099 cifs_buf_release(smb_buffer);
5103 static void delayed_free(struct rcu_head *p)
5105 struct cifs_sb_info *sbi = container_of(p, struct cifs_sb_info, rcu);
5106 unload_nls(sbi->local_nls);
5111 cifs_umount(struct cifs_sb_info *cifs_sb)
5113 struct rb_root *root = &cifs_sb->tlink_tree;
5114 struct rb_node *node;
5115 struct tcon_link *tlink;
5117 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
5119 spin_lock(&cifs_sb->tlink_tree_lock);
5120 while ((node = rb_first(root))) {
5121 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
5122 cifs_get_tlink(tlink);
5123 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
5124 rb_erase(node, root);
5126 spin_unlock(&cifs_sb->tlink_tree_lock);
5127 cifs_put_tlink(tlink);
5128 spin_lock(&cifs_sb->tlink_tree_lock);
5130 spin_unlock(&cifs_sb->tlink_tree_lock);
5132 kfree(cifs_sb->mountdata);
5133 kfree(cifs_sb->prepath);
5134 #ifdef CONFIG_CIFS_DFS_UPCALL
5135 dfs_cache_del_vol(cifs_sb->origin_fullpath);
5136 kfree(cifs_sb->origin_fullpath);
5138 call_rcu(&cifs_sb->rcu, delayed_free);
5142 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
5145 struct TCP_Server_Info *server = ses->server;
5147 if (!server->ops->need_neg || !server->ops->negotiate)
5150 /* only send once per connect */
5151 if (!server->ops->need_neg(server))
5154 rc = server->ops->negotiate(xid, ses);
5156 spin_lock(&GlobalMid_Lock);
5157 if (server->tcpStatus == CifsNeedNegotiate)
5158 server->tcpStatus = CifsGood;
5161 spin_unlock(&GlobalMid_Lock);
5168 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
5169 struct nls_table *nls_info)
5172 struct TCP_Server_Info *server = ses->server;
5174 ses->capabilities = server->capabilities;
5175 if (linuxExtEnabled == 0)
5176 ses->capabilities &= (~server->vals->cap_unix);
5178 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
5179 server->sec_mode, server->capabilities, server->timeAdj);
5181 if (ses->auth_key.response) {
5182 cifs_dbg(FYI, "Free previous auth_key.response = %p\n",
5183 ses->auth_key.response);
5184 kfree(ses->auth_key.response);
5185 ses->auth_key.response = NULL;
5186 ses->auth_key.len = 0;
5189 if (server->ops->sess_setup)
5190 rc = server->ops->sess_setup(xid, ses, nls_info);
5193 cifs_server_dbg(VFS, "Send error in SessSetup = %d\n", rc);
5199 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
5201 vol->sectype = ses->sectype;
5203 /* krb5 is special, since we don't need username or pw */
5204 if (vol->sectype == Kerberos)
5207 return cifs_set_cifscreds(vol, ses);
5210 static struct cifs_tcon *
5211 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
5214 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
5215 struct cifs_ses *ses;
5216 struct cifs_tcon *tcon = NULL;
5217 struct smb_vol *vol_info;
5219 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
5220 if (vol_info == NULL)
5221 return ERR_PTR(-ENOMEM);
5223 vol_info->local_nls = cifs_sb->local_nls;
5224 vol_info->linux_uid = fsuid;
5225 vol_info->cred_uid = fsuid;
5226 vol_info->UNC = master_tcon->treeName;
5227 vol_info->retry = master_tcon->retry;
5228 vol_info->nocase = master_tcon->nocase;
5229 vol_info->nohandlecache = master_tcon->nohandlecache;
5230 vol_info->local_lease = master_tcon->local_lease;
5231 vol_info->no_linux_ext = !master_tcon->unix_ext;
5232 vol_info->sectype = master_tcon->ses->sectype;
5233 vol_info->sign = master_tcon->ses->sign;
5235 rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
5241 /* get a reference for the same TCP session */
5242 spin_lock(&cifs_tcp_ses_lock);
5243 ++master_tcon->ses->server->srv_count;
5244 spin_unlock(&cifs_tcp_ses_lock);
5246 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
5248 tcon = (struct cifs_tcon *)ses;
5249 cifs_put_tcp_session(master_tcon->ses->server, 0);
5253 tcon = cifs_get_tcon(ses, vol_info);
5255 cifs_put_smb_ses(ses);
5259 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
5260 if (tcon->posix_extensions)
5261 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
5264 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
5267 kfree(vol_info->username);
5268 kzfree(vol_info->password);
5275 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
5277 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
5280 /* find and return a tlink with given uid */
5281 static struct tcon_link *
5282 tlink_rb_search(struct rb_root *root, kuid_t uid)
5284 struct rb_node *node = root->rb_node;
5285 struct tcon_link *tlink;
5288 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
5290 if (uid_gt(tlink->tl_uid, uid))
5291 node = node->rb_left;
5292 else if (uid_lt(tlink->tl_uid, uid))
5293 node = node->rb_right;
5300 /* insert a tcon_link into the tree */
5302 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
5304 struct rb_node **new = &(root->rb_node), *parent = NULL;
5305 struct tcon_link *tlink;
5308 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
5311 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
5312 new = &((*new)->rb_left);
5314 new = &((*new)->rb_right);
5317 rb_link_node(&new_tlink->tl_rbnode, parent, new);
5318 rb_insert_color(&new_tlink->tl_rbnode, root);
5322 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
5325 * If the superblock doesn't refer to a multiuser mount, then just return
5326 * the master tcon for the mount.
5328 * First, search the rbtree for an existing tcon for this fsuid. If one
5329 * exists, then check to see if it's pending construction. If it is then wait
5330 * for construction to complete. Once it's no longer pending, check to see if
5331 * it failed and either return an error or retry construction, depending on
5334 * If one doesn't exist then insert a new tcon_link struct into the tree and
5335 * try to construct a new one.
5338 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
5341 kuid_t fsuid = current_fsuid();
5342 struct tcon_link *tlink, *newtlink;
5344 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
5345 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
5347 spin_lock(&cifs_sb->tlink_tree_lock);
5348 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5350 cifs_get_tlink(tlink);
5351 spin_unlock(&cifs_sb->tlink_tree_lock);
5353 if (tlink == NULL) {
5354 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
5355 if (newtlink == NULL)
5356 return ERR_PTR(-ENOMEM);
5357 newtlink->tl_uid = fsuid;
5358 newtlink->tl_tcon = ERR_PTR(-EACCES);
5359 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
5360 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
5361 cifs_get_tlink(newtlink);
5363 spin_lock(&cifs_sb->tlink_tree_lock);
5364 /* was one inserted after previous search? */
5365 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5367 cifs_get_tlink(tlink);
5368 spin_unlock(&cifs_sb->tlink_tree_lock);
5370 goto wait_for_construction;
5373 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
5374 spin_unlock(&cifs_sb->tlink_tree_lock);
5376 wait_for_construction:
5377 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
5378 TASK_INTERRUPTIBLE);
5380 cifs_put_tlink(tlink);
5381 return ERR_PTR(-ERESTARTSYS);
5384 /* if it's good, return it */
5385 if (!IS_ERR(tlink->tl_tcon))
5388 /* return error if we tried this already recently */
5389 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
5390 cifs_put_tlink(tlink);
5391 return ERR_PTR(-EACCES);
5394 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
5395 goto wait_for_construction;
5398 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
5399 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
5400 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
5402 if (IS_ERR(tlink->tl_tcon)) {
5403 cifs_put_tlink(tlink);
5404 return ERR_PTR(-EACCES);
5411 * periodic workqueue job that scans tcon_tree for a superblock and closes
5415 cifs_prune_tlinks(struct work_struct *work)
5417 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
5419 struct rb_root *root = &cifs_sb->tlink_tree;
5420 struct rb_node *node;
5421 struct rb_node *tmp;
5422 struct tcon_link *tlink;
5425 * Because we drop the spinlock in the loop in order to put the tlink
5426 * it's not guarded against removal of links from the tree. The only
5427 * places that remove entries from the tree are this function and
5428 * umounts. Because this function is non-reentrant and is canceled
5429 * before umount can proceed, this is safe.
5431 spin_lock(&cifs_sb->tlink_tree_lock);
5432 node = rb_first(root);
5433 while (node != NULL) {
5435 node = rb_next(tmp);
5436 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
5438 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
5439 atomic_read(&tlink->tl_count) != 0 ||
5440 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
5443 cifs_get_tlink(tlink);
5444 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
5445 rb_erase(tmp, root);
5447 spin_unlock(&cifs_sb->tlink_tree_lock);
5448 cifs_put_tlink(tlink);
5449 spin_lock(&cifs_sb->tlink_tree_lock);
5451 spin_unlock(&cifs_sb->tlink_tree_lock);
5453 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,