4 * Copyright (C) International Business Machines Corp., 2002,2011
5 * Author(s): Steve French (sfrench@us.ibm.com)
7 * This library is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser General Public License as published
9 * by the Free Software Foundation; either version 2.1 of the License, or
10 * (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
15 * the GNU Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include <linux/net.h>
23 #include <linux/string.h>
24 #include <linux/sched/signal.h>
25 #include <linux/list.h>
26 #include <linux/wait.h>
27 #include <linux/slab.h>
28 #include <linux/pagemap.h>
29 #include <linux/ctype.h>
30 #include <linux/utsname.h>
31 #include <linux/mempool.h>
32 #include <linux/delay.h>
33 #include <linux/completion.h>
34 #include <linux/kthread.h>
35 #include <linux/pagevec.h>
36 #include <linux/freezer.h>
37 #include <linux/namei.h>
38 #include <linux/uuid.h>
39 #include <linux/uaccess.h>
40 #include <asm/processor.h>
41 #include <linux/inet.h>
42 #include <linux/module.h>
43 #include <keys/user-type.h>
45 #include <linux/parser.h>
46 #include <linux/bvec.h>
49 #include "cifsproto.h"
50 #include "cifs_unicode.h"
51 #include "cifs_debug.h"
52 #include "cifs_fs_sb.h"
55 #include "rfc1002pdu.h"
57 #include "smb2proto.h"
58 #include "smbdirect.h"
59 #include "dns_resolve.h"
61 #ifdef CONFIG_CIFS_DFS_UPCALL
62 #include "dfs_cache.h"
65 extern mempool_t *cifs_req_poolp;
66 extern bool disable_legacy_dialects;
68 /* FIXME: should these be tunable? */
69 #define TLINK_ERROR_EXPIRE (1 * HZ)
70 #define TLINK_IDLE_EXPIRE (600 * HZ)
73 /* Mount options that take no arguments */
74 Opt_user_xattr, Opt_nouser_xattr,
75 Opt_forceuid, Opt_noforceuid,
76 Opt_forcegid, Opt_noforcegid,
77 Opt_noblocksend, Opt_noautotune, Opt_nolease,
78 Opt_hard, Opt_soft, Opt_perm, Opt_noperm,
79 Opt_mapposix, Opt_nomapposix,
80 Opt_mapchars, Opt_nomapchars, Opt_sfu,
81 Opt_nosfu, Opt_nodfs, Opt_posixpaths,
82 Opt_noposixpaths, Opt_nounix, Opt_unix,
85 Opt_handlecache, Opt_nohandlecache,
86 Opt_forcemandatorylock, Opt_setuidfromacl, Opt_setuids,
87 Opt_nosetuids, Opt_dynperm, Opt_nodynperm,
88 Opt_nohard, Opt_nosoft,
90 Opt_nostrictsync, Opt_strictsync,
91 Opt_serverino, Opt_noserverino,
92 Opt_rwpidforward, Opt_cifsacl, Opt_nocifsacl,
93 Opt_acl, Opt_noacl, Opt_locallease,
94 Opt_sign, Opt_ignore_signature, Opt_seal, Opt_noac,
95 Opt_fsc, Opt_mfsymlinks,
96 Opt_multiuser, Opt_sloppy, Opt_nosharesock,
97 Opt_persistent, Opt_nopersistent,
98 Opt_resilient, Opt_noresilient,
99 Opt_domainauto, Opt_rdma, Opt_modesid, Opt_rootfs,
102 /* Mount options which take numeric value */
103 Opt_backupuid, Opt_backupgid, Opt_uid,
104 Opt_cruid, Opt_gid, Opt_file_mode,
105 Opt_dirmode, Opt_port,
107 Opt_blocksize, Opt_rsize, Opt_wsize, Opt_actimeo,
108 Opt_echo_interval, Opt_max_credits, Opt_handletimeout,
111 /* Mount options which take string value */
112 Opt_user, Opt_pass, Opt_ip,
113 Opt_domain, Opt_srcaddr, Opt_iocharset,
114 Opt_netbiosname, Opt_servern,
115 Opt_ver, Opt_vers, Opt_sec, Opt_cache,
117 /* Mount options to be ignored */
120 /* Options which could be blank */
128 static const match_table_t cifs_mount_option_tokens = {
130 { Opt_user_xattr, "user_xattr" },
131 { Opt_nouser_xattr, "nouser_xattr" },
132 { Opt_forceuid, "forceuid" },
133 { Opt_noforceuid, "noforceuid" },
134 { Opt_forcegid, "forcegid" },
135 { Opt_noforcegid, "noforcegid" },
136 { Opt_noblocksend, "noblocksend" },
137 { Opt_noautotune, "noautotune" },
138 { Opt_nolease, "nolease" },
139 { Opt_hard, "hard" },
140 { Opt_soft, "soft" },
141 { Opt_perm, "perm" },
142 { Opt_noperm, "noperm" },
143 { Opt_mapchars, "mapchars" }, /* SFU style */
144 { Opt_nomapchars, "nomapchars" },
145 { Opt_mapposix, "mapposix" }, /* SFM style */
146 { Opt_nomapposix, "nomapposix" },
148 { Opt_nosfu, "nosfu" },
149 { Opt_nodfs, "nodfs" },
150 { Opt_posixpaths, "posixpaths" },
151 { Opt_noposixpaths, "noposixpaths" },
152 { Opt_nounix, "nounix" },
153 { Opt_nounix, "nolinux" },
154 { Opt_nounix, "noposix" },
155 { Opt_unix, "unix" },
156 { Opt_unix, "linux" },
157 { Opt_unix, "posix" },
158 { Opt_nocase, "nocase" },
159 { Opt_nocase, "ignorecase" },
161 { Opt_nobrl, "nobrl" },
162 { Opt_handlecache, "handlecache" },
163 { Opt_nohandlecache, "nohandlecache" },
164 { Opt_nobrl, "nolock" },
165 { Opt_forcemandatorylock, "forcemandatorylock" },
166 { Opt_forcemandatorylock, "forcemand" },
167 { Opt_setuids, "setuids" },
168 { Opt_nosetuids, "nosetuids" },
169 { Opt_setuidfromacl, "idsfromsid" },
170 { Opt_dynperm, "dynperm" },
171 { Opt_nodynperm, "nodynperm" },
172 { Opt_nohard, "nohard" },
173 { Opt_nosoft, "nosoft" },
174 { Opt_nointr, "nointr" },
175 { Opt_intr, "intr" },
176 { Opt_nostrictsync, "nostrictsync" },
177 { Opt_strictsync, "strictsync" },
178 { Opt_serverino, "serverino" },
179 { Opt_noserverino, "noserverino" },
180 { Opt_rwpidforward, "rwpidforward" },
181 { Opt_modesid, "modefromsid" },
182 { Opt_cifsacl, "cifsacl" },
183 { Opt_nocifsacl, "nocifsacl" },
185 { Opt_noacl, "noacl" },
186 { Opt_locallease, "locallease" },
187 { Opt_sign, "sign" },
188 { Opt_ignore_signature, "signloosely" },
189 { Opt_seal, "seal" },
190 { Opt_noac, "noac" },
192 { Opt_mfsymlinks, "mfsymlinks" },
193 { Opt_multiuser, "multiuser" },
194 { Opt_sloppy, "sloppy" },
195 { Opt_nosharesock, "nosharesock" },
196 { Opt_persistent, "persistenthandles"},
197 { Opt_nopersistent, "nopersistenthandles"},
198 { Opt_resilient, "resilienthandles"},
199 { Opt_noresilient, "noresilienthandles"},
200 { Opt_domainauto, "domainauto"},
203 { Opt_backupuid, "backupuid=%s" },
204 { Opt_backupgid, "backupgid=%s" },
205 { Opt_uid, "uid=%s" },
206 { Opt_cruid, "cruid=%s" },
207 { Opt_gid, "gid=%s" },
208 { Opt_file_mode, "file_mode=%s" },
209 { Opt_dirmode, "dirmode=%s" },
210 { Opt_dirmode, "dir_mode=%s" },
211 { Opt_port, "port=%s" },
212 { Opt_min_enc_offload, "esize=%s" },
213 { Opt_blocksize, "bsize=%s" },
214 { Opt_rsize, "rsize=%s" },
215 { Opt_wsize, "wsize=%s" },
216 { Opt_actimeo, "actimeo=%s" },
217 { Opt_handletimeout, "handletimeout=%s" },
218 { Opt_echo_interval, "echo_interval=%s" },
219 { Opt_max_credits, "max_credits=%s" },
220 { Opt_snapshot, "snapshot=%s" },
221 { Opt_compress, "compress=%s" },
223 { Opt_blank_user, "user=" },
224 { Opt_blank_user, "username=" },
225 { Opt_user, "user=%s" },
226 { Opt_user, "username=%s" },
227 { Opt_blank_pass, "pass=" },
228 { Opt_blank_pass, "password=" },
229 { Opt_pass, "pass=%s" },
230 { Opt_pass, "password=%s" },
231 { Opt_blank_ip, "ip=" },
232 { Opt_blank_ip, "addr=" },
234 { Opt_ip, "addr=%s" },
235 { Opt_ignore, "unc=%s" },
236 { Opt_ignore, "target=%s" },
237 { Opt_ignore, "path=%s" },
238 { Opt_domain, "dom=%s" },
239 { Opt_domain, "domain=%s" },
240 { Opt_domain, "workgroup=%s" },
241 { Opt_srcaddr, "srcaddr=%s" },
242 { Opt_ignore, "prefixpath=%s" },
243 { Opt_iocharset, "iocharset=%s" },
244 { Opt_netbiosname, "netbiosname=%s" },
245 { Opt_servern, "servern=%s" },
246 { Opt_ver, "ver=%s" },
247 { Opt_vers, "vers=%s" },
248 { Opt_sec, "sec=%s" },
249 { Opt_cache, "cache=%s" },
251 { Opt_ignore, "cred" },
252 { Opt_ignore, "credentials" },
253 { Opt_ignore, "cred=%s" },
254 { Opt_ignore, "credentials=%s" },
255 { Opt_ignore, "guest" },
256 { Opt_ignore, "rw" },
257 { Opt_ignore, "ro" },
258 { Opt_ignore, "suid" },
259 { Opt_ignore, "nosuid" },
260 { Opt_ignore, "exec" },
261 { Opt_ignore, "noexec" },
262 { Opt_ignore, "nodev" },
263 { Opt_ignore, "noauto" },
264 { Opt_ignore, "dev" },
265 { Opt_ignore, "mand" },
266 { Opt_ignore, "nomand" },
267 { Opt_ignore, "relatime" },
268 { Opt_ignore, "_netdev" },
269 { Opt_rootfs, "rootfs" },
275 Opt_sec_krb5, Opt_sec_krb5i, Opt_sec_krb5p,
276 Opt_sec_ntlmsspi, Opt_sec_ntlmssp,
277 Opt_ntlm, Opt_sec_ntlmi, Opt_sec_ntlmv2,
278 Opt_sec_ntlmv2i, Opt_sec_lanman,
284 static const match_table_t cifs_secflavor_tokens = {
285 { Opt_sec_krb5, "krb5" },
286 { Opt_sec_krb5i, "krb5i" },
287 { Opt_sec_krb5p, "krb5p" },
288 { Opt_sec_ntlmsspi, "ntlmsspi" },
289 { Opt_sec_ntlmssp, "ntlmssp" },
290 { Opt_ntlm, "ntlm" },
291 { Opt_sec_ntlmi, "ntlmi" },
292 { Opt_sec_ntlmv2, "nontlm" },
293 { Opt_sec_ntlmv2, "ntlmv2" },
294 { Opt_sec_ntlmv2i, "ntlmv2i" },
295 { Opt_sec_lanman, "lanman" },
296 { Opt_sec_none, "none" },
298 { Opt_sec_err, NULL }
311 static const match_table_t cifs_cacheflavor_tokens = {
312 { Opt_cache_loose, "loose" },
313 { Opt_cache_strict, "strict" },
314 { Opt_cache_none, "none" },
315 { Opt_cache_ro, "ro" },
316 { Opt_cache_rw, "singleclient" },
317 { Opt_cache_err, NULL }
320 static const match_table_t cifs_smb_version_tokens = {
321 { Smb_1, SMB1_VERSION_STRING },
322 { Smb_20, SMB20_VERSION_STRING},
323 { Smb_21, SMB21_VERSION_STRING },
324 { Smb_30, SMB30_VERSION_STRING },
325 { Smb_302, SMB302_VERSION_STRING },
326 { Smb_302, ALT_SMB302_VERSION_STRING },
327 { Smb_311, SMB311_VERSION_STRING },
328 { Smb_311, ALT_SMB311_VERSION_STRING },
329 { Smb_3any, SMB3ANY_VERSION_STRING },
330 { Smb_default, SMBDEFAULT_VERSION_STRING },
331 { Smb_version_err, NULL }
334 static int ip_connect(struct TCP_Server_Info *server);
335 static int generic_ip_connect(struct TCP_Server_Info *server);
336 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
337 static void cifs_prune_tlinks(struct work_struct *work);
338 static char *extract_hostname(const char *unc);
341 * Resolve hostname and set ip addr in tcp ses. Useful for hostnames that may
342 * get their ip addresses changed at some point.
344 * This should be called with server->srv_mutex held.
346 #ifdef CONFIG_CIFS_DFS_UPCALL
347 static int reconn_set_ipaddr(struct TCP_Server_Info *server)
351 char *unc, *ipaddr = NULL;
353 if (!server->hostname)
356 len = strlen(server->hostname) + 3;
358 unc = kmalloc(len, GFP_KERNEL);
360 cifs_dbg(FYI, "%s: failed to create UNC path\n", __func__);
363 scnprintf(unc, len, "\\\\%s", server->hostname);
365 rc = dns_resolve_server_name_to_ip(unc, &ipaddr);
369 cifs_dbg(FYI, "%s: failed to resolve server part of %s to IP: %d\n",
370 __func__, server->hostname, rc);
374 rc = cifs_convert_address((struct sockaddr *)&server->dstaddr, ipaddr,
381 static inline int reconn_set_ipaddr(struct TCP_Server_Info *server)
387 #ifdef CONFIG_CIFS_DFS_UPCALL
388 struct super_cb_data {
389 struct TCP_Server_Info *server;
390 struct super_block *sb;
393 /* These functions must be called with server->srv_mutex held */
395 static void super_cb(struct super_block *sb, void *arg)
397 struct super_cb_data *d = arg;
398 struct cifs_sb_info *cifs_sb;
399 struct cifs_tcon *tcon;
404 cifs_sb = CIFS_SB(sb);
405 tcon = cifs_sb_master_tcon(cifs_sb);
406 if (tcon->ses->server == d->server)
410 static struct super_block *get_tcp_super(struct TCP_Server_Info *server)
412 struct super_cb_data d = {
417 iterate_supers_type(&cifs_fs_type, super_cb, &d);
420 return ERR_PTR(-ENOENT);
422 * Grab an active reference in order to prevent automounts (DFS links)
423 * of expiring and then freeing up our cifs superblock pointer while
424 * we're doing failover.
426 cifs_sb_active(d.sb);
430 static inline void put_tcp_super(struct super_block *sb)
432 if (!IS_ERR_OR_NULL(sb))
433 cifs_sb_deactive(sb);
436 static void reconn_inval_dfs_target(struct TCP_Server_Info *server,
437 struct cifs_sb_info *cifs_sb,
438 struct dfs_cache_tgt_list *tgt_list,
439 struct dfs_cache_tgt_iterator **tgt_it)
443 if (!cifs_sb || !cifs_sb->origin_fullpath || !tgt_list ||
448 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
450 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
452 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
455 cifs_dbg(FYI, "%s: UNC: %s\n", __func__, cifs_sb->origin_fullpath);
457 name = dfs_cache_get_tgt_name(*tgt_it);
459 kfree(server->hostname);
461 server->hostname = extract_hostname(name);
462 if (IS_ERR(server->hostname)) {
464 "%s: failed to extract hostname from target: %ld\n",
465 __func__, PTR_ERR(server->hostname));
469 static inline int reconn_setup_dfs_targets(struct cifs_sb_info *cifs_sb,
470 struct dfs_cache_tgt_list *tl,
471 struct dfs_cache_tgt_iterator **it)
473 if (!cifs_sb->origin_fullpath)
475 return dfs_cache_noreq_find(cifs_sb->origin_fullpath + 1, NULL, tl);
480 * cifs tcp session reconnection
482 * mark tcp session as reconnecting so temporarily locked
483 * mark all smb sessions as reconnecting for tcp session
484 * reconnect tcp session
485 * wake up waiters on reconnection? - (not needed currently)
488 cifs_reconnect(struct TCP_Server_Info *server)
491 struct list_head *tmp, *tmp2;
492 struct cifs_ses *ses;
493 struct cifs_tcon *tcon;
494 struct mid_q_entry *mid_entry;
495 struct list_head retry_list;
496 #ifdef CONFIG_CIFS_DFS_UPCALL
497 struct super_block *sb = NULL;
498 struct cifs_sb_info *cifs_sb = NULL;
499 struct dfs_cache_tgt_list tgt_list = {0};
500 struct dfs_cache_tgt_iterator *tgt_it = NULL;
503 spin_lock(&GlobalMid_Lock);
504 server->nr_targets = 1;
505 #ifdef CONFIG_CIFS_DFS_UPCALL
506 spin_unlock(&GlobalMid_Lock);
507 sb = get_tcp_super(server);
510 cifs_dbg(FYI, "%s: will not do DFS failover: rc = %d\n",
514 cifs_sb = CIFS_SB(sb);
516 rc = reconn_setup_dfs_targets(cifs_sb, &tgt_list, &tgt_it);
517 if (rc && (rc != -EOPNOTSUPP)) {
518 cifs_server_dbg(VFS, "%s: no target servers for DFS failover\n",
521 server->nr_targets = dfs_cache_get_nr_tgts(&tgt_list);
524 cifs_dbg(FYI, "%s: will retry %d target(s)\n", __func__,
526 spin_lock(&GlobalMid_Lock);
528 if (server->tcpStatus == CifsExiting) {
529 /* the demux thread will exit normally
530 next time through the loop */
531 spin_unlock(&GlobalMid_Lock);
532 #ifdef CONFIG_CIFS_DFS_UPCALL
533 dfs_cache_free_tgts(&tgt_list);
538 server->tcpStatus = CifsNeedReconnect;
539 spin_unlock(&GlobalMid_Lock);
541 server->max_read = 0;
543 cifs_dbg(FYI, "Mark tcp session as need reconnect\n");
544 trace_smb3_reconnect(server->CurrentMid, server->hostname);
546 /* before reconnecting the tcp session, mark the smb session (uid)
547 and the tid bad so they are not used until reconnected */
548 cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
550 spin_lock(&cifs_tcp_ses_lock);
551 list_for_each(tmp, &server->smb_ses_list) {
552 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
553 ses->need_reconnect = true;
554 list_for_each(tmp2, &ses->tcon_list) {
555 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
556 tcon->need_reconnect = true;
559 ses->tcon_ipc->need_reconnect = true;
561 spin_unlock(&cifs_tcp_ses_lock);
563 /* do not want to be sending data on a socket we are freeing */
564 cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
565 mutex_lock(&server->srv_mutex);
566 if (server->ssocket) {
567 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
568 server->ssocket->state, server->ssocket->flags);
569 kernel_sock_shutdown(server->ssocket, SHUT_WR);
570 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
571 server->ssocket->state, server->ssocket->flags);
572 sock_release(server->ssocket);
573 server->ssocket = NULL;
575 server->sequence_number = 0;
576 server->session_estab = false;
577 kfree(server->session_key.response);
578 server->session_key.response = NULL;
579 server->session_key.len = 0;
580 server->lstrp = jiffies;
582 /* mark submitted MIDs for retry and issue callback */
583 INIT_LIST_HEAD(&retry_list);
584 cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
585 spin_lock(&GlobalMid_Lock);
586 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
587 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
588 kref_get(&mid_entry->refcount);
589 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
590 mid_entry->mid_state = MID_RETRY_NEEDED;
591 list_move(&mid_entry->qhead, &retry_list);
592 mid_entry->mid_flags |= MID_DELETED;
594 spin_unlock(&GlobalMid_Lock);
595 mutex_unlock(&server->srv_mutex);
597 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
598 list_for_each_safe(tmp, tmp2, &retry_list) {
599 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
600 list_del_init(&mid_entry->qhead);
601 mid_entry->callback(mid_entry);
602 cifs_mid_q_entry_release(mid_entry);
605 if (cifs_rdma_enabled(server)) {
606 mutex_lock(&server->srv_mutex);
607 smbd_destroy(server);
608 mutex_unlock(&server->srv_mutex);
614 mutex_lock(&server->srv_mutex);
616 * Set up next DFS target server (if any) for reconnect. If DFS
617 * feature is disabled, then we will retry last server we
618 * connected to before.
620 if (cifs_rdma_enabled(server))
621 rc = smbd_reconnect(server);
623 rc = generic_ip_connect(server);
625 cifs_dbg(FYI, "reconnect error %d\n", rc);
626 #ifdef CONFIG_CIFS_DFS_UPCALL
627 reconn_inval_dfs_target(server, cifs_sb, &tgt_list,
630 rc = reconn_set_ipaddr(server);
632 cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
635 mutex_unlock(&server->srv_mutex);
638 atomic_inc(&tcpSesReconnectCount);
639 set_credits(server, 1);
640 spin_lock(&GlobalMid_Lock);
641 if (server->tcpStatus != CifsExiting)
642 server->tcpStatus = CifsNeedNegotiate;
643 spin_unlock(&GlobalMid_Lock);
644 mutex_unlock(&server->srv_mutex);
646 } while (server->tcpStatus == CifsNeedReconnect);
648 #ifdef CONFIG_CIFS_DFS_UPCALL
650 rc = dfs_cache_noreq_update_tgthint(cifs_sb->origin_fullpath + 1,
653 cifs_server_dbg(VFS, "%s: failed to update DFS target hint: rc = %d\n",
656 rc = dfs_cache_update_vol(cifs_sb->origin_fullpath, server);
658 cifs_server_dbg(VFS, "%s: failed to update vol info in DFS cache: rc = %d\n",
661 dfs_cache_free_tgts(&tgt_list);
667 if (server->tcpStatus == CifsNeedNegotiate)
668 mod_delayed_work(cifsiod_wq, &server->echo, 0);
674 cifs_echo_request(struct work_struct *work)
677 struct TCP_Server_Info *server = container_of(work,
678 struct TCP_Server_Info, echo.work);
679 unsigned long echo_interval;
682 * If we need to renegotiate, set echo interval to zero to
683 * immediately call echo service where we can renegotiate.
685 if (server->tcpStatus == CifsNeedNegotiate)
688 echo_interval = server->echo_interval;
691 * We cannot send an echo if it is disabled.
692 * Also, no need to ping if we got a response recently.
695 if (server->tcpStatus == CifsNeedReconnect ||
696 server->tcpStatus == CifsExiting ||
697 server->tcpStatus == CifsNew ||
698 (server->ops->can_echo && !server->ops->can_echo(server)) ||
699 time_before(jiffies, server->lstrp + echo_interval - HZ))
702 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
704 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
708 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
712 allocate_buffers(struct TCP_Server_Info *server)
714 if (!server->bigbuf) {
715 server->bigbuf = (char *)cifs_buf_get();
716 if (!server->bigbuf) {
717 cifs_server_dbg(VFS, "No memory for large SMB response\n");
719 /* retry will check if exiting */
722 } else if (server->large_buf) {
723 /* we are reusing a dirty large buf, clear its start */
724 memset(server->bigbuf, 0, HEADER_SIZE(server));
727 if (!server->smallbuf) {
728 server->smallbuf = (char *)cifs_small_buf_get();
729 if (!server->smallbuf) {
730 cifs_server_dbg(VFS, "No memory for SMB response\n");
732 /* retry will check if exiting */
735 /* beginning of smb buffer is cleared in our buf_get */
737 /* if existing small buf clear beginning */
738 memset(server->smallbuf, 0, HEADER_SIZE(server));
745 server_unresponsive(struct TCP_Server_Info *server)
748 * We need to wait 3 echo intervals to make sure we handle such
750 * 1s client sends a normal SMB request
751 * 2s client gets a response
752 * 30s echo workqueue job pops, and decides we got a response recently
753 * and don't need to send another
755 * 65s kernel_recvmsg times out, and we see that we haven't gotten
756 * a response in >60s.
758 if ((server->tcpStatus == CifsGood ||
759 server->tcpStatus == CifsNeedNegotiate) &&
760 time_after(jiffies, server->lstrp + 3 * server->echo_interval)) {
761 cifs_server_dbg(VFS, "has not responded in %lu seconds. Reconnecting...\n",
762 (3 * server->echo_interval) / HZ);
763 cifs_reconnect(server);
764 wake_up(&server->response_q);
772 zero_credits(struct TCP_Server_Info *server)
776 spin_lock(&server->req_lock);
777 val = server->credits + server->echo_credits + server->oplock_credits;
778 if (server->in_flight == 0 && val == 0) {
779 spin_unlock(&server->req_lock);
782 spin_unlock(&server->req_lock);
787 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
792 smb_msg->msg_control = NULL;
793 smb_msg->msg_controllen = 0;
795 for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
798 /* reconnect if no credits and no requests in flight */
799 if (zero_credits(server)) {
800 cifs_reconnect(server);
801 return -ECONNABORTED;
804 if (server_unresponsive(server))
805 return -ECONNABORTED;
806 if (cifs_rdma_enabled(server) && server->smbd_conn)
807 length = smbd_recv(server->smbd_conn, smb_msg);
809 length = sock_recvmsg(server->ssocket, smb_msg, 0);
811 if (server->tcpStatus == CifsExiting)
814 if (server->tcpStatus == CifsNeedReconnect) {
815 cifs_reconnect(server);
816 return -ECONNABORTED;
819 if (length == -ERESTARTSYS ||
823 * Minimum sleep to prevent looping, allowing socket
824 * to clear and app threads to set tcpStatus
825 * CifsNeedReconnect if server hung.
827 usleep_range(1000, 2000);
833 cifs_dbg(FYI, "Received no data or error: %d\n", length);
834 cifs_reconnect(server);
835 return -ECONNABORTED;
842 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
843 unsigned int to_read)
845 struct msghdr smb_msg;
846 struct kvec iov = {.iov_base = buf, .iov_len = to_read};
847 iov_iter_kvec(&smb_msg.msg_iter, READ, &iov, 1, to_read);
849 return cifs_readv_from_socket(server, &smb_msg);
853 cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
854 unsigned int page_offset, unsigned int to_read)
856 struct msghdr smb_msg;
857 struct bio_vec bv = {
858 .bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
859 iov_iter_bvec(&smb_msg.msg_iter, READ, &bv, 1, to_read);
860 return cifs_readv_from_socket(server, &smb_msg);
864 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
867 * The first byte big endian of the length field,
868 * is actually not part of the length but the type
869 * with the most common, zero, as regular data.
872 case RFC1002_SESSION_MESSAGE:
873 /* Regular SMB response */
875 case RFC1002_SESSION_KEEP_ALIVE:
876 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
878 case RFC1002_POSITIVE_SESSION_RESPONSE:
879 cifs_dbg(FYI, "RFC 1002 positive session response\n");
881 case RFC1002_NEGATIVE_SESSION_RESPONSE:
883 * We get this from Windows 98 instead of an error on
884 * SMB negprot response.
886 cifs_dbg(FYI, "RFC 1002 negative session response\n");
887 /* give server a second to clean up */
890 * Always try 445 first on reconnect since we get NACK
891 * on some if we ever connected to port 139 (the NACK
892 * is since we do not begin with RFC1001 session
895 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
896 cifs_reconnect(server);
897 wake_up(&server->response_q);
900 cifs_server_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
901 cifs_reconnect(server);
908 dequeue_mid(struct mid_q_entry *mid, bool malformed)
910 #ifdef CONFIG_CIFS_STATS2
911 mid->when_received = jiffies;
913 spin_lock(&GlobalMid_Lock);
915 mid->mid_state = MID_RESPONSE_RECEIVED;
917 mid->mid_state = MID_RESPONSE_MALFORMED;
919 * Trying to handle/dequeue a mid after the send_recv()
920 * function has finished processing it is a bug.
922 if (mid->mid_flags & MID_DELETED)
923 printk_once(KERN_WARNING
924 "trying to dequeue a deleted mid\n");
926 list_del_init(&mid->qhead);
927 mid->mid_flags |= MID_DELETED;
929 spin_unlock(&GlobalMid_Lock);
933 smb2_get_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
935 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
938 * SMB1 does not use credits.
940 if (server->vals->header_preamble_size)
943 return le16_to_cpu(shdr->CreditRequest);
947 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
948 char *buf, int malformed)
950 if (server->ops->check_trans2 &&
951 server->ops->check_trans2(mid, server, buf, malformed))
953 mid->credits_received = smb2_get_credits_from_hdr(buf, server);
955 mid->large_buf = server->large_buf;
956 /* Was previous buf put in mpx struct for multi-rsp? */
957 if (!mid->multiRsp) {
958 /* smb buffer will be freed by user thread */
959 if (server->large_buf)
960 server->bigbuf = NULL;
962 server->smallbuf = NULL;
964 dequeue_mid(mid, malformed);
967 static void clean_demultiplex_info(struct TCP_Server_Info *server)
971 /* take it off the list, if it's not already */
972 spin_lock(&cifs_tcp_ses_lock);
973 list_del_init(&server->tcp_ses_list);
974 spin_unlock(&cifs_tcp_ses_lock);
976 spin_lock(&GlobalMid_Lock);
977 server->tcpStatus = CifsExiting;
978 spin_unlock(&GlobalMid_Lock);
979 wake_up_all(&server->response_q);
981 /* check if we have blocked requests that need to free */
982 spin_lock(&server->req_lock);
983 if (server->credits <= 0)
985 spin_unlock(&server->req_lock);
987 * Although there should not be any requests blocked on this queue it
988 * can not hurt to be paranoid and try to wake up requests that may
989 * haven been blocked when more than 50 at time were on the wire to the
990 * same server - they now will see the session is in exit state and get
991 * out of SendReceive.
993 wake_up_all(&server->request_q);
994 /* give those requests time to exit */
996 if (cifs_rdma_enabled(server))
997 smbd_destroy(server);
998 if (server->ssocket) {
999 sock_release(server->ssocket);
1000 server->ssocket = NULL;
1003 if (!list_empty(&server->pending_mid_q)) {
1004 struct list_head dispose_list;
1005 struct mid_q_entry *mid_entry;
1006 struct list_head *tmp, *tmp2;
1008 INIT_LIST_HEAD(&dispose_list);
1009 spin_lock(&GlobalMid_Lock);
1010 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
1011 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
1012 cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
1013 kref_get(&mid_entry->refcount);
1014 mid_entry->mid_state = MID_SHUTDOWN;
1015 list_move(&mid_entry->qhead, &dispose_list);
1016 mid_entry->mid_flags |= MID_DELETED;
1018 spin_unlock(&GlobalMid_Lock);
1020 /* now walk dispose list and issue callbacks */
1021 list_for_each_safe(tmp, tmp2, &dispose_list) {
1022 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
1023 cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
1024 list_del_init(&mid_entry->qhead);
1025 mid_entry->callback(mid_entry);
1026 cifs_mid_q_entry_release(mid_entry);
1028 /* 1/8th of sec is more than enough time for them to exit */
1032 if (!list_empty(&server->pending_mid_q)) {
1034 * mpx threads have not exited yet give them at least the smb
1035 * send timeout time for long ops.
1037 * Due to delays on oplock break requests, we need to wait at
1038 * least 45 seconds before giving up on a request getting a
1039 * response and going ahead and killing cifsd.
1041 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
1044 * If threads still have not exited they are probably never
1045 * coming home not much else we can do but free the memory.
1049 kfree(server->hostname);
1052 length = atomic_dec_return(&tcpSesAllocCount);
1054 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
1058 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1061 char *buf = server->smallbuf;
1062 unsigned int pdu_length = server->pdu_size;
1064 /* make sure this will fit in a large buffer */
1065 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
1066 server->vals->header_preamble_size) {
1067 cifs_server_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
1068 cifs_reconnect(server);
1069 wake_up(&server->response_q);
1070 return -ECONNABORTED;
1073 /* switch to large buffer if too big for a small one */
1074 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
1075 server->large_buf = true;
1076 memcpy(server->bigbuf, buf, server->total_read);
1077 buf = server->bigbuf;
1080 /* now read the rest */
1081 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
1082 pdu_length - HEADER_SIZE(server) + 1
1083 + server->vals->header_preamble_size);
1087 server->total_read += length;
1089 dump_smb(buf, server->total_read);
1091 return cifs_handle_standard(server, mid);
1095 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1097 char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
1101 * We know that we received enough to get to the MID as we
1102 * checked the pdu_length earlier. Now check to see
1103 * if the rest of the header is OK. We borrow the length
1104 * var for the rest of the loop to avoid a new stack var.
1106 * 48 bytes is enough to display the header and a little bit
1107 * into the payload for debugging purposes.
1109 length = server->ops->check_message(buf, server->total_read, server);
1111 cifs_dump_mem("Bad SMB: ", buf,
1112 min_t(unsigned int, server->total_read, 48));
1114 if (server->ops->is_session_expired &&
1115 server->ops->is_session_expired(buf)) {
1116 cifs_reconnect(server);
1117 wake_up(&server->response_q);
1121 if (server->ops->is_status_pending &&
1122 server->ops->is_status_pending(buf, server))
1128 handle_mid(mid, server, buf, length);
1133 smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
1135 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
1138 * SMB1 does not use credits.
1140 if (server->vals->header_preamble_size)
1143 if (shdr->CreditRequest) {
1144 spin_lock(&server->req_lock);
1145 server->credits += le16_to_cpu(shdr->CreditRequest);
1146 spin_unlock(&server->req_lock);
1147 wake_up(&server->request_q);
1153 cifs_demultiplex_thread(void *p)
1155 int i, num_mids, length;
1156 struct TCP_Server_Info *server = p;
1157 unsigned int pdu_length;
1158 unsigned int next_offset;
1160 struct task_struct *task_to_wake = NULL;
1161 struct mid_q_entry *mids[MAX_COMPOUND];
1162 char *bufs[MAX_COMPOUND];
1164 current->flags |= PF_MEMALLOC;
1165 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
1167 length = atomic_inc_return(&tcpSesAllocCount);
1169 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
1172 allow_kernel_signal(SIGKILL);
1173 while (server->tcpStatus != CifsExiting) {
1174 if (try_to_freeze())
1177 if (!allocate_buffers(server))
1180 server->large_buf = false;
1181 buf = server->smallbuf;
1182 pdu_length = 4; /* enough to get RFC1001 header */
1184 length = cifs_read_from_socket(server, buf, pdu_length);
1188 if (server->vals->header_preamble_size == 0)
1189 server->total_read = 0;
1191 server->total_read = length;
1194 * The right amount was read from socket - 4 bytes,
1195 * so we can now interpret the length field.
1197 pdu_length = get_rfc1002_length(buf);
1199 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
1200 if (!is_smb_response(server, buf[0]))
1203 server->pdu_size = pdu_length;
1205 /* make sure we have enough to get to the MID */
1206 if (server->pdu_size < HEADER_SIZE(server) - 1 -
1207 server->vals->header_preamble_size) {
1208 cifs_server_dbg(VFS, "SMB response too short (%u bytes)\n",
1210 cifs_reconnect(server);
1211 wake_up(&server->response_q);
1215 /* read down to the MID */
1216 length = cifs_read_from_socket(server,
1217 buf + server->vals->header_preamble_size,
1218 HEADER_SIZE(server) - 1
1219 - server->vals->header_preamble_size);
1222 server->total_read += length;
1224 if (server->ops->next_header) {
1225 next_offset = server->ops->next_header(buf);
1227 server->pdu_size = next_offset;
1230 memset(mids, 0, sizeof(mids));
1231 memset(bufs, 0, sizeof(bufs));
1234 if (server->ops->is_transform_hdr &&
1235 server->ops->receive_transform &&
1236 server->ops->is_transform_hdr(buf)) {
1237 length = server->ops->receive_transform(server,
1242 mids[0] = server->ops->find_mid(server, buf);
1246 if (!mids[0] || !mids[0]->receive)
1247 length = standard_receive3(server, mids[0]);
1249 length = mids[0]->receive(server, mids[0]);
1253 for (i = 0; i < num_mids; i++)
1255 cifs_mid_q_entry_release(mids[i]);
1259 server->lstrp = jiffies;
1261 for (i = 0; i < num_mids; i++) {
1262 if (mids[i] != NULL) {
1263 mids[i]->resp_buf_size = server->pdu_size;
1265 if (!mids[i]->multiRsp || mids[i]->multiEnd)
1266 mids[i]->callback(mids[i]);
1268 cifs_mid_q_entry_release(mids[i]);
1269 } else if (server->ops->is_oplock_break &&
1270 server->ops->is_oplock_break(bufs[i],
1272 smb2_add_credits_from_hdr(bufs[i], server);
1273 cifs_dbg(FYI, "Received oplock break\n");
1275 cifs_server_dbg(VFS, "No task to wake, unknown frame "
1276 "received! NumMids %d\n",
1277 atomic_read(&midCount));
1278 cifs_dump_mem("Received Data is: ", bufs[i],
1279 HEADER_SIZE(server));
1280 smb2_add_credits_from_hdr(bufs[i], server);
1281 #ifdef CONFIG_CIFS_DEBUG2
1282 if (server->ops->dump_detail)
1283 server->ops->dump_detail(bufs[i],
1285 cifs_dump_mids(server);
1286 #endif /* CIFS_DEBUG2 */
1290 if (pdu_length > server->pdu_size) {
1291 if (!allocate_buffers(server))
1293 pdu_length -= server->pdu_size;
1294 server->total_read = 0;
1295 server->large_buf = false;
1296 buf = server->smallbuf;
1299 } /* end while !EXITING */
1301 /* buffer usually freed in free_mid - need to free it here on exit */
1302 cifs_buf_release(server->bigbuf);
1303 if (server->smallbuf) /* no sense logging a debug message if NULL */
1304 cifs_small_buf_release(server->smallbuf);
1306 task_to_wake = xchg(&server->tsk, NULL);
1307 clean_demultiplex_info(server);
1309 /* if server->tsk was NULL then wait for a signal before exiting */
1310 if (!task_to_wake) {
1311 set_current_state(TASK_INTERRUPTIBLE);
1312 while (!signal_pending(current)) {
1314 set_current_state(TASK_INTERRUPTIBLE);
1316 set_current_state(TASK_RUNNING);
1319 module_put_and_exit(0);
1322 /* extract the host portion of the UNC string */
1324 extract_hostname(const char *unc)
1330 /* skip double chars at beginning of string */
1331 /* BB: check validity of these bytes? */
1332 if (strlen(unc) < 3)
1333 return ERR_PTR(-EINVAL);
1334 for (src = unc; *src && *src == '\\'; src++)
1337 return ERR_PTR(-EINVAL);
1339 /* delimiter between hostname and sharename is always '\\' now */
1340 delim = strchr(src, '\\');
1342 return ERR_PTR(-EINVAL);
1345 dst = kmalloc((len + 1), GFP_KERNEL);
1347 return ERR_PTR(-ENOMEM);
1349 memcpy(dst, src, len);
1355 static int get_option_ul(substring_t args[], unsigned long *option)
1360 string = match_strdup(args);
1363 rc = kstrtoul(string, 0, option);
1369 static int get_option_uid(substring_t args[], kuid_t *result)
1371 unsigned long value;
1375 rc = get_option_ul(args, &value);
1379 uid = make_kuid(current_user_ns(), value);
1380 if (!uid_valid(uid))
1387 static int get_option_gid(substring_t args[], kgid_t *result)
1389 unsigned long value;
1393 rc = get_option_ul(args, &value);
1397 gid = make_kgid(current_user_ns(), value);
1398 if (!gid_valid(gid))
1405 static int cifs_parse_security_flavors(char *value,
1406 struct smb_vol *vol)
1409 substring_t args[MAX_OPT_ARGS];
1412 * With mount options, the last one should win. Reset any existing
1413 * settings back to default.
1415 vol->sectype = Unspecified;
1418 switch (match_token(value, cifs_secflavor_tokens, args)) {
1420 cifs_dbg(VFS, "sec=krb5p is not supported!\n");
1426 vol->sectype = Kerberos;
1428 case Opt_sec_ntlmsspi:
1431 case Opt_sec_ntlmssp:
1432 vol->sectype = RawNTLMSSP;
1438 vol->sectype = NTLM;
1440 case Opt_sec_ntlmv2i:
1443 case Opt_sec_ntlmv2:
1444 vol->sectype = NTLMv2;
1446 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1447 case Opt_sec_lanman:
1448 vol->sectype = LANMAN;
1455 cifs_dbg(VFS, "bad security option: %s\n", value);
1463 cifs_parse_cache_flavor(char *value, struct smb_vol *vol)
1465 substring_t args[MAX_OPT_ARGS];
1467 switch (match_token(value, cifs_cacheflavor_tokens, args)) {
1468 case Opt_cache_loose:
1469 vol->direct_io = false;
1470 vol->strict_io = false;
1471 vol->cache_ro = false;
1472 vol->cache_rw = false;
1474 case Opt_cache_strict:
1475 vol->direct_io = false;
1476 vol->strict_io = true;
1477 vol->cache_ro = false;
1478 vol->cache_rw = false;
1480 case Opt_cache_none:
1481 vol->direct_io = true;
1482 vol->strict_io = false;
1483 vol->cache_ro = false;
1484 vol->cache_rw = false;
1487 vol->direct_io = false;
1488 vol->strict_io = false;
1489 vol->cache_ro = true;
1490 vol->cache_rw = false;
1493 vol->direct_io = false;
1494 vol->strict_io = false;
1495 vol->cache_ro = false;
1496 vol->cache_rw = true;
1499 cifs_dbg(VFS, "bad cache= option: %s\n", value);
1506 cifs_parse_smb_version(char *value, struct smb_vol *vol, bool is_smb3)
1508 substring_t args[MAX_OPT_ARGS];
1510 switch (match_token(value, cifs_smb_version_tokens, args)) {
1511 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1513 if (disable_legacy_dialects) {
1514 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1518 cifs_dbg(VFS, "vers=1.0 (cifs) not permitted when mounting with smb3\n");
1521 vol->ops = &smb1_operations;
1522 vol->vals = &smb1_values;
1525 if (disable_legacy_dialects) {
1526 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1530 cifs_dbg(VFS, "vers=2.0 not permitted when mounting with smb3\n");
1533 vol->ops = &smb20_operations;
1534 vol->vals = &smb20_values;
1538 cifs_dbg(VFS, "vers=1.0 (cifs) mount not permitted when legacy dialects disabled\n");
1541 cifs_dbg(VFS, "vers=2.0 mount not permitted when legacy dialects disabled\n");
1543 #endif /* CIFS_ALLOW_INSECURE_LEGACY */
1545 vol->ops = &smb21_operations;
1546 vol->vals = &smb21_values;
1549 vol->ops = &smb30_operations;
1550 vol->vals = &smb30_values;
1553 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1554 vol->vals = &smb302_values;
1557 vol->ops = &smb311_operations;
1558 vol->vals = &smb311_values;
1561 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1562 vol->vals = &smb3any_values;
1565 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1566 vol->vals = &smbdefault_values;
1569 cifs_dbg(VFS, "Unknown vers= option specified: %s\n", value);
1576 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1577 * fields with the result. Returns 0 on success and an error otherwise.
1580 cifs_parse_devname(const char *devname, struct smb_vol *vol)
1583 const char *delims = "/\\";
1586 if (unlikely(!devname || !*devname)) {
1587 cifs_dbg(VFS, "Device name not specified.\n");
1591 /* make sure we have a valid UNC double delimiter prefix */
1592 len = strspn(devname, delims);
1596 /* find delimiter between host and sharename */
1597 pos = strpbrk(devname + 2, delims);
1601 /* skip past delimiter */
1604 /* now go until next delimiter or end of string */
1605 len = strcspn(pos, delims);
1607 /* move "pos" up to delimiter or NULL */
1609 vol->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
1613 convert_delimiter(vol->UNC, '\\');
1615 /* skip any delimiter */
1616 if (*pos == '/' || *pos == '\\')
1619 /* If pos is NULL then no prepath */
1623 vol->prepath = kstrdup(pos, GFP_KERNEL);
1631 cifs_parse_mount_options(const char *mountdata, const char *devname,
1632 struct smb_vol *vol, bool is_smb3)
1635 char *mountdata_copy = NULL, *options;
1636 unsigned int temp_len, i, j;
1638 short int override_uid = -1;
1639 short int override_gid = -1;
1640 bool uid_specified = false;
1641 bool gid_specified = false;
1642 bool sloppy = false;
1643 char *invalid = NULL;
1644 char *nodename = utsname()->nodename;
1645 char *string = NULL;
1646 char *tmp_end, *value;
1648 bool got_ip = false;
1649 bool got_version = false;
1650 unsigned short port = 0;
1651 struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1655 delim = separator[0];
1657 /* ensure we always start with zeroed-out smb_vol */
1658 memset(vol, 0, sizeof(*vol));
1661 * does not have to be perfect mapping since field is
1662 * informational, only used for servers that do not support
1663 * port 445 and it can be overridden at mount time
1665 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1666 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1667 vol->source_rfc1001_name[i] = toupper(nodename[i]);
1669 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1670 /* null target name indicates to use *SMBSERVR default called name
1671 if we end up sending RFC1001 session initialize */
1672 vol->target_rfc1001_name[0] = 0;
1673 vol->cred_uid = current_uid();
1674 vol->linux_uid = current_uid();
1675 vol->linux_gid = current_gid();
1676 vol->bsize = 1024 * 1024; /* can improve cp performance significantly */
1678 * default to SFM style remapping of seven reserved characters
1679 * unless user overrides it or we negotiate CIFS POSIX where
1680 * it is unnecessary. Can not simultaneously use more than one mapping
1681 * since then readdir could list files that open could not open
1685 /* default to only allowing write access to owner of the mount */
1686 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1688 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1689 /* default is always to request posix paths. */
1690 vol->posix_paths = 1;
1691 /* default to using server inode numbers where available */
1692 vol->server_ino = 1;
1694 /* default is to use strict cifs caching semantics */
1695 vol->strict_io = true;
1697 vol->actimeo = CIFS_DEF_ACTIMEO;
1699 /* Most clients set timeout to 0, allows server to use its default */
1700 vol->handle_timeout = 0; /* See MS-SMB2 spec section 2.2.14.2.12 */
1702 /* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1703 vol->ops = &smb30_operations;
1704 vol->vals = &smbdefault_values;
1706 vol->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1709 goto cifs_parse_mount_err;
1711 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1712 if (!mountdata_copy)
1713 goto cifs_parse_mount_err;
1715 options = mountdata_copy;
1716 end = options + strlen(options);
1718 if (strncmp(options, "sep=", 4) == 0) {
1719 if (options[4] != 0) {
1720 separator[0] = options[4];
1723 cifs_dbg(FYI, "Null separator not allowed\n");
1726 vol->backupuid_specified = false; /* no backup intent for a user */
1727 vol->backupgid_specified = false; /* no backup intent for a group */
1729 switch (cifs_parse_devname(devname, vol)) {
1733 cifs_dbg(VFS, "Unable to allocate memory for devname.\n");
1734 goto cifs_parse_mount_err;
1736 cifs_dbg(VFS, "Malformed UNC in devname.\n");
1737 goto cifs_parse_mount_err;
1739 cifs_dbg(VFS, "Unknown error parsing devname.\n");
1740 goto cifs_parse_mount_err;
1743 while ((data = strsep(&options, separator)) != NULL) {
1744 substring_t args[MAX_OPT_ARGS];
1745 unsigned long option;
1751 token = match_token(data, cifs_mount_option_tokens, args);
1755 /* Ingnore the following */
1759 /* Boolean values */
1760 case Opt_user_xattr:
1763 case Opt_nouser_xattr:
1769 case Opt_noforceuid:
1775 case Opt_noforcegid:
1778 case Opt_noblocksend:
1779 vol->noblocksnd = 1;
1781 case Opt_noautotune:
1782 vol->noautotune = 1;
1800 vol->sfu_remap = true;
1801 vol->remap = false; /* disable SFM mapping */
1803 case Opt_nomapchars:
1804 vol->sfu_remap = false;
1808 vol->sfu_remap = false; /* disable SFU mapping */
1810 case Opt_nomapposix:
1823 #ifdef CONFIG_CIFS_ROOT
1827 case Opt_posixpaths:
1828 vol->posix_paths = 1;
1830 case Opt_noposixpaths:
1831 vol->posix_paths = 0;
1836 "conflicting unix mount options\n");
1837 vol->no_linux_ext = 1;
1840 if (vol->no_linux_ext)
1842 "conflicting unix mount options\n");
1854 * turn off mandatory locking in mode
1855 * if remote locking is turned off since the
1856 * local vfs will do advisory
1858 if (vol->file_mode ==
1859 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1860 vol->file_mode = S_IALLUGO;
1862 case Opt_nohandlecache:
1863 vol->nohandlecache = 1;
1865 case Opt_handlecache:
1866 vol->nohandlecache = 0;
1868 case Opt_forcemandatorylock:
1877 case Opt_setuidfromacl:
1878 vol->setuidfromacl = 1;
1881 vol->dynperm = true;
1884 vol->dynperm = false;
1898 case Opt_nostrictsync:
1899 vol->nostrictsync = 1;
1901 case Opt_strictsync:
1902 vol->nostrictsync = 0;
1905 vol->server_ino = 1;
1907 case Opt_noserverino:
1908 vol->server_ino = 0;
1910 case Opt_rwpidforward:
1911 vol->rwpidforward = 1;
1923 vol->no_psx_acl = 0;
1926 vol->no_psx_acl = 1;
1928 case Opt_locallease:
1929 vol->local_lease = 1;
1934 case Opt_ignore_signature:
1936 vol->ignore_signature = true;
1939 /* we do not do the following in secFlags because seal
1940 * is a per tree connection (mount) not a per socket
1941 * or per-smb connection option in the protocol
1942 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1947 pr_warn("CIFS: Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1950 #ifndef CONFIG_CIFS_FSCACHE
1951 cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1952 goto cifs_parse_mount_err;
1956 case Opt_mfsymlinks:
1957 vol->mfsymlinks = true;
1960 vol->multiuser = true;
1965 case Opt_nosharesock:
1966 vol->nosharesock = true;
1968 case Opt_nopersistent:
1969 vol->nopersistent = true;
1970 if (vol->persistent) {
1972 "persistenthandles mount options conflict\n");
1973 goto cifs_parse_mount_err;
1976 case Opt_persistent:
1977 vol->persistent = true;
1978 if ((vol->nopersistent) || (vol->resilient)) {
1980 "persistenthandles mount options conflict\n");
1981 goto cifs_parse_mount_err;
1985 vol->resilient = true;
1986 if (vol->persistent) {
1988 "persistenthandles mount options conflict\n");
1989 goto cifs_parse_mount_err;
1992 case Opt_noresilient:
1993 vol->resilient = false; /* already the default */
1995 case Opt_domainauto:
1996 vol->domainauto = true;
2002 vol->compression = UNKNOWN_TYPE;
2004 "SMB3 compression support is experimental\n");
2007 /* Numeric Values */
2009 if (get_option_uid(args, &vol->backupuid)) {
2010 cifs_dbg(VFS, "%s: Invalid backupuid value\n",
2012 goto cifs_parse_mount_err;
2014 vol->backupuid_specified = true;
2017 if (get_option_gid(args, &vol->backupgid)) {
2018 cifs_dbg(VFS, "%s: Invalid backupgid value\n",
2020 goto cifs_parse_mount_err;
2022 vol->backupgid_specified = true;
2025 if (get_option_uid(args, &vol->linux_uid)) {
2026 cifs_dbg(VFS, "%s: Invalid uid value\n",
2028 goto cifs_parse_mount_err;
2030 uid_specified = true;
2033 if (get_option_uid(args, &vol->cred_uid)) {
2034 cifs_dbg(VFS, "%s: Invalid cruid value\n",
2036 goto cifs_parse_mount_err;
2040 if (get_option_gid(args, &vol->linux_gid)) {
2041 cifs_dbg(VFS, "%s: Invalid gid value\n",
2043 goto cifs_parse_mount_err;
2045 gid_specified = true;
2048 if (get_option_ul(args, &option)) {
2049 cifs_dbg(VFS, "%s: Invalid file_mode value\n",
2051 goto cifs_parse_mount_err;
2053 vol->file_mode = option;
2056 if (get_option_ul(args, &option)) {
2057 cifs_dbg(VFS, "%s: Invalid dir_mode value\n",
2059 goto cifs_parse_mount_err;
2061 vol->dir_mode = option;
2064 if (get_option_ul(args, &option) ||
2065 option > USHRT_MAX) {
2066 cifs_dbg(VFS, "%s: Invalid port value\n",
2068 goto cifs_parse_mount_err;
2070 port = (unsigned short)option;
2072 case Opt_min_enc_offload:
2073 if (get_option_ul(args, &option)) {
2074 cifs_dbg(VFS, "Invalid minimum encrypted read offload size (esize)\n");
2075 goto cifs_parse_mount_err;
2077 vol->min_offload = option;
2080 if (get_option_ul(args, &option)) {
2081 cifs_dbg(VFS, "%s: Invalid blocksize value\n",
2083 goto cifs_parse_mount_err;
2086 * inode blocksize realistically should never need to be
2087 * less than 16K or greater than 16M and default is 1MB.
2088 * Note that small inode block sizes (e.g. 64K) can lead
2089 * to very poor performance of common tools like cp and scp
2091 if ((option < CIFS_MAX_MSGSIZE) ||
2092 (option > (4 * SMB3_DEFAULT_IOSIZE))) {
2093 cifs_dbg(VFS, "%s: Invalid blocksize\n",
2095 goto cifs_parse_mount_err;
2097 vol->bsize = option;
2100 if (get_option_ul(args, &option)) {
2101 cifs_dbg(VFS, "%s: Invalid rsize value\n",
2103 goto cifs_parse_mount_err;
2105 vol->rsize = option;
2108 if (get_option_ul(args, &option)) {
2109 cifs_dbg(VFS, "%s: Invalid wsize value\n",
2111 goto cifs_parse_mount_err;
2113 vol->wsize = option;
2116 if (get_option_ul(args, &option)) {
2117 cifs_dbg(VFS, "%s: Invalid actimeo value\n",
2119 goto cifs_parse_mount_err;
2121 vol->actimeo = HZ * option;
2122 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
2123 cifs_dbg(VFS, "attribute cache timeout too large\n");
2124 goto cifs_parse_mount_err;
2127 case Opt_handletimeout:
2128 if (get_option_ul(args, &option)) {
2129 cifs_dbg(VFS, "%s: Invalid handletimeout value\n",
2131 goto cifs_parse_mount_err;
2133 vol->handle_timeout = option;
2134 if (vol->handle_timeout > SMB3_MAX_HANDLE_TIMEOUT) {
2135 cifs_dbg(VFS, "Invalid handle cache timeout, longer than 16 minutes\n");
2136 goto cifs_parse_mount_err;
2139 case Opt_echo_interval:
2140 if (get_option_ul(args, &option)) {
2141 cifs_dbg(VFS, "%s: Invalid echo interval value\n",
2143 goto cifs_parse_mount_err;
2145 vol->echo_interval = option;
2148 if (get_option_ul(args, &option)) {
2149 cifs_dbg(VFS, "%s: Invalid snapshot time\n",
2151 goto cifs_parse_mount_err;
2153 vol->snapshot_time = option;
2155 case Opt_max_credits:
2156 if (get_option_ul(args, &option) || (option < 20) ||
2158 cifs_dbg(VFS, "%s: Invalid max_credits value\n",
2160 goto cifs_parse_mount_err;
2162 vol->max_credits = option;
2165 /* String Arguments */
2167 case Opt_blank_user:
2168 /* null user, ie. anonymous authentication */
2170 vol->username = NULL;
2173 string = match_strdup(args);
2177 if (strnlen(string, CIFS_MAX_USERNAME_LEN) >
2178 CIFS_MAX_USERNAME_LEN) {
2179 pr_warn("CIFS: username too long\n");
2180 goto cifs_parse_mount_err;
2183 kfree(vol->username);
2184 vol->username = kstrdup(string, GFP_KERNEL);
2186 goto cifs_parse_mount_err;
2188 case Opt_blank_pass:
2189 /* passwords have to be handled differently
2190 * to allow the character used for deliminator
2191 * to be passed within them
2195 * Check if this is a case where the password
2196 * starts with a delimiter
2198 tmp_end = strchr(data, '=');
2200 if (!(tmp_end < end && tmp_end[1] == delim)) {
2201 /* No it is not. Set the password to NULL */
2202 kzfree(vol->password);
2203 vol->password = NULL;
2206 /* Fallthrough - to Opt_pass below.*/
2208 /* Obtain the value string */
2209 value = strchr(data, '=');
2212 /* Set tmp_end to end of the string */
2213 tmp_end = (char *) value + strlen(value);
2215 /* Check if following character is the deliminator
2216 * If yes, we have encountered a double deliminator
2217 * reset the NULL character to the deliminator
2219 if (tmp_end < end && tmp_end[1] == delim) {
2222 /* Keep iterating until we get to a single
2223 * deliminator OR the end
2225 while ((tmp_end = strchr(tmp_end, delim))
2226 != NULL && (tmp_end[1] == delim)) {
2227 tmp_end = (char *) &tmp_end[2];
2230 /* Reset var options to point to next element */
2233 options = (char *) &tmp_end[1];
2235 /* Reached the end of the mount option
2240 kzfree(vol->password);
2241 /* Now build new password string */
2242 temp_len = strlen(value);
2243 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
2244 if (vol->password == NULL) {
2245 pr_warn("CIFS: no memory for password\n");
2246 goto cifs_parse_mount_err;
2249 for (i = 0, j = 0; i < temp_len; i++, j++) {
2250 vol->password[j] = value[i];
2251 if ((value[i] == delim) &&
2252 value[i+1] == delim)
2253 /* skip the second deliminator */
2256 vol->password[j] = '\0';
2259 /* FIXME: should this be an error instead? */
2263 string = match_strdup(args);
2267 if (!cifs_convert_address(dstaddr, string,
2269 pr_err("CIFS: bad ip= option (%s).\n", string);
2270 goto cifs_parse_mount_err;
2275 string = match_strdup(args);
2279 if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
2280 == CIFS_MAX_DOMAINNAME_LEN) {
2281 pr_warn("CIFS: domain name too long\n");
2282 goto cifs_parse_mount_err;
2285 kfree(vol->domainname);
2286 vol->domainname = kstrdup(string, GFP_KERNEL);
2287 if (!vol->domainname) {
2288 pr_warn("CIFS: no memory for domainname\n");
2289 goto cifs_parse_mount_err;
2291 cifs_dbg(FYI, "Domain name set\n");
2294 string = match_strdup(args);
2298 if (!cifs_convert_address(
2299 (struct sockaddr *)&vol->srcaddr,
2300 string, strlen(string))) {
2301 pr_warn("CIFS: Could not parse srcaddr: %s\n",
2303 goto cifs_parse_mount_err;
2307 string = match_strdup(args);
2311 if (strnlen(string, 1024) >= 65) {
2312 pr_warn("CIFS: iocharset name too long.\n");
2313 goto cifs_parse_mount_err;
2316 if (strncasecmp(string, "default", 7) != 0) {
2317 kfree(vol->iocharset);
2318 vol->iocharset = kstrdup(string,
2320 if (!vol->iocharset) {
2321 pr_warn("CIFS: no memory for charset\n");
2322 goto cifs_parse_mount_err;
2325 /* if iocharset not set then load_nls_default
2328 cifs_dbg(FYI, "iocharset set to %s\n", string);
2330 case Opt_netbiosname:
2331 string = match_strdup(args);
2335 memset(vol->source_rfc1001_name, 0x20,
2338 * FIXME: are there cases in which a comma can
2339 * be valid in workstation netbios name (and
2340 * need special handling)?
2342 for (i = 0; i < RFC1001_NAME_LEN; i++) {
2343 /* don't ucase netbiosname for user */
2346 vol->source_rfc1001_name[i] = string[i];
2348 /* The string has 16th byte zero still from
2349 * set at top of the function
2351 if (i == RFC1001_NAME_LEN && string[i] != 0)
2352 pr_warn("CIFS: netbiosname longer than 15 truncated.\n");
2355 /* servernetbiosname specified override *SMBSERVER */
2356 string = match_strdup(args);
2360 /* last byte, type, is 0x20 for servr type */
2361 memset(vol->target_rfc1001_name, 0x20,
2362 RFC1001_NAME_LEN_WITH_NULL);
2364 /* BB are there cases in which a comma can be
2365 valid in this workstation netbios name
2366 (and need special handling)? */
2368 /* user or mount helper must uppercase the
2370 for (i = 0; i < 15; i++) {
2373 vol->target_rfc1001_name[i] = string[i];
2375 /* The string has 16th byte zero still from
2376 set at top of the function */
2377 if (i == RFC1001_NAME_LEN && string[i] != 0)
2378 pr_warn("CIFS: server netbiosname longer than 15 truncated.\n");
2381 /* version of mount userspace tools, not dialect */
2382 string = match_strdup(args);
2386 /* If interface changes in mount.cifs bump to new ver */
2387 if (strncasecmp(string, "1", 1) == 0) {
2388 if (strlen(string) > 1) {
2389 pr_warn("Bad mount helper ver=%s. Did "
2390 "you want SMB1 (CIFS) dialect "
2391 "and mean to type vers=1.0 "
2392 "instead?\n", string);
2393 goto cifs_parse_mount_err;
2395 /* This is the default */
2398 /* For all other value, error */
2399 pr_warn("CIFS: Invalid mount helper version specified\n");
2400 goto cifs_parse_mount_err;
2402 /* protocol version (dialect) */
2403 string = match_strdup(args);
2407 if (cifs_parse_smb_version(string, vol, is_smb3) != 0)
2408 goto cifs_parse_mount_err;
2412 string = match_strdup(args);
2416 if (cifs_parse_security_flavors(string, vol) != 0)
2417 goto cifs_parse_mount_err;
2420 string = match_strdup(args);
2424 if (cifs_parse_cache_flavor(string, vol) != 0)
2425 goto cifs_parse_mount_err;
2429 * An option we don't recognize. Save it off for later
2430 * if we haven't already found one
2436 /* Free up any allocated string */
2441 if (!sloppy && invalid) {
2442 pr_err("CIFS: Unknown mount option \"%s\"\n", invalid);
2443 goto cifs_parse_mount_err;
2446 if (vol->rdma && vol->vals->protocol_id < SMB30_PROT_ID) {
2447 cifs_dbg(VFS, "SMB Direct requires Version >=3.0\n");
2448 goto cifs_parse_mount_err;
2452 /* Muliuser mounts require CONFIG_KEYS support */
2453 if (vol->multiuser) {
2454 cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
2455 goto cifs_parse_mount_err;
2459 cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
2460 goto cifs_parse_mount_err;
2463 /* make sure UNC has a share name */
2464 if (!strchr(vol->UNC + 3, '\\')) {
2465 cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
2466 goto cifs_parse_mount_err;
2473 /* No ip= option specified? Try to get it from UNC */
2474 /* Use the address part of the UNC. */
2475 slash = strchr(&vol->UNC[2], '\\');
2476 len = slash - &vol->UNC[2];
2477 if (!cifs_convert_address(dstaddr, &vol->UNC[2], len)) {
2478 pr_err("Unable to determine destination address.\n");
2479 goto cifs_parse_mount_err;
2483 /* set the port that we got earlier */
2484 cifs_set_port(dstaddr, port);
2487 vol->override_uid = override_uid;
2488 else if (override_uid == 1)
2489 pr_notice("CIFS: ignoring forceuid mount option specified with no uid= option.\n");
2492 vol->override_gid = override_gid;
2493 else if (override_gid == 1)
2494 pr_notice("CIFS: ignoring forcegid mount option specified with no gid= option.\n");
2496 if (got_version == false)
2497 pr_warn("No dialect specified on mount. Default has changed to "
2498 "a more secure dialect, SMB2.1 or later (e.g. SMB3), from CIFS "
2499 "(SMB1). To use the less secure SMB1 dialect to access "
2500 "old servers which do not support SMB3 (or SMB2.1) specify vers=1.0"
2503 kfree(mountdata_copy);
2507 pr_warn("Could not allocate temporary buffer\n");
2508 cifs_parse_mount_err:
2510 kfree(mountdata_copy);
2514 /** Returns true if srcaddr isn't specified and rhs isn't
2515 * specified, or if srcaddr is specified and
2516 * matches the IP address of the rhs argument.
2519 srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
2521 switch (srcaddr->sa_family) {
2523 return (rhs->sa_family == AF_UNSPEC);
2525 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
2526 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
2527 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
2530 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
2531 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
2532 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
2536 return false; /* don't expect to be here */
2541 * If no port is specified in addr structure, we try to match with 445 port
2542 * and if it fails - with 139 ports. It should be called only if address
2543 * families of server and addr are equal.
2546 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
2548 __be16 port, *sport;
2550 /* SMBDirect manages its own ports, don't match it here */
2554 switch (addr->sa_family) {
2556 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
2557 port = ((struct sockaddr_in *) addr)->sin_port;
2560 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
2561 port = ((struct sockaddr_in6 *) addr)->sin6_port;
2569 port = htons(CIFS_PORT);
2573 port = htons(RFC1001_PORT);
2576 return port == *sport;
2580 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
2581 struct sockaddr *srcaddr)
2583 switch (addr->sa_family) {
2585 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
2586 struct sockaddr_in *srv_addr4 =
2587 (struct sockaddr_in *)&server->dstaddr;
2589 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
2594 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
2595 struct sockaddr_in6 *srv_addr6 =
2596 (struct sockaddr_in6 *)&server->dstaddr;
2598 if (!ipv6_addr_equal(&addr6->sin6_addr,
2599 &srv_addr6->sin6_addr))
2601 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
2607 return false; /* don't expect to be here */
2610 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
2617 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2620 * The select_sectype function should either return the vol->sectype
2621 * that was specified, or "Unspecified" if that sectype was not
2622 * compatible with the given NEGOTIATE request.
2624 if (server->ops->select_sectype(server, vol->sectype)
2629 * Now check if signing mode is acceptable. No need to check
2630 * global_secflags at this point since if MUST_SIGN is set then
2631 * the server->sign had better be too.
2633 if (vol->sign && !server->sign)
2639 static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
2641 struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2643 if (vol->nosharesock)
2646 /* If multidialect negotiation see if existing sessions match one */
2647 if (strcmp(vol->vals->version_string, SMB3ANY_VERSION_STRING) == 0) {
2648 if (server->vals->protocol_id < SMB30_PROT_ID)
2650 } else if (strcmp(vol->vals->version_string,
2651 SMBDEFAULT_VERSION_STRING) == 0) {
2652 if (server->vals->protocol_id < SMB21_PROT_ID)
2654 } else if ((server->vals != vol->vals) || (server->ops != vol->ops))
2657 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2660 if (!match_address(server, addr,
2661 (struct sockaddr *)&vol->srcaddr))
2664 if (!match_port(server, addr))
2667 if (!match_security(server, vol))
2670 if (server->echo_interval != vol->echo_interval * HZ)
2673 if (server->rdma != vol->rdma)
2676 if (server->ignore_signature != vol->ignore_signature)
2679 if (server->min_offload != vol->min_offload)
2685 struct TCP_Server_Info *
2686 cifs_find_tcp_session(struct smb_vol *vol)
2688 struct TCP_Server_Info *server;
2690 spin_lock(&cifs_tcp_ses_lock);
2691 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
2692 if (!match_server(server, vol))
2695 ++server->srv_count;
2696 spin_unlock(&cifs_tcp_ses_lock);
2697 cifs_dbg(FYI, "Existing tcp session with server found\n");
2700 spin_unlock(&cifs_tcp_ses_lock);
2705 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
2707 struct task_struct *task;
2709 spin_lock(&cifs_tcp_ses_lock);
2710 if (--server->srv_count > 0) {
2711 spin_unlock(&cifs_tcp_ses_lock);
2715 put_net(cifs_net_ns(server));
2717 list_del_init(&server->tcp_ses_list);
2718 spin_unlock(&cifs_tcp_ses_lock);
2720 cancel_delayed_work_sync(&server->echo);
2724 * Avoid deadlock here: reconnect work calls
2725 * cifs_put_tcp_session() at its end. Need to be sure
2726 * that reconnect work does nothing with server pointer after
2729 cancel_delayed_work(&server->reconnect);
2731 cancel_delayed_work_sync(&server->reconnect);
2733 spin_lock(&GlobalMid_Lock);
2734 server->tcpStatus = CifsExiting;
2735 spin_unlock(&GlobalMid_Lock);
2737 cifs_crypto_secmech_release(server);
2738 cifs_fscache_release_client_cookie(server);
2740 kfree(server->session_key.response);
2741 server->session_key.response = NULL;
2742 server->session_key.len = 0;
2744 task = xchg(&server->tsk, NULL);
2746 send_sig(SIGKILL, task, 1);
2749 static struct TCP_Server_Info *
2750 cifs_get_tcp_session(struct smb_vol *volume_info)
2752 struct TCP_Server_Info *tcp_ses = NULL;
2755 cifs_dbg(FYI, "UNC: %s\n", volume_info->UNC);
2757 /* see if we already have a matching tcp_ses */
2758 tcp_ses = cifs_find_tcp_session(volume_info);
2762 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2768 tcp_ses->ops = volume_info->ops;
2769 tcp_ses->vals = volume_info->vals;
2770 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2771 tcp_ses->hostname = extract_hostname(volume_info->UNC);
2772 if (IS_ERR(tcp_ses->hostname)) {
2773 rc = PTR_ERR(tcp_ses->hostname);
2774 goto out_err_crypto_release;
2777 tcp_ses->noblockcnt = volume_info->rootfs;
2778 tcp_ses->noblocksnd = volume_info->noblocksnd || volume_info->rootfs;
2779 tcp_ses->noautotune = volume_info->noautotune;
2780 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2781 tcp_ses->rdma = volume_info->rdma;
2782 tcp_ses->in_flight = 0;
2783 tcp_ses->max_in_flight = 0;
2784 tcp_ses->credits = 1;
2785 init_waitqueue_head(&tcp_ses->response_q);
2786 init_waitqueue_head(&tcp_ses->request_q);
2787 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2788 mutex_init(&tcp_ses->srv_mutex);
2789 memcpy(tcp_ses->workstation_RFC1001_name,
2790 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2791 memcpy(tcp_ses->server_RFC1001_name,
2792 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2793 tcp_ses->session_estab = false;
2794 tcp_ses->sequence_number = 0;
2795 tcp_ses->reconnect_instance = 1;
2796 tcp_ses->lstrp = jiffies;
2797 tcp_ses->compress_algorithm = cpu_to_le16(volume_info->compression);
2798 spin_lock_init(&tcp_ses->req_lock);
2799 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2800 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2801 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2802 INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
2803 mutex_init(&tcp_ses->reconnect_mutex);
2804 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2805 sizeof(tcp_ses->srcaddr));
2806 memcpy(&tcp_ses->dstaddr, &volume_info->dstaddr,
2807 sizeof(tcp_ses->dstaddr));
2808 generate_random_uuid(tcp_ses->client_guid);
2810 * at this point we are the only ones with the pointer
2811 * to the struct since the kernel thread not created yet
2812 * no need to spinlock this init of tcpStatus or srv_count
2814 tcp_ses->tcpStatus = CifsNew;
2815 ++tcp_ses->srv_count;
2817 if (volume_info->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
2818 volume_info->echo_interval <= SMB_ECHO_INTERVAL_MAX)
2819 tcp_ses->echo_interval = volume_info->echo_interval * HZ;
2821 tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
2822 if (tcp_ses->rdma) {
2823 #ifndef CONFIG_CIFS_SMB_DIRECT
2824 cifs_dbg(VFS, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
2826 goto out_err_crypto_release;
2828 tcp_ses->smbd_conn = smbd_get_connection(
2829 tcp_ses, (struct sockaddr *)&volume_info->dstaddr);
2830 if (tcp_ses->smbd_conn) {
2831 cifs_dbg(VFS, "RDMA transport established\n");
2833 goto smbd_connected;
2836 goto out_err_crypto_release;
2839 rc = ip_connect(tcp_ses);
2841 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
2842 goto out_err_crypto_release;
2846 * since we're in a cifs function already, we know that
2847 * this will succeed. No need for try_module_get().
2849 __module_get(THIS_MODULE);
2850 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2852 if (IS_ERR(tcp_ses->tsk)) {
2853 rc = PTR_ERR(tcp_ses->tsk);
2854 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
2855 module_put(THIS_MODULE);
2856 goto out_err_crypto_release;
2858 tcp_ses->min_offload = volume_info->min_offload;
2859 tcp_ses->tcpStatus = CifsNeedNegotiate;
2861 tcp_ses->nr_targets = 1;
2862 tcp_ses->ignore_signature = volume_info->ignore_signature;
2863 /* thread spawned, put it on the list */
2864 spin_lock(&cifs_tcp_ses_lock);
2865 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2866 spin_unlock(&cifs_tcp_ses_lock);
2868 cifs_fscache_get_client_cookie(tcp_ses);
2870 /* queue echo request delayed work */
2871 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
2875 out_err_crypto_release:
2876 cifs_crypto_secmech_release(tcp_ses);
2878 put_net(cifs_net_ns(tcp_ses));
2882 if (!IS_ERR(tcp_ses->hostname))
2883 kfree(tcp_ses->hostname);
2884 if (tcp_ses->ssocket)
2885 sock_release(tcp_ses->ssocket);
2891 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2893 if (vol->sectype != Unspecified &&
2894 vol->sectype != ses->sectype)
2897 switch (ses->sectype) {
2899 if (!uid_eq(vol->cred_uid, ses->cred_uid))
2903 /* NULL username means anonymous session */
2904 if (ses->user_name == NULL) {
2910 /* anything else takes username/password */
2911 if (strncmp(ses->user_name,
2912 vol->username ? vol->username : "",
2913 CIFS_MAX_USERNAME_LEN))
2915 if ((vol->username && strlen(vol->username) != 0) &&
2916 ses->password != NULL &&
2917 strncmp(ses->password,
2918 vol->password ? vol->password : "",
2919 CIFS_MAX_PASSWORD_LEN))
2926 * cifs_setup_ipc - helper to setup the IPC tcon for the session
2928 * A new IPC connection is made and stored in the session
2929 * tcon_ipc. The IPC tcon has the same lifetime as the session.
2932 cifs_setup_ipc(struct cifs_ses *ses, struct smb_vol *volume_info)
2935 struct cifs_tcon *tcon;
2936 struct nls_table *nls_codepage;
2937 char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0};
2939 struct TCP_Server_Info *server = ses->server;
2942 * If the mount request that resulted in the creation of the
2943 * session requires encryption, force IPC to be encrypted too.
2945 if (volume_info->seal) {
2946 if (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
2949 cifs_server_dbg(VFS,
2950 "IPC: server doesn't support encryption\n");
2955 tcon = tconInfoAlloc();
2959 scnprintf(unc, sizeof(unc), "\\\\%s\\IPC$", server->hostname);
2962 nls_codepage = load_nls_default();
2968 rc = server->ops->tree_connect(xid, ses, unc, tcon, nls_codepage);
2972 cifs_server_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
2977 cifs_dbg(FYI, "IPC tcon rc = %d ipc tid = %d\n", rc, tcon->tid);
2979 ses->tcon_ipc = tcon;
2981 unload_nls(nls_codepage);
2986 * cifs_free_ipc - helper to release the session IPC tcon
2988 * Needs to be called everytime a session is destroyed
2991 cifs_free_ipc(struct cifs_ses *ses)
2994 struct cifs_tcon *tcon = ses->tcon_ipc;
2999 if (ses->server->ops->tree_disconnect) {
3001 rc = ses->server->ops->tree_disconnect(xid, tcon);
3006 cifs_dbg(FYI, "failed to disconnect IPC tcon (rc=%d)\n", rc);
3009 ses->tcon_ipc = NULL;
3013 static struct cifs_ses *
3014 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
3016 struct cifs_ses *ses;
3018 spin_lock(&cifs_tcp_ses_lock);
3019 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
3020 if (ses->status == CifsExiting)
3022 if (!match_session(ses, vol))
3025 spin_unlock(&cifs_tcp_ses_lock);
3028 spin_unlock(&cifs_tcp_ses_lock);
3032 void cifs_put_smb_ses(struct cifs_ses *ses)
3034 unsigned int rc, xid;
3035 struct TCP_Server_Info *server = ses->server;
3037 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
3039 spin_lock(&cifs_tcp_ses_lock);
3040 if (ses->status == CifsExiting) {
3041 spin_unlock(&cifs_tcp_ses_lock);
3044 if (--ses->ses_count > 0) {
3045 spin_unlock(&cifs_tcp_ses_lock);
3048 if (ses->status == CifsGood)
3049 ses->status = CifsExiting;
3050 spin_unlock(&cifs_tcp_ses_lock);
3054 if (ses->status == CifsExiting && server->ops->logoff) {
3056 rc = server->ops->logoff(xid, ses);
3058 cifs_server_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
3063 spin_lock(&cifs_tcp_ses_lock);
3064 list_del_init(&ses->smb_ses_list);
3065 spin_unlock(&cifs_tcp_ses_lock);
3068 cifs_put_tcp_session(server, 0);
3073 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
3074 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
3076 /* Populate username and pw fields from keyring if possible */
3078 cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
3082 const char *delim, *payload;
3086 struct TCP_Server_Info *server = ses->server;
3087 struct sockaddr_in *sa;
3088 struct sockaddr_in6 *sa6;
3089 const struct user_key_payload *upayload;
3091 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
3095 /* try to find an address key first */
3096 switch (server->dstaddr.ss_family) {
3098 sa = (struct sockaddr_in *)&server->dstaddr;
3099 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
3102 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
3103 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
3106 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
3107 server->dstaddr.ss_family);
3112 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
3113 key = request_key(&key_type_logon, desc, "");
3115 if (!ses->domainName) {
3116 cifs_dbg(FYI, "domainName is NULL\n");
3121 /* didn't work, try to find a domain key */
3122 sprintf(desc, "cifs:d:%s", ses->domainName);
3123 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
3124 key = request_key(&key_type_logon, desc, "");
3132 down_read(&key->sem);
3133 upayload = user_key_payload_locked(key);
3134 if (IS_ERR_OR_NULL(upayload)) {
3135 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
3139 /* find first : in payload */
3140 payload = upayload->data;
3141 delim = strnchr(payload, upayload->datalen, ':');
3142 cifs_dbg(FYI, "payload=%s\n", payload);
3144 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
3150 len = delim - payload;
3151 if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
3152 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
3158 vol->username = kstrndup(payload, len, GFP_KERNEL);
3159 if (!vol->username) {
3160 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
3165 cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
3167 len = key->datalen - (len + 1);
3168 if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
3169 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
3171 kfree(vol->username);
3172 vol->username = NULL;
3177 vol->password = kstrndup(delim, len, GFP_KERNEL);
3178 if (!vol->password) {
3179 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
3182 kfree(vol->username);
3183 vol->username = NULL;
3188 * If we have a domain key then we must set the domainName in the
3191 if (is_domain && ses->domainName) {
3192 vol->domainname = kstrndup(ses->domainName,
3193 strlen(ses->domainName),
3195 if (!vol->domainname) {
3196 cifs_dbg(FYI, "Unable to allocate %zd bytes for "
3199 kfree(vol->username);
3200 vol->username = NULL;
3201 kzfree(vol->password);
3202 vol->password = NULL;
3212 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
3215 #else /* ! CONFIG_KEYS */
3217 cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
3218 struct cifs_ses *ses __attribute__((unused)))
3222 #endif /* CONFIG_KEYS */
3225 * cifs_get_smb_ses - get a session matching @volume_info data from @server
3227 * This function assumes it is being called from cifs_mount() where we
3228 * already got a server reference (server refcount +1). See
3229 * cifs_get_tcon() for refcount explanations.
3232 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
3236 struct cifs_ses *ses;
3237 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3238 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3242 ses = cifs_find_smb_ses(server, volume_info);
3244 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
3247 mutex_lock(&ses->session_mutex);
3248 rc = cifs_negotiate_protocol(xid, ses);
3250 mutex_unlock(&ses->session_mutex);
3251 /* problem -- put our ses reference */
3252 cifs_put_smb_ses(ses);
3256 if (ses->need_reconnect) {
3257 cifs_dbg(FYI, "Session needs reconnect\n");
3258 rc = cifs_setup_session(xid, ses,
3259 volume_info->local_nls);
3261 mutex_unlock(&ses->session_mutex);
3262 /* problem -- put our reference */
3263 cifs_put_smb_ses(ses);
3268 mutex_unlock(&ses->session_mutex);
3270 /* existing SMB ses has a server reference already */
3271 cifs_put_tcp_session(server, 0);
3276 cifs_dbg(FYI, "Existing smb sess not found\n");
3277 ses = sesInfoAlloc();
3281 /* new SMB session uses our server ref */
3282 ses->server = server;
3283 if (server->dstaddr.ss_family == AF_INET6)
3284 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
3286 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
3288 if (volume_info->username) {
3289 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
3290 if (!ses->user_name)
3294 /* volume_info->password freed at unmount */
3295 if (volume_info->password) {
3296 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
3300 if (volume_info->domainname) {
3301 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
3302 if (!ses->domainName)
3305 if (volume_info->domainauto)
3306 ses->domainAuto = volume_info->domainauto;
3307 ses->cred_uid = volume_info->cred_uid;
3308 ses->linux_uid = volume_info->linux_uid;
3310 ses->sectype = volume_info->sectype;
3311 ses->sign = volume_info->sign;
3312 mutex_lock(&ses->session_mutex);
3313 rc = cifs_negotiate_protocol(xid, ses);
3315 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
3316 mutex_unlock(&ses->session_mutex);
3320 /* success, put it on the list */
3321 spin_lock(&cifs_tcp_ses_lock);
3322 list_add(&ses->smb_ses_list, &server->smb_ses_list);
3323 spin_unlock(&cifs_tcp_ses_lock);
3327 cifs_setup_ipc(ses, volume_info);
3337 static int match_tcon(struct cifs_tcon *tcon, struct smb_vol *volume_info)
3339 if (tcon->tidStatus == CifsExiting)
3341 if (strncmp(tcon->treeName, volume_info->UNC, MAX_TREE_SIZE))
3343 if (tcon->seal != volume_info->seal)
3345 if (tcon->snapshot_time != volume_info->snapshot_time)
3347 if (tcon->handle_timeout != volume_info->handle_timeout)
3349 if (tcon->no_lease != volume_info->no_lease)
3354 static struct cifs_tcon *
3355 cifs_find_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3357 struct list_head *tmp;
3358 struct cifs_tcon *tcon;
3360 spin_lock(&cifs_tcp_ses_lock);
3361 list_for_each(tmp, &ses->tcon_list) {
3362 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
3363 if (!match_tcon(tcon, volume_info))
3366 spin_unlock(&cifs_tcp_ses_lock);
3369 spin_unlock(&cifs_tcp_ses_lock);
3374 cifs_put_tcon(struct cifs_tcon *tcon)
3377 struct cifs_ses *ses;
3380 * IPC tcon share the lifetime of their session and are
3381 * destroyed in the session put function
3383 if (tcon == NULL || tcon->ipc)
3387 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
3388 spin_lock(&cifs_tcp_ses_lock);
3389 if (--tcon->tc_count > 0) {
3390 spin_unlock(&cifs_tcp_ses_lock);
3394 list_del_init(&tcon->tcon_list);
3395 spin_unlock(&cifs_tcp_ses_lock);
3398 if (ses->server->ops->tree_disconnect)
3399 ses->server->ops->tree_disconnect(xid, tcon);
3402 cifs_fscache_release_super_cookie(tcon);
3404 cifs_put_smb_ses(ses);
3408 * cifs_get_tcon - get a tcon matching @volume_info data from @ses
3410 * - tcon refcount is the number of mount points using the tcon.
3411 * - ses refcount is the number of tcon using the session.
3413 * 1. This function assumes it is being called from cifs_mount() where
3414 * we already got a session reference (ses refcount +1).
3416 * 2. Since we're in the context of adding a mount point, the end
3417 * result should be either:
3419 * a) a new tcon already allocated with refcount=1 (1 mount point) and
3420 * its session refcount incremented (1 new tcon). This +1 was
3421 * already done in (1).
3423 * b) an existing tcon with refcount+1 (add a mount point to it) and
3424 * identical ses refcount (no new tcon). Because of (1) we need to
3425 * decrement the ses refcount.
3427 static struct cifs_tcon *
3428 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3431 struct cifs_tcon *tcon;
3433 tcon = cifs_find_tcon(ses, volume_info);
3436 * tcon has refcount already incremented but we need to
3437 * decrement extra ses reference gotten by caller (case b)
3439 cifs_dbg(FYI, "Found match on UNC path\n");
3440 cifs_put_smb_ses(ses);
3444 if (!ses->server->ops->tree_connect) {
3449 tcon = tconInfoAlloc();
3455 if (volume_info->snapshot_time) {
3456 if (ses->server->vals->protocol_id == 0) {
3458 "Use SMB2 or later for snapshot mount option\n");
3462 tcon->snapshot_time = volume_info->snapshot_time;
3465 if (volume_info->handle_timeout) {
3466 if (ses->server->vals->protocol_id == 0) {
3468 "Use SMB2.1 or later for handle timeout option\n");
3472 tcon->handle_timeout = volume_info->handle_timeout;
3476 if (volume_info->password) {
3477 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
3478 if (!tcon->password) {
3484 if (volume_info->seal) {
3485 if (ses->server->vals->protocol_id == 0) {
3487 "SMB3 or later required for encryption\n");
3490 } else if (tcon->ses->server->capabilities &
3491 SMB2_GLOBAL_CAP_ENCRYPTION)
3494 cifs_dbg(VFS, "Encryption is not supported on share\n");
3500 if (volume_info->linux_ext) {
3501 if (ses->server->posix_ext_supported) {
3502 tcon->posix_extensions = true;
3503 printk_once(KERN_WARNING
3504 "SMB3.11 POSIX Extensions are experimental\n");
3506 cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions.\n");
3513 * BB Do we need to wrap session_mutex around this TCon call and Unix
3514 * SetFS as we do on SessSetup and reconnect?
3517 rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
3518 volume_info->local_nls);
3520 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
3524 tcon->use_persistent = false;
3525 /* check if SMB2 or later, CIFS does not support persistent handles */
3526 if (volume_info->persistent) {
3527 if (ses->server->vals->protocol_id == 0) {
3529 "SMB3 or later required for persistent handles\n");
3532 } else if (ses->server->capabilities &
3533 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3534 tcon->use_persistent = true;
3535 else /* persistent handles requested but not supported */ {
3537 "Persistent handles not supported on share\n");
3541 } else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
3542 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3543 && (volume_info->nopersistent == false)) {
3544 cifs_dbg(FYI, "enabling persistent handles\n");
3545 tcon->use_persistent = true;
3546 } else if (volume_info->resilient) {
3547 if (ses->server->vals->protocol_id == 0) {
3549 "SMB2.1 or later required for resilient handles\n");
3553 tcon->use_resilient = true;
3556 /* If the user really knows what they are doing they can override */
3557 if (tcon->share_flags & SMB2_SHAREFLAG_NO_CACHING) {
3558 if (volume_info->cache_ro)
3559 cifs_dbg(VFS, "cache=ro requested on mount but NO_CACHING flag set on share\n");
3560 else if (volume_info->cache_rw)
3561 cifs_dbg(VFS, "cache=singleclient requested on mount but NO_CACHING flag set on share\n");
3565 * We can have only one retry value for a connection to a share so for
3566 * resources mounted more than once to the same server share the last
3567 * value passed in for the retry flag is used.
3569 tcon->retry = volume_info->retry;
3570 tcon->nocase = volume_info->nocase;
3571 tcon->nohandlecache = volume_info->nohandlecache;
3572 tcon->local_lease = volume_info->local_lease;
3573 tcon->no_lease = volume_info->no_lease;
3574 INIT_LIST_HEAD(&tcon->pending_opens);
3576 spin_lock(&cifs_tcp_ses_lock);
3577 list_add(&tcon->tcon_list, &ses->tcon_list);
3578 spin_unlock(&cifs_tcp_ses_lock);
3580 cifs_fscache_get_super_cookie(tcon);
3590 cifs_put_tlink(struct tcon_link *tlink)
3592 if (!tlink || IS_ERR(tlink))
3595 if (!atomic_dec_and_test(&tlink->tl_count) ||
3596 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
3597 tlink->tl_time = jiffies;
3601 if (!IS_ERR(tlink_tcon(tlink)))
3602 cifs_put_tcon(tlink_tcon(tlink));
3608 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3610 struct cifs_sb_info *old = CIFS_SB(sb);
3611 struct cifs_sb_info *new = mnt_data->cifs_sb;
3612 unsigned int oldflags = old->mnt_cifs_flags & CIFS_MOUNT_MASK;
3613 unsigned int newflags = new->mnt_cifs_flags & CIFS_MOUNT_MASK;
3615 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
3618 if (old->mnt_cifs_serverino_autodisabled)
3619 newflags &= ~CIFS_MOUNT_SERVER_INUM;
3621 if (oldflags != newflags)
3625 * We want to share sb only if we don't specify an r/wsize or
3626 * specified r/wsize is greater than or equal to existing one.
3628 if (new->wsize && new->wsize < old->wsize)
3631 if (new->rsize && new->rsize < old->rsize)
3634 if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))
3637 if (old->mnt_file_mode != new->mnt_file_mode ||
3638 old->mnt_dir_mode != new->mnt_dir_mode)
3641 if (strcmp(old->local_nls->charset, new->local_nls->charset))
3644 if (old->actimeo != new->actimeo)
3651 match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3653 struct cifs_sb_info *old = CIFS_SB(sb);
3654 struct cifs_sb_info *new = mnt_data->cifs_sb;
3655 bool old_set = (old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
3657 bool new_set = (new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
3660 if (old_set && new_set && !strcmp(new->prepath, old->prepath))
3662 else if (!old_set && !new_set)
3669 cifs_match_super(struct super_block *sb, void *data)
3671 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
3672 struct smb_vol *volume_info;
3673 struct cifs_sb_info *cifs_sb;
3674 struct TCP_Server_Info *tcp_srv;
3675 struct cifs_ses *ses;
3676 struct cifs_tcon *tcon;
3677 struct tcon_link *tlink;
3680 spin_lock(&cifs_tcp_ses_lock);
3681 cifs_sb = CIFS_SB(sb);
3682 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3683 if (IS_ERR(tlink)) {
3684 spin_unlock(&cifs_tcp_ses_lock);
3687 tcon = tlink_tcon(tlink);
3689 tcp_srv = ses->server;
3691 volume_info = mnt_data->vol;
3693 if (!match_server(tcp_srv, volume_info) ||
3694 !match_session(ses, volume_info) ||
3695 !match_tcon(tcon, volume_info) ||
3696 !match_prepath(sb, mnt_data)) {
3701 rc = compare_mount_options(sb, mnt_data);
3703 spin_unlock(&cifs_tcp_ses_lock);
3704 cifs_put_tlink(tlink);
3708 #ifdef CONFIG_DEBUG_LOCK_ALLOC
3709 static struct lock_class_key cifs_key[2];
3710 static struct lock_class_key cifs_slock_key[2];
3713 cifs_reclassify_socket4(struct socket *sock)
3715 struct sock *sk = sock->sk;
3716 BUG_ON(!sock_allow_reclassification(sk));
3717 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
3718 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
3722 cifs_reclassify_socket6(struct socket *sock)
3724 struct sock *sk = sock->sk;
3725 BUG_ON(!sock_allow_reclassification(sk));
3726 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
3727 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
3731 cifs_reclassify_socket4(struct socket *sock)
3736 cifs_reclassify_socket6(struct socket *sock)
3741 /* See RFC1001 section 14 on representation of Netbios names */
3742 static void rfc1002mangle(char *target, char *source, unsigned int length)
3746 for (i = 0, j = 0; i < (length); i++) {
3747 /* mask a nibble at a time and encode */
3748 target[j] = 'A' + (0x0F & (source[i] >> 4));
3749 target[j+1] = 'A' + (0x0F & source[i]);
3756 bind_socket(struct TCP_Server_Info *server)
3759 if (server->srcaddr.ss_family != AF_UNSPEC) {
3760 /* Bind to the specified local IP address */
3761 struct socket *socket = server->ssocket;
3762 rc = socket->ops->bind(socket,
3763 (struct sockaddr *) &server->srcaddr,
3764 sizeof(server->srcaddr));
3766 struct sockaddr_in *saddr4;
3767 struct sockaddr_in6 *saddr6;
3768 saddr4 = (struct sockaddr_in *)&server->srcaddr;
3769 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
3770 if (saddr6->sin6_family == AF_INET6)
3771 cifs_server_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
3772 &saddr6->sin6_addr, rc);
3774 cifs_server_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
3775 &saddr4->sin_addr.s_addr, rc);
3782 ip_rfc1001_connect(struct TCP_Server_Info *server)
3786 * some servers require RFC1001 sessinit before sending
3787 * negprot - BB check reconnection in case where second
3788 * sessinit is sent but no second negprot
3790 struct rfc1002_session_packet *ses_init_buf;
3791 struct smb_hdr *smb_buf;
3792 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
3795 ses_init_buf->trailer.session_req.called_len = 32;
3797 if (server->server_RFC1001_name[0] != 0)
3798 rfc1002mangle(ses_init_buf->trailer.
3799 session_req.called_name,
3800 server->server_RFC1001_name,
3801 RFC1001_NAME_LEN_WITH_NULL);
3803 rfc1002mangle(ses_init_buf->trailer.
3804 session_req.called_name,
3805 DEFAULT_CIFS_CALLED_NAME,
3806 RFC1001_NAME_LEN_WITH_NULL);
3808 ses_init_buf->trailer.session_req.calling_len = 32;
3811 * calling name ends in null (byte 16) from old smb
3814 if (server->workstation_RFC1001_name[0] != 0)
3815 rfc1002mangle(ses_init_buf->trailer.
3816 session_req.calling_name,
3817 server->workstation_RFC1001_name,
3818 RFC1001_NAME_LEN_WITH_NULL);
3820 rfc1002mangle(ses_init_buf->trailer.
3821 session_req.calling_name,
3823 RFC1001_NAME_LEN_WITH_NULL);
3825 ses_init_buf->trailer.session_req.scope1 = 0;
3826 ses_init_buf->trailer.session_req.scope2 = 0;
3827 smb_buf = (struct smb_hdr *)ses_init_buf;
3829 /* sizeof RFC1002_SESSION_REQUEST with no scope */
3830 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
3831 rc = smb_send(server, smb_buf, 0x44);
3832 kfree(ses_init_buf);
3834 * RFC1001 layer in at least one server
3835 * requires very short break before negprot
3836 * presumably because not expecting negprot
3837 * to follow so fast. This is a simple
3838 * solution that works without
3839 * complicating the code and causes no
3840 * significant slowing down on mount
3843 usleep_range(1000, 2000);
3846 * else the negprot may still work without this
3847 * even though malloc failed
3854 generic_ip_connect(struct TCP_Server_Info *server)
3859 struct socket *socket = server->ssocket;
3860 struct sockaddr *saddr;
3862 saddr = (struct sockaddr *) &server->dstaddr;
3864 if (server->dstaddr.ss_family == AF_INET6) {
3865 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
3866 slen = sizeof(struct sockaddr_in6);
3869 sport = ((struct sockaddr_in *) saddr)->sin_port;
3870 slen = sizeof(struct sockaddr_in);
3874 if (socket == NULL) {
3875 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3876 IPPROTO_TCP, &socket, 1);
3878 cifs_server_dbg(VFS, "Error %d creating socket\n", rc);
3879 server->ssocket = NULL;
3883 /* BB other socket options to set KEEPALIVE, NODELAY? */
3884 cifs_dbg(FYI, "Socket created\n");
3885 server->ssocket = socket;
3886 socket->sk->sk_allocation = GFP_NOFS;
3887 if (sfamily == AF_INET6)
3888 cifs_reclassify_socket6(socket);
3890 cifs_reclassify_socket4(socket);
3893 rc = bind_socket(server);
3898 * Eventually check for other socket options to change from
3899 * the default. sock_setsockopt not used because it expects
3902 socket->sk->sk_rcvtimeo = 7 * HZ;
3903 socket->sk->sk_sndtimeo = 5 * HZ;
3905 /* make the bufsizes depend on wsize/rsize and max requests */
3906 if (server->noautotune) {
3907 if (socket->sk->sk_sndbuf < (200 * 1024))
3908 socket->sk->sk_sndbuf = 200 * 1024;
3909 if (socket->sk->sk_rcvbuf < (140 * 1024))
3910 socket->sk->sk_rcvbuf = 140 * 1024;
3913 if (server->tcp_nodelay) {
3915 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
3916 (char *)&val, sizeof(val));
3918 cifs_dbg(FYI, "set TCP_NODELAY socket option error %d\n",
3922 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3923 socket->sk->sk_sndbuf,
3924 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3926 rc = socket->ops->connect(socket, saddr, slen,
3927 server->noblockcnt ? O_NONBLOCK : 0);
3929 * When mounting SMB root file systems, we do not want to block in
3930 * connect. Otherwise bail out and then let cifs_reconnect() perform
3931 * reconnect failover - if possible.
3933 if (server->noblockcnt && rc == -EINPROGRESS)
3936 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3937 sock_release(socket);
3938 server->ssocket = NULL;
3942 if (sport == htons(RFC1001_PORT))
3943 rc = ip_rfc1001_connect(server);
3949 ip_connect(struct TCP_Server_Info *server)
3952 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3953 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3955 if (server->dstaddr.ss_family == AF_INET6)
3956 sport = &addr6->sin6_port;
3958 sport = &addr->sin_port;
3963 /* try with 445 port at first */
3964 *sport = htons(CIFS_PORT);
3966 rc = generic_ip_connect(server);
3970 /* if it failed, try with 139 port */
3971 *sport = htons(RFC1001_PORT);
3974 return generic_ip_connect(server);
3977 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
3978 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
3980 /* if we are reconnecting then should we check to see if
3981 * any requested capabilities changed locally e.g. via
3982 * remount but we can not do much about it here
3983 * if they have (even if we could detect it by the following)
3984 * Perhaps we could add a backpointer to array of sb from tcon
3985 * or if we change to make all sb to same share the same
3986 * sb as NFS - then we only have one backpointer to sb.
3987 * What if we wanted to mount the server share twice once with
3988 * and once without posixacls or posix paths? */
3989 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3991 if (vol_info && vol_info->no_linux_ext) {
3992 tcon->fsUnixInfo.Capability = 0;
3993 tcon->unix_ext = 0; /* Unix Extensions disabled */
3994 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
3996 } else if (vol_info)
3997 tcon->unix_ext = 1; /* Unix Extensions supported */
3999 if (tcon->unix_ext == 0) {
4000 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
4004 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
4005 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
4006 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
4007 /* check for reconnect case in which we do not
4008 want to change the mount behavior if we can avoid it */
4009 if (vol_info == NULL) {
4010 /* turn off POSIX ACL and PATHNAMES if not set
4011 originally at mount time */
4012 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
4013 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
4014 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
4015 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
4016 cifs_dbg(VFS, "POSIXPATH support change\n");
4017 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
4018 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
4019 cifs_dbg(VFS, "possible reconnect error\n");
4020 cifs_dbg(VFS, "server disabled POSIX path support\n");
4024 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
4025 cifs_dbg(VFS, "per-share encryption not supported yet\n");
4027 cap &= CIFS_UNIX_CAP_MASK;
4028 if (vol_info && vol_info->no_psx_acl)
4029 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
4030 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
4031 cifs_dbg(FYI, "negotiated posix acl support\n");
4033 cifs_sb->mnt_cifs_flags |=
4034 CIFS_MOUNT_POSIXACL;
4037 if (vol_info && vol_info->posix_paths == 0)
4038 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
4039 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
4040 cifs_dbg(FYI, "negotiate posix pathnames\n");
4042 cifs_sb->mnt_cifs_flags |=
4043 CIFS_MOUNT_POSIX_PATHS;
4046 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
4047 #ifdef CONFIG_CIFS_DEBUG2
4048 if (cap & CIFS_UNIX_FCNTL_CAP)
4049 cifs_dbg(FYI, "FCNTL cap\n");
4050 if (cap & CIFS_UNIX_EXTATTR_CAP)
4051 cifs_dbg(FYI, "EXTATTR cap\n");
4052 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
4053 cifs_dbg(FYI, "POSIX path cap\n");
4054 if (cap & CIFS_UNIX_XATTR_CAP)
4055 cifs_dbg(FYI, "XATTR cap\n");
4056 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
4057 cifs_dbg(FYI, "POSIX ACL cap\n");
4058 if (cap & CIFS_UNIX_LARGE_READ_CAP)
4059 cifs_dbg(FYI, "very large read cap\n");
4060 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
4061 cifs_dbg(FYI, "very large write cap\n");
4062 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
4063 cifs_dbg(FYI, "transport encryption cap\n");
4064 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
4065 cifs_dbg(FYI, "mandatory transport encryption cap\n");
4066 #endif /* CIFS_DEBUG2 */
4067 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
4068 if (vol_info == NULL) {
4069 cifs_dbg(FYI, "resetting capabilities failed\n");
4071 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");
4077 int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
4078 struct cifs_sb_info *cifs_sb)
4080 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
4082 spin_lock_init(&cifs_sb->tlink_tree_lock);
4083 cifs_sb->tlink_tree = RB_ROOT;
4085 cifs_sb->bsize = pvolume_info->bsize;
4087 * Temporarily set r/wsize for matching superblock. If we end up using
4088 * new sb then client will later negotiate it downward if needed.
4090 cifs_sb->rsize = pvolume_info->rsize;
4091 cifs_sb->wsize = pvolume_info->wsize;
4093 cifs_sb->mnt_uid = pvolume_info->linux_uid;
4094 cifs_sb->mnt_gid = pvolume_info->linux_gid;
4095 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
4096 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
4097 cifs_dbg(FYI, "file mode: %04ho dir mode: %04ho\n",
4098 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
4100 cifs_sb->actimeo = pvolume_info->actimeo;
4101 cifs_sb->local_nls = pvolume_info->local_nls;
4103 if (pvolume_info->nodfs)
4104 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_DFS;
4105 if (pvolume_info->noperm)
4106 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
4107 if (pvolume_info->setuids)
4108 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
4109 if (pvolume_info->setuidfromacl)
4110 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
4111 if (pvolume_info->server_ino)
4112 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
4113 if (pvolume_info->remap)
4114 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
4115 if (pvolume_info->sfu_remap)
4116 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
4117 if (pvolume_info->no_xattr)
4118 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
4119 if (pvolume_info->sfu_emul)
4120 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
4121 if (pvolume_info->nobrl)
4122 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
4123 if (pvolume_info->nohandlecache)
4124 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_HANDLE_CACHE;
4125 if (pvolume_info->nostrictsync)
4126 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
4127 if (pvolume_info->mand_lock)
4128 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
4129 if (pvolume_info->rwpidforward)
4130 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
4131 if (pvolume_info->mode_ace)
4132 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MODE_FROM_SID;
4133 if (pvolume_info->cifs_acl)
4134 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
4135 if (pvolume_info->backupuid_specified) {
4136 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
4137 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
4139 if (pvolume_info->backupgid_specified) {
4140 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
4141 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
4143 if (pvolume_info->override_uid)
4144 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
4145 if (pvolume_info->override_gid)
4146 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
4147 if (pvolume_info->dynperm)
4148 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
4149 if (pvolume_info->fsc)
4150 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
4151 if (pvolume_info->multiuser)
4152 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
4153 CIFS_MOUNT_NO_PERM);
4154 if (pvolume_info->strict_io)
4155 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
4156 if (pvolume_info->direct_io) {
4157 cifs_dbg(FYI, "mounting share using direct i/o\n");
4158 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
4160 if (pvolume_info->cache_ro) {
4161 cifs_dbg(VFS, "mounting share with read only caching. Ensure that the share will not be modified while in use.\n");
4162 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RO_CACHE;
4163 } else if (pvolume_info->cache_rw) {
4164 cifs_dbg(VFS, "mounting share in single client RW caching mode. Ensure that no other systems will be accessing the share.\n");
4165 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_RO_CACHE |
4166 CIFS_MOUNT_RW_CACHE);
4168 if (pvolume_info->mfsymlinks) {
4169 if (pvolume_info->sfu_emul) {
4171 * Our SFU ("Services for Unix" emulation does not allow
4172 * creating symlinks but does allow reading existing SFU
4173 * symlinks (it does allow both creating and reading SFU
4174 * style mknod and FIFOs though). When "mfsymlinks" and
4175 * "sfu" are both enabled at the same time, it allows
4176 * reading both types of symlinks, but will only create
4177 * them with mfsymlinks format. This allows better
4178 * Apple compatibility (probably better for Samba too)
4179 * while still recognizing old Windows style symlinks.
4181 cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
4183 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
4186 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
4187 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
4189 if (pvolume_info->prepath) {
4190 cifs_sb->prepath = kstrdup(pvolume_info->prepath, GFP_KERNEL);
4191 if (cifs_sb->prepath == NULL)
4199 cifs_cleanup_volume_info_contents(struct smb_vol *volume_info)
4201 kfree(volume_info->username);
4202 kzfree(volume_info->password);
4203 kfree(volume_info->UNC);
4204 kfree(volume_info->domainname);
4205 kfree(volume_info->iocharset);
4206 kfree(volume_info->prepath);
4210 cifs_cleanup_volume_info(struct smb_vol *volume_info)
4214 cifs_cleanup_volume_info_contents(volume_info);
4218 /* Release all succeed connections */
4219 static inline void mount_put_conns(struct cifs_sb_info *cifs_sb,
4221 struct TCP_Server_Info *server,
4222 struct cifs_ses *ses, struct cifs_tcon *tcon)
4227 cifs_put_tcon(tcon);
4229 cifs_put_smb_ses(ses);
4231 cifs_put_tcp_session(server, 0);
4232 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
4236 /* Get connections for tcp, ses and tcon */
4237 static int mount_get_conns(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
4239 struct TCP_Server_Info **nserver,
4240 struct cifs_ses **nses, struct cifs_tcon **ntcon)
4243 struct TCP_Server_Info *server;
4244 struct cifs_ses *ses;
4245 struct cifs_tcon *tcon;
4253 /* get a reference to a tcp session */
4254 server = cifs_get_tcp_session(vol);
4255 if (IS_ERR(server)) {
4256 rc = PTR_ERR(server);
4262 if ((vol->max_credits < 20) || (vol->max_credits > 60000))
4263 server->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
4265 server->max_credits = vol->max_credits;
4267 /* get a reference to a SMB session */
4268 ses = cifs_get_smb_ses(server, vol);
4276 if ((vol->persistent == true) && (!(ses->server->capabilities &
4277 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES))) {
4278 cifs_server_dbg(VFS, "persistent handles not supported by server\n");
4282 /* search for existing tcon to this server share */
4283 tcon = cifs_get_tcon(ses, vol);
4291 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
4292 if (tcon->posix_extensions)
4293 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
4295 /* tell server which Unix caps we support */
4296 if (cap_unix(tcon->ses)) {
4298 * reset of caps checks mount to see if unix extensions disabled
4299 * for just this mount.
4301 reset_cifs_unix_caps(*xid, tcon, cifs_sb, vol);
4302 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
4303 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
4304 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP))
4307 tcon->unix_ext = 0; /* server does not support them */
4309 /* do not care if a following call succeed - informational */
4310 if (!tcon->pipe && server->ops->qfs_tcon) {
4311 server->ops->qfs_tcon(*xid, tcon);
4312 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE) {
4313 if (tcon->fsDevInfo.DeviceCharacteristics &
4314 cpu_to_le32(FILE_READ_ONLY_DEVICE))
4315 cifs_dbg(VFS, "mounted to read only share\n");
4316 else if ((cifs_sb->mnt_cifs_flags &
4317 CIFS_MOUNT_RW_CACHE) == 0)
4318 cifs_dbg(VFS, "read only mount of RW share\n");
4319 /* no need to log a RW mount of a typical RW share */
4323 cifs_sb->wsize = server->ops->negotiate_wsize(tcon, vol);
4324 cifs_sb->rsize = server->ops->negotiate_rsize(tcon, vol);
4329 static int mount_setup_tlink(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
4330 struct cifs_tcon *tcon)
4332 struct tcon_link *tlink;
4334 /* hang the tcon off of the superblock */
4335 tlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4339 tlink->tl_uid = ses->linux_uid;
4340 tlink->tl_tcon = tcon;
4341 tlink->tl_time = jiffies;
4342 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
4343 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4345 cifs_sb->master_tlink = tlink;
4346 spin_lock(&cifs_sb->tlink_tree_lock);
4347 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4348 spin_unlock(&cifs_sb->tlink_tree_lock);
4350 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4355 #ifdef CONFIG_CIFS_DFS_UPCALL
4357 * cifs_build_path_to_root returns full path to root when we do not have an
4358 * exiting connection (tcon)
4361 build_unc_path_to_root(const struct smb_vol *vol,
4362 const struct cifs_sb_info *cifs_sb, bool useppath)
4364 char *full_path, *pos;
4365 unsigned int pplen = useppath && vol->prepath ?
4366 strlen(vol->prepath) + 1 : 0;
4367 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
4369 if (unc_len > MAX_TREE_SIZE)
4370 return ERR_PTR(-EINVAL);
4372 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
4373 if (full_path == NULL)
4374 return ERR_PTR(-ENOMEM);
4376 memcpy(full_path, vol->UNC, unc_len);
4377 pos = full_path + unc_len;
4380 *pos = CIFS_DIR_SEP(cifs_sb);
4381 memcpy(pos + 1, vol->prepath, pplen);
4385 *pos = '\0'; /* add trailing null */
4386 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
4387 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
4392 * expand_dfs_referral - Perform a dfs referral query and update the cifs_sb
4395 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
4396 * to a string containing updated options for the submount. Otherwise it
4397 * will be left untouched.
4399 * Returns the rc from get_dfs_path to the caller, which can be used to
4400 * determine whether there were referrals.
4403 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
4404 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
4408 struct dfs_info3_param referral = {0};
4409 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
4411 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4414 full_path = build_unc_path_to_root(volume_info, cifs_sb, true);
4415 if (IS_ERR(full_path))
4416 return PTR_ERR(full_path);
4418 /* For DFS paths, skip the first '\' of the UNC */
4419 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
4421 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4422 ref_path, &referral, NULL);
4424 char *fake_devname = NULL;
4426 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
4427 full_path + 1, &referral,
4429 free_dfs_info_param(&referral);
4431 if (IS_ERR(mdata)) {
4432 rc = PTR_ERR(mdata);
4435 cifs_cleanup_volume_info_contents(volume_info);
4436 rc = cifs_setup_volume_info(volume_info, mdata,
4437 fake_devname, false);
4439 kfree(fake_devname);
4440 kfree(cifs_sb->mountdata);
4441 cifs_sb->mountdata = mdata;
4447 static inline int get_next_dfs_tgt(const char *path,
4448 struct dfs_cache_tgt_list *tgt_list,
4449 struct dfs_cache_tgt_iterator **tgt_it)
4452 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
4454 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
4455 return !*tgt_it ? -EHOSTDOWN : 0;
4458 static int update_vol_info(const struct dfs_cache_tgt_iterator *tgt_it,
4459 struct smb_vol *fake_vol, struct smb_vol *vol)
4461 const char *tgt = dfs_cache_get_tgt_name(tgt_it);
4462 int len = strlen(tgt) + 2;
4465 new_unc = kmalloc(len, GFP_KERNEL);
4468 scnprintf(new_unc, len, "\\%s", tgt);
4473 if (fake_vol->prepath) {
4474 kfree(vol->prepath);
4475 vol->prepath = fake_vol->prepath;
4476 fake_vol->prepath = NULL;
4478 memcpy(&vol->dstaddr, &fake_vol->dstaddr, sizeof(vol->dstaddr));
4483 static int setup_dfs_tgt_conn(const char *path,
4484 const struct dfs_cache_tgt_iterator *tgt_it,
4485 struct cifs_sb_info *cifs_sb,
4486 struct smb_vol *vol,
4488 struct TCP_Server_Info **server,
4489 struct cifs_ses **ses,
4490 struct cifs_tcon **tcon)
4493 struct dfs_info3_param ref = {0};
4494 char *mdata = NULL, *fake_devname = NULL;
4495 struct smb_vol fake_vol = {NULL};
4497 cifs_dbg(FYI, "%s: dfs path: %s\n", __func__, path);
4499 rc = dfs_cache_get_tgt_referral(path, tgt_it, &ref);
4503 mdata = cifs_compose_mount_options(cifs_sb->mountdata, path, &ref,
4505 free_dfs_info_param(&ref);
4507 if (IS_ERR(mdata)) {
4508 rc = PTR_ERR(mdata);
4511 cifs_dbg(FYI, "%s: fake_devname: %s\n", __func__, fake_devname);
4512 rc = cifs_setup_volume_info(&fake_vol, mdata, fake_devname,
4516 kfree(fake_devname);
4520 * We use a 'fake_vol' here because we need pass it down to the
4521 * mount_{get,put} functions to test connection against new DFS
4524 mount_put_conns(cifs_sb, *xid, *server, *ses, *tcon);
4525 rc = mount_get_conns(&fake_vol, cifs_sb, xid, server, ses,
4529 * We were able to connect to new target server.
4530 * Update current volume info with new target server.
4532 rc = update_vol_info(tgt_it, &fake_vol, vol);
4535 cifs_cleanup_volume_info_contents(&fake_vol);
4539 static int mount_do_dfs_failover(const char *path,
4540 struct cifs_sb_info *cifs_sb,
4541 struct smb_vol *vol,
4542 struct cifs_ses *root_ses,
4544 struct TCP_Server_Info **server,
4545 struct cifs_ses **ses,
4546 struct cifs_tcon **tcon)
4549 struct dfs_cache_tgt_list tgt_list;
4550 struct dfs_cache_tgt_iterator *tgt_it = NULL;
4552 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4555 rc = dfs_cache_noreq_find(path, NULL, &tgt_list);
4560 /* Get next DFS target server - if any */
4561 rc = get_next_dfs_tgt(path, &tgt_list, &tgt_it);
4564 /* Connect to next DFS target */
4565 rc = setup_dfs_tgt_conn(path, tgt_it, cifs_sb, vol, xid, server,
4567 if (!rc || rc == -EACCES || rc == -EOPNOTSUPP)
4572 * Update DFS target hint in DFS referral cache with the target
4573 * server we successfully reconnected to.
4575 rc = dfs_cache_update_tgthint(*xid, root_ses ? root_ses : *ses,
4577 cifs_remap(cifs_sb), path,
4580 dfs_cache_free_tgts(&tgt_list);
4586 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
4587 const char *devname, bool is_smb3)
4591 if (cifs_parse_mount_options(mount_data, devname, volume_info, is_smb3))
4594 if (volume_info->nullauth) {
4595 cifs_dbg(FYI, "Anonymous login\n");
4596 kfree(volume_info->username);
4597 volume_info->username = NULL;
4598 } else if (volume_info->username) {
4599 /* BB fixme parse for domain name here */
4600 cifs_dbg(FYI, "Username: %s\n", volume_info->username);
4602 cifs_dbg(VFS, "No username specified\n");
4603 /* In userspace mount helper we can get user name from alternate
4604 locations such as env variables and files on disk */
4608 /* this is needed for ASCII cp to Unicode converts */
4609 if (volume_info->iocharset == NULL) {
4610 /* load_nls_default cannot return null */
4611 volume_info->local_nls = load_nls_default();
4613 volume_info->local_nls = load_nls(volume_info->iocharset);
4614 if (volume_info->local_nls == NULL) {
4615 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
4616 volume_info->iocharset);
4625 cifs_get_volume_info(char *mount_data, const char *devname, bool is_smb3)
4628 struct smb_vol *volume_info;
4630 volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
4632 return ERR_PTR(-ENOMEM);
4634 rc = cifs_setup_volume_info(volume_info, mount_data, devname, is_smb3);
4636 cifs_cleanup_volume_info(volume_info);
4637 volume_info = ERR_PTR(rc);
4644 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
4646 struct cifs_tcon *tcon,
4647 struct cifs_sb_info *cifs_sb,
4654 int skip = added_treename ? 1 : 0;
4656 sep = CIFS_DIR_SEP(cifs_sb);
4659 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
4661 /* skip separators */
4666 /* next separator */
4667 while (*s && *s != sep)
4670 * if the treename is added, we then have to skip the first
4671 * part within the separators
4678 * temporarily null-terminate the path at the end of
4679 * the current component
4683 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4691 * Check if path is remote (e.g. a DFS share). Return -EREMOTE if it is,
4694 static int is_path_remote(struct cifs_sb_info *cifs_sb, struct smb_vol *vol,
4695 const unsigned int xid,
4696 struct TCP_Server_Info *server,
4697 struct cifs_tcon *tcon)
4702 if (!server->ops->is_path_accessible)
4706 * cifs_build_path_to_root works only when we have a valid tcon
4708 full_path = cifs_build_path_to_root(vol, cifs_sb, tcon,
4709 tcon->Flags & SMB_SHARE_IS_IN_DFS);
4710 if (full_path == NULL)
4713 cifs_dbg(FYI, "%s: full_path: %s\n", __func__, full_path);
4715 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4717 if (rc != 0 && rc != -EREMOTE) {
4722 if (rc != -EREMOTE) {
4723 rc = cifs_are_all_path_components_accessible(server, xid, tcon,
4724 cifs_sb, full_path, tcon->Flags & SMB_SHARE_IS_IN_DFS);
4726 cifs_server_dbg(VFS, "cannot query dirs between root and final path, "
4727 "enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
4728 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
4737 #ifdef CONFIG_CIFS_DFS_UPCALL
4738 static inline void set_root_tcon(struct cifs_sb_info *cifs_sb,
4739 struct cifs_tcon *tcon,
4740 struct cifs_tcon **root)
4742 spin_lock(&cifs_tcp_ses_lock);
4744 tcon->remap = cifs_remap(cifs_sb);
4745 spin_unlock(&cifs_tcp_ses_lock);
4749 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4753 struct cifs_ses *ses;
4754 struct cifs_tcon *root_tcon = NULL;
4755 struct cifs_tcon *tcon = NULL;
4756 struct TCP_Server_Info *server;
4757 char *root_path = NULL, *full_path = NULL;
4758 char *old_mountdata, *origin_mountdata = NULL;
4761 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4763 /* If not a standalone DFS root, then check if path is remote */
4764 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls,
4765 cifs_remap(cifs_sb), vol->UNC + 1, NULL,
4768 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4776 * If first DFS target server went offline and we failed to connect it,
4777 * server and ses pointers are NULL at this point, though we still have
4778 * chance to get a cached DFS referral in expand_dfs_referral() and
4779 * retry next target available in it.
4781 * If a NULL ses ptr is passed to dfs_cache_find(), a lookup will be
4782 * performed against DFS path and *no* requests will be sent to server
4783 * for any new DFS referrals. Hence it's safe to skip checking whether
4784 * server or ses ptr is NULL.
4786 if (rc == -EACCES || rc == -EOPNOTSUPP)
4789 root_path = build_unc_path_to_root(vol, cifs_sb, false);
4790 if (IS_ERR(root_path)) {
4791 rc = PTR_ERR(root_path);
4796 full_path = build_unc_path_to_root(vol, cifs_sb, true);
4797 if (IS_ERR(full_path)) {
4798 rc = PTR_ERR(full_path);
4803 * Perform an unconditional check for whether there are DFS
4804 * referrals for this path without prefix, to provide support
4805 * for DFS referrals from w2k8 servers which don't seem to respond
4806 * with PATH_NOT_COVERED to requests that include the prefix.
4807 * Chase the referral if found, otherwise continue normally.
4809 old_mountdata = cifs_sb->mountdata;
4810 (void)expand_dfs_referral(xid, ses, vol, cifs_sb, false);
4812 if (cifs_sb->mountdata == NULL) {
4817 /* Save DFS root volume information for DFS refresh worker */
4818 origin_mountdata = kstrndup(cifs_sb->mountdata,
4819 strlen(cifs_sb->mountdata), GFP_KERNEL);
4820 if (!origin_mountdata) {
4825 if (cifs_sb->mountdata != old_mountdata) {
4826 /* If we were redirected, reconnect to new target server */
4827 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4828 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4831 if (rc == -EACCES || rc == -EOPNOTSUPP)
4833 /* Perform DFS failover to any other DFS targets */
4834 rc = mount_do_dfs_failover(root_path + 1, cifs_sb, vol, NULL,
4835 &xid, &server, &ses, &tcon);
4841 root_path = build_unc_path_to_root(vol, cifs_sb, false);
4842 if (IS_ERR(root_path)) {
4843 rc = PTR_ERR(root_path);
4847 /* Cache out resolved root server */
4848 (void)dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4849 root_path + 1, NULL, NULL);
4853 set_root_tcon(cifs_sb, tcon, &root_tcon);
4855 for (count = 1; ;) {
4857 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4858 if (!rc || rc != -EREMOTE)
4862 * BB: when we implement proper loop detection,
4863 * we will remove this check. But now we need it
4864 * to prevent an indefinite loop if 'DFS tree' is
4865 * misconfigured (i.e. has loops).
4867 if (count++ > MAX_NESTED_LINKS) {
4873 full_path = build_unc_path_to_root(vol, cifs_sb, true);
4874 if (IS_ERR(full_path)) {
4875 rc = PTR_ERR(full_path);
4880 old_mountdata = cifs_sb->mountdata;
4881 rc = expand_dfs_referral(xid, root_tcon->ses, vol, cifs_sb,
4886 if (cifs_sb->mountdata != old_mountdata) {
4887 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4888 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses,
4891 * Ensure that DFS referrals go through new root server.
4894 (tcon->share_flags & (SHI1005_FLAGS_DFS |
4895 SHI1005_FLAGS_DFS_ROOT))) {
4896 cifs_put_tcon(root_tcon);
4897 set_root_tcon(cifs_sb, tcon, &root_tcon);
4901 if (rc == -EACCES || rc == -EOPNOTSUPP)
4903 /* Perform DFS failover to any other DFS targets */
4904 rc = mount_do_dfs_failover(full_path + 1, cifs_sb, vol,
4905 root_tcon->ses, &xid,
4906 &server, &ses, &tcon);
4907 if (rc == -EACCES || rc == -EOPNOTSUPP || !server ||
4912 cifs_put_tcon(root_tcon);
4917 spin_lock(&cifs_tcp_ses_lock);
4918 if (!tcon->dfs_path) {
4919 /* Save full path in new tcon to do failover when reconnecting tcons */
4920 tcon->dfs_path = full_path;
4922 tcon->remap = cifs_remap(cifs_sb);
4924 cifs_sb->origin_fullpath = kstrndup(tcon->dfs_path,
4925 strlen(tcon->dfs_path),
4927 if (!cifs_sb->origin_fullpath) {
4928 spin_unlock(&cifs_tcp_ses_lock);
4932 spin_unlock(&cifs_tcp_ses_lock);
4934 rc = dfs_cache_add_vol(origin_mountdata, vol, cifs_sb->origin_fullpath);
4936 kfree(cifs_sb->origin_fullpath);
4940 * After reconnecting to a different server, unique ids won't
4941 * match anymore, so we disable serverino. This prevents
4942 * dentry revalidation to think the dentry are stale (ESTALE).
4944 cifs_autodisable_serverino(cifs_sb);
4947 return mount_setup_tlink(cifs_sb, ses, tcon);
4952 kfree(origin_mountdata);
4953 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4957 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4961 struct cifs_ses *ses;
4962 struct cifs_tcon *tcon;
4963 struct TCP_Server_Info *server;
4965 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4970 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4979 return mount_setup_tlink(cifs_sb, ses, tcon);
4982 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4988 * Issue a TREE_CONNECT request.
4991 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
4992 const char *tree, struct cifs_tcon *tcon,
4993 const struct nls_table *nls_codepage)
4995 struct smb_hdr *smb_buffer;
4996 struct smb_hdr *smb_buffer_response;
4999 unsigned char *bcc_ptr;
5002 __u16 bytes_left, count;
5007 smb_buffer = cifs_buf_get();
5008 if (smb_buffer == NULL)
5011 smb_buffer_response = smb_buffer;
5013 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
5014 NULL /*no tid */ , 4 /*wct */ );
5016 smb_buffer->Mid = get_next_mid(ses->server);
5017 smb_buffer->Uid = ses->Suid;
5018 pSMB = (TCONX_REQ *) smb_buffer;
5019 pSMBr = (TCONX_RSP *) smb_buffer_response;
5021 pSMB->AndXCommand = 0xFF;
5022 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
5023 bcc_ptr = &pSMB->Password[0];
5024 if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
5025 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
5026 *bcc_ptr = 0; /* password is null byte */
5027 bcc_ptr++; /* skip password */
5028 /* already aligned so no need to do it below */
5030 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
5031 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
5032 specified as required (when that support is added to
5033 the vfs in the future) as only NTLM or the much
5034 weaker LANMAN (which we do not send by default) is accepted
5035 by Samba (not sure whether other servers allow
5036 NTLMv2 password here) */
5037 #ifdef CONFIG_CIFS_WEAK_PW_HASH
5038 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
5039 (ses->sectype == LANMAN))
5040 calc_lanman_hash(tcon->password, ses->server->cryptkey,
5041 ses->server->sec_mode &
5042 SECMODE_PW_ENCRYPT ? true : false,
5045 #endif /* CIFS_WEAK_PW_HASH */
5046 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
5047 bcc_ptr, nls_codepage);
5049 cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
5051 cifs_buf_release(smb_buffer);
5055 bcc_ptr += CIFS_AUTH_RESP_SIZE;
5056 if (ses->capabilities & CAP_UNICODE) {
5057 /* must align unicode strings */
5058 *bcc_ptr = 0; /* null byte password */
5063 if (ses->server->sign)
5064 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
5066 if (ses->capabilities & CAP_STATUS32) {
5067 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
5069 if (ses->capabilities & CAP_DFS) {
5070 smb_buffer->Flags2 |= SMBFLG2_DFS;
5072 if (ses->capabilities & CAP_UNICODE) {
5073 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
5075 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
5076 6 /* max utf8 char length in bytes */ *
5077 (/* server len*/ + 256 /* share len */), nls_codepage);
5078 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
5079 bcc_ptr += 2; /* skip trailing null */
5080 } else { /* ASCII */
5081 strcpy(bcc_ptr, tree);
5082 bcc_ptr += strlen(tree) + 1;
5084 strcpy(bcc_ptr, "?????");
5085 bcc_ptr += strlen("?????");
5087 count = bcc_ptr - &pSMB->Password[0];
5088 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
5089 pSMB->hdr.smb_buf_length) + count);
5090 pSMB->ByteCount = cpu_to_le16(count);
5092 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
5095 /* above now done in SendReceive */
5099 tcon->tidStatus = CifsGood;
5100 tcon->need_reconnect = false;
5101 tcon->tid = smb_buffer_response->Tid;
5102 bcc_ptr = pByteArea(smb_buffer_response);
5103 bytes_left = get_bcc(smb_buffer_response);
5104 length = strnlen(bcc_ptr, bytes_left - 2);
5105 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
5111 /* skip service field (NB: this field is always ASCII) */
5113 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
5114 (bcc_ptr[2] == 'C')) {
5115 cifs_dbg(FYI, "IPC connection\n");
5119 } else if (length == 2) {
5120 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
5121 /* the most common case */
5122 cifs_dbg(FYI, "disk share connection\n");
5125 bcc_ptr += length + 1;
5126 bytes_left -= (length + 1);
5127 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
5129 /* mostly informational -- no need to fail on error here */
5130 kfree(tcon->nativeFileSystem);
5131 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
5132 bytes_left, is_unicode,
5135 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
5137 if ((smb_buffer_response->WordCount == 3) ||
5138 (smb_buffer_response->WordCount == 7))
5139 /* field is in same location */
5140 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
5143 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
5146 cifs_buf_release(smb_buffer);
5150 static void delayed_free(struct rcu_head *p)
5152 struct cifs_sb_info *sbi = container_of(p, struct cifs_sb_info, rcu);
5153 unload_nls(sbi->local_nls);
5158 cifs_umount(struct cifs_sb_info *cifs_sb)
5160 struct rb_root *root = &cifs_sb->tlink_tree;
5161 struct rb_node *node;
5162 struct tcon_link *tlink;
5164 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
5166 spin_lock(&cifs_sb->tlink_tree_lock);
5167 while ((node = rb_first(root))) {
5168 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
5169 cifs_get_tlink(tlink);
5170 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
5171 rb_erase(node, root);
5173 spin_unlock(&cifs_sb->tlink_tree_lock);
5174 cifs_put_tlink(tlink);
5175 spin_lock(&cifs_sb->tlink_tree_lock);
5177 spin_unlock(&cifs_sb->tlink_tree_lock);
5179 kfree(cifs_sb->mountdata);
5180 kfree(cifs_sb->prepath);
5181 #ifdef CONFIG_CIFS_DFS_UPCALL
5182 dfs_cache_del_vol(cifs_sb->origin_fullpath);
5183 kfree(cifs_sb->origin_fullpath);
5185 call_rcu(&cifs_sb->rcu, delayed_free);
5189 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
5192 struct TCP_Server_Info *server = ses->server;
5194 if (!server->ops->need_neg || !server->ops->negotiate)
5197 /* only send once per connect */
5198 if (!server->ops->need_neg(server))
5201 rc = server->ops->negotiate(xid, ses);
5203 spin_lock(&GlobalMid_Lock);
5204 if (server->tcpStatus == CifsNeedNegotiate)
5205 server->tcpStatus = CifsGood;
5208 spin_unlock(&GlobalMid_Lock);
5215 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
5216 struct nls_table *nls_info)
5219 struct TCP_Server_Info *server = ses->server;
5221 ses->capabilities = server->capabilities;
5222 if (linuxExtEnabled == 0)
5223 ses->capabilities &= (~server->vals->cap_unix);
5225 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
5226 server->sec_mode, server->capabilities, server->timeAdj);
5228 if (ses->auth_key.response) {
5229 cifs_dbg(FYI, "Free previous auth_key.response = %p\n",
5230 ses->auth_key.response);
5231 kfree(ses->auth_key.response);
5232 ses->auth_key.response = NULL;
5233 ses->auth_key.len = 0;
5236 if (server->ops->sess_setup)
5237 rc = server->ops->sess_setup(xid, ses, nls_info);
5240 cifs_server_dbg(VFS, "Send error in SessSetup = %d\n", rc);
5246 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
5248 vol->sectype = ses->sectype;
5250 /* krb5 is special, since we don't need username or pw */
5251 if (vol->sectype == Kerberos)
5254 return cifs_set_cifscreds(vol, ses);
5257 static struct cifs_tcon *
5258 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
5261 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
5262 struct cifs_ses *ses;
5263 struct cifs_tcon *tcon = NULL;
5264 struct smb_vol *vol_info;
5266 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
5267 if (vol_info == NULL)
5268 return ERR_PTR(-ENOMEM);
5270 vol_info->local_nls = cifs_sb->local_nls;
5271 vol_info->linux_uid = fsuid;
5272 vol_info->cred_uid = fsuid;
5273 vol_info->UNC = master_tcon->treeName;
5274 vol_info->retry = master_tcon->retry;
5275 vol_info->nocase = master_tcon->nocase;
5276 vol_info->nohandlecache = master_tcon->nohandlecache;
5277 vol_info->local_lease = master_tcon->local_lease;
5278 vol_info->no_linux_ext = !master_tcon->unix_ext;
5279 vol_info->sectype = master_tcon->ses->sectype;
5280 vol_info->sign = master_tcon->ses->sign;
5282 rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
5288 /* get a reference for the same TCP session */
5289 spin_lock(&cifs_tcp_ses_lock);
5290 ++master_tcon->ses->server->srv_count;
5291 spin_unlock(&cifs_tcp_ses_lock);
5293 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
5295 tcon = (struct cifs_tcon *)ses;
5296 cifs_put_tcp_session(master_tcon->ses->server, 0);
5300 tcon = cifs_get_tcon(ses, vol_info);
5302 cifs_put_smb_ses(ses);
5306 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
5307 if (tcon->posix_extensions)
5308 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
5311 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
5314 kfree(vol_info->username);
5315 kzfree(vol_info->password);
5322 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
5324 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
5327 /* find and return a tlink with given uid */
5328 static struct tcon_link *
5329 tlink_rb_search(struct rb_root *root, kuid_t uid)
5331 struct rb_node *node = root->rb_node;
5332 struct tcon_link *tlink;
5335 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
5337 if (uid_gt(tlink->tl_uid, uid))
5338 node = node->rb_left;
5339 else if (uid_lt(tlink->tl_uid, uid))
5340 node = node->rb_right;
5347 /* insert a tcon_link into the tree */
5349 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
5351 struct rb_node **new = &(root->rb_node), *parent = NULL;
5352 struct tcon_link *tlink;
5355 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
5358 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
5359 new = &((*new)->rb_left);
5361 new = &((*new)->rb_right);
5364 rb_link_node(&new_tlink->tl_rbnode, parent, new);
5365 rb_insert_color(&new_tlink->tl_rbnode, root);
5369 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
5372 * If the superblock doesn't refer to a multiuser mount, then just return
5373 * the master tcon for the mount.
5375 * First, search the rbtree for an existing tcon for this fsuid. If one
5376 * exists, then check to see if it's pending construction. If it is then wait
5377 * for construction to complete. Once it's no longer pending, check to see if
5378 * it failed and either return an error or retry construction, depending on
5381 * If one doesn't exist then insert a new tcon_link struct into the tree and
5382 * try to construct a new one.
5385 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
5388 kuid_t fsuid = current_fsuid();
5389 struct tcon_link *tlink, *newtlink;
5391 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
5392 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
5394 spin_lock(&cifs_sb->tlink_tree_lock);
5395 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5397 cifs_get_tlink(tlink);
5398 spin_unlock(&cifs_sb->tlink_tree_lock);
5400 if (tlink == NULL) {
5401 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
5402 if (newtlink == NULL)
5403 return ERR_PTR(-ENOMEM);
5404 newtlink->tl_uid = fsuid;
5405 newtlink->tl_tcon = ERR_PTR(-EACCES);
5406 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
5407 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
5408 cifs_get_tlink(newtlink);
5410 spin_lock(&cifs_sb->tlink_tree_lock);
5411 /* was one inserted after previous search? */
5412 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5414 cifs_get_tlink(tlink);
5415 spin_unlock(&cifs_sb->tlink_tree_lock);
5417 goto wait_for_construction;
5420 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
5421 spin_unlock(&cifs_sb->tlink_tree_lock);
5423 wait_for_construction:
5424 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
5425 TASK_INTERRUPTIBLE);
5427 cifs_put_tlink(tlink);
5428 return ERR_PTR(-ERESTARTSYS);
5431 /* if it's good, return it */
5432 if (!IS_ERR(tlink->tl_tcon))
5435 /* return error if we tried this already recently */
5436 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
5437 cifs_put_tlink(tlink);
5438 return ERR_PTR(-EACCES);
5441 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
5442 goto wait_for_construction;
5445 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
5446 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
5447 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
5449 if (IS_ERR(tlink->tl_tcon)) {
5450 cifs_put_tlink(tlink);
5451 return ERR_PTR(-EACCES);
5458 * periodic workqueue job that scans tcon_tree for a superblock and closes
5462 cifs_prune_tlinks(struct work_struct *work)
5464 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
5466 struct rb_root *root = &cifs_sb->tlink_tree;
5467 struct rb_node *node;
5468 struct rb_node *tmp;
5469 struct tcon_link *tlink;
5472 * Because we drop the spinlock in the loop in order to put the tlink
5473 * it's not guarded against removal of links from the tree. The only
5474 * places that remove entries from the tree are this function and
5475 * umounts. Because this function is non-reentrant and is canceled
5476 * before umount can proceed, this is safe.
5478 spin_lock(&cifs_sb->tlink_tree_lock);
5479 node = rb_first(root);
5480 while (node != NULL) {
5482 node = rb_next(tmp);
5483 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
5485 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
5486 atomic_read(&tlink->tl_count) != 0 ||
5487 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
5490 cifs_get_tlink(tlink);
5491 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
5492 rb_erase(tmp, root);
5494 spin_unlock(&cifs_sb->tlink_tree_lock);
5495 cifs_put_tlink(tlink);
5496 spin_lock(&cifs_sb->tlink_tree_lock);
5498 spin_unlock(&cifs_sb->tlink_tree_lock);
5500 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,