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 spin_lock(&cifs_tcp_ses_lock);
375 rc = cifs_convert_address((struct sockaddr *)&server->dstaddr, ipaddr,
377 spin_unlock(&cifs_tcp_ses_lock);
383 static inline int reconn_set_ipaddr(struct TCP_Server_Info *server)
389 #ifdef CONFIG_CIFS_DFS_UPCALL
390 struct super_cb_data {
391 struct TCP_Server_Info *server;
392 struct super_block *sb;
395 /* These functions must be called with server->srv_mutex held */
397 static void super_cb(struct super_block *sb, void *arg)
399 struct super_cb_data *d = arg;
400 struct cifs_sb_info *cifs_sb;
401 struct cifs_tcon *tcon;
406 cifs_sb = CIFS_SB(sb);
407 tcon = cifs_sb_master_tcon(cifs_sb);
408 if (tcon->ses->server == d->server)
412 static struct super_block *get_tcp_super(struct TCP_Server_Info *server)
414 struct super_cb_data d = {
419 iterate_supers_type(&cifs_fs_type, super_cb, &d);
422 return ERR_PTR(-ENOENT);
424 * Grab an active reference in order to prevent automounts (DFS links)
425 * of expiring and then freeing up our cifs superblock pointer while
426 * we're doing failover.
428 cifs_sb_active(d.sb);
432 static inline void put_tcp_super(struct super_block *sb)
434 if (!IS_ERR_OR_NULL(sb))
435 cifs_sb_deactive(sb);
438 static void reconn_inval_dfs_target(struct TCP_Server_Info *server,
439 struct cifs_sb_info *cifs_sb,
440 struct dfs_cache_tgt_list *tgt_list,
441 struct dfs_cache_tgt_iterator **tgt_it)
445 if (!cifs_sb || !cifs_sb->origin_fullpath || !tgt_list ||
450 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
452 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
454 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
457 cifs_dbg(FYI, "%s: UNC: %s\n", __func__, cifs_sb->origin_fullpath);
459 name = dfs_cache_get_tgt_name(*tgt_it);
461 kfree(server->hostname);
463 server->hostname = extract_hostname(name);
464 if (IS_ERR(server->hostname)) {
466 "%s: failed to extract hostname from target: %ld\n",
467 __func__, PTR_ERR(server->hostname));
471 static inline int reconn_setup_dfs_targets(struct cifs_sb_info *cifs_sb,
472 struct dfs_cache_tgt_list *tl,
473 struct dfs_cache_tgt_iterator **it)
475 if (!cifs_sb->origin_fullpath)
477 return dfs_cache_noreq_find(cifs_sb->origin_fullpath + 1, NULL, tl);
482 * cifs tcp session reconnection
484 * mark tcp session as reconnecting so temporarily locked
485 * mark all smb sessions as reconnecting for tcp session
486 * reconnect tcp session
487 * wake up waiters on reconnection? - (not needed currently)
490 cifs_reconnect(struct TCP_Server_Info *server)
493 struct list_head *tmp, *tmp2;
494 struct cifs_ses *ses;
495 struct cifs_tcon *tcon;
496 struct mid_q_entry *mid_entry;
497 struct list_head retry_list;
498 #ifdef CONFIG_CIFS_DFS_UPCALL
499 struct super_block *sb = NULL;
500 struct cifs_sb_info *cifs_sb = NULL;
501 struct dfs_cache_tgt_list tgt_list = {0};
502 struct dfs_cache_tgt_iterator *tgt_it = NULL;
505 spin_lock(&GlobalMid_Lock);
506 server->nr_targets = 1;
507 #ifdef CONFIG_CIFS_DFS_UPCALL
508 spin_unlock(&GlobalMid_Lock);
509 sb = get_tcp_super(server);
512 cifs_dbg(FYI, "%s: will not do DFS failover: rc = %d\n",
516 cifs_sb = CIFS_SB(sb);
518 rc = reconn_setup_dfs_targets(cifs_sb, &tgt_list, &tgt_it);
519 if (rc && (rc != -EOPNOTSUPP)) {
520 cifs_server_dbg(VFS, "%s: no target servers for DFS failover\n",
523 server->nr_targets = dfs_cache_get_nr_tgts(&tgt_list);
526 cifs_dbg(FYI, "%s: will retry %d target(s)\n", __func__,
528 spin_lock(&GlobalMid_Lock);
530 if (server->tcpStatus == CifsExiting) {
531 /* the demux thread will exit normally
532 next time through the loop */
533 spin_unlock(&GlobalMid_Lock);
534 #ifdef CONFIG_CIFS_DFS_UPCALL
535 dfs_cache_free_tgts(&tgt_list);
540 server->tcpStatus = CifsNeedReconnect;
541 spin_unlock(&GlobalMid_Lock);
543 server->max_read = 0;
545 cifs_dbg(FYI, "Mark tcp session as need reconnect\n");
546 trace_smb3_reconnect(server->CurrentMid, server->hostname);
548 /* before reconnecting the tcp session, mark the smb session (uid)
549 and the tid bad so they are not used until reconnected */
550 cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
552 spin_lock(&cifs_tcp_ses_lock);
553 list_for_each(tmp, &server->smb_ses_list) {
554 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
555 ses->need_reconnect = true;
556 list_for_each(tmp2, &ses->tcon_list) {
557 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
558 tcon->need_reconnect = true;
561 ses->tcon_ipc->need_reconnect = true;
563 spin_unlock(&cifs_tcp_ses_lock);
565 /* do not want to be sending data on a socket we are freeing */
566 cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
567 mutex_lock(&server->srv_mutex);
568 if (server->ssocket) {
569 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
570 server->ssocket->state, server->ssocket->flags);
571 kernel_sock_shutdown(server->ssocket, SHUT_WR);
572 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
573 server->ssocket->state, server->ssocket->flags);
574 sock_release(server->ssocket);
575 server->ssocket = NULL;
577 server->sequence_number = 0;
578 server->session_estab = false;
579 kfree(server->session_key.response);
580 server->session_key.response = NULL;
581 server->session_key.len = 0;
582 server->lstrp = jiffies;
584 /* mark submitted MIDs for retry and issue callback */
585 INIT_LIST_HEAD(&retry_list);
586 cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
587 spin_lock(&GlobalMid_Lock);
588 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
589 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
590 kref_get(&mid_entry->refcount);
591 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
592 mid_entry->mid_state = MID_RETRY_NEEDED;
593 list_move(&mid_entry->qhead, &retry_list);
594 mid_entry->mid_flags |= MID_DELETED;
596 spin_unlock(&GlobalMid_Lock);
597 mutex_unlock(&server->srv_mutex);
599 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
600 list_for_each_safe(tmp, tmp2, &retry_list) {
601 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
602 list_del_init(&mid_entry->qhead);
603 mid_entry->callback(mid_entry);
604 cifs_mid_q_entry_release(mid_entry);
607 if (cifs_rdma_enabled(server)) {
608 mutex_lock(&server->srv_mutex);
609 smbd_destroy(server);
610 mutex_unlock(&server->srv_mutex);
616 mutex_lock(&server->srv_mutex);
618 * Set up next DFS target server (if any) for reconnect. If DFS
619 * feature is disabled, then we will retry last server we
620 * connected to before.
622 if (cifs_rdma_enabled(server))
623 rc = smbd_reconnect(server);
625 rc = generic_ip_connect(server);
627 cifs_dbg(FYI, "reconnect error %d\n", rc);
628 #ifdef CONFIG_CIFS_DFS_UPCALL
629 reconn_inval_dfs_target(server, cifs_sb, &tgt_list,
632 rc = reconn_set_ipaddr(server);
634 cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
637 mutex_unlock(&server->srv_mutex);
640 atomic_inc(&tcpSesReconnectCount);
641 set_credits(server, 1);
642 spin_lock(&GlobalMid_Lock);
643 if (server->tcpStatus != CifsExiting)
644 server->tcpStatus = CifsNeedNegotiate;
645 spin_unlock(&GlobalMid_Lock);
646 mutex_unlock(&server->srv_mutex);
648 } while (server->tcpStatus == CifsNeedReconnect);
650 #ifdef CONFIG_CIFS_DFS_UPCALL
652 rc = dfs_cache_noreq_update_tgthint(cifs_sb->origin_fullpath + 1,
655 cifs_server_dbg(VFS, "%s: failed to update DFS target hint: rc = %d\n",
658 rc = dfs_cache_update_vol(cifs_sb->origin_fullpath, server);
660 cifs_server_dbg(VFS, "%s: failed to update vol info in DFS cache: rc = %d\n",
663 dfs_cache_free_tgts(&tgt_list);
669 if (server->tcpStatus == CifsNeedNegotiate)
670 mod_delayed_work(cifsiod_wq, &server->echo, 0);
676 cifs_echo_request(struct work_struct *work)
679 struct TCP_Server_Info *server = container_of(work,
680 struct TCP_Server_Info, echo.work);
681 unsigned long echo_interval;
684 * If we need to renegotiate, set echo interval to zero to
685 * immediately call echo service where we can renegotiate.
687 if (server->tcpStatus == CifsNeedNegotiate)
690 echo_interval = server->echo_interval;
693 * We cannot send an echo if it is disabled.
694 * Also, no need to ping if we got a response recently.
697 if (server->tcpStatus == CifsNeedReconnect ||
698 server->tcpStatus == CifsExiting ||
699 server->tcpStatus == CifsNew ||
700 (server->ops->can_echo && !server->ops->can_echo(server)) ||
701 time_before(jiffies, server->lstrp + echo_interval - HZ))
704 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
706 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
710 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
714 allocate_buffers(struct TCP_Server_Info *server)
716 if (!server->bigbuf) {
717 server->bigbuf = (char *)cifs_buf_get();
718 if (!server->bigbuf) {
719 cifs_server_dbg(VFS, "No memory for large SMB response\n");
721 /* retry will check if exiting */
724 } else if (server->large_buf) {
725 /* we are reusing a dirty large buf, clear its start */
726 memset(server->bigbuf, 0, HEADER_SIZE(server));
729 if (!server->smallbuf) {
730 server->smallbuf = (char *)cifs_small_buf_get();
731 if (!server->smallbuf) {
732 cifs_server_dbg(VFS, "No memory for SMB response\n");
734 /* retry will check if exiting */
737 /* beginning of smb buffer is cleared in our buf_get */
739 /* if existing small buf clear beginning */
740 memset(server->smallbuf, 0, HEADER_SIZE(server));
747 server_unresponsive(struct TCP_Server_Info *server)
750 * We need to wait 3 echo intervals to make sure we handle such
752 * 1s client sends a normal SMB request
753 * 2s client gets a response
754 * 30s echo workqueue job pops, and decides we got a response recently
755 * and don't need to send another
757 * 65s kernel_recvmsg times out, and we see that we haven't gotten
758 * a response in >60s.
760 if ((server->tcpStatus == CifsGood ||
761 server->tcpStatus == CifsNeedNegotiate) &&
762 time_after(jiffies, server->lstrp + 3 * server->echo_interval)) {
763 cifs_server_dbg(VFS, "has not responded in %lu seconds. Reconnecting...\n",
764 (3 * server->echo_interval) / HZ);
765 cifs_reconnect(server);
766 wake_up(&server->response_q);
774 zero_credits(struct TCP_Server_Info *server)
778 spin_lock(&server->req_lock);
779 val = server->credits + server->echo_credits + server->oplock_credits;
780 if (server->in_flight == 0 && val == 0) {
781 spin_unlock(&server->req_lock);
784 spin_unlock(&server->req_lock);
789 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
794 smb_msg->msg_control = NULL;
795 smb_msg->msg_controllen = 0;
797 for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
800 /* reconnect if no credits and no requests in flight */
801 if (zero_credits(server)) {
802 cifs_reconnect(server);
803 return -ECONNABORTED;
806 if (server_unresponsive(server))
807 return -ECONNABORTED;
808 if (cifs_rdma_enabled(server) && server->smbd_conn)
809 length = smbd_recv(server->smbd_conn, smb_msg);
811 length = sock_recvmsg(server->ssocket, smb_msg, 0);
813 if (server->tcpStatus == CifsExiting)
816 if (server->tcpStatus == CifsNeedReconnect) {
817 cifs_reconnect(server);
818 return -ECONNABORTED;
821 if (length == -ERESTARTSYS ||
825 * Minimum sleep to prevent looping, allowing socket
826 * to clear and app threads to set tcpStatus
827 * CifsNeedReconnect if server hung.
829 usleep_range(1000, 2000);
835 cifs_dbg(FYI, "Received no data or error: %d\n", length);
836 cifs_reconnect(server);
837 return -ECONNABORTED;
844 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
845 unsigned int to_read)
847 struct msghdr smb_msg;
848 struct kvec iov = {.iov_base = buf, .iov_len = to_read};
849 iov_iter_kvec(&smb_msg.msg_iter, READ, &iov, 1, to_read);
851 return cifs_readv_from_socket(server, &smb_msg);
855 cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
856 unsigned int page_offset, unsigned int to_read)
858 struct msghdr smb_msg;
859 struct bio_vec bv = {
860 .bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
861 iov_iter_bvec(&smb_msg.msg_iter, READ, &bv, 1, to_read);
862 return cifs_readv_from_socket(server, &smb_msg);
866 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
869 * The first byte big endian of the length field,
870 * is actually not part of the length but the type
871 * with the most common, zero, as regular data.
874 case RFC1002_SESSION_MESSAGE:
875 /* Regular SMB response */
877 case RFC1002_SESSION_KEEP_ALIVE:
878 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
880 case RFC1002_POSITIVE_SESSION_RESPONSE:
881 cifs_dbg(FYI, "RFC 1002 positive session response\n");
883 case RFC1002_NEGATIVE_SESSION_RESPONSE:
885 * We get this from Windows 98 instead of an error on
886 * SMB negprot response.
888 cifs_dbg(FYI, "RFC 1002 negative session response\n");
889 /* give server a second to clean up */
892 * Always try 445 first on reconnect since we get NACK
893 * on some if we ever connected to port 139 (the NACK
894 * is since we do not begin with RFC1001 session
897 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
898 cifs_reconnect(server);
899 wake_up(&server->response_q);
902 cifs_server_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
903 cifs_reconnect(server);
910 dequeue_mid(struct mid_q_entry *mid, bool malformed)
912 #ifdef CONFIG_CIFS_STATS2
913 mid->when_received = jiffies;
915 spin_lock(&GlobalMid_Lock);
917 mid->mid_state = MID_RESPONSE_RECEIVED;
919 mid->mid_state = MID_RESPONSE_MALFORMED;
921 * Trying to handle/dequeue a mid after the send_recv()
922 * function has finished processing it is a bug.
924 if (mid->mid_flags & MID_DELETED)
925 printk_once(KERN_WARNING
926 "trying to dequeue a deleted mid\n");
928 list_del_init(&mid->qhead);
929 mid->mid_flags |= MID_DELETED;
931 spin_unlock(&GlobalMid_Lock);
935 smb2_get_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
937 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
940 * SMB1 does not use credits.
942 if (server->vals->header_preamble_size)
945 return le16_to_cpu(shdr->CreditRequest);
949 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
950 char *buf, int malformed)
952 if (server->ops->check_trans2 &&
953 server->ops->check_trans2(mid, server, buf, malformed))
955 mid->credits_received = smb2_get_credits_from_hdr(buf, server);
957 mid->large_buf = server->large_buf;
958 /* Was previous buf put in mpx struct for multi-rsp? */
959 if (!mid->multiRsp) {
960 /* smb buffer will be freed by user thread */
961 if (server->large_buf)
962 server->bigbuf = NULL;
964 server->smallbuf = NULL;
966 dequeue_mid(mid, malformed);
969 static void clean_demultiplex_info(struct TCP_Server_Info *server)
973 /* take it off the list, if it's not already */
974 spin_lock(&cifs_tcp_ses_lock);
975 list_del_init(&server->tcp_ses_list);
976 spin_unlock(&cifs_tcp_ses_lock);
978 spin_lock(&GlobalMid_Lock);
979 server->tcpStatus = CifsExiting;
980 spin_unlock(&GlobalMid_Lock);
981 wake_up_all(&server->response_q);
983 /* check if we have blocked requests that need to free */
984 spin_lock(&server->req_lock);
985 if (server->credits <= 0)
987 spin_unlock(&server->req_lock);
989 * Although there should not be any requests blocked on this queue it
990 * can not hurt to be paranoid and try to wake up requests that may
991 * haven been blocked when more than 50 at time were on the wire to the
992 * same server - they now will see the session is in exit state and get
993 * out of SendReceive.
995 wake_up_all(&server->request_q);
996 /* give those requests time to exit */
998 if (cifs_rdma_enabled(server))
999 smbd_destroy(server);
1000 if (server->ssocket) {
1001 sock_release(server->ssocket);
1002 server->ssocket = NULL;
1005 if (!list_empty(&server->pending_mid_q)) {
1006 struct list_head dispose_list;
1007 struct mid_q_entry *mid_entry;
1008 struct list_head *tmp, *tmp2;
1010 INIT_LIST_HEAD(&dispose_list);
1011 spin_lock(&GlobalMid_Lock);
1012 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
1013 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
1014 cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
1015 kref_get(&mid_entry->refcount);
1016 mid_entry->mid_state = MID_SHUTDOWN;
1017 list_move(&mid_entry->qhead, &dispose_list);
1018 mid_entry->mid_flags |= MID_DELETED;
1020 spin_unlock(&GlobalMid_Lock);
1022 /* now walk dispose list and issue callbacks */
1023 list_for_each_safe(tmp, tmp2, &dispose_list) {
1024 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
1025 cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
1026 list_del_init(&mid_entry->qhead);
1027 mid_entry->callback(mid_entry);
1028 cifs_mid_q_entry_release(mid_entry);
1030 /* 1/8th of sec is more than enough time for them to exit */
1034 if (!list_empty(&server->pending_mid_q)) {
1036 * mpx threads have not exited yet give them at least the smb
1037 * send timeout time for long ops.
1039 * Due to delays on oplock break requests, we need to wait at
1040 * least 45 seconds before giving up on a request getting a
1041 * response and going ahead and killing cifsd.
1043 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
1046 * If threads still have not exited they are probably never
1047 * coming home not much else we can do but free the memory.
1051 kfree(server->hostname);
1054 length = atomic_dec_return(&tcpSesAllocCount);
1056 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
1060 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1063 char *buf = server->smallbuf;
1064 unsigned int pdu_length = server->pdu_size;
1066 /* make sure this will fit in a large buffer */
1067 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
1068 server->vals->header_preamble_size) {
1069 cifs_server_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
1070 cifs_reconnect(server);
1071 wake_up(&server->response_q);
1072 return -ECONNABORTED;
1075 /* switch to large buffer if too big for a small one */
1076 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
1077 server->large_buf = true;
1078 memcpy(server->bigbuf, buf, server->total_read);
1079 buf = server->bigbuf;
1082 /* now read the rest */
1083 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
1084 pdu_length - HEADER_SIZE(server) + 1
1085 + server->vals->header_preamble_size);
1089 server->total_read += length;
1091 dump_smb(buf, server->total_read);
1093 return cifs_handle_standard(server, mid);
1097 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1099 char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
1103 * We know that we received enough to get to the MID as we
1104 * checked the pdu_length earlier. Now check to see
1105 * if the rest of the header is OK. We borrow the length
1106 * var for the rest of the loop to avoid a new stack var.
1108 * 48 bytes is enough to display the header and a little bit
1109 * into the payload for debugging purposes.
1111 length = server->ops->check_message(buf, server->total_read, server);
1113 cifs_dump_mem("Bad SMB: ", buf,
1114 min_t(unsigned int, server->total_read, 48));
1116 if (server->ops->is_session_expired &&
1117 server->ops->is_session_expired(buf)) {
1118 cifs_reconnect(server);
1119 wake_up(&server->response_q);
1123 if (server->ops->is_status_pending &&
1124 server->ops->is_status_pending(buf, server))
1130 handle_mid(mid, server, buf, length);
1135 smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
1137 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
1140 * SMB1 does not use credits.
1142 if (server->vals->header_preamble_size)
1145 if (shdr->CreditRequest) {
1146 spin_lock(&server->req_lock);
1147 server->credits += le16_to_cpu(shdr->CreditRequest);
1148 spin_unlock(&server->req_lock);
1149 wake_up(&server->request_q);
1155 cifs_demultiplex_thread(void *p)
1157 int i, num_mids, length;
1158 struct TCP_Server_Info *server = p;
1159 unsigned int pdu_length;
1160 unsigned int next_offset;
1162 struct task_struct *task_to_wake = NULL;
1163 struct mid_q_entry *mids[MAX_COMPOUND];
1164 char *bufs[MAX_COMPOUND];
1166 current->flags |= PF_MEMALLOC;
1167 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
1169 length = atomic_inc_return(&tcpSesAllocCount);
1171 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
1174 allow_kernel_signal(SIGKILL);
1175 while (server->tcpStatus != CifsExiting) {
1176 if (try_to_freeze())
1179 if (!allocate_buffers(server))
1182 server->large_buf = false;
1183 buf = server->smallbuf;
1184 pdu_length = 4; /* enough to get RFC1001 header */
1186 length = cifs_read_from_socket(server, buf, pdu_length);
1190 if (server->vals->header_preamble_size == 0)
1191 server->total_read = 0;
1193 server->total_read = length;
1196 * The right amount was read from socket - 4 bytes,
1197 * so we can now interpret the length field.
1199 pdu_length = get_rfc1002_length(buf);
1201 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
1202 if (!is_smb_response(server, buf[0]))
1205 server->pdu_size = pdu_length;
1207 /* make sure we have enough to get to the MID */
1208 if (server->pdu_size < HEADER_SIZE(server) - 1 -
1209 server->vals->header_preamble_size) {
1210 cifs_server_dbg(VFS, "SMB response too short (%u bytes)\n",
1212 cifs_reconnect(server);
1213 wake_up(&server->response_q);
1217 /* read down to the MID */
1218 length = cifs_read_from_socket(server,
1219 buf + server->vals->header_preamble_size,
1220 HEADER_SIZE(server) - 1
1221 - server->vals->header_preamble_size);
1224 server->total_read += length;
1226 if (server->ops->next_header) {
1227 next_offset = server->ops->next_header(buf);
1229 server->pdu_size = next_offset;
1232 memset(mids, 0, sizeof(mids));
1233 memset(bufs, 0, sizeof(bufs));
1236 if (server->ops->is_transform_hdr &&
1237 server->ops->receive_transform &&
1238 server->ops->is_transform_hdr(buf)) {
1239 length = server->ops->receive_transform(server,
1244 mids[0] = server->ops->find_mid(server, buf);
1248 if (!mids[0] || !mids[0]->receive)
1249 length = standard_receive3(server, mids[0]);
1251 length = mids[0]->receive(server, mids[0]);
1255 for (i = 0; i < num_mids; i++)
1257 cifs_mid_q_entry_release(mids[i]);
1261 server->lstrp = jiffies;
1263 for (i = 0; i < num_mids; i++) {
1264 if (mids[i] != NULL) {
1265 mids[i]->resp_buf_size = server->pdu_size;
1267 if (!mids[i]->multiRsp || mids[i]->multiEnd)
1268 mids[i]->callback(mids[i]);
1270 cifs_mid_q_entry_release(mids[i]);
1271 } else if (server->ops->is_oplock_break &&
1272 server->ops->is_oplock_break(bufs[i],
1274 smb2_add_credits_from_hdr(bufs[i], server);
1275 cifs_dbg(FYI, "Received oplock break\n");
1277 cifs_server_dbg(VFS, "No task to wake, unknown frame "
1278 "received! NumMids %d\n",
1279 atomic_read(&midCount));
1280 cifs_dump_mem("Received Data is: ", bufs[i],
1281 HEADER_SIZE(server));
1282 smb2_add_credits_from_hdr(bufs[i], server);
1283 #ifdef CONFIG_CIFS_DEBUG2
1284 if (server->ops->dump_detail)
1285 server->ops->dump_detail(bufs[i],
1287 cifs_dump_mids(server);
1288 #endif /* CIFS_DEBUG2 */
1292 if (pdu_length > server->pdu_size) {
1293 if (!allocate_buffers(server))
1295 pdu_length -= server->pdu_size;
1296 server->total_read = 0;
1297 server->large_buf = false;
1298 buf = server->smallbuf;
1301 } /* end while !EXITING */
1303 /* buffer usually freed in free_mid - need to free it here on exit */
1304 cifs_buf_release(server->bigbuf);
1305 if (server->smallbuf) /* no sense logging a debug message if NULL */
1306 cifs_small_buf_release(server->smallbuf);
1308 task_to_wake = xchg(&server->tsk, NULL);
1309 clean_demultiplex_info(server);
1311 /* if server->tsk was NULL then wait for a signal before exiting */
1312 if (!task_to_wake) {
1313 set_current_state(TASK_INTERRUPTIBLE);
1314 while (!signal_pending(current)) {
1316 set_current_state(TASK_INTERRUPTIBLE);
1318 set_current_state(TASK_RUNNING);
1321 module_put_and_exit(0);
1324 /* extract the host portion of the UNC string */
1326 extract_hostname(const char *unc)
1332 /* skip double chars at beginning of string */
1333 /* BB: check validity of these bytes? */
1334 if (strlen(unc) < 3)
1335 return ERR_PTR(-EINVAL);
1336 for (src = unc; *src && *src == '\\'; src++)
1339 return ERR_PTR(-EINVAL);
1341 /* delimiter between hostname and sharename is always '\\' now */
1342 delim = strchr(src, '\\');
1344 return ERR_PTR(-EINVAL);
1347 dst = kmalloc((len + 1), GFP_KERNEL);
1349 return ERR_PTR(-ENOMEM);
1351 memcpy(dst, src, len);
1357 static int get_option_ul(substring_t args[], unsigned long *option)
1362 string = match_strdup(args);
1365 rc = kstrtoul(string, 0, option);
1371 static int get_option_uid(substring_t args[], kuid_t *result)
1373 unsigned long value;
1377 rc = get_option_ul(args, &value);
1381 uid = make_kuid(current_user_ns(), value);
1382 if (!uid_valid(uid))
1389 static int get_option_gid(substring_t args[], kgid_t *result)
1391 unsigned long value;
1395 rc = get_option_ul(args, &value);
1399 gid = make_kgid(current_user_ns(), value);
1400 if (!gid_valid(gid))
1407 static int cifs_parse_security_flavors(char *value,
1408 struct smb_vol *vol)
1411 substring_t args[MAX_OPT_ARGS];
1414 * With mount options, the last one should win. Reset any existing
1415 * settings back to default.
1417 vol->sectype = Unspecified;
1420 switch (match_token(value, cifs_secflavor_tokens, args)) {
1422 cifs_dbg(VFS, "sec=krb5p is not supported!\n");
1428 vol->sectype = Kerberos;
1430 case Opt_sec_ntlmsspi:
1433 case Opt_sec_ntlmssp:
1434 vol->sectype = RawNTLMSSP;
1440 vol->sectype = NTLM;
1442 case Opt_sec_ntlmv2i:
1445 case Opt_sec_ntlmv2:
1446 vol->sectype = NTLMv2;
1448 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1449 case Opt_sec_lanman:
1450 vol->sectype = LANMAN;
1457 cifs_dbg(VFS, "bad security option: %s\n", value);
1465 cifs_parse_cache_flavor(char *value, struct smb_vol *vol)
1467 substring_t args[MAX_OPT_ARGS];
1469 switch (match_token(value, cifs_cacheflavor_tokens, args)) {
1470 case Opt_cache_loose:
1471 vol->direct_io = false;
1472 vol->strict_io = false;
1473 vol->cache_ro = false;
1474 vol->cache_rw = false;
1476 case Opt_cache_strict:
1477 vol->direct_io = false;
1478 vol->strict_io = true;
1479 vol->cache_ro = false;
1480 vol->cache_rw = false;
1482 case Opt_cache_none:
1483 vol->direct_io = true;
1484 vol->strict_io = false;
1485 vol->cache_ro = false;
1486 vol->cache_rw = false;
1489 vol->direct_io = false;
1490 vol->strict_io = false;
1491 vol->cache_ro = true;
1492 vol->cache_rw = false;
1495 vol->direct_io = false;
1496 vol->strict_io = false;
1497 vol->cache_ro = false;
1498 vol->cache_rw = true;
1501 cifs_dbg(VFS, "bad cache= option: %s\n", value);
1508 cifs_parse_smb_version(char *value, struct smb_vol *vol, bool is_smb3)
1510 substring_t args[MAX_OPT_ARGS];
1512 switch (match_token(value, cifs_smb_version_tokens, args)) {
1513 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1515 if (disable_legacy_dialects) {
1516 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1520 cifs_dbg(VFS, "vers=1.0 (cifs) not permitted when mounting with smb3\n");
1523 vol->ops = &smb1_operations;
1524 vol->vals = &smb1_values;
1527 if (disable_legacy_dialects) {
1528 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1532 cifs_dbg(VFS, "vers=2.0 not permitted when mounting with smb3\n");
1535 vol->ops = &smb20_operations;
1536 vol->vals = &smb20_values;
1540 cifs_dbg(VFS, "vers=1.0 (cifs) mount not permitted when legacy dialects disabled\n");
1543 cifs_dbg(VFS, "vers=2.0 mount not permitted when legacy dialects disabled\n");
1545 #endif /* CIFS_ALLOW_INSECURE_LEGACY */
1547 vol->ops = &smb21_operations;
1548 vol->vals = &smb21_values;
1551 vol->ops = &smb30_operations;
1552 vol->vals = &smb30_values;
1555 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1556 vol->vals = &smb302_values;
1559 vol->ops = &smb311_operations;
1560 vol->vals = &smb311_values;
1563 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1564 vol->vals = &smb3any_values;
1567 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1568 vol->vals = &smbdefault_values;
1571 cifs_dbg(VFS, "Unknown vers= option specified: %s\n", value);
1578 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1579 * fields with the result. Returns 0 on success and an error otherwise.
1582 cifs_parse_devname(const char *devname, struct smb_vol *vol)
1585 const char *delims = "/\\";
1588 if (unlikely(!devname || !*devname)) {
1589 cifs_dbg(VFS, "Device name not specified.\n");
1593 /* make sure we have a valid UNC double delimiter prefix */
1594 len = strspn(devname, delims);
1598 /* find delimiter between host and sharename */
1599 pos = strpbrk(devname + 2, delims);
1603 /* skip past delimiter */
1606 /* now go until next delimiter or end of string */
1607 len = strcspn(pos, delims);
1609 /* move "pos" up to delimiter or NULL */
1611 vol->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
1615 convert_delimiter(vol->UNC, '\\');
1617 /* skip any delimiter */
1618 if (*pos == '/' || *pos == '\\')
1621 /* If pos is NULL then no prepath */
1625 vol->prepath = kstrdup(pos, GFP_KERNEL);
1633 cifs_parse_mount_options(const char *mountdata, const char *devname,
1634 struct smb_vol *vol, bool is_smb3)
1637 char *mountdata_copy = NULL, *options;
1638 unsigned int temp_len, i, j;
1640 short int override_uid = -1;
1641 short int override_gid = -1;
1642 bool uid_specified = false;
1643 bool gid_specified = false;
1644 bool sloppy = false;
1645 char *invalid = NULL;
1646 char *nodename = utsname()->nodename;
1647 char *string = NULL;
1648 char *tmp_end, *value;
1650 bool got_ip = false;
1651 bool got_version = false;
1652 unsigned short port = 0;
1653 struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1657 delim = separator[0];
1659 /* ensure we always start with zeroed-out smb_vol */
1660 memset(vol, 0, sizeof(*vol));
1663 * does not have to be perfect mapping since field is
1664 * informational, only used for servers that do not support
1665 * port 445 and it can be overridden at mount time
1667 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1668 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1669 vol->source_rfc1001_name[i] = toupper(nodename[i]);
1671 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1672 /* null target name indicates to use *SMBSERVR default called name
1673 if we end up sending RFC1001 session initialize */
1674 vol->target_rfc1001_name[0] = 0;
1675 vol->cred_uid = current_uid();
1676 vol->linux_uid = current_uid();
1677 vol->linux_gid = current_gid();
1678 vol->bsize = 1024 * 1024; /* can improve cp performance significantly */
1680 * default to SFM style remapping of seven reserved characters
1681 * unless user overrides it or we negotiate CIFS POSIX where
1682 * it is unnecessary. Can not simultaneously use more than one mapping
1683 * since then readdir could list files that open could not open
1687 /* default to only allowing write access to owner of the mount */
1688 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1690 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1691 /* default is always to request posix paths. */
1692 vol->posix_paths = 1;
1693 /* default to using server inode numbers where available */
1694 vol->server_ino = 1;
1696 /* default is to use strict cifs caching semantics */
1697 vol->strict_io = true;
1699 vol->actimeo = CIFS_DEF_ACTIMEO;
1701 /* Most clients set timeout to 0, allows server to use its default */
1702 vol->handle_timeout = 0; /* See MS-SMB2 spec section 2.2.14.2.12 */
1704 /* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1705 vol->ops = &smb30_operations;
1706 vol->vals = &smbdefault_values;
1708 vol->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1711 goto cifs_parse_mount_err;
1713 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1714 if (!mountdata_copy)
1715 goto cifs_parse_mount_err;
1717 options = mountdata_copy;
1718 end = options + strlen(options);
1720 if (strncmp(options, "sep=", 4) == 0) {
1721 if (options[4] != 0) {
1722 separator[0] = options[4];
1725 cifs_dbg(FYI, "Null separator not allowed\n");
1728 vol->backupuid_specified = false; /* no backup intent for a user */
1729 vol->backupgid_specified = false; /* no backup intent for a group */
1731 switch (cifs_parse_devname(devname, vol)) {
1735 cifs_dbg(VFS, "Unable to allocate memory for devname.\n");
1736 goto cifs_parse_mount_err;
1738 cifs_dbg(VFS, "Malformed UNC in devname.\n");
1739 goto cifs_parse_mount_err;
1741 cifs_dbg(VFS, "Unknown error parsing devname.\n");
1742 goto cifs_parse_mount_err;
1745 while ((data = strsep(&options, separator)) != NULL) {
1746 substring_t args[MAX_OPT_ARGS];
1747 unsigned long option;
1753 token = match_token(data, cifs_mount_option_tokens, args);
1757 /* Ingnore the following */
1761 /* Boolean values */
1762 case Opt_user_xattr:
1765 case Opt_nouser_xattr:
1771 case Opt_noforceuid:
1777 case Opt_noforcegid:
1780 case Opt_noblocksend:
1781 vol->noblocksnd = 1;
1783 case Opt_noautotune:
1784 vol->noautotune = 1;
1802 vol->sfu_remap = true;
1803 vol->remap = false; /* disable SFM mapping */
1805 case Opt_nomapchars:
1806 vol->sfu_remap = false;
1810 vol->sfu_remap = false; /* disable SFU mapping */
1812 case Opt_nomapposix:
1825 #ifdef CONFIG_CIFS_ROOT
1829 case Opt_posixpaths:
1830 vol->posix_paths = 1;
1832 case Opt_noposixpaths:
1833 vol->posix_paths = 0;
1838 "conflicting unix mount options\n");
1839 vol->no_linux_ext = 1;
1842 if (vol->no_linux_ext)
1844 "conflicting unix mount options\n");
1856 * turn off mandatory locking in mode
1857 * if remote locking is turned off since the
1858 * local vfs will do advisory
1860 if (vol->file_mode ==
1861 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1862 vol->file_mode = S_IALLUGO;
1864 case Opt_nohandlecache:
1865 vol->nohandlecache = 1;
1867 case Opt_handlecache:
1868 vol->nohandlecache = 0;
1870 case Opt_forcemandatorylock:
1879 case Opt_setuidfromacl:
1880 vol->setuidfromacl = 1;
1883 vol->dynperm = true;
1886 vol->dynperm = false;
1900 case Opt_nostrictsync:
1901 vol->nostrictsync = 1;
1903 case Opt_strictsync:
1904 vol->nostrictsync = 0;
1907 vol->server_ino = 1;
1909 case Opt_noserverino:
1910 vol->server_ino = 0;
1912 case Opt_rwpidforward:
1913 vol->rwpidforward = 1;
1925 vol->no_psx_acl = 0;
1928 vol->no_psx_acl = 1;
1930 case Opt_locallease:
1931 vol->local_lease = 1;
1936 case Opt_ignore_signature:
1938 vol->ignore_signature = true;
1941 /* we do not do the following in secFlags because seal
1942 * is a per tree connection (mount) not a per socket
1943 * or per-smb connection option in the protocol
1944 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1949 pr_warn("CIFS: Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1952 #ifndef CONFIG_CIFS_FSCACHE
1953 cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1954 goto cifs_parse_mount_err;
1958 case Opt_mfsymlinks:
1959 vol->mfsymlinks = true;
1962 vol->multiuser = true;
1967 case Opt_nosharesock:
1968 vol->nosharesock = true;
1970 case Opt_nopersistent:
1971 vol->nopersistent = true;
1972 if (vol->persistent) {
1974 "persistenthandles mount options conflict\n");
1975 goto cifs_parse_mount_err;
1978 case Opt_persistent:
1979 vol->persistent = true;
1980 if ((vol->nopersistent) || (vol->resilient)) {
1982 "persistenthandles mount options conflict\n");
1983 goto cifs_parse_mount_err;
1987 vol->resilient = true;
1988 if (vol->persistent) {
1990 "persistenthandles mount options conflict\n");
1991 goto cifs_parse_mount_err;
1994 case Opt_noresilient:
1995 vol->resilient = false; /* already the default */
1997 case Opt_domainauto:
1998 vol->domainauto = true;
2004 vol->compression = UNKNOWN_TYPE;
2006 "SMB3 compression support is experimental\n");
2009 /* Numeric Values */
2011 if (get_option_uid(args, &vol->backupuid)) {
2012 cifs_dbg(VFS, "%s: Invalid backupuid value\n",
2014 goto cifs_parse_mount_err;
2016 vol->backupuid_specified = true;
2019 if (get_option_gid(args, &vol->backupgid)) {
2020 cifs_dbg(VFS, "%s: Invalid backupgid value\n",
2022 goto cifs_parse_mount_err;
2024 vol->backupgid_specified = true;
2027 if (get_option_uid(args, &vol->linux_uid)) {
2028 cifs_dbg(VFS, "%s: Invalid uid value\n",
2030 goto cifs_parse_mount_err;
2032 uid_specified = true;
2035 if (get_option_uid(args, &vol->cred_uid)) {
2036 cifs_dbg(VFS, "%s: Invalid cruid value\n",
2038 goto cifs_parse_mount_err;
2042 if (get_option_gid(args, &vol->linux_gid)) {
2043 cifs_dbg(VFS, "%s: Invalid gid value\n",
2045 goto cifs_parse_mount_err;
2047 gid_specified = true;
2050 if (get_option_ul(args, &option)) {
2051 cifs_dbg(VFS, "%s: Invalid file_mode value\n",
2053 goto cifs_parse_mount_err;
2055 vol->file_mode = option;
2058 if (get_option_ul(args, &option)) {
2059 cifs_dbg(VFS, "%s: Invalid dir_mode value\n",
2061 goto cifs_parse_mount_err;
2063 vol->dir_mode = option;
2066 if (get_option_ul(args, &option) ||
2067 option > USHRT_MAX) {
2068 cifs_dbg(VFS, "%s: Invalid port value\n",
2070 goto cifs_parse_mount_err;
2072 port = (unsigned short)option;
2074 case Opt_min_enc_offload:
2075 if (get_option_ul(args, &option)) {
2076 cifs_dbg(VFS, "Invalid minimum encrypted read offload size (esize)\n");
2077 goto cifs_parse_mount_err;
2079 vol->min_offload = option;
2082 if (get_option_ul(args, &option)) {
2083 cifs_dbg(VFS, "%s: Invalid blocksize value\n",
2085 goto cifs_parse_mount_err;
2088 * inode blocksize realistically should never need to be
2089 * less than 16K or greater than 16M and default is 1MB.
2090 * Note that small inode block sizes (e.g. 64K) can lead
2091 * to very poor performance of common tools like cp and scp
2093 if ((option < CIFS_MAX_MSGSIZE) ||
2094 (option > (4 * SMB3_DEFAULT_IOSIZE))) {
2095 cifs_dbg(VFS, "%s: Invalid blocksize\n",
2097 goto cifs_parse_mount_err;
2099 vol->bsize = option;
2102 if (get_option_ul(args, &option)) {
2103 cifs_dbg(VFS, "%s: Invalid rsize value\n",
2105 goto cifs_parse_mount_err;
2107 vol->rsize = option;
2110 if (get_option_ul(args, &option)) {
2111 cifs_dbg(VFS, "%s: Invalid wsize value\n",
2113 goto cifs_parse_mount_err;
2115 vol->wsize = option;
2118 if (get_option_ul(args, &option)) {
2119 cifs_dbg(VFS, "%s: Invalid actimeo value\n",
2121 goto cifs_parse_mount_err;
2123 vol->actimeo = HZ * option;
2124 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
2125 cifs_dbg(VFS, "attribute cache timeout too large\n");
2126 goto cifs_parse_mount_err;
2129 case Opt_handletimeout:
2130 if (get_option_ul(args, &option)) {
2131 cifs_dbg(VFS, "%s: Invalid handletimeout value\n",
2133 goto cifs_parse_mount_err;
2135 vol->handle_timeout = option;
2136 if (vol->handle_timeout > SMB3_MAX_HANDLE_TIMEOUT) {
2137 cifs_dbg(VFS, "Invalid handle cache timeout, longer than 16 minutes\n");
2138 goto cifs_parse_mount_err;
2141 case Opt_echo_interval:
2142 if (get_option_ul(args, &option)) {
2143 cifs_dbg(VFS, "%s: Invalid echo interval value\n",
2145 goto cifs_parse_mount_err;
2147 vol->echo_interval = option;
2150 if (get_option_ul(args, &option)) {
2151 cifs_dbg(VFS, "%s: Invalid snapshot time\n",
2153 goto cifs_parse_mount_err;
2155 vol->snapshot_time = option;
2157 case Opt_max_credits:
2158 if (get_option_ul(args, &option) || (option < 20) ||
2160 cifs_dbg(VFS, "%s: Invalid max_credits value\n",
2162 goto cifs_parse_mount_err;
2164 vol->max_credits = option;
2167 /* String Arguments */
2169 case Opt_blank_user:
2170 /* null user, ie. anonymous authentication */
2172 vol->username = NULL;
2175 string = match_strdup(args);
2179 if (strnlen(string, CIFS_MAX_USERNAME_LEN) >
2180 CIFS_MAX_USERNAME_LEN) {
2181 pr_warn("CIFS: username too long\n");
2182 goto cifs_parse_mount_err;
2185 kfree(vol->username);
2186 vol->username = kstrdup(string, GFP_KERNEL);
2188 goto cifs_parse_mount_err;
2190 case Opt_blank_pass:
2191 /* passwords have to be handled differently
2192 * to allow the character used for deliminator
2193 * to be passed within them
2197 * Check if this is a case where the password
2198 * starts with a delimiter
2200 tmp_end = strchr(data, '=');
2202 if (!(tmp_end < end && tmp_end[1] == delim)) {
2203 /* No it is not. Set the password to NULL */
2204 kzfree(vol->password);
2205 vol->password = NULL;
2208 /* Fallthrough - to Opt_pass below.*/
2210 /* Obtain the value string */
2211 value = strchr(data, '=');
2214 /* Set tmp_end to end of the string */
2215 tmp_end = (char *) value + strlen(value);
2217 /* Check if following character is the deliminator
2218 * If yes, we have encountered a double deliminator
2219 * reset the NULL character to the deliminator
2221 if (tmp_end < end && tmp_end[1] == delim) {
2224 /* Keep iterating until we get to a single
2225 * deliminator OR the end
2227 while ((tmp_end = strchr(tmp_end, delim))
2228 != NULL && (tmp_end[1] == delim)) {
2229 tmp_end = (char *) &tmp_end[2];
2232 /* Reset var options to point to next element */
2235 options = (char *) &tmp_end[1];
2237 /* Reached the end of the mount option
2242 kzfree(vol->password);
2243 /* Now build new password string */
2244 temp_len = strlen(value);
2245 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
2246 if (vol->password == NULL) {
2247 pr_warn("CIFS: no memory for password\n");
2248 goto cifs_parse_mount_err;
2251 for (i = 0, j = 0; i < temp_len; i++, j++) {
2252 vol->password[j] = value[i];
2253 if ((value[i] == delim) &&
2254 value[i+1] == delim)
2255 /* skip the second deliminator */
2258 vol->password[j] = '\0';
2261 /* FIXME: should this be an error instead? */
2265 string = match_strdup(args);
2269 if (!cifs_convert_address(dstaddr, string,
2271 pr_err("CIFS: bad ip= option (%s).\n", string);
2272 goto cifs_parse_mount_err;
2277 string = match_strdup(args);
2281 if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
2282 == CIFS_MAX_DOMAINNAME_LEN) {
2283 pr_warn("CIFS: domain name too long\n");
2284 goto cifs_parse_mount_err;
2287 kfree(vol->domainname);
2288 vol->domainname = kstrdup(string, GFP_KERNEL);
2289 if (!vol->domainname) {
2290 pr_warn("CIFS: no memory for domainname\n");
2291 goto cifs_parse_mount_err;
2293 cifs_dbg(FYI, "Domain name set\n");
2296 string = match_strdup(args);
2300 if (!cifs_convert_address(
2301 (struct sockaddr *)&vol->srcaddr,
2302 string, strlen(string))) {
2303 pr_warn("CIFS: Could not parse srcaddr: %s\n",
2305 goto cifs_parse_mount_err;
2309 string = match_strdup(args);
2313 if (strnlen(string, 1024) >= 65) {
2314 pr_warn("CIFS: iocharset name too long.\n");
2315 goto cifs_parse_mount_err;
2318 if (strncasecmp(string, "default", 7) != 0) {
2319 kfree(vol->iocharset);
2320 vol->iocharset = kstrdup(string,
2322 if (!vol->iocharset) {
2323 pr_warn("CIFS: no memory for charset\n");
2324 goto cifs_parse_mount_err;
2327 /* if iocharset not set then load_nls_default
2330 cifs_dbg(FYI, "iocharset set to %s\n", string);
2332 case Opt_netbiosname:
2333 string = match_strdup(args);
2337 memset(vol->source_rfc1001_name, 0x20,
2340 * FIXME: are there cases in which a comma can
2341 * be valid in workstation netbios name (and
2342 * need special handling)?
2344 for (i = 0; i < RFC1001_NAME_LEN; i++) {
2345 /* don't ucase netbiosname for user */
2348 vol->source_rfc1001_name[i] = string[i];
2350 /* The string has 16th byte zero still from
2351 * set at top of the function
2353 if (i == RFC1001_NAME_LEN && string[i] != 0)
2354 pr_warn("CIFS: netbiosname longer than 15 truncated.\n");
2357 /* servernetbiosname specified override *SMBSERVER */
2358 string = match_strdup(args);
2362 /* last byte, type, is 0x20 for servr type */
2363 memset(vol->target_rfc1001_name, 0x20,
2364 RFC1001_NAME_LEN_WITH_NULL);
2366 /* BB are there cases in which a comma can be
2367 valid in this workstation netbios name
2368 (and need special handling)? */
2370 /* user or mount helper must uppercase the
2372 for (i = 0; i < 15; i++) {
2375 vol->target_rfc1001_name[i] = string[i];
2377 /* The string has 16th byte zero still from
2378 set at top of the function */
2379 if (i == RFC1001_NAME_LEN && string[i] != 0)
2380 pr_warn("CIFS: server netbiosname longer than 15 truncated.\n");
2383 /* version of mount userspace tools, not dialect */
2384 string = match_strdup(args);
2388 /* If interface changes in mount.cifs bump to new ver */
2389 if (strncasecmp(string, "1", 1) == 0) {
2390 if (strlen(string) > 1) {
2391 pr_warn("Bad mount helper ver=%s. Did "
2392 "you want SMB1 (CIFS) dialect "
2393 "and mean to type vers=1.0 "
2394 "instead?\n", string);
2395 goto cifs_parse_mount_err;
2397 /* This is the default */
2400 /* For all other value, error */
2401 pr_warn("CIFS: Invalid mount helper version specified\n");
2402 goto cifs_parse_mount_err;
2404 /* protocol version (dialect) */
2405 string = match_strdup(args);
2409 if (cifs_parse_smb_version(string, vol, is_smb3) != 0)
2410 goto cifs_parse_mount_err;
2414 string = match_strdup(args);
2418 if (cifs_parse_security_flavors(string, vol) != 0)
2419 goto cifs_parse_mount_err;
2422 string = match_strdup(args);
2426 if (cifs_parse_cache_flavor(string, vol) != 0)
2427 goto cifs_parse_mount_err;
2431 * An option we don't recognize. Save it off for later
2432 * if we haven't already found one
2438 /* Free up any allocated string */
2443 if (!sloppy && invalid) {
2444 pr_err("CIFS: Unknown mount option \"%s\"\n", invalid);
2445 goto cifs_parse_mount_err;
2448 if (vol->rdma && vol->vals->protocol_id < SMB30_PROT_ID) {
2449 cifs_dbg(VFS, "SMB Direct requires Version >=3.0\n");
2450 goto cifs_parse_mount_err;
2454 /* Muliuser mounts require CONFIG_KEYS support */
2455 if (vol->multiuser) {
2456 cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
2457 goto cifs_parse_mount_err;
2461 cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
2462 goto cifs_parse_mount_err;
2465 /* make sure UNC has a share name */
2466 if (!strchr(vol->UNC + 3, '\\')) {
2467 cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
2468 goto cifs_parse_mount_err;
2475 /* No ip= option specified? Try to get it from UNC */
2476 /* Use the address part of the UNC. */
2477 slash = strchr(&vol->UNC[2], '\\');
2478 len = slash - &vol->UNC[2];
2479 if (!cifs_convert_address(dstaddr, &vol->UNC[2], len)) {
2480 pr_err("Unable to determine destination address.\n");
2481 goto cifs_parse_mount_err;
2485 /* set the port that we got earlier */
2486 cifs_set_port(dstaddr, port);
2489 vol->override_uid = override_uid;
2490 else if (override_uid == 1)
2491 pr_notice("CIFS: ignoring forceuid mount option specified with no uid= option.\n");
2494 vol->override_gid = override_gid;
2495 else if (override_gid == 1)
2496 pr_notice("CIFS: ignoring forcegid mount option specified with no gid= option.\n");
2498 if (got_version == false)
2499 pr_warn("No dialect specified on mount. Default has changed to "
2500 "a more secure dialect, SMB2.1 or later (e.g. SMB3), from CIFS "
2501 "(SMB1). To use the less secure SMB1 dialect to access "
2502 "old servers which do not support SMB3 (or SMB2.1) specify vers=1.0"
2505 kfree(mountdata_copy);
2509 pr_warn("Could not allocate temporary buffer\n");
2510 cifs_parse_mount_err:
2512 kfree(mountdata_copy);
2516 /** Returns true if srcaddr isn't specified and rhs isn't
2517 * specified, or if srcaddr is specified and
2518 * matches the IP address of the rhs argument.
2521 srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
2523 switch (srcaddr->sa_family) {
2525 return (rhs->sa_family == AF_UNSPEC);
2527 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
2528 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
2529 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
2532 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
2533 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
2534 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
2538 return false; /* don't expect to be here */
2543 * If no port is specified in addr structure, we try to match with 445 port
2544 * and if it fails - with 139 ports. It should be called only if address
2545 * families of server and addr are equal.
2548 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
2550 __be16 port, *sport;
2552 /* SMBDirect manages its own ports, don't match it here */
2556 switch (addr->sa_family) {
2558 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
2559 port = ((struct sockaddr_in *) addr)->sin_port;
2562 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
2563 port = ((struct sockaddr_in6 *) addr)->sin6_port;
2571 port = htons(CIFS_PORT);
2575 port = htons(RFC1001_PORT);
2578 return port == *sport;
2582 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
2583 struct sockaddr *srcaddr)
2585 switch (addr->sa_family) {
2587 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
2588 struct sockaddr_in *srv_addr4 =
2589 (struct sockaddr_in *)&server->dstaddr;
2591 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
2596 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
2597 struct sockaddr_in6 *srv_addr6 =
2598 (struct sockaddr_in6 *)&server->dstaddr;
2600 if (!ipv6_addr_equal(&addr6->sin6_addr,
2601 &srv_addr6->sin6_addr))
2603 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
2609 return false; /* don't expect to be here */
2612 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
2619 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2622 * The select_sectype function should either return the vol->sectype
2623 * that was specified, or "Unspecified" if that sectype was not
2624 * compatible with the given NEGOTIATE request.
2626 if (server->ops->select_sectype(server, vol->sectype)
2631 * Now check if signing mode is acceptable. No need to check
2632 * global_secflags at this point since if MUST_SIGN is set then
2633 * the server->sign had better be too.
2635 if (vol->sign && !server->sign)
2641 static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
2643 struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2645 if (vol->nosharesock)
2648 /* If multidialect negotiation see if existing sessions match one */
2649 if (strcmp(vol->vals->version_string, SMB3ANY_VERSION_STRING) == 0) {
2650 if (server->vals->protocol_id < SMB30_PROT_ID)
2652 } else if (strcmp(vol->vals->version_string,
2653 SMBDEFAULT_VERSION_STRING) == 0) {
2654 if (server->vals->protocol_id < SMB21_PROT_ID)
2656 } else if ((server->vals != vol->vals) || (server->ops != vol->ops))
2659 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2662 if (!match_address(server, addr,
2663 (struct sockaddr *)&vol->srcaddr))
2666 if (!match_port(server, addr))
2669 if (!match_security(server, vol))
2672 if (server->echo_interval != vol->echo_interval * HZ)
2675 if (server->rdma != vol->rdma)
2678 if (server->ignore_signature != vol->ignore_signature)
2681 if (server->min_offload != vol->min_offload)
2687 struct TCP_Server_Info *
2688 cifs_find_tcp_session(struct smb_vol *vol)
2690 struct TCP_Server_Info *server;
2692 spin_lock(&cifs_tcp_ses_lock);
2693 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
2694 if (!match_server(server, vol))
2697 ++server->srv_count;
2698 spin_unlock(&cifs_tcp_ses_lock);
2699 cifs_dbg(FYI, "Existing tcp session with server found\n");
2702 spin_unlock(&cifs_tcp_ses_lock);
2707 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
2709 struct task_struct *task;
2711 spin_lock(&cifs_tcp_ses_lock);
2712 if (--server->srv_count > 0) {
2713 spin_unlock(&cifs_tcp_ses_lock);
2717 put_net(cifs_net_ns(server));
2719 list_del_init(&server->tcp_ses_list);
2720 spin_unlock(&cifs_tcp_ses_lock);
2722 cancel_delayed_work_sync(&server->echo);
2726 * Avoid deadlock here: reconnect work calls
2727 * cifs_put_tcp_session() at its end. Need to be sure
2728 * that reconnect work does nothing with server pointer after
2731 cancel_delayed_work(&server->reconnect);
2733 cancel_delayed_work_sync(&server->reconnect);
2735 spin_lock(&GlobalMid_Lock);
2736 server->tcpStatus = CifsExiting;
2737 spin_unlock(&GlobalMid_Lock);
2739 cifs_crypto_secmech_release(server);
2740 cifs_fscache_release_client_cookie(server);
2742 kfree(server->session_key.response);
2743 server->session_key.response = NULL;
2744 server->session_key.len = 0;
2746 task = xchg(&server->tsk, NULL);
2748 send_sig(SIGKILL, task, 1);
2751 static struct TCP_Server_Info *
2752 cifs_get_tcp_session(struct smb_vol *volume_info)
2754 struct TCP_Server_Info *tcp_ses = NULL;
2757 cifs_dbg(FYI, "UNC: %s\n", volume_info->UNC);
2759 /* see if we already have a matching tcp_ses */
2760 tcp_ses = cifs_find_tcp_session(volume_info);
2764 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2770 tcp_ses->ops = volume_info->ops;
2771 tcp_ses->vals = volume_info->vals;
2772 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2773 tcp_ses->hostname = extract_hostname(volume_info->UNC);
2774 if (IS_ERR(tcp_ses->hostname)) {
2775 rc = PTR_ERR(tcp_ses->hostname);
2776 goto out_err_crypto_release;
2779 tcp_ses->noblockcnt = volume_info->rootfs;
2780 tcp_ses->noblocksnd = volume_info->noblocksnd || volume_info->rootfs;
2781 tcp_ses->noautotune = volume_info->noautotune;
2782 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2783 tcp_ses->rdma = volume_info->rdma;
2784 tcp_ses->in_flight = 0;
2785 tcp_ses->max_in_flight = 0;
2786 tcp_ses->credits = 1;
2787 init_waitqueue_head(&tcp_ses->response_q);
2788 init_waitqueue_head(&tcp_ses->request_q);
2789 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2790 mutex_init(&tcp_ses->srv_mutex);
2791 memcpy(tcp_ses->workstation_RFC1001_name,
2792 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2793 memcpy(tcp_ses->server_RFC1001_name,
2794 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2795 tcp_ses->session_estab = false;
2796 tcp_ses->sequence_number = 0;
2797 tcp_ses->reconnect_instance = 1;
2798 tcp_ses->lstrp = jiffies;
2799 tcp_ses->compress_algorithm = cpu_to_le16(volume_info->compression);
2800 spin_lock_init(&tcp_ses->req_lock);
2801 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2802 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2803 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2804 INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
2805 mutex_init(&tcp_ses->reconnect_mutex);
2806 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2807 sizeof(tcp_ses->srcaddr));
2808 memcpy(&tcp_ses->dstaddr, &volume_info->dstaddr,
2809 sizeof(tcp_ses->dstaddr));
2810 generate_random_uuid(tcp_ses->client_guid);
2812 * at this point we are the only ones with the pointer
2813 * to the struct since the kernel thread not created yet
2814 * no need to spinlock this init of tcpStatus or srv_count
2816 tcp_ses->tcpStatus = CifsNew;
2817 ++tcp_ses->srv_count;
2819 if (volume_info->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
2820 volume_info->echo_interval <= SMB_ECHO_INTERVAL_MAX)
2821 tcp_ses->echo_interval = volume_info->echo_interval * HZ;
2823 tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
2824 if (tcp_ses->rdma) {
2825 #ifndef CONFIG_CIFS_SMB_DIRECT
2826 cifs_dbg(VFS, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
2828 goto out_err_crypto_release;
2830 tcp_ses->smbd_conn = smbd_get_connection(
2831 tcp_ses, (struct sockaddr *)&volume_info->dstaddr);
2832 if (tcp_ses->smbd_conn) {
2833 cifs_dbg(VFS, "RDMA transport established\n");
2835 goto smbd_connected;
2838 goto out_err_crypto_release;
2841 rc = ip_connect(tcp_ses);
2843 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
2844 goto out_err_crypto_release;
2848 * since we're in a cifs function already, we know that
2849 * this will succeed. No need for try_module_get().
2851 __module_get(THIS_MODULE);
2852 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2854 if (IS_ERR(tcp_ses->tsk)) {
2855 rc = PTR_ERR(tcp_ses->tsk);
2856 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
2857 module_put(THIS_MODULE);
2858 goto out_err_crypto_release;
2860 tcp_ses->min_offload = volume_info->min_offload;
2861 tcp_ses->tcpStatus = CifsNeedNegotiate;
2863 tcp_ses->nr_targets = 1;
2864 tcp_ses->ignore_signature = volume_info->ignore_signature;
2865 /* thread spawned, put it on the list */
2866 spin_lock(&cifs_tcp_ses_lock);
2867 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2868 spin_unlock(&cifs_tcp_ses_lock);
2870 cifs_fscache_get_client_cookie(tcp_ses);
2872 /* queue echo request delayed work */
2873 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
2877 out_err_crypto_release:
2878 cifs_crypto_secmech_release(tcp_ses);
2880 put_net(cifs_net_ns(tcp_ses));
2884 if (!IS_ERR(tcp_ses->hostname))
2885 kfree(tcp_ses->hostname);
2886 if (tcp_ses->ssocket)
2887 sock_release(tcp_ses->ssocket);
2893 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2895 if (vol->sectype != Unspecified &&
2896 vol->sectype != ses->sectype)
2899 switch (ses->sectype) {
2901 if (!uid_eq(vol->cred_uid, ses->cred_uid))
2905 /* NULL username means anonymous session */
2906 if (ses->user_name == NULL) {
2912 /* anything else takes username/password */
2913 if (strncmp(ses->user_name,
2914 vol->username ? vol->username : "",
2915 CIFS_MAX_USERNAME_LEN))
2917 if ((vol->username && strlen(vol->username) != 0) &&
2918 ses->password != NULL &&
2919 strncmp(ses->password,
2920 vol->password ? vol->password : "",
2921 CIFS_MAX_PASSWORD_LEN))
2928 * cifs_setup_ipc - helper to setup the IPC tcon for the session
2930 * A new IPC connection is made and stored in the session
2931 * tcon_ipc. The IPC tcon has the same lifetime as the session.
2934 cifs_setup_ipc(struct cifs_ses *ses, struct smb_vol *volume_info)
2937 struct cifs_tcon *tcon;
2938 struct nls_table *nls_codepage;
2939 char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0};
2941 struct TCP_Server_Info *server = ses->server;
2944 * If the mount request that resulted in the creation of the
2945 * session requires encryption, force IPC to be encrypted too.
2947 if (volume_info->seal) {
2948 if (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
2951 cifs_server_dbg(VFS,
2952 "IPC: server doesn't support encryption\n");
2957 tcon = tconInfoAlloc();
2961 scnprintf(unc, sizeof(unc), "\\\\%s\\IPC$", server->hostname);
2964 nls_codepage = load_nls_default();
2970 rc = server->ops->tree_connect(xid, ses, unc, tcon, nls_codepage);
2974 cifs_server_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
2979 cifs_dbg(FYI, "IPC tcon rc = %d ipc tid = %d\n", rc, tcon->tid);
2981 ses->tcon_ipc = tcon;
2983 unload_nls(nls_codepage);
2988 * cifs_free_ipc - helper to release the session IPC tcon
2990 * Needs to be called everytime a session is destroyed
2993 cifs_free_ipc(struct cifs_ses *ses)
2996 struct cifs_tcon *tcon = ses->tcon_ipc;
3001 if (ses->server->ops->tree_disconnect) {
3003 rc = ses->server->ops->tree_disconnect(xid, tcon);
3008 cifs_dbg(FYI, "failed to disconnect IPC tcon (rc=%d)\n", rc);
3011 ses->tcon_ipc = NULL;
3015 static struct cifs_ses *
3016 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
3018 struct cifs_ses *ses;
3020 spin_lock(&cifs_tcp_ses_lock);
3021 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
3022 if (ses->status == CifsExiting)
3024 if (!match_session(ses, vol))
3027 spin_unlock(&cifs_tcp_ses_lock);
3030 spin_unlock(&cifs_tcp_ses_lock);
3034 void cifs_put_smb_ses(struct cifs_ses *ses)
3036 unsigned int rc, xid;
3037 struct TCP_Server_Info *server = ses->server;
3039 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
3041 spin_lock(&cifs_tcp_ses_lock);
3042 if (ses->status == CifsExiting) {
3043 spin_unlock(&cifs_tcp_ses_lock);
3046 if (--ses->ses_count > 0) {
3047 spin_unlock(&cifs_tcp_ses_lock);
3050 if (ses->status == CifsGood)
3051 ses->status = CifsExiting;
3052 spin_unlock(&cifs_tcp_ses_lock);
3056 if (ses->status == CifsExiting && server->ops->logoff) {
3058 rc = server->ops->logoff(xid, ses);
3060 cifs_server_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
3065 spin_lock(&cifs_tcp_ses_lock);
3066 list_del_init(&ses->smb_ses_list);
3067 spin_unlock(&cifs_tcp_ses_lock);
3070 cifs_put_tcp_session(server, 0);
3075 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
3076 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
3078 /* Populate username and pw fields from keyring if possible */
3080 cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
3084 const char *delim, *payload;
3088 struct TCP_Server_Info *server = ses->server;
3089 struct sockaddr_in *sa;
3090 struct sockaddr_in6 *sa6;
3091 const struct user_key_payload *upayload;
3093 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
3097 /* try to find an address key first */
3098 switch (server->dstaddr.ss_family) {
3100 sa = (struct sockaddr_in *)&server->dstaddr;
3101 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
3104 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
3105 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
3108 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
3109 server->dstaddr.ss_family);
3114 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
3115 key = request_key(&key_type_logon, desc, "");
3117 if (!ses->domainName) {
3118 cifs_dbg(FYI, "domainName is NULL\n");
3123 /* didn't work, try to find a domain key */
3124 sprintf(desc, "cifs:d:%s", ses->domainName);
3125 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
3126 key = request_key(&key_type_logon, desc, "");
3134 down_read(&key->sem);
3135 upayload = user_key_payload_locked(key);
3136 if (IS_ERR_OR_NULL(upayload)) {
3137 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
3141 /* find first : in payload */
3142 payload = upayload->data;
3143 delim = strnchr(payload, upayload->datalen, ':');
3144 cifs_dbg(FYI, "payload=%s\n", payload);
3146 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
3152 len = delim - payload;
3153 if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
3154 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
3160 vol->username = kstrndup(payload, len, GFP_KERNEL);
3161 if (!vol->username) {
3162 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
3167 cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
3169 len = key->datalen - (len + 1);
3170 if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
3171 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
3173 kfree(vol->username);
3174 vol->username = NULL;
3179 vol->password = kstrndup(delim, len, GFP_KERNEL);
3180 if (!vol->password) {
3181 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
3184 kfree(vol->username);
3185 vol->username = NULL;
3190 * If we have a domain key then we must set the domainName in the
3193 if (is_domain && ses->domainName) {
3194 vol->domainname = kstrndup(ses->domainName,
3195 strlen(ses->domainName),
3197 if (!vol->domainname) {
3198 cifs_dbg(FYI, "Unable to allocate %zd bytes for "
3201 kfree(vol->username);
3202 vol->username = NULL;
3203 kzfree(vol->password);
3204 vol->password = NULL;
3214 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
3217 #else /* ! CONFIG_KEYS */
3219 cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
3220 struct cifs_ses *ses __attribute__((unused)))
3224 #endif /* CONFIG_KEYS */
3227 * cifs_get_smb_ses - get a session matching @volume_info data from @server
3229 * This function assumes it is being called from cifs_mount() where we
3230 * already got a server reference (server refcount +1). See
3231 * cifs_get_tcon() for refcount explanations.
3234 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
3238 struct cifs_ses *ses;
3239 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3240 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3244 ses = cifs_find_smb_ses(server, volume_info);
3246 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
3249 mutex_lock(&ses->session_mutex);
3250 rc = cifs_negotiate_protocol(xid, ses);
3252 mutex_unlock(&ses->session_mutex);
3253 /* problem -- put our ses reference */
3254 cifs_put_smb_ses(ses);
3258 if (ses->need_reconnect) {
3259 cifs_dbg(FYI, "Session needs reconnect\n");
3260 rc = cifs_setup_session(xid, ses,
3261 volume_info->local_nls);
3263 mutex_unlock(&ses->session_mutex);
3264 /* problem -- put our reference */
3265 cifs_put_smb_ses(ses);
3270 mutex_unlock(&ses->session_mutex);
3272 /* existing SMB ses has a server reference already */
3273 cifs_put_tcp_session(server, 0);
3278 cifs_dbg(FYI, "Existing smb sess not found\n");
3279 ses = sesInfoAlloc();
3283 /* new SMB session uses our server ref */
3284 ses->server = server;
3285 if (server->dstaddr.ss_family == AF_INET6)
3286 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
3288 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
3290 if (volume_info->username) {
3291 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
3292 if (!ses->user_name)
3296 /* volume_info->password freed at unmount */
3297 if (volume_info->password) {
3298 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
3302 if (volume_info->domainname) {
3303 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
3304 if (!ses->domainName)
3307 if (volume_info->domainauto)
3308 ses->domainAuto = volume_info->domainauto;
3309 ses->cred_uid = volume_info->cred_uid;
3310 ses->linux_uid = volume_info->linux_uid;
3312 ses->sectype = volume_info->sectype;
3313 ses->sign = volume_info->sign;
3314 mutex_lock(&ses->session_mutex);
3315 rc = cifs_negotiate_protocol(xid, ses);
3317 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
3318 mutex_unlock(&ses->session_mutex);
3322 /* success, put it on the list */
3323 spin_lock(&cifs_tcp_ses_lock);
3324 list_add(&ses->smb_ses_list, &server->smb_ses_list);
3325 spin_unlock(&cifs_tcp_ses_lock);
3329 cifs_setup_ipc(ses, volume_info);
3339 static int match_tcon(struct cifs_tcon *tcon, struct smb_vol *volume_info)
3341 if (tcon->tidStatus == CifsExiting)
3343 if (strncmp(tcon->treeName, volume_info->UNC, MAX_TREE_SIZE))
3345 if (tcon->seal != volume_info->seal)
3347 if (tcon->snapshot_time != volume_info->snapshot_time)
3349 if (tcon->handle_timeout != volume_info->handle_timeout)
3351 if (tcon->no_lease != volume_info->no_lease)
3356 static struct cifs_tcon *
3357 cifs_find_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3359 struct list_head *tmp;
3360 struct cifs_tcon *tcon;
3362 spin_lock(&cifs_tcp_ses_lock);
3363 list_for_each(tmp, &ses->tcon_list) {
3364 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
3365 #ifdef CONFIG_CIFS_DFS_UPCALL
3369 if (!match_tcon(tcon, volume_info))
3372 spin_unlock(&cifs_tcp_ses_lock);
3375 spin_unlock(&cifs_tcp_ses_lock);
3380 cifs_put_tcon(struct cifs_tcon *tcon)
3383 struct cifs_ses *ses;
3386 * IPC tcon share the lifetime of their session and are
3387 * destroyed in the session put function
3389 if (tcon == NULL || tcon->ipc)
3393 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
3394 spin_lock(&cifs_tcp_ses_lock);
3395 if (--tcon->tc_count > 0) {
3396 spin_unlock(&cifs_tcp_ses_lock);
3400 list_del_init(&tcon->tcon_list);
3401 spin_unlock(&cifs_tcp_ses_lock);
3404 if (ses->server->ops->tree_disconnect)
3405 ses->server->ops->tree_disconnect(xid, tcon);
3408 cifs_fscache_release_super_cookie(tcon);
3410 cifs_put_smb_ses(ses);
3414 * cifs_get_tcon - get a tcon matching @volume_info data from @ses
3416 * - tcon refcount is the number of mount points using the tcon.
3417 * - ses refcount is the number of tcon using the session.
3419 * 1. This function assumes it is being called from cifs_mount() where
3420 * we already got a session reference (ses refcount +1).
3422 * 2. Since we're in the context of adding a mount point, the end
3423 * result should be either:
3425 * a) a new tcon already allocated with refcount=1 (1 mount point) and
3426 * its session refcount incremented (1 new tcon). This +1 was
3427 * already done in (1).
3429 * b) an existing tcon with refcount+1 (add a mount point to it) and
3430 * identical ses refcount (no new tcon). Because of (1) we need to
3431 * decrement the ses refcount.
3433 static struct cifs_tcon *
3434 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3437 struct cifs_tcon *tcon;
3439 tcon = cifs_find_tcon(ses, volume_info);
3442 * tcon has refcount already incremented but we need to
3443 * decrement extra ses reference gotten by caller (case b)
3445 cifs_dbg(FYI, "Found match on UNC path\n");
3446 cifs_put_smb_ses(ses);
3450 if (!ses->server->ops->tree_connect) {
3455 tcon = tconInfoAlloc();
3461 if (volume_info->snapshot_time) {
3462 if (ses->server->vals->protocol_id == 0) {
3464 "Use SMB2 or later for snapshot mount option\n");
3468 tcon->snapshot_time = volume_info->snapshot_time;
3471 if (volume_info->handle_timeout) {
3472 if (ses->server->vals->protocol_id == 0) {
3474 "Use SMB2.1 or later for handle timeout option\n");
3478 tcon->handle_timeout = volume_info->handle_timeout;
3482 if (volume_info->password) {
3483 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
3484 if (!tcon->password) {
3490 if (volume_info->seal) {
3491 if (ses->server->vals->protocol_id == 0) {
3493 "SMB3 or later required for encryption\n");
3496 } else if (tcon->ses->server->capabilities &
3497 SMB2_GLOBAL_CAP_ENCRYPTION)
3500 cifs_dbg(VFS, "Encryption is not supported on share\n");
3506 if (volume_info->linux_ext) {
3507 if (ses->server->posix_ext_supported) {
3508 tcon->posix_extensions = true;
3509 printk_once(KERN_WARNING
3510 "SMB3.11 POSIX Extensions are experimental\n");
3512 cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions.\n");
3519 * BB Do we need to wrap session_mutex around this TCon call and Unix
3520 * SetFS as we do on SessSetup and reconnect?
3523 rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
3524 volume_info->local_nls);
3526 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
3530 tcon->use_persistent = false;
3531 /* check if SMB2 or later, CIFS does not support persistent handles */
3532 if (volume_info->persistent) {
3533 if (ses->server->vals->protocol_id == 0) {
3535 "SMB3 or later required for persistent handles\n");
3538 } else if (ses->server->capabilities &
3539 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3540 tcon->use_persistent = true;
3541 else /* persistent handles requested but not supported */ {
3543 "Persistent handles not supported on share\n");
3547 } else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
3548 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3549 && (volume_info->nopersistent == false)) {
3550 cifs_dbg(FYI, "enabling persistent handles\n");
3551 tcon->use_persistent = true;
3552 } else if (volume_info->resilient) {
3553 if (ses->server->vals->protocol_id == 0) {
3555 "SMB2.1 or later required for resilient handles\n");
3559 tcon->use_resilient = true;
3562 /* If the user really knows what they are doing they can override */
3563 if (tcon->share_flags & SMB2_SHAREFLAG_NO_CACHING) {
3564 if (volume_info->cache_ro)
3565 cifs_dbg(VFS, "cache=ro requested on mount but NO_CACHING flag set on share\n");
3566 else if (volume_info->cache_rw)
3567 cifs_dbg(VFS, "cache=singleclient requested on mount but NO_CACHING flag set on share\n");
3571 * We can have only one retry value for a connection to a share so for
3572 * resources mounted more than once to the same server share the last
3573 * value passed in for the retry flag is used.
3575 tcon->retry = volume_info->retry;
3576 tcon->nocase = volume_info->nocase;
3577 tcon->nohandlecache = volume_info->nohandlecache;
3578 tcon->local_lease = volume_info->local_lease;
3579 tcon->no_lease = volume_info->no_lease;
3580 INIT_LIST_HEAD(&tcon->pending_opens);
3582 spin_lock(&cifs_tcp_ses_lock);
3583 list_add(&tcon->tcon_list, &ses->tcon_list);
3584 spin_unlock(&cifs_tcp_ses_lock);
3586 cifs_fscache_get_super_cookie(tcon);
3596 cifs_put_tlink(struct tcon_link *tlink)
3598 if (!tlink || IS_ERR(tlink))
3601 if (!atomic_dec_and_test(&tlink->tl_count) ||
3602 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
3603 tlink->tl_time = jiffies;
3607 if (!IS_ERR(tlink_tcon(tlink)))
3608 cifs_put_tcon(tlink_tcon(tlink));
3614 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3616 struct cifs_sb_info *old = CIFS_SB(sb);
3617 struct cifs_sb_info *new = mnt_data->cifs_sb;
3618 unsigned int oldflags = old->mnt_cifs_flags & CIFS_MOUNT_MASK;
3619 unsigned int newflags = new->mnt_cifs_flags & CIFS_MOUNT_MASK;
3621 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
3624 if (old->mnt_cifs_serverino_autodisabled)
3625 newflags &= ~CIFS_MOUNT_SERVER_INUM;
3627 if (oldflags != newflags)
3631 * We want to share sb only if we don't specify an r/wsize or
3632 * specified r/wsize is greater than or equal to existing one.
3634 if (new->wsize && new->wsize < old->wsize)
3637 if (new->rsize && new->rsize < old->rsize)
3640 if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))
3643 if (old->mnt_file_mode != new->mnt_file_mode ||
3644 old->mnt_dir_mode != new->mnt_dir_mode)
3647 if (strcmp(old->local_nls->charset, new->local_nls->charset))
3650 if (old->actimeo != new->actimeo)
3657 match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3659 struct cifs_sb_info *old = CIFS_SB(sb);
3660 struct cifs_sb_info *new = mnt_data->cifs_sb;
3661 bool old_set = (old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
3663 bool new_set = (new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
3666 if (old_set && new_set && !strcmp(new->prepath, old->prepath))
3668 else if (!old_set && !new_set)
3675 cifs_match_super(struct super_block *sb, void *data)
3677 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
3678 struct smb_vol *volume_info;
3679 struct cifs_sb_info *cifs_sb;
3680 struct TCP_Server_Info *tcp_srv;
3681 struct cifs_ses *ses;
3682 struct cifs_tcon *tcon;
3683 struct tcon_link *tlink;
3686 spin_lock(&cifs_tcp_ses_lock);
3687 cifs_sb = CIFS_SB(sb);
3688 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3689 if (IS_ERR(tlink)) {
3690 spin_unlock(&cifs_tcp_ses_lock);
3693 tcon = tlink_tcon(tlink);
3695 tcp_srv = ses->server;
3697 volume_info = mnt_data->vol;
3699 if (!match_server(tcp_srv, volume_info) ||
3700 !match_session(ses, volume_info) ||
3701 !match_tcon(tcon, volume_info) ||
3702 !match_prepath(sb, mnt_data)) {
3707 rc = compare_mount_options(sb, mnt_data);
3709 spin_unlock(&cifs_tcp_ses_lock);
3710 cifs_put_tlink(tlink);
3714 #ifdef CONFIG_DEBUG_LOCK_ALLOC
3715 static struct lock_class_key cifs_key[2];
3716 static struct lock_class_key cifs_slock_key[2];
3719 cifs_reclassify_socket4(struct socket *sock)
3721 struct sock *sk = sock->sk;
3722 BUG_ON(!sock_allow_reclassification(sk));
3723 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
3724 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
3728 cifs_reclassify_socket6(struct socket *sock)
3730 struct sock *sk = sock->sk;
3731 BUG_ON(!sock_allow_reclassification(sk));
3732 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
3733 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
3737 cifs_reclassify_socket4(struct socket *sock)
3742 cifs_reclassify_socket6(struct socket *sock)
3747 /* See RFC1001 section 14 on representation of Netbios names */
3748 static void rfc1002mangle(char *target, char *source, unsigned int length)
3752 for (i = 0, j = 0; i < (length); i++) {
3753 /* mask a nibble at a time and encode */
3754 target[j] = 'A' + (0x0F & (source[i] >> 4));
3755 target[j+1] = 'A' + (0x0F & source[i]);
3762 bind_socket(struct TCP_Server_Info *server)
3765 if (server->srcaddr.ss_family != AF_UNSPEC) {
3766 /* Bind to the specified local IP address */
3767 struct socket *socket = server->ssocket;
3768 rc = socket->ops->bind(socket,
3769 (struct sockaddr *) &server->srcaddr,
3770 sizeof(server->srcaddr));
3772 struct sockaddr_in *saddr4;
3773 struct sockaddr_in6 *saddr6;
3774 saddr4 = (struct sockaddr_in *)&server->srcaddr;
3775 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
3776 if (saddr6->sin6_family == AF_INET6)
3777 cifs_server_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
3778 &saddr6->sin6_addr, rc);
3780 cifs_server_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
3781 &saddr4->sin_addr.s_addr, rc);
3788 ip_rfc1001_connect(struct TCP_Server_Info *server)
3792 * some servers require RFC1001 sessinit before sending
3793 * negprot - BB check reconnection in case where second
3794 * sessinit is sent but no second negprot
3796 struct rfc1002_session_packet *ses_init_buf;
3797 struct smb_hdr *smb_buf;
3798 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
3801 ses_init_buf->trailer.session_req.called_len = 32;
3803 if (server->server_RFC1001_name[0] != 0)
3804 rfc1002mangle(ses_init_buf->trailer.
3805 session_req.called_name,
3806 server->server_RFC1001_name,
3807 RFC1001_NAME_LEN_WITH_NULL);
3809 rfc1002mangle(ses_init_buf->trailer.
3810 session_req.called_name,
3811 DEFAULT_CIFS_CALLED_NAME,
3812 RFC1001_NAME_LEN_WITH_NULL);
3814 ses_init_buf->trailer.session_req.calling_len = 32;
3817 * calling name ends in null (byte 16) from old smb
3820 if (server->workstation_RFC1001_name[0] != 0)
3821 rfc1002mangle(ses_init_buf->trailer.
3822 session_req.calling_name,
3823 server->workstation_RFC1001_name,
3824 RFC1001_NAME_LEN_WITH_NULL);
3826 rfc1002mangle(ses_init_buf->trailer.
3827 session_req.calling_name,
3829 RFC1001_NAME_LEN_WITH_NULL);
3831 ses_init_buf->trailer.session_req.scope1 = 0;
3832 ses_init_buf->trailer.session_req.scope2 = 0;
3833 smb_buf = (struct smb_hdr *)ses_init_buf;
3835 /* sizeof RFC1002_SESSION_REQUEST with no scope */
3836 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
3837 rc = smb_send(server, smb_buf, 0x44);
3838 kfree(ses_init_buf);
3840 * RFC1001 layer in at least one server
3841 * requires very short break before negprot
3842 * presumably because not expecting negprot
3843 * to follow so fast. This is a simple
3844 * solution that works without
3845 * complicating the code and causes no
3846 * significant slowing down on mount
3849 usleep_range(1000, 2000);
3852 * else the negprot may still work without this
3853 * even though malloc failed
3860 generic_ip_connect(struct TCP_Server_Info *server)
3865 struct socket *socket = server->ssocket;
3866 struct sockaddr *saddr;
3868 saddr = (struct sockaddr *) &server->dstaddr;
3870 if (server->dstaddr.ss_family == AF_INET6) {
3871 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
3872 slen = sizeof(struct sockaddr_in6);
3875 sport = ((struct sockaddr_in *) saddr)->sin_port;
3876 slen = sizeof(struct sockaddr_in);
3880 if (socket == NULL) {
3881 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3882 IPPROTO_TCP, &socket, 1);
3884 cifs_server_dbg(VFS, "Error %d creating socket\n", rc);
3885 server->ssocket = NULL;
3889 /* BB other socket options to set KEEPALIVE, NODELAY? */
3890 cifs_dbg(FYI, "Socket created\n");
3891 server->ssocket = socket;
3892 socket->sk->sk_allocation = GFP_NOFS;
3893 if (sfamily == AF_INET6)
3894 cifs_reclassify_socket6(socket);
3896 cifs_reclassify_socket4(socket);
3899 rc = bind_socket(server);
3904 * Eventually check for other socket options to change from
3905 * the default. sock_setsockopt not used because it expects
3908 socket->sk->sk_rcvtimeo = 7 * HZ;
3909 socket->sk->sk_sndtimeo = 5 * HZ;
3911 /* make the bufsizes depend on wsize/rsize and max requests */
3912 if (server->noautotune) {
3913 if (socket->sk->sk_sndbuf < (200 * 1024))
3914 socket->sk->sk_sndbuf = 200 * 1024;
3915 if (socket->sk->sk_rcvbuf < (140 * 1024))
3916 socket->sk->sk_rcvbuf = 140 * 1024;
3919 if (server->tcp_nodelay) {
3921 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
3922 (char *)&val, sizeof(val));
3924 cifs_dbg(FYI, "set TCP_NODELAY socket option error %d\n",
3928 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3929 socket->sk->sk_sndbuf,
3930 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3932 rc = socket->ops->connect(socket, saddr, slen,
3933 server->noblockcnt ? O_NONBLOCK : 0);
3935 * When mounting SMB root file systems, we do not want to block in
3936 * connect. Otherwise bail out and then let cifs_reconnect() perform
3937 * reconnect failover - if possible.
3939 if (server->noblockcnt && rc == -EINPROGRESS)
3942 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3943 sock_release(socket);
3944 server->ssocket = NULL;
3948 if (sport == htons(RFC1001_PORT))
3949 rc = ip_rfc1001_connect(server);
3955 ip_connect(struct TCP_Server_Info *server)
3958 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3959 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3961 if (server->dstaddr.ss_family == AF_INET6)
3962 sport = &addr6->sin6_port;
3964 sport = &addr->sin_port;
3969 /* try with 445 port at first */
3970 *sport = htons(CIFS_PORT);
3972 rc = generic_ip_connect(server);
3976 /* if it failed, try with 139 port */
3977 *sport = htons(RFC1001_PORT);
3980 return generic_ip_connect(server);
3983 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
3984 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
3986 /* if we are reconnecting then should we check to see if
3987 * any requested capabilities changed locally e.g. via
3988 * remount but we can not do much about it here
3989 * if they have (even if we could detect it by the following)
3990 * Perhaps we could add a backpointer to array of sb from tcon
3991 * or if we change to make all sb to same share the same
3992 * sb as NFS - then we only have one backpointer to sb.
3993 * What if we wanted to mount the server share twice once with
3994 * and once without posixacls or posix paths? */
3995 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3997 if (vol_info && vol_info->no_linux_ext) {
3998 tcon->fsUnixInfo.Capability = 0;
3999 tcon->unix_ext = 0; /* Unix Extensions disabled */
4000 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
4002 } else if (vol_info)
4003 tcon->unix_ext = 1; /* Unix Extensions supported */
4005 if (tcon->unix_ext == 0) {
4006 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
4010 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
4011 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
4012 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
4013 /* check for reconnect case in which we do not
4014 want to change the mount behavior if we can avoid it */
4015 if (vol_info == NULL) {
4016 /* turn off POSIX ACL and PATHNAMES if not set
4017 originally at mount time */
4018 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
4019 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
4020 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
4021 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
4022 cifs_dbg(VFS, "POSIXPATH support change\n");
4023 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
4024 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
4025 cifs_dbg(VFS, "possible reconnect error\n");
4026 cifs_dbg(VFS, "server disabled POSIX path support\n");
4030 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
4031 cifs_dbg(VFS, "per-share encryption not supported yet\n");
4033 cap &= CIFS_UNIX_CAP_MASK;
4034 if (vol_info && vol_info->no_psx_acl)
4035 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
4036 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
4037 cifs_dbg(FYI, "negotiated posix acl support\n");
4039 cifs_sb->mnt_cifs_flags |=
4040 CIFS_MOUNT_POSIXACL;
4043 if (vol_info && vol_info->posix_paths == 0)
4044 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
4045 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
4046 cifs_dbg(FYI, "negotiate posix pathnames\n");
4048 cifs_sb->mnt_cifs_flags |=
4049 CIFS_MOUNT_POSIX_PATHS;
4052 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
4053 #ifdef CONFIG_CIFS_DEBUG2
4054 if (cap & CIFS_UNIX_FCNTL_CAP)
4055 cifs_dbg(FYI, "FCNTL cap\n");
4056 if (cap & CIFS_UNIX_EXTATTR_CAP)
4057 cifs_dbg(FYI, "EXTATTR cap\n");
4058 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
4059 cifs_dbg(FYI, "POSIX path cap\n");
4060 if (cap & CIFS_UNIX_XATTR_CAP)
4061 cifs_dbg(FYI, "XATTR cap\n");
4062 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
4063 cifs_dbg(FYI, "POSIX ACL cap\n");
4064 if (cap & CIFS_UNIX_LARGE_READ_CAP)
4065 cifs_dbg(FYI, "very large read cap\n");
4066 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
4067 cifs_dbg(FYI, "very large write cap\n");
4068 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
4069 cifs_dbg(FYI, "transport encryption cap\n");
4070 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
4071 cifs_dbg(FYI, "mandatory transport encryption cap\n");
4072 #endif /* CIFS_DEBUG2 */
4073 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
4074 if (vol_info == NULL) {
4075 cifs_dbg(FYI, "resetting capabilities failed\n");
4077 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");
4083 int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
4084 struct cifs_sb_info *cifs_sb)
4086 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
4088 spin_lock_init(&cifs_sb->tlink_tree_lock);
4089 cifs_sb->tlink_tree = RB_ROOT;
4091 cifs_sb->bsize = pvolume_info->bsize;
4093 * Temporarily set r/wsize for matching superblock. If we end up using
4094 * new sb then client will later negotiate it downward if needed.
4096 cifs_sb->rsize = pvolume_info->rsize;
4097 cifs_sb->wsize = pvolume_info->wsize;
4099 cifs_sb->mnt_uid = pvolume_info->linux_uid;
4100 cifs_sb->mnt_gid = pvolume_info->linux_gid;
4101 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
4102 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
4103 cifs_dbg(FYI, "file mode: %04ho dir mode: %04ho\n",
4104 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
4106 cifs_sb->actimeo = pvolume_info->actimeo;
4107 cifs_sb->local_nls = pvolume_info->local_nls;
4109 if (pvolume_info->nodfs)
4110 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_DFS;
4111 if (pvolume_info->noperm)
4112 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
4113 if (pvolume_info->setuids)
4114 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
4115 if (pvolume_info->setuidfromacl)
4116 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
4117 if (pvolume_info->server_ino)
4118 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
4119 if (pvolume_info->remap)
4120 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
4121 if (pvolume_info->sfu_remap)
4122 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
4123 if (pvolume_info->no_xattr)
4124 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
4125 if (pvolume_info->sfu_emul)
4126 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
4127 if (pvolume_info->nobrl)
4128 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
4129 if (pvolume_info->nohandlecache)
4130 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_HANDLE_CACHE;
4131 if (pvolume_info->nostrictsync)
4132 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
4133 if (pvolume_info->mand_lock)
4134 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
4135 if (pvolume_info->rwpidforward)
4136 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
4137 if (pvolume_info->mode_ace)
4138 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MODE_FROM_SID;
4139 if (pvolume_info->cifs_acl)
4140 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
4141 if (pvolume_info->backupuid_specified) {
4142 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
4143 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
4145 if (pvolume_info->backupgid_specified) {
4146 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
4147 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
4149 if (pvolume_info->override_uid)
4150 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
4151 if (pvolume_info->override_gid)
4152 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
4153 if (pvolume_info->dynperm)
4154 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
4155 if (pvolume_info->fsc)
4156 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
4157 if (pvolume_info->multiuser)
4158 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
4159 CIFS_MOUNT_NO_PERM);
4160 if (pvolume_info->strict_io)
4161 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
4162 if (pvolume_info->direct_io) {
4163 cifs_dbg(FYI, "mounting share using direct i/o\n");
4164 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
4166 if (pvolume_info->cache_ro) {
4167 cifs_dbg(VFS, "mounting share with read only caching. Ensure that the share will not be modified while in use.\n");
4168 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RO_CACHE;
4169 } else if (pvolume_info->cache_rw) {
4170 cifs_dbg(VFS, "mounting share in single client RW caching mode. Ensure that no other systems will be accessing the share.\n");
4171 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_RO_CACHE |
4172 CIFS_MOUNT_RW_CACHE);
4174 if (pvolume_info->mfsymlinks) {
4175 if (pvolume_info->sfu_emul) {
4177 * Our SFU ("Services for Unix" emulation does not allow
4178 * creating symlinks but does allow reading existing SFU
4179 * symlinks (it does allow both creating and reading SFU
4180 * style mknod and FIFOs though). When "mfsymlinks" and
4181 * "sfu" are both enabled at the same time, it allows
4182 * reading both types of symlinks, but will only create
4183 * them with mfsymlinks format. This allows better
4184 * Apple compatibility (probably better for Samba too)
4185 * while still recognizing old Windows style symlinks.
4187 cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
4189 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
4192 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
4193 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
4195 if (pvolume_info->prepath) {
4196 cifs_sb->prepath = kstrdup(pvolume_info->prepath, GFP_KERNEL);
4197 if (cifs_sb->prepath == NULL)
4205 cifs_cleanup_volume_info_contents(struct smb_vol *volume_info)
4207 kfree(volume_info->username);
4208 kzfree(volume_info->password);
4209 kfree(volume_info->UNC);
4210 kfree(volume_info->domainname);
4211 kfree(volume_info->iocharset);
4212 kfree(volume_info->prepath);
4216 cifs_cleanup_volume_info(struct smb_vol *volume_info)
4220 cifs_cleanup_volume_info_contents(volume_info);
4224 /* Release all succeed connections */
4225 static inline void mount_put_conns(struct cifs_sb_info *cifs_sb,
4227 struct TCP_Server_Info *server,
4228 struct cifs_ses *ses, struct cifs_tcon *tcon)
4233 cifs_put_tcon(tcon);
4235 cifs_put_smb_ses(ses);
4237 cifs_put_tcp_session(server, 0);
4238 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
4242 /* Get connections for tcp, ses and tcon */
4243 static int mount_get_conns(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
4245 struct TCP_Server_Info **nserver,
4246 struct cifs_ses **nses, struct cifs_tcon **ntcon)
4249 struct TCP_Server_Info *server;
4250 struct cifs_ses *ses;
4251 struct cifs_tcon *tcon;
4259 /* get a reference to a tcp session */
4260 server = cifs_get_tcp_session(vol);
4261 if (IS_ERR(server)) {
4262 rc = PTR_ERR(server);
4268 if ((vol->max_credits < 20) || (vol->max_credits > 60000))
4269 server->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
4271 server->max_credits = vol->max_credits;
4273 /* get a reference to a SMB session */
4274 ses = cifs_get_smb_ses(server, vol);
4282 if ((vol->persistent == true) && (!(ses->server->capabilities &
4283 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES))) {
4284 cifs_server_dbg(VFS, "persistent handles not supported by server\n");
4288 /* search for existing tcon to this server share */
4289 tcon = cifs_get_tcon(ses, vol);
4297 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
4298 if (tcon->posix_extensions)
4299 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
4301 /* tell server which Unix caps we support */
4302 if (cap_unix(tcon->ses)) {
4304 * reset of caps checks mount to see if unix extensions disabled
4305 * for just this mount.
4307 reset_cifs_unix_caps(*xid, tcon, cifs_sb, vol);
4308 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
4309 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
4310 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP))
4313 tcon->unix_ext = 0; /* server does not support them */
4315 /* do not care if a following call succeed - informational */
4316 if (!tcon->pipe && server->ops->qfs_tcon) {
4317 server->ops->qfs_tcon(*xid, tcon);
4318 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE) {
4319 if (tcon->fsDevInfo.DeviceCharacteristics &
4320 cpu_to_le32(FILE_READ_ONLY_DEVICE))
4321 cifs_dbg(VFS, "mounted to read only share\n");
4322 else if ((cifs_sb->mnt_cifs_flags &
4323 CIFS_MOUNT_RW_CACHE) == 0)
4324 cifs_dbg(VFS, "read only mount of RW share\n");
4325 /* no need to log a RW mount of a typical RW share */
4329 cifs_sb->wsize = server->ops->negotiate_wsize(tcon, vol);
4330 cifs_sb->rsize = server->ops->negotiate_rsize(tcon, vol);
4335 static int mount_setup_tlink(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
4336 struct cifs_tcon *tcon)
4338 struct tcon_link *tlink;
4340 /* hang the tcon off of the superblock */
4341 tlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4345 tlink->tl_uid = ses->linux_uid;
4346 tlink->tl_tcon = tcon;
4347 tlink->tl_time = jiffies;
4348 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
4349 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4351 cifs_sb->master_tlink = tlink;
4352 spin_lock(&cifs_sb->tlink_tree_lock);
4353 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4354 spin_unlock(&cifs_sb->tlink_tree_lock);
4356 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4361 #ifdef CONFIG_CIFS_DFS_UPCALL
4363 * cifs_build_path_to_root returns full path to root when we do not have an
4364 * exiting connection (tcon)
4367 build_unc_path_to_root(const struct smb_vol *vol,
4368 const struct cifs_sb_info *cifs_sb, bool useppath)
4370 char *full_path, *pos;
4371 unsigned int pplen = useppath && vol->prepath ?
4372 strlen(vol->prepath) + 1 : 0;
4373 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
4375 if (unc_len > MAX_TREE_SIZE)
4376 return ERR_PTR(-EINVAL);
4378 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
4379 if (full_path == NULL)
4380 return ERR_PTR(-ENOMEM);
4382 memcpy(full_path, vol->UNC, unc_len);
4383 pos = full_path + unc_len;
4386 *pos = CIFS_DIR_SEP(cifs_sb);
4387 memcpy(pos + 1, vol->prepath, pplen);
4391 *pos = '\0'; /* add trailing null */
4392 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
4393 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
4398 * expand_dfs_referral - Perform a dfs referral query and update the cifs_sb
4401 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
4402 * to a string containing updated options for the submount. Otherwise it
4403 * will be left untouched.
4405 * Returns the rc from get_dfs_path to the caller, which can be used to
4406 * determine whether there were referrals.
4409 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
4410 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
4414 struct dfs_info3_param referral = {0};
4415 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
4417 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4420 full_path = build_unc_path_to_root(volume_info, cifs_sb, true);
4421 if (IS_ERR(full_path))
4422 return PTR_ERR(full_path);
4424 /* For DFS paths, skip the first '\' of the UNC */
4425 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
4427 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4428 ref_path, &referral, NULL);
4430 char *fake_devname = NULL;
4432 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
4433 full_path + 1, &referral,
4435 free_dfs_info_param(&referral);
4437 if (IS_ERR(mdata)) {
4438 rc = PTR_ERR(mdata);
4441 cifs_cleanup_volume_info_contents(volume_info);
4442 rc = cifs_setup_volume_info(volume_info, mdata,
4443 fake_devname, false);
4445 kfree(fake_devname);
4446 kfree(cifs_sb->mountdata);
4447 cifs_sb->mountdata = mdata;
4453 static inline int get_next_dfs_tgt(const char *path,
4454 struct dfs_cache_tgt_list *tgt_list,
4455 struct dfs_cache_tgt_iterator **tgt_it)
4458 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
4460 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
4461 return !*tgt_it ? -EHOSTDOWN : 0;
4464 static int update_vol_info(const struct dfs_cache_tgt_iterator *tgt_it,
4465 struct smb_vol *fake_vol, struct smb_vol *vol)
4467 const char *tgt = dfs_cache_get_tgt_name(tgt_it);
4468 int len = strlen(tgt) + 2;
4471 new_unc = kmalloc(len, GFP_KERNEL);
4474 scnprintf(new_unc, len, "\\%s", tgt);
4479 if (fake_vol->prepath) {
4480 kfree(vol->prepath);
4481 vol->prepath = fake_vol->prepath;
4482 fake_vol->prepath = NULL;
4484 memcpy(&vol->dstaddr, &fake_vol->dstaddr, sizeof(vol->dstaddr));
4489 static int setup_dfs_tgt_conn(const char *path,
4490 const struct dfs_cache_tgt_iterator *tgt_it,
4491 struct cifs_sb_info *cifs_sb,
4492 struct smb_vol *vol,
4494 struct TCP_Server_Info **server,
4495 struct cifs_ses **ses,
4496 struct cifs_tcon **tcon)
4499 struct dfs_info3_param ref = {0};
4500 char *mdata = NULL, *fake_devname = NULL;
4501 struct smb_vol fake_vol = {NULL};
4503 cifs_dbg(FYI, "%s: dfs path: %s\n", __func__, path);
4505 rc = dfs_cache_get_tgt_referral(path, tgt_it, &ref);
4509 mdata = cifs_compose_mount_options(cifs_sb->mountdata, path, &ref,
4511 free_dfs_info_param(&ref);
4513 if (IS_ERR(mdata)) {
4514 rc = PTR_ERR(mdata);
4517 cifs_dbg(FYI, "%s: fake_devname: %s\n", __func__, fake_devname);
4518 rc = cifs_setup_volume_info(&fake_vol, mdata, fake_devname,
4522 kfree(fake_devname);
4526 * We use a 'fake_vol' here because we need pass it down to the
4527 * mount_{get,put} functions to test connection against new DFS
4530 mount_put_conns(cifs_sb, *xid, *server, *ses, *tcon);
4531 rc = mount_get_conns(&fake_vol, cifs_sb, xid, server, ses,
4535 * We were able to connect to new target server.
4536 * Update current volume info with new target server.
4538 rc = update_vol_info(tgt_it, &fake_vol, vol);
4541 cifs_cleanup_volume_info_contents(&fake_vol);
4545 static int mount_do_dfs_failover(const char *path,
4546 struct cifs_sb_info *cifs_sb,
4547 struct smb_vol *vol,
4548 struct cifs_ses *root_ses,
4550 struct TCP_Server_Info **server,
4551 struct cifs_ses **ses,
4552 struct cifs_tcon **tcon)
4555 struct dfs_cache_tgt_list tgt_list;
4556 struct dfs_cache_tgt_iterator *tgt_it = NULL;
4558 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4561 rc = dfs_cache_noreq_find(path, NULL, &tgt_list);
4566 /* Get next DFS target server - if any */
4567 rc = get_next_dfs_tgt(path, &tgt_list, &tgt_it);
4570 /* Connect to next DFS target */
4571 rc = setup_dfs_tgt_conn(path, tgt_it, cifs_sb, vol, xid, server,
4573 if (!rc || rc == -EACCES || rc == -EOPNOTSUPP)
4578 * Update DFS target hint in DFS referral cache with the target
4579 * server we successfully reconnected to.
4581 rc = dfs_cache_update_tgthint(*xid, root_ses ? root_ses : *ses,
4583 cifs_remap(cifs_sb), path,
4586 dfs_cache_free_tgts(&tgt_list);
4592 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
4593 const char *devname, bool is_smb3)
4597 if (cifs_parse_mount_options(mount_data, devname, volume_info, is_smb3))
4600 if (volume_info->nullauth) {
4601 cifs_dbg(FYI, "Anonymous login\n");
4602 kfree(volume_info->username);
4603 volume_info->username = NULL;
4604 } else if (volume_info->username) {
4605 /* BB fixme parse for domain name here */
4606 cifs_dbg(FYI, "Username: %s\n", volume_info->username);
4608 cifs_dbg(VFS, "No username specified\n");
4609 /* In userspace mount helper we can get user name from alternate
4610 locations such as env variables and files on disk */
4614 /* this is needed for ASCII cp to Unicode converts */
4615 if (volume_info->iocharset == NULL) {
4616 /* load_nls_default cannot return null */
4617 volume_info->local_nls = load_nls_default();
4619 volume_info->local_nls = load_nls(volume_info->iocharset);
4620 if (volume_info->local_nls == NULL) {
4621 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
4622 volume_info->iocharset);
4631 cifs_get_volume_info(char *mount_data, const char *devname, bool is_smb3)
4634 struct smb_vol *volume_info;
4636 volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
4638 return ERR_PTR(-ENOMEM);
4640 rc = cifs_setup_volume_info(volume_info, mount_data, devname, is_smb3);
4642 cifs_cleanup_volume_info(volume_info);
4643 volume_info = ERR_PTR(rc);
4650 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
4652 struct cifs_tcon *tcon,
4653 struct cifs_sb_info *cifs_sb,
4660 int skip = added_treename ? 1 : 0;
4662 sep = CIFS_DIR_SEP(cifs_sb);
4665 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
4667 /* skip separators */
4672 /* next separator */
4673 while (*s && *s != sep)
4676 * if the treename is added, we then have to skip the first
4677 * part within the separators
4684 * temporarily null-terminate the path at the end of
4685 * the current component
4689 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4697 * Check if path is remote (e.g. a DFS share). Return -EREMOTE if it is,
4700 static int is_path_remote(struct cifs_sb_info *cifs_sb, struct smb_vol *vol,
4701 const unsigned int xid,
4702 struct TCP_Server_Info *server,
4703 struct cifs_tcon *tcon)
4708 if (!server->ops->is_path_accessible)
4712 * cifs_build_path_to_root works only when we have a valid tcon
4714 full_path = cifs_build_path_to_root(vol, cifs_sb, tcon,
4715 tcon->Flags & SMB_SHARE_IS_IN_DFS);
4716 if (full_path == NULL)
4719 cifs_dbg(FYI, "%s: full_path: %s\n", __func__, full_path);
4721 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4723 if (rc != 0 && rc != -EREMOTE) {
4728 if (rc != -EREMOTE) {
4729 rc = cifs_are_all_path_components_accessible(server, xid, tcon,
4730 cifs_sb, full_path, tcon->Flags & SMB_SHARE_IS_IN_DFS);
4732 cifs_server_dbg(VFS, "cannot query dirs between root and final path, "
4733 "enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
4734 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
4743 #ifdef CONFIG_CIFS_DFS_UPCALL
4744 static inline void set_root_tcon(struct cifs_sb_info *cifs_sb,
4745 struct cifs_tcon *tcon,
4746 struct cifs_tcon **root)
4748 spin_lock(&cifs_tcp_ses_lock);
4750 tcon->remap = cifs_remap(cifs_sb);
4751 spin_unlock(&cifs_tcp_ses_lock);
4755 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4759 struct cifs_ses *ses;
4760 struct cifs_tcon *root_tcon = NULL;
4761 struct cifs_tcon *tcon = NULL;
4762 struct TCP_Server_Info *server;
4763 char *root_path = NULL, *full_path = NULL;
4764 char *old_mountdata, *origin_mountdata = NULL;
4767 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4769 /* If not a standalone DFS root, then check if path is remote */
4770 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls,
4771 cifs_remap(cifs_sb), vol->UNC + 1, NULL,
4774 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4782 * If first DFS target server went offline and we failed to connect it,
4783 * server and ses pointers are NULL at this point, though we still have
4784 * chance to get a cached DFS referral in expand_dfs_referral() and
4785 * retry next target available in it.
4787 * If a NULL ses ptr is passed to dfs_cache_find(), a lookup will be
4788 * performed against DFS path and *no* requests will be sent to server
4789 * for any new DFS referrals. Hence it's safe to skip checking whether
4790 * server or ses ptr is NULL.
4792 if (rc == -EACCES || rc == -EOPNOTSUPP)
4795 root_path = build_unc_path_to_root(vol, cifs_sb, false);
4796 if (IS_ERR(root_path)) {
4797 rc = PTR_ERR(root_path);
4802 full_path = build_unc_path_to_root(vol, cifs_sb, true);
4803 if (IS_ERR(full_path)) {
4804 rc = PTR_ERR(full_path);
4809 * Perform an unconditional check for whether there are DFS
4810 * referrals for this path without prefix, to provide support
4811 * for DFS referrals from w2k8 servers which don't seem to respond
4812 * with PATH_NOT_COVERED to requests that include the prefix.
4813 * Chase the referral if found, otherwise continue normally.
4815 old_mountdata = cifs_sb->mountdata;
4816 (void)expand_dfs_referral(xid, ses, vol, cifs_sb, false);
4818 if (cifs_sb->mountdata == NULL) {
4823 /* Save DFS root volume information for DFS refresh worker */
4824 origin_mountdata = kstrndup(cifs_sb->mountdata,
4825 strlen(cifs_sb->mountdata), GFP_KERNEL);
4826 if (!origin_mountdata) {
4831 if (cifs_sb->mountdata != old_mountdata) {
4832 /* If we were redirected, reconnect to new target server */
4833 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4834 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4837 if (rc == -EACCES || rc == -EOPNOTSUPP)
4839 /* Perform DFS failover to any other DFS targets */
4840 rc = mount_do_dfs_failover(root_path + 1, cifs_sb, vol, NULL,
4841 &xid, &server, &ses, &tcon);
4847 root_path = build_unc_path_to_root(vol, cifs_sb, false);
4848 if (IS_ERR(root_path)) {
4849 rc = PTR_ERR(root_path);
4853 /* Cache out resolved root server */
4854 (void)dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4855 root_path + 1, NULL, NULL);
4859 set_root_tcon(cifs_sb, tcon, &root_tcon);
4861 for (count = 1; ;) {
4863 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4864 if (!rc || rc != -EREMOTE)
4868 * BB: when we implement proper loop detection,
4869 * we will remove this check. But now we need it
4870 * to prevent an indefinite loop if 'DFS tree' is
4871 * misconfigured (i.e. has loops).
4873 if (count++ > MAX_NESTED_LINKS) {
4879 full_path = build_unc_path_to_root(vol, cifs_sb, true);
4880 if (IS_ERR(full_path)) {
4881 rc = PTR_ERR(full_path);
4886 old_mountdata = cifs_sb->mountdata;
4887 rc = expand_dfs_referral(xid, root_tcon->ses, vol, cifs_sb,
4892 if (cifs_sb->mountdata != old_mountdata) {
4893 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4894 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses,
4897 * Ensure that DFS referrals go through new root server.
4900 (tcon->share_flags & (SHI1005_FLAGS_DFS |
4901 SHI1005_FLAGS_DFS_ROOT))) {
4902 cifs_put_tcon(root_tcon);
4903 set_root_tcon(cifs_sb, tcon, &root_tcon);
4907 if (rc == -EACCES || rc == -EOPNOTSUPP)
4909 /* Perform DFS failover to any other DFS targets */
4910 rc = mount_do_dfs_failover(full_path + 1, cifs_sb, vol,
4911 root_tcon->ses, &xid,
4912 &server, &ses, &tcon);
4913 if (rc == -EACCES || rc == -EOPNOTSUPP || !server ||
4918 cifs_put_tcon(root_tcon);
4923 spin_lock(&cifs_tcp_ses_lock);
4924 if (!tcon->dfs_path) {
4925 /* Save full path in new tcon to do failover when reconnecting tcons */
4926 tcon->dfs_path = full_path;
4928 tcon->remap = cifs_remap(cifs_sb);
4930 cifs_sb->origin_fullpath = kstrndup(tcon->dfs_path,
4931 strlen(tcon->dfs_path),
4933 if (!cifs_sb->origin_fullpath) {
4934 spin_unlock(&cifs_tcp_ses_lock);
4938 spin_unlock(&cifs_tcp_ses_lock);
4940 rc = dfs_cache_add_vol(origin_mountdata, vol, cifs_sb->origin_fullpath);
4942 kfree(cifs_sb->origin_fullpath);
4946 * After reconnecting to a different server, unique ids won't
4947 * match anymore, so we disable serverino. This prevents
4948 * dentry revalidation to think the dentry are stale (ESTALE).
4950 cifs_autodisable_serverino(cifs_sb);
4953 return mount_setup_tlink(cifs_sb, ses, tcon);
4958 kfree(origin_mountdata);
4959 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4963 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4967 struct cifs_ses *ses;
4968 struct cifs_tcon *tcon;
4969 struct TCP_Server_Info *server;
4971 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4976 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4985 return mount_setup_tlink(cifs_sb, ses, tcon);
4988 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4994 * Issue a TREE_CONNECT request.
4997 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
4998 const char *tree, struct cifs_tcon *tcon,
4999 const struct nls_table *nls_codepage)
5001 struct smb_hdr *smb_buffer;
5002 struct smb_hdr *smb_buffer_response;
5005 unsigned char *bcc_ptr;
5008 __u16 bytes_left, count;
5013 smb_buffer = cifs_buf_get();
5014 if (smb_buffer == NULL)
5017 smb_buffer_response = smb_buffer;
5019 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
5020 NULL /*no tid */ , 4 /*wct */ );
5022 smb_buffer->Mid = get_next_mid(ses->server);
5023 smb_buffer->Uid = ses->Suid;
5024 pSMB = (TCONX_REQ *) smb_buffer;
5025 pSMBr = (TCONX_RSP *) smb_buffer_response;
5027 pSMB->AndXCommand = 0xFF;
5028 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
5029 bcc_ptr = &pSMB->Password[0];
5030 if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
5031 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
5032 *bcc_ptr = 0; /* password is null byte */
5033 bcc_ptr++; /* skip password */
5034 /* already aligned so no need to do it below */
5036 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
5037 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
5038 specified as required (when that support is added to
5039 the vfs in the future) as only NTLM or the much
5040 weaker LANMAN (which we do not send by default) is accepted
5041 by Samba (not sure whether other servers allow
5042 NTLMv2 password here) */
5043 #ifdef CONFIG_CIFS_WEAK_PW_HASH
5044 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
5045 (ses->sectype == LANMAN))
5046 calc_lanman_hash(tcon->password, ses->server->cryptkey,
5047 ses->server->sec_mode &
5048 SECMODE_PW_ENCRYPT ? true : false,
5051 #endif /* CIFS_WEAK_PW_HASH */
5052 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
5053 bcc_ptr, nls_codepage);
5055 cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
5057 cifs_buf_release(smb_buffer);
5061 bcc_ptr += CIFS_AUTH_RESP_SIZE;
5062 if (ses->capabilities & CAP_UNICODE) {
5063 /* must align unicode strings */
5064 *bcc_ptr = 0; /* null byte password */
5069 if (ses->server->sign)
5070 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
5072 if (ses->capabilities & CAP_STATUS32) {
5073 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
5075 if (ses->capabilities & CAP_DFS) {
5076 smb_buffer->Flags2 |= SMBFLG2_DFS;
5078 if (ses->capabilities & CAP_UNICODE) {
5079 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
5081 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
5082 6 /* max utf8 char length in bytes */ *
5083 (/* server len*/ + 256 /* share len */), nls_codepage);
5084 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
5085 bcc_ptr += 2; /* skip trailing null */
5086 } else { /* ASCII */
5087 strcpy(bcc_ptr, tree);
5088 bcc_ptr += strlen(tree) + 1;
5090 strcpy(bcc_ptr, "?????");
5091 bcc_ptr += strlen("?????");
5093 count = bcc_ptr - &pSMB->Password[0];
5094 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
5095 pSMB->hdr.smb_buf_length) + count);
5096 pSMB->ByteCount = cpu_to_le16(count);
5098 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
5101 /* above now done in SendReceive */
5105 tcon->tidStatus = CifsGood;
5106 tcon->need_reconnect = false;
5107 tcon->tid = smb_buffer_response->Tid;
5108 bcc_ptr = pByteArea(smb_buffer_response);
5109 bytes_left = get_bcc(smb_buffer_response);
5110 length = strnlen(bcc_ptr, bytes_left - 2);
5111 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
5117 /* skip service field (NB: this field is always ASCII) */
5119 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
5120 (bcc_ptr[2] == 'C')) {
5121 cifs_dbg(FYI, "IPC connection\n");
5125 } else if (length == 2) {
5126 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
5127 /* the most common case */
5128 cifs_dbg(FYI, "disk share connection\n");
5131 bcc_ptr += length + 1;
5132 bytes_left -= (length + 1);
5133 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
5135 /* mostly informational -- no need to fail on error here */
5136 kfree(tcon->nativeFileSystem);
5137 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
5138 bytes_left, is_unicode,
5141 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
5143 if ((smb_buffer_response->WordCount == 3) ||
5144 (smb_buffer_response->WordCount == 7))
5145 /* field is in same location */
5146 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
5149 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
5152 cifs_buf_release(smb_buffer);
5156 static void delayed_free(struct rcu_head *p)
5158 struct cifs_sb_info *sbi = container_of(p, struct cifs_sb_info, rcu);
5159 unload_nls(sbi->local_nls);
5164 cifs_umount(struct cifs_sb_info *cifs_sb)
5166 struct rb_root *root = &cifs_sb->tlink_tree;
5167 struct rb_node *node;
5168 struct tcon_link *tlink;
5170 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
5172 spin_lock(&cifs_sb->tlink_tree_lock);
5173 while ((node = rb_first(root))) {
5174 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
5175 cifs_get_tlink(tlink);
5176 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
5177 rb_erase(node, root);
5179 spin_unlock(&cifs_sb->tlink_tree_lock);
5180 cifs_put_tlink(tlink);
5181 spin_lock(&cifs_sb->tlink_tree_lock);
5183 spin_unlock(&cifs_sb->tlink_tree_lock);
5185 kfree(cifs_sb->mountdata);
5186 kfree(cifs_sb->prepath);
5187 #ifdef CONFIG_CIFS_DFS_UPCALL
5188 dfs_cache_del_vol(cifs_sb->origin_fullpath);
5189 kfree(cifs_sb->origin_fullpath);
5191 call_rcu(&cifs_sb->rcu, delayed_free);
5195 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
5198 struct TCP_Server_Info *server = ses->server;
5200 if (!server->ops->need_neg || !server->ops->negotiate)
5203 /* only send once per connect */
5204 if (!server->ops->need_neg(server))
5207 rc = server->ops->negotiate(xid, ses);
5209 spin_lock(&GlobalMid_Lock);
5210 if (server->tcpStatus == CifsNeedNegotiate)
5211 server->tcpStatus = CifsGood;
5214 spin_unlock(&GlobalMid_Lock);
5221 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
5222 struct nls_table *nls_info)
5225 struct TCP_Server_Info *server = ses->server;
5227 ses->capabilities = server->capabilities;
5228 if (linuxExtEnabled == 0)
5229 ses->capabilities &= (~server->vals->cap_unix);
5231 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
5232 server->sec_mode, server->capabilities, server->timeAdj);
5234 if (ses->auth_key.response) {
5235 cifs_dbg(FYI, "Free previous auth_key.response = %p\n",
5236 ses->auth_key.response);
5237 kfree(ses->auth_key.response);
5238 ses->auth_key.response = NULL;
5239 ses->auth_key.len = 0;
5242 if (server->ops->sess_setup)
5243 rc = server->ops->sess_setup(xid, ses, nls_info);
5246 cifs_server_dbg(VFS, "Send error in SessSetup = %d\n", rc);
5252 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
5254 vol->sectype = ses->sectype;
5256 /* krb5 is special, since we don't need username or pw */
5257 if (vol->sectype == Kerberos)
5260 return cifs_set_cifscreds(vol, ses);
5263 static struct cifs_tcon *
5264 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
5267 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
5268 struct cifs_ses *ses;
5269 struct cifs_tcon *tcon = NULL;
5270 struct smb_vol *vol_info;
5272 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
5273 if (vol_info == NULL)
5274 return ERR_PTR(-ENOMEM);
5276 vol_info->local_nls = cifs_sb->local_nls;
5277 vol_info->linux_uid = fsuid;
5278 vol_info->cred_uid = fsuid;
5279 vol_info->UNC = master_tcon->treeName;
5280 vol_info->retry = master_tcon->retry;
5281 vol_info->nocase = master_tcon->nocase;
5282 vol_info->nohandlecache = master_tcon->nohandlecache;
5283 vol_info->local_lease = master_tcon->local_lease;
5284 vol_info->no_linux_ext = !master_tcon->unix_ext;
5285 vol_info->sectype = master_tcon->ses->sectype;
5286 vol_info->sign = master_tcon->ses->sign;
5288 rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
5294 /* get a reference for the same TCP session */
5295 spin_lock(&cifs_tcp_ses_lock);
5296 ++master_tcon->ses->server->srv_count;
5297 spin_unlock(&cifs_tcp_ses_lock);
5299 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
5301 tcon = (struct cifs_tcon *)ses;
5302 cifs_put_tcp_session(master_tcon->ses->server, 0);
5306 tcon = cifs_get_tcon(ses, vol_info);
5308 cifs_put_smb_ses(ses);
5312 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
5313 if (tcon->posix_extensions)
5314 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
5317 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
5320 kfree(vol_info->username);
5321 kzfree(vol_info->password);
5328 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
5330 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
5333 /* find and return a tlink with given uid */
5334 static struct tcon_link *
5335 tlink_rb_search(struct rb_root *root, kuid_t uid)
5337 struct rb_node *node = root->rb_node;
5338 struct tcon_link *tlink;
5341 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
5343 if (uid_gt(tlink->tl_uid, uid))
5344 node = node->rb_left;
5345 else if (uid_lt(tlink->tl_uid, uid))
5346 node = node->rb_right;
5353 /* insert a tcon_link into the tree */
5355 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
5357 struct rb_node **new = &(root->rb_node), *parent = NULL;
5358 struct tcon_link *tlink;
5361 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
5364 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
5365 new = &((*new)->rb_left);
5367 new = &((*new)->rb_right);
5370 rb_link_node(&new_tlink->tl_rbnode, parent, new);
5371 rb_insert_color(&new_tlink->tl_rbnode, root);
5375 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
5378 * If the superblock doesn't refer to a multiuser mount, then just return
5379 * the master tcon for the mount.
5381 * First, search the rbtree for an existing tcon for this fsuid. If one
5382 * exists, then check to see if it's pending construction. If it is then wait
5383 * for construction to complete. Once it's no longer pending, check to see if
5384 * it failed and either return an error or retry construction, depending on
5387 * If one doesn't exist then insert a new tcon_link struct into the tree and
5388 * try to construct a new one.
5391 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
5394 kuid_t fsuid = current_fsuid();
5395 struct tcon_link *tlink, *newtlink;
5397 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
5398 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
5400 spin_lock(&cifs_sb->tlink_tree_lock);
5401 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5403 cifs_get_tlink(tlink);
5404 spin_unlock(&cifs_sb->tlink_tree_lock);
5406 if (tlink == NULL) {
5407 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
5408 if (newtlink == NULL)
5409 return ERR_PTR(-ENOMEM);
5410 newtlink->tl_uid = fsuid;
5411 newtlink->tl_tcon = ERR_PTR(-EACCES);
5412 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
5413 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
5414 cifs_get_tlink(newtlink);
5416 spin_lock(&cifs_sb->tlink_tree_lock);
5417 /* was one inserted after previous search? */
5418 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5420 cifs_get_tlink(tlink);
5421 spin_unlock(&cifs_sb->tlink_tree_lock);
5423 goto wait_for_construction;
5426 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
5427 spin_unlock(&cifs_sb->tlink_tree_lock);
5429 wait_for_construction:
5430 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
5431 TASK_INTERRUPTIBLE);
5433 cifs_put_tlink(tlink);
5434 return ERR_PTR(-ERESTARTSYS);
5437 /* if it's good, return it */
5438 if (!IS_ERR(tlink->tl_tcon))
5441 /* return error if we tried this already recently */
5442 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
5443 cifs_put_tlink(tlink);
5444 return ERR_PTR(-EACCES);
5447 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
5448 goto wait_for_construction;
5451 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
5452 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
5453 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
5455 if (IS_ERR(tlink->tl_tcon)) {
5456 cifs_put_tlink(tlink);
5457 return ERR_PTR(-EACCES);
5464 * periodic workqueue job that scans tcon_tree for a superblock and closes
5468 cifs_prune_tlinks(struct work_struct *work)
5470 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
5472 struct rb_root *root = &cifs_sb->tlink_tree;
5473 struct rb_node *node;
5474 struct rb_node *tmp;
5475 struct tcon_link *tlink;
5478 * Because we drop the spinlock in the loop in order to put the tlink
5479 * it's not guarded against removal of links from the tree. The only
5480 * places that remove entries from the tree are this function and
5481 * umounts. Because this function is non-reentrant and is canceled
5482 * before umount can proceed, this is safe.
5484 spin_lock(&cifs_sb->tlink_tree_lock);
5485 node = rb_first(root);
5486 while (node != NULL) {
5488 node = rb_next(tmp);
5489 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
5491 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
5492 atomic_read(&tlink->tl_count) != 0 ||
5493 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
5496 cifs_get_tlink(tlink);
5497 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
5498 rb_erase(tmp, root);
5500 spin_unlock(&cifs_sb->tlink_tree_lock);
5501 cifs_put_tlink(tlink);
5502 spin_lock(&cifs_sb->tlink_tree_lock);
5504 spin_unlock(&cifs_sb->tlink_tree_lock);
5506 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,