4 * Copyright (C) International Business Machines Corp., 2002,2011
7 * This library is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser General Public License as published
9 * by the Free Software Foundation; either version 2.1 of the License, or
10 * (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
15 * the GNU Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include <linux/net.h>
23 #include <linux/string.h>
24 #include <linux/sched/signal.h>
25 #include <linux/list.h>
26 #include <linux/wait.h>
27 #include <linux/slab.h>
28 #include <linux/pagemap.h>
29 #include <linux/ctype.h>
30 #include <linux/utsname.h>
31 #include <linux/mempool.h>
32 #include <linux/delay.h>
33 #include <linux/completion.h>
34 #include <linux/kthread.h>
35 #include <linux/pagevec.h>
36 #include <linux/freezer.h>
37 #include <linux/namei.h>
38 #include <linux/uuid.h>
39 #include <linux/uaccess.h>
40 #include <asm/processor.h>
41 #include <linux/inet.h>
42 #include <linux/module.h>
43 #include <keys/user-type.h>
45 #include <linux/parser.h>
46 #include <linux/bvec.h>
49 #include "cifsproto.h"
50 #include "cifs_unicode.h"
51 #include "cifs_debug.h"
52 #include "cifs_fs_sb.h"
55 #include "rfc1002pdu.h"
57 #include "smb2proto.h"
58 #include "smbdirect.h"
59 #include "dns_resolve.h"
61 #ifdef CONFIG_CIFS_DFS_UPCALL
62 #include "dfs_cache.h"
65 extern mempool_t *cifs_req_poolp;
66 extern bool disable_legacy_dialects;
68 /* FIXME: should these be tunable? */
69 #define TLINK_ERROR_EXPIRE (1 * HZ)
70 #define TLINK_IDLE_EXPIRE (600 * HZ)
73 /* Mount options that take no arguments */
74 Opt_user_xattr, Opt_nouser_xattr,
75 Opt_forceuid, Opt_noforceuid,
76 Opt_forcegid, Opt_noforcegid,
77 Opt_noblocksend, Opt_noautotune,
78 Opt_hard, Opt_soft, Opt_perm, Opt_noperm,
79 Opt_mapposix, Opt_nomapposix,
80 Opt_mapchars, Opt_nomapchars, Opt_sfu,
81 Opt_nosfu, Opt_nodfs, Opt_posixpaths,
82 Opt_noposixpaths, Opt_nounix, Opt_unix,
85 Opt_handlecache, Opt_nohandlecache,
86 Opt_forcemandatorylock, Opt_setuidfromacl, Opt_setuids,
87 Opt_nosetuids, Opt_dynperm, Opt_nodynperm,
88 Opt_nohard, Opt_nosoft,
90 Opt_nostrictsync, Opt_strictsync,
91 Opt_serverino, Opt_noserverino,
92 Opt_rwpidforward, Opt_cifsacl, Opt_nocifsacl,
93 Opt_acl, Opt_noacl, Opt_locallease,
94 Opt_sign, Opt_seal, Opt_noac,
95 Opt_fsc, Opt_mfsymlinks,
96 Opt_multiuser, Opt_sloppy, Opt_nosharesock,
97 Opt_persistent, Opt_nopersistent,
98 Opt_resilient, Opt_noresilient,
99 Opt_domainauto, Opt_rdma,
101 /* Mount options which take numeric value */
102 Opt_backupuid, Opt_backupgid, Opt_uid,
103 Opt_cruid, Opt_gid, Opt_file_mode,
104 Opt_dirmode, Opt_port,
105 Opt_blocksize, Opt_rsize, Opt_wsize, Opt_actimeo,
106 Opt_echo_interval, Opt_max_credits, Opt_handletimeout,
109 /* Mount options which take string value */
110 Opt_user, Opt_pass, Opt_ip,
111 Opt_domain, Opt_srcaddr, Opt_iocharset,
112 Opt_netbiosname, Opt_servern,
113 Opt_ver, Opt_vers, Opt_sec, Opt_cache,
115 /* Mount options to be ignored */
118 /* Options which could be blank */
126 static const match_table_t cifs_mount_option_tokens = {
128 { Opt_user_xattr, "user_xattr" },
129 { Opt_nouser_xattr, "nouser_xattr" },
130 { Opt_forceuid, "forceuid" },
131 { Opt_noforceuid, "noforceuid" },
132 { Opt_forcegid, "forcegid" },
133 { Opt_noforcegid, "noforcegid" },
134 { Opt_noblocksend, "noblocksend" },
135 { Opt_noautotune, "noautotune" },
136 { Opt_hard, "hard" },
137 { Opt_soft, "soft" },
138 { Opt_perm, "perm" },
139 { Opt_noperm, "noperm" },
140 { Opt_mapchars, "mapchars" }, /* SFU style */
141 { Opt_nomapchars, "nomapchars" },
142 { Opt_mapposix, "mapposix" }, /* SFM style */
143 { Opt_nomapposix, "nomapposix" },
145 { Opt_nosfu, "nosfu" },
146 { Opt_nodfs, "nodfs" },
147 { Opt_posixpaths, "posixpaths" },
148 { Opt_noposixpaths, "noposixpaths" },
149 { Opt_nounix, "nounix" },
150 { Opt_nounix, "nolinux" },
151 { Opt_nounix, "noposix" },
152 { Opt_unix, "unix" },
153 { Opt_unix, "linux" },
154 { Opt_unix, "posix" },
155 { Opt_nocase, "nocase" },
156 { Opt_nocase, "ignorecase" },
158 { Opt_nobrl, "nobrl" },
159 { Opt_handlecache, "handlecache" },
160 { Opt_nohandlecache, "nohandlecache" },
161 { Opt_nobrl, "nolock" },
162 { Opt_forcemandatorylock, "forcemandatorylock" },
163 { Opt_forcemandatorylock, "forcemand" },
164 { Opt_setuids, "setuids" },
165 { Opt_nosetuids, "nosetuids" },
166 { Opt_setuidfromacl, "idsfromsid" },
167 { Opt_dynperm, "dynperm" },
168 { Opt_nodynperm, "nodynperm" },
169 { Opt_nohard, "nohard" },
170 { Opt_nosoft, "nosoft" },
171 { Opt_nointr, "nointr" },
172 { Opt_intr, "intr" },
173 { Opt_nostrictsync, "nostrictsync" },
174 { Opt_strictsync, "strictsync" },
175 { Opt_serverino, "serverino" },
176 { Opt_noserverino, "noserverino" },
177 { Opt_rwpidforward, "rwpidforward" },
178 { Opt_cifsacl, "cifsacl" },
179 { Opt_nocifsacl, "nocifsacl" },
181 { Opt_noacl, "noacl" },
182 { Opt_locallease, "locallease" },
183 { Opt_sign, "sign" },
184 { Opt_seal, "seal" },
185 { Opt_noac, "noac" },
187 { Opt_mfsymlinks, "mfsymlinks" },
188 { Opt_multiuser, "multiuser" },
189 { Opt_sloppy, "sloppy" },
190 { Opt_nosharesock, "nosharesock" },
191 { Opt_persistent, "persistenthandles"},
192 { Opt_nopersistent, "nopersistenthandles"},
193 { Opt_resilient, "resilienthandles"},
194 { Opt_noresilient, "noresilienthandles"},
195 { Opt_domainauto, "domainauto"},
198 { Opt_backupuid, "backupuid=%s" },
199 { Opt_backupgid, "backupgid=%s" },
200 { Opt_uid, "uid=%s" },
201 { Opt_cruid, "cruid=%s" },
202 { Opt_gid, "gid=%s" },
203 { Opt_file_mode, "file_mode=%s" },
204 { Opt_dirmode, "dirmode=%s" },
205 { Opt_dirmode, "dir_mode=%s" },
206 { Opt_port, "port=%s" },
207 { Opt_blocksize, "bsize=%s" },
208 { Opt_rsize, "rsize=%s" },
209 { Opt_wsize, "wsize=%s" },
210 { Opt_actimeo, "actimeo=%s" },
211 { Opt_handletimeout, "handletimeout=%s" },
212 { Opt_echo_interval, "echo_interval=%s" },
213 { Opt_max_credits, "max_credits=%s" },
214 { Opt_snapshot, "snapshot=%s" },
216 { Opt_blank_user, "user=" },
217 { Opt_blank_user, "username=" },
218 { Opt_user, "user=%s" },
219 { Opt_user, "username=%s" },
220 { Opt_blank_pass, "pass=" },
221 { Opt_blank_pass, "password=" },
222 { Opt_pass, "pass=%s" },
223 { Opt_pass, "password=%s" },
224 { Opt_blank_ip, "ip=" },
225 { Opt_blank_ip, "addr=" },
227 { Opt_ip, "addr=%s" },
228 { Opt_ignore, "unc=%s" },
229 { Opt_ignore, "target=%s" },
230 { Opt_ignore, "path=%s" },
231 { Opt_domain, "dom=%s" },
232 { Opt_domain, "domain=%s" },
233 { Opt_domain, "workgroup=%s" },
234 { Opt_srcaddr, "srcaddr=%s" },
235 { Opt_ignore, "prefixpath=%s" },
236 { Opt_iocharset, "iocharset=%s" },
237 { Opt_netbiosname, "netbiosname=%s" },
238 { Opt_servern, "servern=%s" },
239 { Opt_ver, "ver=%s" },
240 { Opt_vers, "vers=%s" },
241 { Opt_sec, "sec=%s" },
242 { Opt_cache, "cache=%s" },
244 { Opt_ignore, "cred" },
245 { Opt_ignore, "credentials" },
246 { Opt_ignore, "cred=%s" },
247 { Opt_ignore, "credentials=%s" },
248 { Opt_ignore, "guest" },
249 { Opt_ignore, "rw" },
250 { Opt_ignore, "ro" },
251 { Opt_ignore, "suid" },
252 { Opt_ignore, "nosuid" },
253 { Opt_ignore, "exec" },
254 { Opt_ignore, "noexec" },
255 { Opt_ignore, "nodev" },
256 { Opt_ignore, "noauto" },
257 { Opt_ignore, "dev" },
258 { Opt_ignore, "mand" },
259 { Opt_ignore, "nomand" },
260 { Opt_ignore, "relatime" },
261 { Opt_ignore, "_netdev" },
267 Opt_sec_krb5, Opt_sec_krb5i, Opt_sec_krb5p,
268 Opt_sec_ntlmsspi, Opt_sec_ntlmssp,
269 Opt_ntlm, Opt_sec_ntlmi, Opt_sec_ntlmv2,
270 Opt_sec_ntlmv2i, Opt_sec_lanman,
276 static const match_table_t cifs_secflavor_tokens = {
277 { Opt_sec_krb5, "krb5" },
278 { Opt_sec_krb5i, "krb5i" },
279 { Opt_sec_krb5p, "krb5p" },
280 { Opt_sec_ntlmsspi, "ntlmsspi" },
281 { Opt_sec_ntlmssp, "ntlmssp" },
282 { Opt_ntlm, "ntlm" },
283 { Opt_sec_ntlmi, "ntlmi" },
284 { Opt_sec_ntlmv2, "nontlm" },
285 { Opt_sec_ntlmv2, "ntlmv2" },
286 { Opt_sec_ntlmv2i, "ntlmv2i" },
287 { Opt_sec_lanman, "lanman" },
288 { Opt_sec_none, "none" },
290 { Opt_sec_err, NULL }
301 static const match_table_t cifs_cacheflavor_tokens = {
302 { Opt_cache_loose, "loose" },
303 { Opt_cache_strict, "strict" },
304 { Opt_cache_none, "none" },
305 { Opt_cache_err, NULL }
308 static const match_table_t cifs_smb_version_tokens = {
309 { Smb_1, SMB1_VERSION_STRING },
310 { Smb_20, SMB20_VERSION_STRING},
311 { Smb_21, SMB21_VERSION_STRING },
312 { Smb_30, SMB30_VERSION_STRING },
313 { Smb_302, SMB302_VERSION_STRING },
314 { Smb_302, ALT_SMB302_VERSION_STRING },
315 { Smb_311, SMB311_VERSION_STRING },
316 { Smb_311, ALT_SMB311_VERSION_STRING },
317 { Smb_3any, SMB3ANY_VERSION_STRING },
318 { Smb_default, SMBDEFAULT_VERSION_STRING },
319 { Smb_version_err, NULL }
322 static int ip_connect(struct TCP_Server_Info *server);
323 static int generic_ip_connect(struct TCP_Server_Info *server);
324 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
325 static void cifs_prune_tlinks(struct work_struct *work);
326 static char *extract_hostname(const char *unc);
329 * Resolve hostname and set ip addr in tcp ses. Useful for hostnames that may
330 * get their ip addresses changed at some point.
332 * This should be called with server->srv_mutex held.
334 #ifdef CONFIG_CIFS_DFS_UPCALL
335 static int reconn_set_ipaddr(struct TCP_Server_Info *server)
339 char *unc, *ipaddr = NULL;
341 if (!server->hostname)
344 len = strlen(server->hostname) + 3;
346 unc = kmalloc(len, GFP_KERNEL);
348 cifs_dbg(FYI, "%s: failed to create UNC path\n", __func__);
351 scnprintf(unc, len, "\\\\%s", server->hostname);
353 rc = dns_resolve_server_name_to_ip(unc, &ipaddr);
357 cifs_dbg(FYI, "%s: failed to resolve server part of %s to IP: %d\n",
358 __func__, server->hostname, rc);
362 rc = cifs_convert_address((struct sockaddr *)&server->dstaddr, ipaddr,
369 static inline int reconn_set_ipaddr(struct TCP_Server_Info *server)
375 #ifdef CONFIG_CIFS_DFS_UPCALL
376 struct super_cb_data {
377 struct TCP_Server_Info *server;
378 struct cifs_sb_info *cifs_sb;
381 /* These functions must be called with server->srv_mutex held */
383 static void super_cb(struct super_block *sb, void *arg)
385 struct super_cb_data *d = arg;
386 struct cifs_sb_info *cifs_sb;
387 struct cifs_tcon *tcon;
392 cifs_sb = CIFS_SB(sb);
393 tcon = cifs_sb_master_tcon(cifs_sb);
394 if (tcon->ses->server == d->server)
395 d->cifs_sb = cifs_sb;
398 static inline struct cifs_sb_info *
399 find_super_by_tcp(struct TCP_Server_Info *server)
401 struct super_cb_data d = {
406 iterate_supers_type(&cifs_fs_type, super_cb, &d);
407 return d.cifs_sb ? d.cifs_sb : ERR_PTR(-ENOENT);
410 static void reconn_inval_dfs_target(struct TCP_Server_Info *server,
411 struct cifs_sb_info *cifs_sb,
412 struct dfs_cache_tgt_list *tgt_list,
413 struct dfs_cache_tgt_iterator **tgt_it)
417 if (!cifs_sb || !cifs_sb->origin_fullpath || !tgt_list ||
422 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
424 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
426 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
429 cifs_dbg(FYI, "%s: UNC: %s\n", __func__, cifs_sb->origin_fullpath);
431 name = dfs_cache_get_tgt_name(*tgt_it);
433 kfree(server->hostname);
435 server->hostname = extract_hostname(name);
436 if (IS_ERR(server->hostname)) {
438 "%s: failed to extract hostname from target: %ld\n",
439 __func__, PTR_ERR(server->hostname));
443 static inline int reconn_setup_dfs_targets(struct cifs_sb_info *cifs_sb,
444 struct dfs_cache_tgt_list *tl,
445 struct dfs_cache_tgt_iterator **it)
447 if (!cifs_sb->origin_fullpath)
449 return dfs_cache_noreq_find(cifs_sb->origin_fullpath + 1, NULL, tl);
454 * cifs tcp session reconnection
456 * mark tcp session as reconnecting so temporarily locked
457 * mark all smb sessions as reconnecting for tcp session
458 * reconnect tcp session
459 * wake up waiters on reconnection? - (not needed currently)
462 cifs_reconnect(struct TCP_Server_Info *server)
465 struct list_head *tmp, *tmp2;
466 struct cifs_ses *ses;
467 struct cifs_tcon *tcon;
468 struct mid_q_entry *mid_entry;
469 struct list_head retry_list;
470 #ifdef CONFIG_CIFS_DFS_UPCALL
471 struct cifs_sb_info *cifs_sb = NULL;
472 struct dfs_cache_tgt_list tgt_list = {0};
473 struct dfs_cache_tgt_iterator *tgt_it = NULL;
476 spin_lock(&GlobalMid_Lock);
477 server->nr_targets = 1;
478 #ifdef CONFIG_CIFS_DFS_UPCALL
479 cifs_sb = find_super_by_tcp(server);
480 if (IS_ERR(cifs_sb)) {
481 rc = PTR_ERR(cifs_sb);
482 cifs_dbg(FYI, "%s: will not do DFS failover: rc = %d\n",
486 rc = reconn_setup_dfs_targets(cifs_sb, &tgt_list, &tgt_it);
487 if (rc && (rc != -EOPNOTSUPP)) {
488 cifs_dbg(VFS, "%s: no target servers for DFS failover\n",
491 server->nr_targets = dfs_cache_get_nr_tgts(&tgt_list);
494 cifs_dbg(FYI, "%s: will retry %d target(s)\n", __func__,
497 if (server->tcpStatus == CifsExiting) {
498 /* the demux thread will exit normally
499 next time through the loop */
500 spin_unlock(&GlobalMid_Lock);
503 server->tcpStatus = CifsNeedReconnect;
504 spin_unlock(&GlobalMid_Lock);
506 server->max_read = 0;
508 cifs_dbg(FYI, "Mark tcp session as need reconnect\n");
509 trace_smb3_reconnect(server->CurrentMid, server->hostname);
511 /* before reconnecting the tcp session, mark the smb session (uid)
512 and the tid bad so they are not used until reconnected */
513 cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
515 spin_lock(&cifs_tcp_ses_lock);
516 list_for_each(tmp, &server->smb_ses_list) {
517 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
518 ses->need_reconnect = true;
519 list_for_each(tmp2, &ses->tcon_list) {
520 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
521 tcon->need_reconnect = true;
524 ses->tcon_ipc->need_reconnect = true;
526 spin_unlock(&cifs_tcp_ses_lock);
528 /* do not want to be sending data on a socket we are freeing */
529 cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
530 mutex_lock(&server->srv_mutex);
531 if (server->ssocket) {
532 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
533 server->ssocket->state, server->ssocket->flags);
534 kernel_sock_shutdown(server->ssocket, SHUT_WR);
535 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
536 server->ssocket->state, server->ssocket->flags);
537 sock_release(server->ssocket);
538 server->ssocket = NULL;
540 server->sequence_number = 0;
541 server->session_estab = false;
542 kfree(server->session_key.response);
543 server->session_key.response = NULL;
544 server->session_key.len = 0;
545 server->lstrp = jiffies;
547 /* mark submitted MIDs for retry and issue callback */
548 INIT_LIST_HEAD(&retry_list);
549 cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
550 spin_lock(&GlobalMid_Lock);
551 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
552 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
553 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
554 mid_entry->mid_state = MID_RETRY_NEEDED;
555 list_move(&mid_entry->qhead, &retry_list);
557 spin_unlock(&GlobalMid_Lock);
558 mutex_unlock(&server->srv_mutex);
560 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
561 list_for_each_safe(tmp, tmp2, &retry_list) {
562 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
563 list_del_init(&mid_entry->qhead);
564 mid_entry->callback(mid_entry);
567 if (cifs_rdma_enabled(server)) {
568 mutex_lock(&server->srv_mutex);
569 smbd_destroy(server);
570 mutex_unlock(&server->srv_mutex);
576 mutex_lock(&server->srv_mutex);
578 * Set up next DFS target server (if any) for reconnect. If DFS
579 * feature is disabled, then we will retry last server we
580 * connected to before.
582 if (cifs_rdma_enabled(server))
583 rc = smbd_reconnect(server);
585 rc = generic_ip_connect(server);
587 cifs_dbg(FYI, "reconnect error %d\n", rc);
588 #ifdef CONFIG_CIFS_DFS_UPCALL
589 reconn_inval_dfs_target(server, cifs_sb, &tgt_list,
592 rc = reconn_set_ipaddr(server);
594 cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
597 mutex_unlock(&server->srv_mutex);
600 atomic_inc(&tcpSesReconnectCount);
601 set_credits(server, 1);
602 spin_lock(&GlobalMid_Lock);
603 if (server->tcpStatus != CifsExiting)
604 server->tcpStatus = CifsNeedNegotiate;
605 spin_unlock(&GlobalMid_Lock);
606 mutex_unlock(&server->srv_mutex);
608 } while (server->tcpStatus == CifsNeedReconnect);
610 #ifdef CONFIG_CIFS_DFS_UPCALL
612 rc = dfs_cache_noreq_update_tgthint(cifs_sb->origin_fullpath + 1,
615 cifs_dbg(VFS, "%s: failed to update DFS target hint: rc = %d\n",
618 rc = dfs_cache_update_vol(cifs_sb->origin_fullpath, server);
620 cifs_dbg(VFS, "%s: failed to update vol info in DFS cache: rc = %d\n",
623 dfs_cache_free_tgts(&tgt_list);
626 if (server->tcpStatus == CifsNeedNegotiate)
627 mod_delayed_work(cifsiod_wq, &server->echo, 0);
633 cifs_echo_request(struct work_struct *work)
636 struct TCP_Server_Info *server = container_of(work,
637 struct TCP_Server_Info, echo.work);
638 unsigned long echo_interval;
641 * If we need to renegotiate, set echo interval to zero to
642 * immediately call echo service where we can renegotiate.
644 if (server->tcpStatus == CifsNeedNegotiate)
647 echo_interval = server->echo_interval;
650 * We cannot send an echo if it is disabled.
651 * Also, no need to ping if we got a response recently.
654 if (server->tcpStatus == CifsNeedReconnect ||
655 server->tcpStatus == CifsExiting ||
656 server->tcpStatus == CifsNew ||
657 (server->ops->can_echo && !server->ops->can_echo(server)) ||
658 time_before(jiffies, server->lstrp + echo_interval - HZ))
661 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
663 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
667 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
671 allocate_buffers(struct TCP_Server_Info *server)
673 if (!server->bigbuf) {
674 server->bigbuf = (char *)cifs_buf_get();
675 if (!server->bigbuf) {
676 cifs_dbg(VFS, "No memory for large SMB response\n");
678 /* retry will check if exiting */
681 } else if (server->large_buf) {
682 /* we are reusing a dirty large buf, clear its start */
683 memset(server->bigbuf, 0, HEADER_SIZE(server));
686 if (!server->smallbuf) {
687 server->smallbuf = (char *)cifs_small_buf_get();
688 if (!server->smallbuf) {
689 cifs_dbg(VFS, "No memory for SMB response\n");
691 /* retry will check if exiting */
694 /* beginning of smb buffer is cleared in our buf_get */
696 /* if existing small buf clear beginning */
697 memset(server->smallbuf, 0, HEADER_SIZE(server));
704 server_unresponsive(struct TCP_Server_Info *server)
707 * We need to wait 2 echo intervals to make sure we handle such
709 * 1s client sends a normal SMB request
710 * 2s client gets a response
711 * 30s echo workqueue job pops, and decides we got a response recently
712 * and don't need to send another
714 * 65s kernel_recvmsg times out, and we see that we haven't gotten
715 * a response in >60s.
717 if ((server->tcpStatus == CifsGood ||
718 server->tcpStatus == CifsNeedNegotiate) &&
719 time_after(jiffies, server->lstrp + 2 * server->echo_interval)) {
720 cifs_dbg(VFS, "Server %s has not responded in %lu seconds. Reconnecting...\n",
721 server->hostname, (2 * server->echo_interval) / HZ);
722 cifs_reconnect(server);
723 wake_up(&server->response_q);
731 zero_credits(struct TCP_Server_Info *server)
735 spin_lock(&server->req_lock);
736 val = server->credits + server->echo_credits + server->oplock_credits;
737 if (server->in_flight == 0 && val == 0) {
738 spin_unlock(&server->req_lock);
741 spin_unlock(&server->req_lock);
746 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
751 smb_msg->msg_control = NULL;
752 smb_msg->msg_controllen = 0;
754 for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
757 /* reconnect if no credits and no requests in flight */
758 if (zero_credits(server)) {
759 cifs_reconnect(server);
760 return -ECONNABORTED;
763 if (server_unresponsive(server))
764 return -ECONNABORTED;
765 if (cifs_rdma_enabled(server) && server->smbd_conn)
766 length = smbd_recv(server->smbd_conn, smb_msg);
768 length = sock_recvmsg(server->ssocket, smb_msg, 0);
770 if (server->tcpStatus == CifsExiting)
773 if (server->tcpStatus == CifsNeedReconnect) {
774 cifs_reconnect(server);
775 return -ECONNABORTED;
778 if (length == -ERESTARTSYS ||
782 * Minimum sleep to prevent looping, allowing socket
783 * to clear and app threads to set tcpStatus
784 * CifsNeedReconnect if server hung.
786 usleep_range(1000, 2000);
792 cifs_dbg(FYI, "Received no data or error: %d\n", length);
793 cifs_reconnect(server);
794 return -ECONNABORTED;
801 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
802 unsigned int to_read)
804 struct msghdr smb_msg;
805 struct kvec iov = {.iov_base = buf, .iov_len = to_read};
806 iov_iter_kvec(&smb_msg.msg_iter, READ, &iov, 1, to_read);
808 return cifs_readv_from_socket(server, &smb_msg);
812 cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
813 unsigned int page_offset, unsigned int to_read)
815 struct msghdr smb_msg;
816 struct bio_vec bv = {
817 .bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
818 iov_iter_bvec(&smb_msg.msg_iter, READ, &bv, 1, to_read);
819 return cifs_readv_from_socket(server, &smb_msg);
823 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
826 * The first byte big endian of the length field,
827 * is actually not part of the length but the type
828 * with the most common, zero, as regular data.
831 case RFC1002_SESSION_MESSAGE:
832 /* Regular SMB response */
834 case RFC1002_SESSION_KEEP_ALIVE:
835 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
837 case RFC1002_POSITIVE_SESSION_RESPONSE:
838 cifs_dbg(FYI, "RFC 1002 positive session response\n");
840 case RFC1002_NEGATIVE_SESSION_RESPONSE:
842 * We get this from Windows 98 instead of an error on
843 * SMB negprot response.
845 cifs_dbg(FYI, "RFC 1002 negative session response\n");
846 /* give server a second to clean up */
849 * Always try 445 first on reconnect since we get NACK
850 * on some if we ever connected to port 139 (the NACK
851 * is since we do not begin with RFC1001 session
854 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
855 cifs_reconnect(server);
856 wake_up(&server->response_q);
859 cifs_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
860 cifs_reconnect(server);
867 dequeue_mid(struct mid_q_entry *mid, bool malformed)
869 #ifdef CONFIG_CIFS_STATS2
870 mid->when_received = jiffies;
872 spin_lock(&GlobalMid_Lock);
874 mid->mid_state = MID_RESPONSE_RECEIVED;
876 mid->mid_state = MID_RESPONSE_MALFORMED;
878 * Trying to handle/dequeue a mid after the send_recv()
879 * function has finished processing it is a bug.
881 if (mid->mid_flags & MID_DELETED)
882 printk_once(KERN_WARNING
883 "trying to dequeue a deleted mid\n");
885 list_del_init(&mid->qhead);
886 spin_unlock(&GlobalMid_Lock);
890 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
891 char *buf, int malformed)
893 if (server->ops->check_trans2 &&
894 server->ops->check_trans2(mid, server, buf, malformed))
897 mid->large_buf = server->large_buf;
898 /* Was previous buf put in mpx struct for multi-rsp? */
899 if (!mid->multiRsp) {
900 /* smb buffer will be freed by user thread */
901 if (server->large_buf)
902 server->bigbuf = NULL;
904 server->smallbuf = NULL;
906 dequeue_mid(mid, malformed);
909 static void clean_demultiplex_info(struct TCP_Server_Info *server)
913 /* take it off the list, if it's not already */
914 spin_lock(&cifs_tcp_ses_lock);
915 list_del_init(&server->tcp_ses_list);
916 spin_unlock(&cifs_tcp_ses_lock);
918 spin_lock(&GlobalMid_Lock);
919 server->tcpStatus = CifsExiting;
920 spin_unlock(&GlobalMid_Lock);
921 wake_up_all(&server->response_q);
923 /* check if we have blocked requests that need to free */
924 spin_lock(&server->req_lock);
925 if (server->credits <= 0)
927 spin_unlock(&server->req_lock);
929 * Although there should not be any requests blocked on this queue it
930 * can not hurt to be paranoid and try to wake up requests that may
931 * haven been blocked when more than 50 at time were on the wire to the
932 * same server - they now will see the session is in exit state and get
933 * out of SendReceive.
935 wake_up_all(&server->request_q);
936 /* give those requests time to exit */
938 if (cifs_rdma_enabled(server))
939 smbd_destroy(server);
940 if (server->ssocket) {
941 sock_release(server->ssocket);
942 server->ssocket = NULL;
945 if (!list_empty(&server->pending_mid_q)) {
946 struct list_head dispose_list;
947 struct mid_q_entry *mid_entry;
948 struct list_head *tmp, *tmp2;
950 INIT_LIST_HEAD(&dispose_list);
951 spin_lock(&GlobalMid_Lock);
952 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
953 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
954 cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
955 mid_entry->mid_state = MID_SHUTDOWN;
956 list_move(&mid_entry->qhead, &dispose_list);
958 spin_unlock(&GlobalMid_Lock);
960 /* now walk dispose list and issue callbacks */
961 list_for_each_safe(tmp, tmp2, &dispose_list) {
962 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
963 cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
964 list_del_init(&mid_entry->qhead);
965 mid_entry->callback(mid_entry);
967 /* 1/8th of sec is more than enough time for them to exit */
971 if (!list_empty(&server->pending_mid_q)) {
973 * mpx threads have not exited yet give them at least the smb
974 * send timeout time for long ops.
976 * Due to delays on oplock break requests, we need to wait at
977 * least 45 seconds before giving up on a request getting a
978 * response and going ahead and killing cifsd.
980 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
983 * If threads still have not exited they are probably never
984 * coming home not much else we can do but free the memory.
988 kfree(server->hostname);
991 length = atomic_dec_return(&tcpSesAllocCount);
993 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
997 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1000 char *buf = server->smallbuf;
1001 unsigned int pdu_length = server->pdu_size;
1003 /* make sure this will fit in a large buffer */
1004 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
1005 server->vals->header_preamble_size) {
1006 cifs_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
1007 cifs_reconnect(server);
1008 wake_up(&server->response_q);
1009 return -ECONNABORTED;
1012 /* switch to large buffer if too big for a small one */
1013 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
1014 server->large_buf = true;
1015 memcpy(server->bigbuf, buf, server->total_read);
1016 buf = server->bigbuf;
1019 /* now read the rest */
1020 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
1021 pdu_length - HEADER_SIZE(server) + 1
1022 + server->vals->header_preamble_size);
1026 server->total_read += length;
1028 dump_smb(buf, server->total_read);
1030 return cifs_handle_standard(server, mid);
1034 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1036 char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
1040 * We know that we received enough to get to the MID as we
1041 * checked the pdu_length earlier. Now check to see
1042 * if the rest of the header is OK. We borrow the length
1043 * var for the rest of the loop to avoid a new stack var.
1045 * 48 bytes is enough to display the header and a little bit
1046 * into the payload for debugging purposes.
1048 length = server->ops->check_message(buf, server->total_read, server);
1050 cifs_dump_mem("Bad SMB: ", buf,
1051 min_t(unsigned int, server->total_read, 48));
1053 if (server->ops->is_session_expired &&
1054 server->ops->is_session_expired(buf)) {
1055 cifs_reconnect(server);
1056 wake_up(&server->response_q);
1060 if (server->ops->is_status_pending &&
1061 server->ops->is_status_pending(buf, server))
1067 handle_mid(mid, server, buf, length);
1072 smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
1074 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
1077 * SMB1 does not use credits.
1079 if (server->vals->header_preamble_size)
1082 if (shdr->CreditRequest) {
1083 spin_lock(&server->req_lock);
1084 server->credits += le16_to_cpu(shdr->CreditRequest);
1085 spin_unlock(&server->req_lock);
1086 wake_up(&server->request_q);
1092 cifs_demultiplex_thread(void *p)
1094 int i, num_mids, length;
1095 struct TCP_Server_Info *server = p;
1096 unsigned int pdu_length;
1097 unsigned int next_offset;
1099 struct task_struct *task_to_wake = NULL;
1100 struct mid_q_entry *mids[MAX_COMPOUND];
1101 char *bufs[MAX_COMPOUND];
1103 current->flags |= PF_MEMALLOC;
1104 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
1106 length = atomic_inc_return(&tcpSesAllocCount);
1108 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
1111 while (server->tcpStatus != CifsExiting) {
1112 if (try_to_freeze())
1115 if (!allocate_buffers(server))
1118 server->large_buf = false;
1119 buf = server->smallbuf;
1120 pdu_length = 4; /* enough to get RFC1001 header */
1122 length = cifs_read_from_socket(server, buf, pdu_length);
1126 if (server->vals->header_preamble_size == 0)
1127 server->total_read = 0;
1129 server->total_read = length;
1132 * The right amount was read from socket - 4 bytes,
1133 * so we can now interpret the length field.
1135 pdu_length = get_rfc1002_length(buf);
1137 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
1138 if (!is_smb_response(server, buf[0]))
1141 server->pdu_size = pdu_length;
1143 /* make sure we have enough to get to the MID */
1144 if (server->pdu_size < HEADER_SIZE(server) - 1 -
1145 server->vals->header_preamble_size) {
1146 cifs_dbg(VFS, "SMB response too short (%u bytes)\n",
1148 cifs_reconnect(server);
1149 wake_up(&server->response_q);
1153 /* read down to the MID */
1154 length = cifs_read_from_socket(server,
1155 buf + server->vals->header_preamble_size,
1156 HEADER_SIZE(server) - 1
1157 - server->vals->header_preamble_size);
1160 server->total_read += length;
1162 if (server->ops->next_header) {
1163 next_offset = server->ops->next_header(buf);
1165 server->pdu_size = next_offset;
1168 memset(mids, 0, sizeof(mids));
1169 memset(bufs, 0, sizeof(bufs));
1172 if (server->ops->is_transform_hdr &&
1173 server->ops->receive_transform &&
1174 server->ops->is_transform_hdr(buf)) {
1175 length = server->ops->receive_transform(server,
1180 mids[0] = server->ops->find_mid(server, buf);
1184 if (!mids[0] || !mids[0]->receive)
1185 length = standard_receive3(server, mids[0]);
1187 length = mids[0]->receive(server, mids[0]);
1191 for (i = 0; i < num_mids; i++)
1193 cifs_mid_q_entry_release(mids[i]);
1197 server->lstrp = jiffies;
1199 for (i = 0; i < num_mids; i++) {
1200 if (mids[i] != NULL) {
1201 mids[i]->resp_buf_size = server->pdu_size;
1202 if ((mids[i]->mid_flags & MID_WAIT_CANCELLED) &&
1203 mids[i]->mid_state == MID_RESPONSE_RECEIVED &&
1204 server->ops->handle_cancelled_mid)
1205 server->ops->handle_cancelled_mid(
1209 if (!mids[i]->multiRsp || mids[i]->multiEnd)
1210 mids[i]->callback(mids[i]);
1212 cifs_mid_q_entry_release(mids[i]);
1213 } else if (server->ops->is_oplock_break &&
1214 server->ops->is_oplock_break(bufs[i],
1216 smb2_add_credits_from_hdr(bufs[i], server);
1217 cifs_dbg(FYI, "Received oplock break\n");
1219 cifs_dbg(VFS, "No task to wake, unknown frame "
1220 "received! NumMids %d\n",
1221 atomic_read(&midCount));
1222 cifs_dump_mem("Received Data is: ", bufs[i],
1223 HEADER_SIZE(server));
1224 #ifdef CONFIG_CIFS_DEBUG2
1225 if (server->ops->dump_detail)
1226 server->ops->dump_detail(bufs[i],
1228 smb2_add_credits_from_hdr(bufs[i], server);
1229 cifs_dump_mids(server);
1230 #endif /* CIFS_DEBUG2 */
1234 if (pdu_length > server->pdu_size) {
1235 if (!allocate_buffers(server))
1237 pdu_length -= server->pdu_size;
1238 server->total_read = 0;
1239 server->large_buf = false;
1240 buf = server->smallbuf;
1243 } /* end while !EXITING */
1245 /* buffer usually freed in free_mid - need to free it here on exit */
1246 cifs_buf_release(server->bigbuf);
1247 if (server->smallbuf) /* no sense logging a debug message if NULL */
1248 cifs_small_buf_release(server->smallbuf);
1250 task_to_wake = xchg(&server->tsk, NULL);
1251 clean_demultiplex_info(server);
1253 /* if server->tsk was NULL then wait for a signal before exiting */
1254 if (!task_to_wake) {
1255 set_current_state(TASK_INTERRUPTIBLE);
1256 while (!signal_pending(current)) {
1258 set_current_state(TASK_INTERRUPTIBLE);
1260 set_current_state(TASK_RUNNING);
1263 module_put_and_exit(0);
1266 /* extract the host portion of the UNC string */
1268 extract_hostname(const char *unc)
1274 /* skip double chars at beginning of string */
1275 /* BB: check validity of these bytes? */
1276 if (strlen(unc) < 3)
1277 return ERR_PTR(-EINVAL);
1278 for (src = unc; *src && *src == '\\'; src++)
1281 return ERR_PTR(-EINVAL);
1283 /* delimiter between hostname and sharename is always '\\' now */
1284 delim = strchr(src, '\\');
1286 return ERR_PTR(-EINVAL);
1289 dst = kmalloc((len + 1), GFP_KERNEL);
1291 return ERR_PTR(-ENOMEM);
1293 memcpy(dst, src, len);
1299 static int get_option_ul(substring_t args[], unsigned long *option)
1304 string = match_strdup(args);
1307 rc = kstrtoul(string, 0, option);
1313 static int get_option_uid(substring_t args[], kuid_t *result)
1315 unsigned long value;
1319 rc = get_option_ul(args, &value);
1323 uid = make_kuid(current_user_ns(), value);
1324 if (!uid_valid(uid))
1331 static int get_option_gid(substring_t args[], kgid_t *result)
1333 unsigned long value;
1337 rc = get_option_ul(args, &value);
1341 gid = make_kgid(current_user_ns(), value);
1342 if (!gid_valid(gid))
1349 static int cifs_parse_security_flavors(char *value,
1350 struct smb_vol *vol)
1353 substring_t args[MAX_OPT_ARGS];
1356 * With mount options, the last one should win. Reset any existing
1357 * settings back to default.
1359 vol->sectype = Unspecified;
1362 switch (match_token(value, cifs_secflavor_tokens, args)) {
1364 cifs_dbg(VFS, "sec=krb5p is not supported!\n");
1370 vol->sectype = Kerberos;
1372 case Opt_sec_ntlmsspi:
1375 case Opt_sec_ntlmssp:
1376 vol->sectype = RawNTLMSSP;
1382 vol->sectype = NTLM;
1384 case Opt_sec_ntlmv2i:
1387 case Opt_sec_ntlmv2:
1388 vol->sectype = NTLMv2;
1390 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1391 case Opt_sec_lanman:
1392 vol->sectype = LANMAN;
1399 cifs_dbg(VFS, "bad security option: %s\n", value);
1407 cifs_parse_cache_flavor(char *value, struct smb_vol *vol)
1409 substring_t args[MAX_OPT_ARGS];
1411 switch (match_token(value, cifs_cacheflavor_tokens, args)) {
1412 case Opt_cache_loose:
1413 vol->direct_io = false;
1414 vol->strict_io = false;
1416 case Opt_cache_strict:
1417 vol->direct_io = false;
1418 vol->strict_io = true;
1420 case Opt_cache_none:
1421 vol->direct_io = true;
1422 vol->strict_io = false;
1425 cifs_dbg(VFS, "bad cache= option: %s\n", value);
1432 cifs_parse_smb_version(char *value, struct smb_vol *vol, bool is_smb3)
1434 substring_t args[MAX_OPT_ARGS];
1436 switch (match_token(value, cifs_smb_version_tokens, args)) {
1437 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1439 if (disable_legacy_dialects) {
1440 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1444 cifs_dbg(VFS, "vers=1.0 (cifs) not permitted when mounting with smb3\n");
1447 vol->ops = &smb1_operations;
1448 vol->vals = &smb1_values;
1451 if (disable_legacy_dialects) {
1452 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1456 cifs_dbg(VFS, "vers=2.0 not permitted when mounting with smb3\n");
1459 vol->ops = &smb20_operations;
1460 vol->vals = &smb20_values;
1464 cifs_dbg(VFS, "vers=1.0 (cifs) mount not permitted when legacy dialects disabled\n");
1467 cifs_dbg(VFS, "vers=2.0 mount not permitted when legacy dialects disabled\n");
1469 #endif /* CIFS_ALLOW_INSECURE_LEGACY */
1471 vol->ops = &smb21_operations;
1472 vol->vals = &smb21_values;
1475 vol->ops = &smb30_operations;
1476 vol->vals = &smb30_values;
1479 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1480 vol->vals = &smb302_values;
1483 vol->ops = &smb311_operations;
1484 vol->vals = &smb311_values;
1487 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1488 vol->vals = &smb3any_values;
1491 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1492 vol->vals = &smbdefault_values;
1495 cifs_dbg(VFS, "Unknown vers= option specified: %s\n", value);
1502 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1503 * fields with the result. Returns 0 on success and an error otherwise.
1506 cifs_parse_devname(const char *devname, struct smb_vol *vol)
1509 const char *delims = "/\\";
1512 if (unlikely(!devname || !*devname)) {
1513 cifs_dbg(VFS, "Device name not specified.\n");
1517 /* make sure we have a valid UNC double delimiter prefix */
1518 len = strspn(devname, delims);
1522 /* find delimiter between host and sharename */
1523 pos = strpbrk(devname + 2, delims);
1527 /* skip past delimiter */
1530 /* now go until next delimiter or end of string */
1531 len = strcspn(pos, delims);
1533 /* move "pos" up to delimiter or NULL */
1535 vol->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
1539 convert_delimiter(vol->UNC, '\\');
1541 /* skip any delimiter */
1542 if (*pos == '/' || *pos == '\\')
1545 /* If pos is NULL then no prepath */
1549 vol->prepath = kstrdup(pos, GFP_KERNEL);
1557 cifs_parse_mount_options(const char *mountdata, const char *devname,
1558 struct smb_vol *vol, bool is_smb3)
1561 char *mountdata_copy = NULL, *options;
1562 unsigned int temp_len, i, j;
1564 short int override_uid = -1;
1565 short int override_gid = -1;
1566 bool uid_specified = false;
1567 bool gid_specified = false;
1568 bool sloppy = false;
1569 char *invalid = NULL;
1570 char *nodename = utsname()->nodename;
1571 char *string = NULL;
1572 char *tmp_end, *value;
1574 bool got_ip = false;
1575 bool got_version = false;
1576 unsigned short port = 0;
1577 struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1581 delim = separator[0];
1583 /* ensure we always start with zeroed-out smb_vol */
1584 memset(vol, 0, sizeof(*vol));
1587 * does not have to be perfect mapping since field is
1588 * informational, only used for servers that do not support
1589 * port 445 and it can be overridden at mount time
1591 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1592 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1593 vol->source_rfc1001_name[i] = toupper(nodename[i]);
1595 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1596 /* null target name indicates to use *SMBSERVR default called name
1597 if we end up sending RFC1001 session initialize */
1598 vol->target_rfc1001_name[0] = 0;
1599 vol->cred_uid = current_uid();
1600 vol->linux_uid = current_uid();
1601 vol->linux_gid = current_gid();
1602 vol->bsize = 1024 * 1024; /* can improve cp performance significantly */
1604 * default to SFM style remapping of seven reserved characters
1605 * unless user overrides it or we negotiate CIFS POSIX where
1606 * it is unnecessary. Can not simultaneously use more than one mapping
1607 * since then readdir could list files that open could not open
1611 /* default to only allowing write access to owner of the mount */
1612 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1614 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1615 /* default is always to request posix paths. */
1616 vol->posix_paths = 1;
1617 /* default to using server inode numbers where available */
1618 vol->server_ino = 1;
1620 /* default is to use strict cifs caching semantics */
1621 vol->strict_io = true;
1623 vol->actimeo = CIFS_DEF_ACTIMEO;
1625 /* Most clients set timeout to 0, allows server to use its default */
1626 vol->handle_timeout = 0; /* See MS-SMB2 spec section 2.2.14.2.12 */
1628 /* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1629 vol->ops = &smb30_operations;
1630 vol->vals = &smbdefault_values;
1632 vol->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1635 goto cifs_parse_mount_err;
1637 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1638 if (!mountdata_copy)
1639 goto cifs_parse_mount_err;
1641 options = mountdata_copy;
1642 end = options + strlen(options);
1644 if (strncmp(options, "sep=", 4) == 0) {
1645 if (options[4] != 0) {
1646 separator[0] = options[4];
1649 cifs_dbg(FYI, "Null separator not allowed\n");
1652 vol->backupuid_specified = false; /* no backup intent for a user */
1653 vol->backupgid_specified = false; /* no backup intent for a group */
1655 switch (cifs_parse_devname(devname, vol)) {
1659 cifs_dbg(VFS, "Unable to allocate memory for devname.\n");
1660 goto cifs_parse_mount_err;
1662 cifs_dbg(VFS, "Malformed UNC in devname.\n");
1663 goto cifs_parse_mount_err;
1665 cifs_dbg(VFS, "Unknown error parsing devname.\n");
1666 goto cifs_parse_mount_err;
1669 while ((data = strsep(&options, separator)) != NULL) {
1670 substring_t args[MAX_OPT_ARGS];
1671 unsigned long option;
1677 token = match_token(data, cifs_mount_option_tokens, args);
1681 /* Ingnore the following */
1685 /* Boolean values */
1686 case Opt_user_xattr:
1689 case Opt_nouser_xattr:
1695 case Opt_noforceuid:
1701 case Opt_noforcegid:
1704 case Opt_noblocksend:
1705 vol->noblocksnd = 1;
1707 case Opt_noautotune:
1708 vol->noautotune = 1;
1723 vol->sfu_remap = true;
1724 vol->remap = false; /* disable SFM mapping */
1726 case Opt_nomapchars:
1727 vol->sfu_remap = false;
1731 vol->sfu_remap = false; /* disable SFU mapping */
1733 case Opt_nomapposix:
1745 case Opt_posixpaths:
1746 vol->posix_paths = 1;
1748 case Opt_noposixpaths:
1749 vol->posix_paths = 0;
1754 "conflicting unix mount options\n");
1755 vol->no_linux_ext = 1;
1758 if (vol->no_linux_ext)
1760 "conflicting unix mount options\n");
1772 * turn off mandatory locking in mode
1773 * if remote locking is turned off since the
1774 * local vfs will do advisory
1776 if (vol->file_mode ==
1777 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1778 vol->file_mode = S_IALLUGO;
1780 case Opt_nohandlecache:
1781 vol->nohandlecache = 1;
1783 case Opt_handlecache:
1784 vol->nohandlecache = 0;
1786 case Opt_forcemandatorylock:
1795 case Opt_setuidfromacl:
1796 vol->setuidfromacl = 1;
1799 vol->dynperm = true;
1802 vol->dynperm = false;
1816 case Opt_nostrictsync:
1817 vol->nostrictsync = 1;
1819 case Opt_strictsync:
1820 vol->nostrictsync = 0;
1823 vol->server_ino = 1;
1825 case Opt_noserverino:
1826 vol->server_ino = 0;
1828 case Opt_rwpidforward:
1829 vol->rwpidforward = 1;
1838 vol->no_psx_acl = 0;
1841 vol->no_psx_acl = 1;
1843 case Opt_locallease:
1844 vol->local_lease = 1;
1850 /* we do not do the following in secFlags because seal
1851 * is a per tree connection (mount) not a per socket
1852 * or per-smb connection option in the protocol
1853 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1858 pr_warn("CIFS: Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1861 #ifndef CONFIG_CIFS_FSCACHE
1862 cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1863 goto cifs_parse_mount_err;
1867 case Opt_mfsymlinks:
1868 vol->mfsymlinks = true;
1871 vol->multiuser = true;
1876 case Opt_nosharesock:
1877 vol->nosharesock = true;
1879 case Opt_nopersistent:
1880 vol->nopersistent = true;
1881 if (vol->persistent) {
1883 "persistenthandles mount options conflict\n");
1884 goto cifs_parse_mount_err;
1887 case Opt_persistent:
1888 vol->persistent = true;
1889 if ((vol->nopersistent) || (vol->resilient)) {
1891 "persistenthandles mount options conflict\n");
1892 goto cifs_parse_mount_err;
1896 vol->resilient = true;
1897 if (vol->persistent) {
1899 "persistenthandles mount options conflict\n");
1900 goto cifs_parse_mount_err;
1903 case Opt_noresilient:
1904 vol->resilient = false; /* already the default */
1906 case Opt_domainauto:
1907 vol->domainauto = true;
1913 /* Numeric Values */
1915 if (get_option_uid(args, &vol->backupuid)) {
1916 cifs_dbg(VFS, "%s: Invalid backupuid value\n",
1918 goto cifs_parse_mount_err;
1920 vol->backupuid_specified = true;
1923 if (get_option_gid(args, &vol->backupgid)) {
1924 cifs_dbg(VFS, "%s: Invalid backupgid value\n",
1926 goto cifs_parse_mount_err;
1928 vol->backupgid_specified = true;
1931 if (get_option_uid(args, &vol->linux_uid)) {
1932 cifs_dbg(VFS, "%s: Invalid uid value\n",
1934 goto cifs_parse_mount_err;
1936 uid_specified = true;
1939 if (get_option_uid(args, &vol->cred_uid)) {
1940 cifs_dbg(VFS, "%s: Invalid cruid value\n",
1942 goto cifs_parse_mount_err;
1946 if (get_option_gid(args, &vol->linux_gid)) {
1947 cifs_dbg(VFS, "%s: Invalid gid value\n",
1949 goto cifs_parse_mount_err;
1951 gid_specified = true;
1954 if (get_option_ul(args, &option)) {
1955 cifs_dbg(VFS, "%s: Invalid file_mode value\n",
1957 goto cifs_parse_mount_err;
1959 vol->file_mode = option;
1962 if (get_option_ul(args, &option)) {
1963 cifs_dbg(VFS, "%s: Invalid dir_mode value\n",
1965 goto cifs_parse_mount_err;
1967 vol->dir_mode = option;
1970 if (get_option_ul(args, &option) ||
1971 option > USHRT_MAX) {
1972 cifs_dbg(VFS, "%s: Invalid port value\n",
1974 goto cifs_parse_mount_err;
1976 port = (unsigned short)option;
1979 if (get_option_ul(args, &option)) {
1980 cifs_dbg(VFS, "%s: Invalid blocksize value\n",
1982 goto cifs_parse_mount_err;
1985 * inode blocksize realistically should never need to be
1986 * less than 16K or greater than 16M and default is 1MB.
1987 * Note that small inode block sizes (e.g. 64K) can lead
1988 * to very poor performance of common tools like cp and scp
1990 if ((option < CIFS_MAX_MSGSIZE) ||
1991 (option > (4 * SMB3_DEFAULT_IOSIZE))) {
1992 cifs_dbg(VFS, "%s: Invalid blocksize\n",
1994 goto cifs_parse_mount_err;
1996 vol->bsize = option;
1999 if (get_option_ul(args, &option)) {
2000 cifs_dbg(VFS, "%s: Invalid rsize value\n",
2002 goto cifs_parse_mount_err;
2004 vol->rsize = option;
2007 if (get_option_ul(args, &option)) {
2008 cifs_dbg(VFS, "%s: Invalid wsize value\n",
2010 goto cifs_parse_mount_err;
2012 vol->wsize = option;
2015 if (get_option_ul(args, &option)) {
2016 cifs_dbg(VFS, "%s: Invalid actimeo value\n",
2018 goto cifs_parse_mount_err;
2020 vol->actimeo = HZ * option;
2021 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
2022 cifs_dbg(VFS, "attribute cache timeout too large\n");
2023 goto cifs_parse_mount_err;
2026 case Opt_handletimeout:
2027 if (get_option_ul(args, &option)) {
2028 cifs_dbg(VFS, "%s: Invalid handletimeout value\n",
2030 goto cifs_parse_mount_err;
2032 vol->handle_timeout = option;
2033 if (vol->handle_timeout > SMB3_MAX_HANDLE_TIMEOUT) {
2034 cifs_dbg(VFS, "Invalid handle cache timeout, longer than 16 minutes\n");
2035 goto cifs_parse_mount_err;
2038 case Opt_echo_interval:
2039 if (get_option_ul(args, &option)) {
2040 cifs_dbg(VFS, "%s: Invalid echo interval value\n",
2042 goto cifs_parse_mount_err;
2044 vol->echo_interval = option;
2047 if (get_option_ul(args, &option)) {
2048 cifs_dbg(VFS, "%s: Invalid snapshot time\n",
2050 goto cifs_parse_mount_err;
2052 vol->snapshot_time = option;
2054 case Opt_max_credits:
2055 if (get_option_ul(args, &option) || (option < 20) ||
2057 cifs_dbg(VFS, "%s: Invalid max_credits value\n",
2059 goto cifs_parse_mount_err;
2061 vol->max_credits = option;
2064 /* String Arguments */
2066 case Opt_blank_user:
2067 /* null user, ie. anonymous authentication */
2069 vol->username = NULL;
2072 string = match_strdup(args);
2076 if (strnlen(string, CIFS_MAX_USERNAME_LEN) >
2077 CIFS_MAX_USERNAME_LEN) {
2078 pr_warn("CIFS: username too long\n");
2079 goto cifs_parse_mount_err;
2082 kfree(vol->username);
2083 vol->username = kstrdup(string, GFP_KERNEL);
2085 goto cifs_parse_mount_err;
2087 case Opt_blank_pass:
2088 /* passwords have to be handled differently
2089 * to allow the character used for deliminator
2090 * to be passed within them
2094 * Check if this is a case where the password
2095 * starts with a delimiter
2097 tmp_end = strchr(data, '=');
2099 if (!(tmp_end < end && tmp_end[1] == delim)) {
2100 /* No it is not. Set the password to NULL */
2101 kzfree(vol->password);
2102 vol->password = NULL;
2105 /* Fallthrough - to Opt_pass below.*/
2107 /* Obtain the value string */
2108 value = strchr(data, '=');
2111 /* Set tmp_end to end of the string */
2112 tmp_end = (char *) value + strlen(value);
2114 /* Check if following character is the deliminator
2115 * If yes, we have encountered a double deliminator
2116 * reset the NULL character to the deliminator
2118 if (tmp_end < end && tmp_end[1] == delim) {
2121 /* Keep iterating until we get to a single
2122 * deliminator OR the end
2124 while ((tmp_end = strchr(tmp_end, delim))
2125 != NULL && (tmp_end[1] == delim)) {
2126 tmp_end = (char *) &tmp_end[2];
2129 /* Reset var options to point to next element */
2132 options = (char *) &tmp_end[1];
2134 /* Reached the end of the mount option
2139 kzfree(vol->password);
2140 /* Now build new password string */
2141 temp_len = strlen(value);
2142 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
2143 if (vol->password == NULL) {
2144 pr_warn("CIFS: no memory for password\n");
2145 goto cifs_parse_mount_err;
2148 for (i = 0, j = 0; i < temp_len; i++, j++) {
2149 vol->password[j] = value[i];
2150 if ((value[i] == delim) &&
2151 value[i+1] == delim)
2152 /* skip the second deliminator */
2155 vol->password[j] = '\0';
2158 /* FIXME: should this be an error instead? */
2162 string = match_strdup(args);
2166 if (!cifs_convert_address(dstaddr, string,
2168 pr_err("CIFS: bad ip= option (%s).\n", string);
2169 goto cifs_parse_mount_err;
2174 string = match_strdup(args);
2178 if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
2179 == CIFS_MAX_DOMAINNAME_LEN) {
2180 pr_warn("CIFS: domain name too long\n");
2181 goto cifs_parse_mount_err;
2184 kfree(vol->domainname);
2185 vol->domainname = kstrdup(string, GFP_KERNEL);
2186 if (!vol->domainname) {
2187 pr_warn("CIFS: no memory for domainname\n");
2188 goto cifs_parse_mount_err;
2190 cifs_dbg(FYI, "Domain name set\n");
2193 string = match_strdup(args);
2197 if (!cifs_convert_address(
2198 (struct sockaddr *)&vol->srcaddr,
2199 string, strlen(string))) {
2200 pr_warn("CIFS: Could not parse srcaddr: %s\n",
2202 goto cifs_parse_mount_err;
2206 string = match_strdup(args);
2210 if (strnlen(string, 1024) >= 65) {
2211 pr_warn("CIFS: iocharset name too long.\n");
2212 goto cifs_parse_mount_err;
2215 if (strncasecmp(string, "default", 7) != 0) {
2216 kfree(vol->iocharset);
2217 vol->iocharset = kstrdup(string,
2219 if (!vol->iocharset) {
2220 pr_warn("CIFS: no memory for charset\n");
2221 goto cifs_parse_mount_err;
2224 /* if iocharset not set then load_nls_default
2227 cifs_dbg(FYI, "iocharset set to %s\n", string);
2229 case Opt_netbiosname:
2230 string = match_strdup(args);
2234 memset(vol->source_rfc1001_name, 0x20,
2237 * FIXME: are there cases in which a comma can
2238 * be valid in workstation netbios name (and
2239 * need special handling)?
2241 for (i = 0; i < RFC1001_NAME_LEN; i++) {
2242 /* don't ucase netbiosname for user */
2245 vol->source_rfc1001_name[i] = string[i];
2247 /* The string has 16th byte zero still from
2248 * set at top of the function
2250 if (i == RFC1001_NAME_LEN && string[i] != 0)
2251 pr_warn("CIFS: netbiosname longer than 15 truncated.\n");
2254 /* servernetbiosname specified override *SMBSERVER */
2255 string = match_strdup(args);
2259 /* last byte, type, is 0x20 for servr type */
2260 memset(vol->target_rfc1001_name, 0x20,
2261 RFC1001_NAME_LEN_WITH_NULL);
2263 /* BB are there cases in which a comma can be
2264 valid in this workstation netbios name
2265 (and need special handling)? */
2267 /* user or mount helper must uppercase the
2269 for (i = 0; i < 15; i++) {
2272 vol->target_rfc1001_name[i] = string[i];
2274 /* The string has 16th byte zero still from
2275 set at top of the function */
2276 if (i == RFC1001_NAME_LEN && string[i] != 0)
2277 pr_warn("CIFS: server netbiosname longer than 15 truncated.\n");
2280 /* version of mount userspace tools, not dialect */
2281 string = match_strdup(args);
2285 /* If interface changes in mount.cifs bump to new ver */
2286 if (strncasecmp(string, "1", 1) == 0) {
2287 if (strlen(string) > 1) {
2288 pr_warn("Bad mount helper ver=%s. Did "
2289 "you want SMB1 (CIFS) dialect "
2290 "and mean to type vers=1.0 "
2291 "instead?\n", string);
2292 goto cifs_parse_mount_err;
2294 /* This is the default */
2297 /* For all other value, error */
2298 pr_warn("CIFS: Invalid mount helper version specified\n");
2299 goto cifs_parse_mount_err;
2301 /* protocol version (dialect) */
2302 string = match_strdup(args);
2306 if (cifs_parse_smb_version(string, vol, is_smb3) != 0)
2307 goto cifs_parse_mount_err;
2311 string = match_strdup(args);
2315 if (cifs_parse_security_flavors(string, vol) != 0)
2316 goto cifs_parse_mount_err;
2319 string = match_strdup(args);
2323 if (cifs_parse_cache_flavor(string, vol) != 0)
2324 goto cifs_parse_mount_err;
2328 * An option we don't recognize. Save it off for later
2329 * if we haven't already found one
2335 /* Free up any allocated string */
2340 if (!sloppy && invalid) {
2341 pr_err("CIFS: Unknown mount option \"%s\"\n", invalid);
2342 goto cifs_parse_mount_err;
2345 if (vol->rdma && vol->vals->protocol_id < SMB30_PROT_ID) {
2346 cifs_dbg(VFS, "SMB Direct requires Version >=3.0\n");
2347 goto cifs_parse_mount_err;
2351 /* Muliuser mounts require CONFIG_KEYS support */
2352 if (vol->multiuser) {
2353 cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
2354 goto cifs_parse_mount_err;
2358 cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
2359 goto cifs_parse_mount_err;
2362 /* make sure UNC has a share name */
2363 if (!strchr(vol->UNC + 3, '\\')) {
2364 cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
2365 goto cifs_parse_mount_err;
2372 /* No ip= option specified? Try to get it from UNC */
2373 /* Use the address part of the UNC. */
2374 slash = strchr(&vol->UNC[2], '\\');
2375 len = slash - &vol->UNC[2];
2376 if (!cifs_convert_address(dstaddr, &vol->UNC[2], len)) {
2377 pr_err("Unable to determine destination address.\n");
2378 goto cifs_parse_mount_err;
2382 /* set the port that we got earlier */
2383 cifs_set_port(dstaddr, port);
2386 vol->override_uid = override_uid;
2387 else if (override_uid == 1)
2388 pr_notice("CIFS: ignoring forceuid mount option specified with no uid= option.\n");
2391 vol->override_gid = override_gid;
2392 else if (override_gid == 1)
2393 pr_notice("CIFS: ignoring forcegid mount option specified with no gid= option.\n");
2395 if (got_version == false)
2396 pr_warn("No dialect specified on mount. Default has changed to "
2397 "a more secure dialect, SMB2.1 or later (e.g. SMB3), from CIFS "
2398 "(SMB1). To use the less secure SMB1 dialect to access "
2399 "old servers which do not support SMB3 (or SMB2.1) specify vers=1.0"
2402 kfree(mountdata_copy);
2406 pr_warn("Could not allocate temporary buffer\n");
2407 cifs_parse_mount_err:
2409 kfree(mountdata_copy);
2413 /** Returns true if srcaddr isn't specified and rhs isn't
2414 * specified, or if srcaddr is specified and
2415 * matches the IP address of the rhs argument.
2418 srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
2420 switch (srcaddr->sa_family) {
2422 return (rhs->sa_family == AF_UNSPEC);
2424 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
2425 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
2426 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
2429 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
2430 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
2431 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
2435 return false; /* don't expect to be here */
2440 * If no port is specified in addr structure, we try to match with 445 port
2441 * and if it fails - with 139 ports. It should be called only if address
2442 * families of server and addr are equal.
2445 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
2447 __be16 port, *sport;
2449 /* SMBDirect manages its own ports, don't match it here */
2453 switch (addr->sa_family) {
2455 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
2456 port = ((struct sockaddr_in *) addr)->sin_port;
2459 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
2460 port = ((struct sockaddr_in6 *) addr)->sin6_port;
2468 port = htons(CIFS_PORT);
2472 port = htons(RFC1001_PORT);
2475 return port == *sport;
2479 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
2480 struct sockaddr *srcaddr)
2482 switch (addr->sa_family) {
2484 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
2485 struct sockaddr_in *srv_addr4 =
2486 (struct sockaddr_in *)&server->dstaddr;
2488 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
2493 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
2494 struct sockaddr_in6 *srv_addr6 =
2495 (struct sockaddr_in6 *)&server->dstaddr;
2497 if (!ipv6_addr_equal(&addr6->sin6_addr,
2498 &srv_addr6->sin6_addr))
2500 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
2506 return false; /* don't expect to be here */
2509 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
2516 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2519 * The select_sectype function should either return the vol->sectype
2520 * that was specified, or "Unspecified" if that sectype was not
2521 * compatible with the given NEGOTIATE request.
2523 if (server->ops->select_sectype(server, vol->sectype)
2528 * Now check if signing mode is acceptable. No need to check
2529 * global_secflags at this point since if MUST_SIGN is set then
2530 * the server->sign had better be too.
2532 if (vol->sign && !server->sign)
2538 static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
2540 struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2542 if (vol->nosharesock)
2545 /* BB update this for smb3any and default case */
2546 if ((server->vals != vol->vals) || (server->ops != vol->ops))
2549 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2552 if (!match_address(server, addr,
2553 (struct sockaddr *)&vol->srcaddr))
2556 if (!match_port(server, addr))
2559 if (!match_security(server, vol))
2562 if (server->echo_interval != vol->echo_interval * HZ)
2565 if (server->rdma != vol->rdma)
2571 struct TCP_Server_Info *
2572 cifs_find_tcp_session(struct smb_vol *vol)
2574 struct TCP_Server_Info *server;
2576 spin_lock(&cifs_tcp_ses_lock);
2577 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
2578 if (!match_server(server, vol))
2581 ++server->srv_count;
2582 spin_unlock(&cifs_tcp_ses_lock);
2583 cifs_dbg(FYI, "Existing tcp session with server found\n");
2586 spin_unlock(&cifs_tcp_ses_lock);
2591 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
2593 struct task_struct *task;
2595 spin_lock(&cifs_tcp_ses_lock);
2596 if (--server->srv_count > 0) {
2597 spin_unlock(&cifs_tcp_ses_lock);
2601 put_net(cifs_net_ns(server));
2603 list_del_init(&server->tcp_ses_list);
2604 spin_unlock(&cifs_tcp_ses_lock);
2606 cancel_delayed_work_sync(&server->echo);
2610 * Avoid deadlock here: reconnect work calls
2611 * cifs_put_tcp_session() at its end. Need to be sure
2612 * that reconnect work does nothing with server pointer after
2615 cancel_delayed_work(&server->reconnect);
2617 cancel_delayed_work_sync(&server->reconnect);
2619 spin_lock(&GlobalMid_Lock);
2620 server->tcpStatus = CifsExiting;
2621 spin_unlock(&GlobalMid_Lock);
2623 cifs_crypto_secmech_release(server);
2624 cifs_fscache_release_client_cookie(server);
2626 kfree(server->session_key.response);
2627 server->session_key.response = NULL;
2628 server->session_key.len = 0;
2630 task = xchg(&server->tsk, NULL);
2632 force_sig(SIGKILL, task);
2635 static struct TCP_Server_Info *
2636 cifs_get_tcp_session(struct smb_vol *volume_info)
2638 struct TCP_Server_Info *tcp_ses = NULL;
2641 cifs_dbg(FYI, "UNC: %s\n", volume_info->UNC);
2643 /* see if we already have a matching tcp_ses */
2644 tcp_ses = cifs_find_tcp_session(volume_info);
2648 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2654 tcp_ses->ops = volume_info->ops;
2655 tcp_ses->vals = volume_info->vals;
2656 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2657 tcp_ses->hostname = extract_hostname(volume_info->UNC);
2658 if (IS_ERR(tcp_ses->hostname)) {
2659 rc = PTR_ERR(tcp_ses->hostname);
2660 goto out_err_crypto_release;
2663 tcp_ses->noblocksnd = volume_info->noblocksnd;
2664 tcp_ses->noautotune = volume_info->noautotune;
2665 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2666 tcp_ses->rdma = volume_info->rdma;
2667 tcp_ses->in_flight = 0;
2668 tcp_ses->credits = 1;
2669 init_waitqueue_head(&tcp_ses->response_q);
2670 init_waitqueue_head(&tcp_ses->request_q);
2671 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2672 mutex_init(&tcp_ses->srv_mutex);
2673 memcpy(tcp_ses->workstation_RFC1001_name,
2674 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2675 memcpy(tcp_ses->server_RFC1001_name,
2676 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2677 tcp_ses->session_estab = false;
2678 tcp_ses->sequence_number = 0;
2679 tcp_ses->reconnect_instance = 1;
2680 tcp_ses->lstrp = jiffies;
2681 spin_lock_init(&tcp_ses->req_lock);
2682 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2683 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2684 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2685 INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
2686 mutex_init(&tcp_ses->reconnect_mutex);
2687 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2688 sizeof(tcp_ses->srcaddr));
2689 memcpy(&tcp_ses->dstaddr, &volume_info->dstaddr,
2690 sizeof(tcp_ses->dstaddr));
2691 generate_random_uuid(tcp_ses->client_guid);
2693 * at this point we are the only ones with the pointer
2694 * to the struct since the kernel thread not created yet
2695 * no need to spinlock this init of tcpStatus or srv_count
2697 tcp_ses->tcpStatus = CifsNew;
2698 ++tcp_ses->srv_count;
2700 if (volume_info->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
2701 volume_info->echo_interval <= SMB_ECHO_INTERVAL_MAX)
2702 tcp_ses->echo_interval = volume_info->echo_interval * HZ;
2704 tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
2705 if (tcp_ses->rdma) {
2706 #ifndef CONFIG_CIFS_SMB_DIRECT
2707 cifs_dbg(VFS, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
2709 goto out_err_crypto_release;
2711 tcp_ses->smbd_conn = smbd_get_connection(
2712 tcp_ses, (struct sockaddr *)&volume_info->dstaddr);
2713 if (tcp_ses->smbd_conn) {
2714 cifs_dbg(VFS, "RDMA transport established\n");
2716 goto smbd_connected;
2719 goto out_err_crypto_release;
2722 rc = ip_connect(tcp_ses);
2724 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
2725 goto out_err_crypto_release;
2729 * since we're in a cifs function already, we know that
2730 * this will succeed. No need for try_module_get().
2732 __module_get(THIS_MODULE);
2733 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2735 if (IS_ERR(tcp_ses->tsk)) {
2736 rc = PTR_ERR(tcp_ses->tsk);
2737 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
2738 module_put(THIS_MODULE);
2739 goto out_err_crypto_release;
2741 tcp_ses->tcpStatus = CifsNeedNegotiate;
2743 tcp_ses->nr_targets = 1;
2745 /* thread spawned, put it on the list */
2746 spin_lock(&cifs_tcp_ses_lock);
2747 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2748 spin_unlock(&cifs_tcp_ses_lock);
2750 cifs_fscache_get_client_cookie(tcp_ses);
2752 /* queue echo request delayed work */
2753 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
2757 out_err_crypto_release:
2758 cifs_crypto_secmech_release(tcp_ses);
2760 put_net(cifs_net_ns(tcp_ses));
2764 if (!IS_ERR(tcp_ses->hostname))
2765 kfree(tcp_ses->hostname);
2766 if (tcp_ses->ssocket)
2767 sock_release(tcp_ses->ssocket);
2773 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2775 if (vol->sectype != Unspecified &&
2776 vol->sectype != ses->sectype)
2779 switch (ses->sectype) {
2781 if (!uid_eq(vol->cred_uid, ses->cred_uid))
2785 /* NULL username means anonymous session */
2786 if (ses->user_name == NULL) {
2792 /* anything else takes username/password */
2793 if (strncmp(ses->user_name,
2794 vol->username ? vol->username : "",
2795 CIFS_MAX_USERNAME_LEN))
2797 if ((vol->username && strlen(vol->username) != 0) &&
2798 ses->password != NULL &&
2799 strncmp(ses->password,
2800 vol->password ? vol->password : "",
2801 CIFS_MAX_PASSWORD_LEN))
2808 * cifs_setup_ipc - helper to setup the IPC tcon for the session
2810 * A new IPC connection is made and stored in the session
2811 * tcon_ipc. The IPC tcon has the same lifetime as the session.
2814 cifs_setup_ipc(struct cifs_ses *ses, struct smb_vol *volume_info)
2817 struct cifs_tcon *tcon;
2818 struct nls_table *nls_codepage;
2819 char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0};
2823 * If the mount request that resulted in the creation of the
2824 * session requires encryption, force IPC to be encrypted too.
2826 if (volume_info->seal) {
2827 if (ses->server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
2831 "IPC: server doesn't support encryption\n");
2836 tcon = tconInfoAlloc();
2840 scnprintf(unc, sizeof(unc), "\\\\%s\\IPC$", ses->server->hostname);
2843 nls_codepage = load_nls_default();
2849 rc = ses->server->ops->tree_connect(xid, ses, unc, tcon, nls_codepage);
2853 cifs_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
2858 cifs_dbg(FYI, "IPC tcon rc = %d ipc tid = %d\n", rc, tcon->tid);
2860 ses->tcon_ipc = tcon;
2862 unload_nls(nls_codepage);
2867 * cifs_free_ipc - helper to release the session IPC tcon
2869 * Needs to be called everytime a session is destroyed
2872 cifs_free_ipc(struct cifs_ses *ses)
2875 struct cifs_tcon *tcon = ses->tcon_ipc;
2880 if (ses->server->ops->tree_disconnect) {
2882 rc = ses->server->ops->tree_disconnect(xid, tcon);
2887 cifs_dbg(FYI, "failed to disconnect IPC tcon (rc=%d)\n", rc);
2890 ses->tcon_ipc = NULL;
2894 static struct cifs_ses *
2895 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
2897 struct cifs_ses *ses;
2899 spin_lock(&cifs_tcp_ses_lock);
2900 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
2901 if (ses->status == CifsExiting)
2903 if (!match_session(ses, vol))
2906 spin_unlock(&cifs_tcp_ses_lock);
2909 spin_unlock(&cifs_tcp_ses_lock);
2913 void cifs_put_smb_ses(struct cifs_ses *ses)
2915 unsigned int rc, xid;
2916 struct TCP_Server_Info *server = ses->server;
2918 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
2920 spin_lock(&cifs_tcp_ses_lock);
2921 if (ses->status == CifsExiting) {
2922 spin_unlock(&cifs_tcp_ses_lock);
2925 if (--ses->ses_count > 0) {
2926 spin_unlock(&cifs_tcp_ses_lock);
2929 if (ses->status == CifsGood)
2930 ses->status = CifsExiting;
2931 spin_unlock(&cifs_tcp_ses_lock);
2935 if (ses->status == CifsExiting && server->ops->logoff) {
2937 rc = server->ops->logoff(xid, ses);
2939 cifs_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
2944 spin_lock(&cifs_tcp_ses_lock);
2945 list_del_init(&ses->smb_ses_list);
2946 spin_unlock(&cifs_tcp_ses_lock);
2949 cifs_put_tcp_session(server, 0);
2954 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
2955 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
2957 /* Populate username and pw fields from keyring if possible */
2959 cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
2962 const char *delim, *payload;
2966 struct TCP_Server_Info *server = ses->server;
2967 struct sockaddr_in *sa;
2968 struct sockaddr_in6 *sa6;
2969 const struct user_key_payload *upayload;
2971 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
2975 /* try to find an address key first */
2976 switch (server->dstaddr.ss_family) {
2978 sa = (struct sockaddr_in *)&server->dstaddr;
2979 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
2982 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
2983 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
2986 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
2987 server->dstaddr.ss_family);
2992 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2993 key = request_key(&key_type_logon, desc, "");
2995 if (!ses->domainName) {
2996 cifs_dbg(FYI, "domainName is NULL\n");
3001 /* didn't work, try to find a domain key */
3002 sprintf(desc, "cifs:d:%s", ses->domainName);
3003 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
3004 key = request_key(&key_type_logon, desc, "");
3011 down_read(&key->sem);
3012 upayload = user_key_payload_locked(key);
3013 if (IS_ERR_OR_NULL(upayload)) {
3014 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
3018 /* find first : in payload */
3019 payload = upayload->data;
3020 delim = strnchr(payload, upayload->datalen, ':');
3021 cifs_dbg(FYI, "payload=%s\n", payload);
3023 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
3029 len = delim - payload;
3030 if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
3031 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
3037 vol->username = kstrndup(payload, len, GFP_KERNEL);
3038 if (!vol->username) {
3039 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
3044 cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
3046 len = key->datalen - (len + 1);
3047 if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
3048 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
3050 kfree(vol->username);
3051 vol->username = NULL;
3056 vol->password = kstrndup(delim, len, GFP_KERNEL);
3057 if (!vol->password) {
3058 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
3061 kfree(vol->username);
3062 vol->username = NULL;
3071 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
3074 #else /* ! CONFIG_KEYS */
3076 cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
3077 struct cifs_ses *ses __attribute__((unused)))
3081 #endif /* CONFIG_KEYS */
3084 * cifs_get_smb_ses - get a session matching @volume_info data from @server
3086 * This function assumes it is being called from cifs_mount() where we
3087 * already got a server reference (server refcount +1). See
3088 * cifs_get_tcon() for refcount explanations.
3091 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
3095 struct cifs_ses *ses;
3096 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3097 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3101 ses = cifs_find_smb_ses(server, volume_info);
3103 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
3106 mutex_lock(&ses->session_mutex);
3107 rc = cifs_negotiate_protocol(xid, ses);
3109 mutex_unlock(&ses->session_mutex);
3110 /* problem -- put our ses reference */
3111 cifs_put_smb_ses(ses);
3115 if (ses->need_reconnect) {
3116 cifs_dbg(FYI, "Session needs reconnect\n");
3117 rc = cifs_setup_session(xid, ses,
3118 volume_info->local_nls);
3120 mutex_unlock(&ses->session_mutex);
3121 /* problem -- put our reference */
3122 cifs_put_smb_ses(ses);
3127 mutex_unlock(&ses->session_mutex);
3129 /* existing SMB ses has a server reference already */
3130 cifs_put_tcp_session(server, 0);
3135 cifs_dbg(FYI, "Existing smb sess not found\n");
3136 ses = sesInfoAlloc();
3140 /* new SMB session uses our server ref */
3141 ses->server = server;
3142 if (server->dstaddr.ss_family == AF_INET6)
3143 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
3145 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
3147 if (volume_info->username) {
3148 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
3149 if (!ses->user_name)
3153 /* volume_info->password freed at unmount */
3154 if (volume_info->password) {
3155 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
3159 if (volume_info->domainname) {
3160 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
3161 if (!ses->domainName)
3164 if (volume_info->domainauto)
3165 ses->domainAuto = volume_info->domainauto;
3166 ses->cred_uid = volume_info->cred_uid;
3167 ses->linux_uid = volume_info->linux_uid;
3169 ses->sectype = volume_info->sectype;
3170 ses->sign = volume_info->sign;
3172 mutex_lock(&ses->session_mutex);
3173 rc = cifs_negotiate_protocol(xid, ses);
3175 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
3176 mutex_unlock(&ses->session_mutex);
3180 /* success, put it on the list */
3181 spin_lock(&cifs_tcp_ses_lock);
3182 list_add(&ses->smb_ses_list, &server->smb_ses_list);
3183 spin_unlock(&cifs_tcp_ses_lock);
3187 cifs_setup_ipc(ses, volume_info);
3197 static int match_tcon(struct cifs_tcon *tcon, struct smb_vol *volume_info)
3199 if (tcon->tidStatus == CifsExiting)
3201 if (strncmp(tcon->treeName, volume_info->UNC, MAX_TREE_SIZE))
3203 if (tcon->seal != volume_info->seal)
3205 if (tcon->snapshot_time != volume_info->snapshot_time)
3207 if (tcon->handle_timeout != volume_info->handle_timeout)
3212 static struct cifs_tcon *
3213 cifs_find_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3215 struct list_head *tmp;
3216 struct cifs_tcon *tcon;
3218 spin_lock(&cifs_tcp_ses_lock);
3219 list_for_each(tmp, &ses->tcon_list) {
3220 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
3221 if (!match_tcon(tcon, volume_info))
3224 spin_unlock(&cifs_tcp_ses_lock);
3227 spin_unlock(&cifs_tcp_ses_lock);
3232 cifs_put_tcon(struct cifs_tcon *tcon)
3235 struct cifs_ses *ses;
3238 * IPC tcon share the lifetime of their session and are
3239 * destroyed in the session put function
3241 if (tcon == NULL || tcon->ipc)
3245 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
3246 spin_lock(&cifs_tcp_ses_lock);
3247 if (--tcon->tc_count > 0) {
3248 spin_unlock(&cifs_tcp_ses_lock);
3252 list_del_init(&tcon->tcon_list);
3253 spin_unlock(&cifs_tcp_ses_lock);
3256 if (ses->server->ops->tree_disconnect)
3257 ses->server->ops->tree_disconnect(xid, tcon);
3260 cifs_fscache_release_super_cookie(tcon);
3262 cifs_put_smb_ses(ses);
3266 * cifs_get_tcon - get a tcon matching @volume_info data from @ses
3268 * - tcon refcount is the number of mount points using the tcon.
3269 * - ses refcount is the number of tcon using the session.
3271 * 1. This function assumes it is being called from cifs_mount() where
3272 * we already got a session reference (ses refcount +1).
3274 * 2. Since we're in the context of adding a mount point, the end
3275 * result should be either:
3277 * a) a new tcon already allocated with refcount=1 (1 mount point) and
3278 * its session refcount incremented (1 new tcon). This +1 was
3279 * already done in (1).
3281 * b) an existing tcon with refcount+1 (add a mount point to it) and
3282 * identical ses refcount (no new tcon). Because of (1) we need to
3283 * decrement the ses refcount.
3285 static struct cifs_tcon *
3286 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3289 struct cifs_tcon *tcon;
3291 tcon = cifs_find_tcon(ses, volume_info);
3294 * tcon has refcount already incremented but we need to
3295 * decrement extra ses reference gotten by caller (case b)
3297 cifs_dbg(FYI, "Found match on UNC path\n");
3298 cifs_put_smb_ses(ses);
3302 if (!ses->server->ops->tree_connect) {
3307 tcon = tconInfoAlloc();
3313 if (volume_info->snapshot_time) {
3314 if (ses->server->vals->protocol_id == 0) {
3316 "Use SMB2 or later for snapshot mount option\n");
3320 tcon->snapshot_time = volume_info->snapshot_time;
3323 if (volume_info->handle_timeout) {
3324 if (ses->server->vals->protocol_id == 0) {
3326 "Use SMB2.1 or later for handle timeout option\n");
3330 tcon->handle_timeout = volume_info->handle_timeout;
3334 if (volume_info->password) {
3335 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
3336 if (!tcon->password) {
3342 if (volume_info->seal) {
3343 if (ses->server->vals->protocol_id == 0) {
3345 "SMB3 or later required for encryption\n");
3348 } else if (tcon->ses->server->capabilities &
3349 SMB2_GLOBAL_CAP_ENCRYPTION)
3352 cifs_dbg(VFS, "Encryption is not supported on share\n");
3358 if (volume_info->linux_ext) {
3359 if (ses->server->posix_ext_supported) {
3360 tcon->posix_extensions = true;
3361 printk_once(KERN_WARNING
3362 "SMB3.11 POSIX Extensions are experimental\n");
3364 cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions.\n");
3371 * BB Do we need to wrap session_mutex around this TCon call and Unix
3372 * SetFS as we do on SessSetup and reconnect?
3375 rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
3376 volume_info->local_nls);
3378 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
3382 tcon->use_persistent = false;
3383 /* check if SMB2 or later, CIFS does not support persistent handles */
3384 if (volume_info->persistent) {
3385 if (ses->server->vals->protocol_id == 0) {
3387 "SMB3 or later required for persistent handles\n");
3390 } else if (ses->server->capabilities &
3391 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3392 tcon->use_persistent = true;
3393 else /* persistent handles requested but not supported */ {
3395 "Persistent handles not supported on share\n");
3399 } else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
3400 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3401 && (volume_info->nopersistent == false)) {
3402 cifs_dbg(FYI, "enabling persistent handles\n");
3403 tcon->use_persistent = true;
3404 } else if (volume_info->resilient) {
3405 if (ses->server->vals->protocol_id == 0) {
3407 "SMB2.1 or later required for resilient handles\n");
3411 tcon->use_resilient = true;
3415 * We can have only one retry value for a connection to a share so for
3416 * resources mounted more than once to the same server share the last
3417 * value passed in for the retry flag is used.
3419 tcon->retry = volume_info->retry;
3420 tcon->nocase = volume_info->nocase;
3421 tcon->nohandlecache = volume_info->nohandlecache;
3422 tcon->local_lease = volume_info->local_lease;
3423 INIT_LIST_HEAD(&tcon->pending_opens);
3425 spin_lock(&cifs_tcp_ses_lock);
3426 list_add(&tcon->tcon_list, &ses->tcon_list);
3427 spin_unlock(&cifs_tcp_ses_lock);
3429 cifs_fscache_get_super_cookie(tcon);
3439 cifs_put_tlink(struct tcon_link *tlink)
3441 if (!tlink || IS_ERR(tlink))
3444 if (!atomic_dec_and_test(&tlink->tl_count) ||
3445 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
3446 tlink->tl_time = jiffies;
3450 if (!IS_ERR(tlink_tcon(tlink)))
3451 cifs_put_tcon(tlink_tcon(tlink));
3457 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3459 struct cifs_sb_info *old = CIFS_SB(sb);
3460 struct cifs_sb_info *new = mnt_data->cifs_sb;
3462 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
3465 if ((old->mnt_cifs_flags & CIFS_MOUNT_MASK) !=
3466 (new->mnt_cifs_flags & CIFS_MOUNT_MASK))
3470 * We want to share sb only if we don't specify an r/wsize or
3471 * specified r/wsize is greater than or equal to existing one.
3473 if (new->wsize && new->wsize < old->wsize)
3476 if (new->rsize && new->rsize < old->rsize)
3479 if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))
3482 if (old->mnt_file_mode != new->mnt_file_mode ||
3483 old->mnt_dir_mode != new->mnt_dir_mode)
3486 if (strcmp(old->local_nls->charset, new->local_nls->charset))
3489 if (old->actimeo != new->actimeo)
3496 match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3498 struct cifs_sb_info *old = CIFS_SB(sb);
3499 struct cifs_sb_info *new = mnt_data->cifs_sb;
3500 bool old_set = old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH;
3501 bool new_set = new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH;
3503 if (old_set && new_set && !strcmp(new->prepath, old->prepath))
3505 else if (!old_set && !new_set)
3512 cifs_match_super(struct super_block *sb, void *data)
3514 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
3515 struct smb_vol *volume_info;
3516 struct cifs_sb_info *cifs_sb;
3517 struct TCP_Server_Info *tcp_srv;
3518 struct cifs_ses *ses;
3519 struct cifs_tcon *tcon;
3520 struct tcon_link *tlink;
3523 spin_lock(&cifs_tcp_ses_lock);
3524 cifs_sb = CIFS_SB(sb);
3525 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3526 if (IS_ERR(tlink)) {
3527 spin_unlock(&cifs_tcp_ses_lock);
3530 tcon = tlink_tcon(tlink);
3532 tcp_srv = ses->server;
3534 volume_info = mnt_data->vol;
3536 if (!match_server(tcp_srv, volume_info) ||
3537 !match_session(ses, volume_info) ||
3538 !match_tcon(tcon, volume_info) ||
3539 !match_prepath(sb, mnt_data)) {
3544 rc = compare_mount_options(sb, mnt_data);
3546 spin_unlock(&cifs_tcp_ses_lock);
3547 cifs_put_tlink(tlink);
3551 #ifdef CONFIG_DEBUG_LOCK_ALLOC
3552 static struct lock_class_key cifs_key[2];
3553 static struct lock_class_key cifs_slock_key[2];
3556 cifs_reclassify_socket4(struct socket *sock)
3558 struct sock *sk = sock->sk;
3559 BUG_ON(!sock_allow_reclassification(sk));
3560 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
3561 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
3565 cifs_reclassify_socket6(struct socket *sock)
3567 struct sock *sk = sock->sk;
3568 BUG_ON(!sock_allow_reclassification(sk));
3569 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
3570 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
3574 cifs_reclassify_socket4(struct socket *sock)
3579 cifs_reclassify_socket6(struct socket *sock)
3584 /* See RFC1001 section 14 on representation of Netbios names */
3585 static void rfc1002mangle(char *target, char *source, unsigned int length)
3589 for (i = 0, j = 0; i < (length); i++) {
3590 /* mask a nibble at a time and encode */
3591 target[j] = 'A' + (0x0F & (source[i] >> 4));
3592 target[j+1] = 'A' + (0x0F & source[i]);
3599 bind_socket(struct TCP_Server_Info *server)
3602 if (server->srcaddr.ss_family != AF_UNSPEC) {
3603 /* Bind to the specified local IP address */
3604 struct socket *socket = server->ssocket;
3605 rc = socket->ops->bind(socket,
3606 (struct sockaddr *) &server->srcaddr,
3607 sizeof(server->srcaddr));
3609 struct sockaddr_in *saddr4;
3610 struct sockaddr_in6 *saddr6;
3611 saddr4 = (struct sockaddr_in *)&server->srcaddr;
3612 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
3613 if (saddr6->sin6_family == AF_INET6)
3614 cifs_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
3615 &saddr6->sin6_addr, rc);
3617 cifs_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
3618 &saddr4->sin_addr.s_addr, rc);
3625 ip_rfc1001_connect(struct TCP_Server_Info *server)
3629 * some servers require RFC1001 sessinit before sending
3630 * negprot - BB check reconnection in case where second
3631 * sessinit is sent but no second negprot
3633 struct rfc1002_session_packet *ses_init_buf;
3634 struct smb_hdr *smb_buf;
3635 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
3638 ses_init_buf->trailer.session_req.called_len = 32;
3640 if (server->server_RFC1001_name[0] != 0)
3641 rfc1002mangle(ses_init_buf->trailer.
3642 session_req.called_name,
3643 server->server_RFC1001_name,
3644 RFC1001_NAME_LEN_WITH_NULL);
3646 rfc1002mangle(ses_init_buf->trailer.
3647 session_req.called_name,
3648 DEFAULT_CIFS_CALLED_NAME,
3649 RFC1001_NAME_LEN_WITH_NULL);
3651 ses_init_buf->trailer.session_req.calling_len = 32;
3654 * calling name ends in null (byte 16) from old smb
3657 if (server->workstation_RFC1001_name[0] != 0)
3658 rfc1002mangle(ses_init_buf->trailer.
3659 session_req.calling_name,
3660 server->workstation_RFC1001_name,
3661 RFC1001_NAME_LEN_WITH_NULL);
3663 rfc1002mangle(ses_init_buf->trailer.
3664 session_req.calling_name,
3666 RFC1001_NAME_LEN_WITH_NULL);
3668 ses_init_buf->trailer.session_req.scope1 = 0;
3669 ses_init_buf->trailer.session_req.scope2 = 0;
3670 smb_buf = (struct smb_hdr *)ses_init_buf;
3672 /* sizeof RFC1002_SESSION_REQUEST with no scope */
3673 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
3674 rc = smb_send(server, smb_buf, 0x44);
3675 kfree(ses_init_buf);
3677 * RFC1001 layer in at least one server
3678 * requires very short break before negprot
3679 * presumably because not expecting negprot
3680 * to follow so fast. This is a simple
3681 * solution that works without
3682 * complicating the code and causes no
3683 * significant slowing down on mount
3686 usleep_range(1000, 2000);
3689 * else the negprot may still work without this
3690 * even though malloc failed
3697 generic_ip_connect(struct TCP_Server_Info *server)
3702 struct socket *socket = server->ssocket;
3703 struct sockaddr *saddr;
3705 saddr = (struct sockaddr *) &server->dstaddr;
3707 if (server->dstaddr.ss_family == AF_INET6) {
3708 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
3709 slen = sizeof(struct sockaddr_in6);
3712 sport = ((struct sockaddr_in *) saddr)->sin_port;
3713 slen = sizeof(struct sockaddr_in);
3717 if (socket == NULL) {
3718 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3719 IPPROTO_TCP, &socket, 1);
3721 cifs_dbg(VFS, "Error %d creating socket\n", rc);
3722 server->ssocket = NULL;
3726 /* BB other socket options to set KEEPALIVE, NODELAY? */
3727 cifs_dbg(FYI, "Socket created\n");
3728 server->ssocket = socket;
3729 socket->sk->sk_allocation = GFP_NOFS;
3730 if (sfamily == AF_INET6)
3731 cifs_reclassify_socket6(socket);
3733 cifs_reclassify_socket4(socket);
3736 rc = bind_socket(server);
3741 * Eventually check for other socket options to change from
3742 * the default. sock_setsockopt not used because it expects
3745 socket->sk->sk_rcvtimeo = 7 * HZ;
3746 socket->sk->sk_sndtimeo = 5 * HZ;
3748 /* make the bufsizes depend on wsize/rsize and max requests */
3749 if (server->noautotune) {
3750 if (socket->sk->sk_sndbuf < (200 * 1024))
3751 socket->sk->sk_sndbuf = 200 * 1024;
3752 if (socket->sk->sk_rcvbuf < (140 * 1024))
3753 socket->sk->sk_rcvbuf = 140 * 1024;
3756 if (server->tcp_nodelay) {
3758 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
3759 (char *)&val, sizeof(val));
3761 cifs_dbg(FYI, "set TCP_NODELAY socket option error %d\n",
3765 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3766 socket->sk->sk_sndbuf,
3767 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3769 rc = socket->ops->connect(socket, saddr, slen, 0);
3771 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3772 sock_release(socket);
3773 server->ssocket = NULL;
3777 if (sport == htons(RFC1001_PORT))
3778 rc = ip_rfc1001_connect(server);
3784 ip_connect(struct TCP_Server_Info *server)
3787 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3788 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3790 if (server->dstaddr.ss_family == AF_INET6)
3791 sport = &addr6->sin6_port;
3793 sport = &addr->sin_port;
3798 /* try with 445 port at first */
3799 *sport = htons(CIFS_PORT);
3801 rc = generic_ip_connect(server);
3805 /* if it failed, try with 139 port */
3806 *sport = htons(RFC1001_PORT);
3809 return generic_ip_connect(server);
3812 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
3813 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
3815 /* if we are reconnecting then should we check to see if
3816 * any requested capabilities changed locally e.g. via
3817 * remount but we can not do much about it here
3818 * if they have (even if we could detect it by the following)
3819 * Perhaps we could add a backpointer to array of sb from tcon
3820 * or if we change to make all sb to same share the same
3821 * sb as NFS - then we only have one backpointer to sb.
3822 * What if we wanted to mount the server share twice once with
3823 * and once without posixacls or posix paths? */
3824 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3826 if (vol_info && vol_info->no_linux_ext) {
3827 tcon->fsUnixInfo.Capability = 0;
3828 tcon->unix_ext = 0; /* Unix Extensions disabled */
3829 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
3831 } else if (vol_info)
3832 tcon->unix_ext = 1; /* Unix Extensions supported */
3834 if (tcon->unix_ext == 0) {
3835 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
3839 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
3840 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3841 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
3842 /* check for reconnect case in which we do not
3843 want to change the mount behavior if we can avoid it */
3844 if (vol_info == NULL) {
3845 /* turn off POSIX ACL and PATHNAMES if not set
3846 originally at mount time */
3847 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
3848 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3849 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3850 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3851 cifs_dbg(VFS, "POSIXPATH support change\n");
3852 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3853 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3854 cifs_dbg(VFS, "possible reconnect error\n");
3855 cifs_dbg(VFS, "server disabled POSIX path support\n");
3859 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3860 cifs_dbg(VFS, "per-share encryption not supported yet\n");
3862 cap &= CIFS_UNIX_CAP_MASK;
3863 if (vol_info && vol_info->no_psx_acl)
3864 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3865 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
3866 cifs_dbg(FYI, "negotiated posix acl support\n");
3868 cifs_sb->mnt_cifs_flags |=
3869 CIFS_MOUNT_POSIXACL;
3872 if (vol_info && vol_info->posix_paths == 0)
3873 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3874 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
3875 cifs_dbg(FYI, "negotiate posix pathnames\n");
3877 cifs_sb->mnt_cifs_flags |=
3878 CIFS_MOUNT_POSIX_PATHS;
3881 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
3882 #ifdef CONFIG_CIFS_DEBUG2
3883 if (cap & CIFS_UNIX_FCNTL_CAP)
3884 cifs_dbg(FYI, "FCNTL cap\n");
3885 if (cap & CIFS_UNIX_EXTATTR_CAP)
3886 cifs_dbg(FYI, "EXTATTR cap\n");
3887 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3888 cifs_dbg(FYI, "POSIX path cap\n");
3889 if (cap & CIFS_UNIX_XATTR_CAP)
3890 cifs_dbg(FYI, "XATTR cap\n");
3891 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
3892 cifs_dbg(FYI, "POSIX ACL cap\n");
3893 if (cap & CIFS_UNIX_LARGE_READ_CAP)
3894 cifs_dbg(FYI, "very large read cap\n");
3895 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
3896 cifs_dbg(FYI, "very large write cap\n");
3897 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
3898 cifs_dbg(FYI, "transport encryption cap\n");
3899 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3900 cifs_dbg(FYI, "mandatory transport encryption cap\n");
3901 #endif /* CIFS_DEBUG2 */
3902 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
3903 if (vol_info == NULL) {
3904 cifs_dbg(FYI, "resetting capabilities failed\n");
3906 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");
3912 int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
3913 struct cifs_sb_info *cifs_sb)
3915 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
3917 spin_lock_init(&cifs_sb->tlink_tree_lock);
3918 cifs_sb->tlink_tree = RB_ROOT;
3920 cifs_sb->bsize = pvolume_info->bsize;
3922 * Temporarily set r/wsize for matching superblock. If we end up using
3923 * new sb then client will later negotiate it downward if needed.
3925 cifs_sb->rsize = pvolume_info->rsize;
3926 cifs_sb->wsize = pvolume_info->wsize;
3928 cifs_sb->mnt_uid = pvolume_info->linux_uid;
3929 cifs_sb->mnt_gid = pvolume_info->linux_gid;
3930 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
3931 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
3932 cifs_dbg(FYI, "file mode: 0x%hx dir mode: 0x%hx\n",
3933 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
3935 cifs_sb->actimeo = pvolume_info->actimeo;
3936 cifs_sb->local_nls = pvolume_info->local_nls;
3938 if (pvolume_info->nodfs)
3939 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_DFS;
3940 if (pvolume_info->noperm)
3941 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
3942 if (pvolume_info->setuids)
3943 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
3944 if (pvolume_info->setuidfromacl)
3945 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
3946 if (pvolume_info->server_ino)
3947 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
3948 if (pvolume_info->remap)
3949 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
3950 if (pvolume_info->sfu_remap)
3951 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
3952 if (pvolume_info->no_xattr)
3953 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
3954 if (pvolume_info->sfu_emul)
3955 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
3956 if (pvolume_info->nobrl)
3957 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
3958 if (pvolume_info->nohandlecache)
3959 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_HANDLE_CACHE;
3960 if (pvolume_info->nostrictsync)
3961 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
3962 if (pvolume_info->mand_lock)
3963 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
3964 if (pvolume_info->rwpidforward)
3965 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
3966 if (pvolume_info->cifs_acl)
3967 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
3968 if (pvolume_info->backupuid_specified) {
3969 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
3970 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
3972 if (pvolume_info->backupgid_specified) {
3973 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
3974 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
3976 if (pvolume_info->override_uid)
3977 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
3978 if (pvolume_info->override_gid)
3979 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
3980 if (pvolume_info->dynperm)
3981 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
3982 if (pvolume_info->fsc)
3983 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
3984 if (pvolume_info->multiuser)
3985 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
3986 CIFS_MOUNT_NO_PERM);
3987 if (pvolume_info->strict_io)
3988 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
3989 if (pvolume_info->direct_io) {
3990 cifs_dbg(FYI, "mounting share using direct i/o\n");
3991 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
3993 if (pvolume_info->mfsymlinks) {
3994 if (pvolume_info->sfu_emul) {
3996 * Our SFU ("Services for Unix" emulation does not allow
3997 * creating symlinks but does allow reading existing SFU
3998 * symlinks (it does allow both creating and reading SFU
3999 * style mknod and FIFOs though). When "mfsymlinks" and
4000 * "sfu" are both enabled at the same time, it allows
4001 * reading both types of symlinks, but will only create
4002 * them with mfsymlinks format. This allows better
4003 * Apple compatibility (probably better for Samba too)
4004 * while still recognizing old Windows style symlinks.
4006 cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
4008 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
4011 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
4012 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
4014 if (pvolume_info->prepath) {
4015 cifs_sb->prepath = kstrdup(pvolume_info->prepath, GFP_KERNEL);
4016 if (cifs_sb->prepath == NULL)
4024 cifs_cleanup_volume_info_contents(struct smb_vol *volume_info)
4026 kfree(volume_info->username);
4027 kzfree(volume_info->password);
4028 kfree(volume_info->UNC);
4029 kfree(volume_info->domainname);
4030 kfree(volume_info->iocharset);
4031 kfree(volume_info->prepath);
4035 cifs_cleanup_volume_info(struct smb_vol *volume_info)
4039 cifs_cleanup_volume_info_contents(volume_info);
4043 /* Release all succeed connections */
4044 static inline void mount_put_conns(struct cifs_sb_info *cifs_sb,
4046 struct TCP_Server_Info *server,
4047 struct cifs_ses *ses, struct cifs_tcon *tcon)
4052 cifs_put_tcon(tcon);
4054 cifs_put_smb_ses(ses);
4056 cifs_put_tcp_session(server, 0);
4057 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
4061 /* Get connections for tcp, ses and tcon */
4062 static int mount_get_conns(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
4064 struct TCP_Server_Info **nserver,
4065 struct cifs_ses **nses, struct cifs_tcon **ntcon)
4068 struct TCP_Server_Info *server;
4069 struct cifs_ses *ses;
4070 struct cifs_tcon *tcon;
4078 /* get a reference to a tcp session */
4079 server = cifs_get_tcp_session(vol);
4080 if (IS_ERR(server)) {
4081 rc = PTR_ERR(server);
4087 if ((vol->max_credits < 20) || (vol->max_credits > 60000))
4088 server->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
4090 server->max_credits = vol->max_credits;
4092 /* get a reference to a SMB session */
4093 ses = cifs_get_smb_ses(server, vol);
4101 if ((vol->persistent == true) && (!(ses->server->capabilities &
4102 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES))) {
4103 cifs_dbg(VFS, "persistent handles not supported by server\n");
4107 /* search for existing tcon to this server share */
4108 tcon = cifs_get_tcon(ses, vol);
4116 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
4117 if (tcon->posix_extensions)
4118 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
4120 /* tell server which Unix caps we support */
4121 if (cap_unix(tcon->ses)) {
4123 * reset of caps checks mount to see if unix extensions disabled
4124 * for just this mount.
4126 reset_cifs_unix_caps(*xid, tcon, cifs_sb, vol);
4127 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
4128 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
4129 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP))
4132 tcon->unix_ext = 0; /* server does not support them */
4134 /* do not care if a following call succeed - informational */
4135 if (!tcon->pipe && server->ops->qfs_tcon)
4136 server->ops->qfs_tcon(*xid, tcon);
4138 cifs_sb->wsize = server->ops->negotiate_wsize(tcon, vol);
4139 cifs_sb->rsize = server->ops->negotiate_rsize(tcon, vol);
4144 static int mount_setup_tlink(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
4145 struct cifs_tcon *tcon)
4147 struct tcon_link *tlink;
4149 /* hang the tcon off of the superblock */
4150 tlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4154 tlink->tl_uid = ses->linux_uid;
4155 tlink->tl_tcon = tcon;
4156 tlink->tl_time = jiffies;
4157 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
4158 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4160 cifs_sb->master_tlink = tlink;
4161 spin_lock(&cifs_sb->tlink_tree_lock);
4162 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4163 spin_unlock(&cifs_sb->tlink_tree_lock);
4165 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4170 #ifdef CONFIG_CIFS_DFS_UPCALL
4172 * cifs_build_path_to_root returns full path to root when we do not have an
4173 * exiting connection (tcon)
4176 build_unc_path_to_root(const struct smb_vol *vol,
4177 const struct cifs_sb_info *cifs_sb, bool useppath)
4179 char *full_path, *pos;
4180 unsigned int pplen = useppath && vol->prepath ?
4181 strlen(vol->prepath) + 1 : 0;
4182 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
4184 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
4185 if (full_path == NULL)
4186 return ERR_PTR(-ENOMEM);
4188 strncpy(full_path, vol->UNC, unc_len);
4189 pos = full_path + unc_len;
4192 *pos = CIFS_DIR_SEP(cifs_sb);
4193 strncpy(pos + 1, vol->prepath, pplen);
4197 *pos = '\0'; /* add trailing null */
4198 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
4199 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
4204 * expand_dfs_referral - Perform a dfs referral query and update the cifs_sb
4207 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
4208 * to a string containing updated options for the submount. Otherwise it
4209 * will be left untouched.
4211 * Returns the rc from get_dfs_path to the caller, which can be used to
4212 * determine whether there were referrals.
4215 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
4216 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
4220 struct dfs_info3_param referral = {0};
4221 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
4223 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4226 full_path = build_unc_path_to_root(volume_info, cifs_sb, true);
4227 if (IS_ERR(full_path))
4228 return PTR_ERR(full_path);
4230 /* For DFS paths, skip the first '\' of the UNC */
4231 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
4233 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4234 ref_path, &referral, NULL);
4236 char *fake_devname = NULL;
4238 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
4239 full_path + 1, &referral,
4241 free_dfs_info_param(&referral);
4243 if (IS_ERR(mdata)) {
4244 rc = PTR_ERR(mdata);
4247 cifs_cleanup_volume_info_contents(volume_info);
4248 rc = cifs_setup_volume_info(volume_info, mdata,
4249 fake_devname, false);
4251 kfree(fake_devname);
4252 kfree(cifs_sb->mountdata);
4253 cifs_sb->mountdata = mdata;
4259 static inline int get_next_dfs_tgt(const char *path,
4260 struct dfs_cache_tgt_list *tgt_list,
4261 struct dfs_cache_tgt_iterator **tgt_it)
4264 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
4266 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
4267 return !*tgt_it ? -EHOSTDOWN : 0;
4270 static int update_vol_info(const struct dfs_cache_tgt_iterator *tgt_it,
4271 struct smb_vol *fake_vol, struct smb_vol *vol)
4273 const char *tgt = dfs_cache_get_tgt_name(tgt_it);
4274 int len = strlen(tgt) + 2;
4277 new_unc = kmalloc(len, GFP_KERNEL);
4280 scnprintf(new_unc, len, "\\%s", tgt);
4285 if (fake_vol->prepath) {
4286 kfree(vol->prepath);
4287 vol->prepath = fake_vol->prepath;
4288 fake_vol->prepath = NULL;
4290 memcpy(&vol->dstaddr, &fake_vol->dstaddr, sizeof(vol->dstaddr));
4295 static int setup_dfs_tgt_conn(const char *path,
4296 const struct dfs_cache_tgt_iterator *tgt_it,
4297 struct cifs_sb_info *cifs_sb,
4298 struct smb_vol *vol,
4300 struct TCP_Server_Info **server,
4301 struct cifs_ses **ses,
4302 struct cifs_tcon **tcon)
4305 struct dfs_info3_param ref = {0};
4306 char *mdata = NULL, *fake_devname = NULL;
4307 struct smb_vol fake_vol = {0};
4309 cifs_dbg(FYI, "%s: dfs path: %s\n", __func__, path);
4311 rc = dfs_cache_get_tgt_referral(path, tgt_it, &ref);
4315 mdata = cifs_compose_mount_options(cifs_sb->mountdata, path, &ref,
4317 free_dfs_info_param(&ref);
4319 if (IS_ERR(mdata)) {
4320 rc = PTR_ERR(mdata);
4323 cifs_dbg(FYI, "%s: fake_devname: %s\n", __func__, fake_devname);
4324 rc = cifs_setup_volume_info(&fake_vol, mdata, fake_devname,
4328 kfree(fake_devname);
4332 * We use a 'fake_vol' here because we need pass it down to the
4333 * mount_{get,put} functions to test connection against new DFS
4336 mount_put_conns(cifs_sb, *xid, *server, *ses, *tcon);
4337 rc = mount_get_conns(&fake_vol, cifs_sb, xid, server, ses,
4341 * We were able to connect to new target server.
4342 * Update current volume info with new target server.
4344 rc = update_vol_info(tgt_it, &fake_vol, vol);
4347 cifs_cleanup_volume_info_contents(&fake_vol);
4351 static int mount_do_dfs_failover(const char *path,
4352 struct cifs_sb_info *cifs_sb,
4353 struct smb_vol *vol,
4354 struct cifs_ses *root_ses,
4356 struct TCP_Server_Info **server,
4357 struct cifs_ses **ses,
4358 struct cifs_tcon **tcon)
4361 struct dfs_cache_tgt_list tgt_list;
4362 struct dfs_cache_tgt_iterator *tgt_it = NULL;
4364 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4367 rc = dfs_cache_noreq_find(path, NULL, &tgt_list);
4372 /* Get next DFS target server - if any */
4373 rc = get_next_dfs_tgt(path, &tgt_list, &tgt_it);
4376 /* Connect to next DFS target */
4377 rc = setup_dfs_tgt_conn(path, tgt_it, cifs_sb, vol, xid, server,
4379 if (!rc || rc == -EACCES || rc == -EOPNOTSUPP)
4384 * Update DFS target hint in DFS referral cache with the target
4385 * server we successfully reconnected to.
4387 rc = dfs_cache_update_tgthint(*xid, root_ses ? root_ses : *ses,
4389 cifs_remap(cifs_sb), path,
4392 dfs_cache_free_tgts(&tgt_list);
4398 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
4399 const char *devname, bool is_smb3)
4403 if (cifs_parse_mount_options(mount_data, devname, volume_info, is_smb3))
4406 if (volume_info->nullauth) {
4407 cifs_dbg(FYI, "Anonymous login\n");
4408 kfree(volume_info->username);
4409 volume_info->username = NULL;
4410 } else if (volume_info->username) {
4411 /* BB fixme parse for domain name here */
4412 cifs_dbg(FYI, "Username: %s\n", volume_info->username);
4414 cifs_dbg(VFS, "No username specified\n");
4415 /* In userspace mount helper we can get user name from alternate
4416 locations such as env variables and files on disk */
4420 /* this is needed for ASCII cp to Unicode converts */
4421 if (volume_info->iocharset == NULL) {
4422 /* load_nls_default cannot return null */
4423 volume_info->local_nls = load_nls_default();
4425 volume_info->local_nls = load_nls(volume_info->iocharset);
4426 if (volume_info->local_nls == NULL) {
4427 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
4428 volume_info->iocharset);
4437 cifs_get_volume_info(char *mount_data, const char *devname, bool is_smb3)
4440 struct smb_vol *volume_info;
4442 volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
4444 return ERR_PTR(-ENOMEM);
4446 rc = cifs_setup_volume_info(volume_info, mount_data, devname, is_smb3);
4448 cifs_cleanup_volume_info(volume_info);
4449 volume_info = ERR_PTR(rc);
4456 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
4458 struct cifs_tcon *tcon,
4459 struct cifs_sb_info *cifs_sb,
4466 sep = CIFS_DIR_SEP(cifs_sb);
4469 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
4471 /* skip separators */
4476 /* next separator */
4477 while (*s && *s != sep)
4481 * temporarily null-terminate the path at the end of
4482 * the current component
4486 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4494 * Check if path is remote (e.g. a DFS share). Return -EREMOTE if it is,
4497 static int is_path_remote(struct cifs_sb_info *cifs_sb, struct smb_vol *vol,
4498 const unsigned int xid,
4499 struct TCP_Server_Info *server,
4500 struct cifs_tcon *tcon)
4505 if (!server->ops->is_path_accessible)
4509 * cifs_build_path_to_root works only when we have a valid tcon
4511 full_path = cifs_build_path_to_root(vol, cifs_sb, tcon,
4512 tcon->Flags & SMB_SHARE_IS_IN_DFS);
4513 if (full_path == NULL)
4516 cifs_dbg(FYI, "%s: full_path: %s\n", __func__, full_path);
4518 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4520 if (rc != 0 && rc != -EREMOTE) {
4525 if (rc != -EREMOTE) {
4526 rc = cifs_are_all_path_components_accessible(server, xid, tcon,
4530 cifs_dbg(VFS, "cannot query dirs between root and final path, "
4531 "enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
4532 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
4541 #ifdef CONFIG_CIFS_DFS_UPCALL
4542 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4546 struct cifs_ses *ses;
4547 struct cifs_tcon *root_tcon = NULL;
4548 struct cifs_tcon *tcon = NULL;
4549 struct TCP_Server_Info *server;
4550 char *root_path = NULL, *full_path = NULL;
4551 char *old_mountdata, *origin_mountdata = NULL;
4554 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4556 /* If not a standalone DFS root, then check if path is remote */
4557 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls,
4558 cifs_remap(cifs_sb), vol->UNC + 1, NULL,
4561 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4569 * If first DFS target server went offline and we failed to connect it,
4570 * server and ses pointers are NULL at this point, though we still have
4571 * chance to get a cached DFS referral in expand_dfs_referral() and
4572 * retry next target available in it.
4574 * If a NULL ses ptr is passed to dfs_cache_find(), a lookup will be
4575 * performed against DFS path and *no* requests will be sent to server
4576 * for any new DFS referrals. Hence it's safe to skip checking whether
4577 * server or ses ptr is NULL.
4579 if (rc == -EACCES || rc == -EOPNOTSUPP)
4582 root_path = build_unc_path_to_root(vol, cifs_sb, false);
4583 if (IS_ERR(root_path)) {
4584 rc = PTR_ERR(root_path);
4589 full_path = build_unc_path_to_root(vol, cifs_sb, true);
4590 if (IS_ERR(full_path)) {
4591 rc = PTR_ERR(full_path);
4596 * Perform an unconditional check for whether there are DFS
4597 * referrals for this path without prefix, to provide support
4598 * for DFS referrals from w2k8 servers which don't seem to respond
4599 * with PATH_NOT_COVERED to requests that include the prefix.
4600 * Chase the referral if found, otherwise continue normally.
4602 old_mountdata = cifs_sb->mountdata;
4603 (void)expand_dfs_referral(xid, ses, vol, cifs_sb, false);
4605 if (cifs_sb->mountdata == NULL) {
4610 /* Save DFS root volume information for DFS refresh worker */
4611 origin_mountdata = kstrndup(cifs_sb->mountdata,
4612 strlen(cifs_sb->mountdata), GFP_KERNEL);
4613 if (!origin_mountdata) {
4618 if (cifs_sb->mountdata != old_mountdata) {
4619 /* If we were redirected, reconnect to new target server */
4620 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4621 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4624 if (rc == -EACCES || rc == -EOPNOTSUPP)
4626 /* Perform DFS failover to any other DFS targets */
4627 rc = mount_do_dfs_failover(root_path + 1, cifs_sb, vol, NULL,
4628 &xid, &server, &ses, &tcon);
4634 root_path = build_unc_path_to_root(vol, cifs_sb, false);
4635 if (IS_ERR(root_path)) {
4636 rc = PTR_ERR(root_path);
4640 /* Cache out resolved root server */
4641 (void)dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4642 root_path + 1, NULL, NULL);
4644 * Save root tcon for additional DFS requests to update or create a new
4645 * DFS cache entry, or even perform DFS failover.
4647 spin_lock(&cifs_tcp_ses_lock);
4649 tcon->dfs_path = root_path;
4651 tcon->remap = cifs_remap(cifs_sb);
4652 spin_unlock(&cifs_tcp_ses_lock);
4656 for (count = 1; ;) {
4658 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4659 if (!rc || rc != -EREMOTE)
4663 * BB: when we implement proper loop detection,
4664 * we will remove this check. But now we need it
4665 * to prevent an indefinite loop if 'DFS tree' is
4666 * misconfigured (i.e. has loops).
4668 if (count++ > MAX_NESTED_LINKS) {
4674 full_path = build_unc_path_to_root(vol, cifs_sb, true);
4675 if (IS_ERR(full_path)) {
4676 rc = PTR_ERR(full_path);
4681 old_mountdata = cifs_sb->mountdata;
4682 rc = expand_dfs_referral(xid, root_tcon->ses, vol, cifs_sb,
4687 if (cifs_sb->mountdata != old_mountdata) {
4688 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4689 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses,
4693 if (rc == -EACCES || rc == -EOPNOTSUPP)
4695 /* Perform DFS failover to any other DFS targets */
4696 rc = mount_do_dfs_failover(full_path + 1, cifs_sb, vol,
4697 root_tcon->ses, &xid,
4698 &server, &ses, &tcon);
4699 if (rc == -EACCES || rc == -EOPNOTSUPP || !server ||
4704 cifs_put_tcon(root_tcon);
4709 spin_lock(&cifs_tcp_ses_lock);
4710 if (!tcon->dfs_path) {
4711 /* Save full path in new tcon to do failover when reconnecting tcons */
4712 tcon->dfs_path = full_path;
4714 tcon->remap = cifs_remap(cifs_sb);
4716 cifs_sb->origin_fullpath = kstrndup(tcon->dfs_path,
4717 strlen(tcon->dfs_path),
4719 if (!cifs_sb->origin_fullpath) {
4720 spin_unlock(&cifs_tcp_ses_lock);
4724 spin_unlock(&cifs_tcp_ses_lock);
4726 rc = dfs_cache_add_vol(origin_mountdata, vol, cifs_sb->origin_fullpath);
4728 kfree(cifs_sb->origin_fullpath);
4732 * After reconnecting to a different server, unique ids won't
4733 * match anymore, so we disable serverino. This prevents
4734 * dentry revalidation to think the dentry are stale (ESTALE).
4736 cifs_autodisable_serverino(cifs_sb);
4739 return mount_setup_tlink(cifs_sb, ses, tcon);
4744 kfree(origin_mountdata);
4745 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4749 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4753 struct cifs_ses *ses;
4754 struct cifs_tcon *tcon;
4755 struct TCP_Server_Info *server;
4757 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4762 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4771 return mount_setup_tlink(cifs_sb, ses, tcon);
4774 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4780 * Issue a TREE_CONNECT request.
4783 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
4784 const char *tree, struct cifs_tcon *tcon,
4785 const struct nls_table *nls_codepage)
4787 struct smb_hdr *smb_buffer;
4788 struct smb_hdr *smb_buffer_response;
4791 unsigned char *bcc_ptr;
4794 __u16 bytes_left, count;
4799 smb_buffer = cifs_buf_get();
4800 if (smb_buffer == NULL)
4803 smb_buffer_response = smb_buffer;
4805 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
4806 NULL /*no tid */ , 4 /*wct */ );
4808 smb_buffer->Mid = get_next_mid(ses->server);
4809 smb_buffer->Uid = ses->Suid;
4810 pSMB = (TCONX_REQ *) smb_buffer;
4811 pSMBr = (TCONX_RSP *) smb_buffer_response;
4813 pSMB->AndXCommand = 0xFF;
4814 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
4815 bcc_ptr = &pSMB->Password[0];
4816 if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
4817 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
4818 *bcc_ptr = 0; /* password is null byte */
4819 bcc_ptr++; /* skip password */
4820 /* already aligned so no need to do it below */
4822 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
4823 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
4824 specified as required (when that support is added to
4825 the vfs in the future) as only NTLM or the much
4826 weaker LANMAN (which we do not send by default) is accepted
4827 by Samba (not sure whether other servers allow
4828 NTLMv2 password here) */
4829 #ifdef CONFIG_CIFS_WEAK_PW_HASH
4830 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
4831 (ses->sectype == LANMAN))
4832 calc_lanman_hash(tcon->password, ses->server->cryptkey,
4833 ses->server->sec_mode &
4834 SECMODE_PW_ENCRYPT ? true : false,
4837 #endif /* CIFS_WEAK_PW_HASH */
4838 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
4839 bcc_ptr, nls_codepage);
4841 cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
4843 cifs_buf_release(smb_buffer);
4847 bcc_ptr += CIFS_AUTH_RESP_SIZE;
4848 if (ses->capabilities & CAP_UNICODE) {
4849 /* must align unicode strings */
4850 *bcc_ptr = 0; /* null byte password */
4855 if (ses->server->sign)
4856 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
4858 if (ses->capabilities & CAP_STATUS32) {
4859 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
4861 if (ses->capabilities & CAP_DFS) {
4862 smb_buffer->Flags2 |= SMBFLG2_DFS;
4864 if (ses->capabilities & CAP_UNICODE) {
4865 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
4867 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
4868 6 /* max utf8 char length in bytes */ *
4869 (/* server len*/ + 256 /* share len */), nls_codepage);
4870 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
4871 bcc_ptr += 2; /* skip trailing null */
4872 } else { /* ASCII */
4873 strcpy(bcc_ptr, tree);
4874 bcc_ptr += strlen(tree) + 1;
4876 strcpy(bcc_ptr, "?????");
4877 bcc_ptr += strlen("?????");
4879 count = bcc_ptr - &pSMB->Password[0];
4880 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
4881 pSMB->hdr.smb_buf_length) + count);
4882 pSMB->ByteCount = cpu_to_le16(count);
4884 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
4887 /* above now done in SendReceive */
4891 tcon->tidStatus = CifsGood;
4892 tcon->need_reconnect = false;
4893 tcon->tid = smb_buffer_response->Tid;
4894 bcc_ptr = pByteArea(smb_buffer_response);
4895 bytes_left = get_bcc(smb_buffer_response);
4896 length = strnlen(bcc_ptr, bytes_left - 2);
4897 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
4903 /* skip service field (NB: this field is always ASCII) */
4905 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
4906 (bcc_ptr[2] == 'C')) {
4907 cifs_dbg(FYI, "IPC connection\n");
4911 } else if (length == 2) {
4912 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
4913 /* the most common case */
4914 cifs_dbg(FYI, "disk share connection\n");
4917 bcc_ptr += length + 1;
4918 bytes_left -= (length + 1);
4919 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
4921 /* mostly informational -- no need to fail on error here */
4922 kfree(tcon->nativeFileSystem);
4923 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
4924 bytes_left, is_unicode,
4927 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
4929 if ((smb_buffer_response->WordCount == 3) ||
4930 (smb_buffer_response->WordCount == 7))
4931 /* field is in same location */
4932 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
4935 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
4938 cifs_buf_release(smb_buffer);
4942 static void delayed_free(struct rcu_head *p)
4944 struct cifs_sb_info *sbi = container_of(p, struct cifs_sb_info, rcu);
4945 unload_nls(sbi->local_nls);
4950 cifs_umount(struct cifs_sb_info *cifs_sb)
4952 struct rb_root *root = &cifs_sb->tlink_tree;
4953 struct rb_node *node;
4954 struct tcon_link *tlink;
4956 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
4958 spin_lock(&cifs_sb->tlink_tree_lock);
4959 while ((node = rb_first(root))) {
4960 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
4961 cifs_get_tlink(tlink);
4962 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4963 rb_erase(node, root);
4965 spin_unlock(&cifs_sb->tlink_tree_lock);
4966 cifs_put_tlink(tlink);
4967 spin_lock(&cifs_sb->tlink_tree_lock);
4969 spin_unlock(&cifs_sb->tlink_tree_lock);
4971 kfree(cifs_sb->mountdata);
4972 kfree(cifs_sb->prepath);
4973 #ifdef CONFIG_CIFS_DFS_UPCALL
4974 dfs_cache_del_vol(cifs_sb->origin_fullpath);
4975 kfree(cifs_sb->origin_fullpath);
4977 call_rcu(&cifs_sb->rcu, delayed_free);
4981 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
4984 struct TCP_Server_Info *server = ses->server;
4986 if (!server->ops->need_neg || !server->ops->negotiate)
4989 /* only send once per connect */
4990 if (!server->ops->need_neg(server))
4993 rc = server->ops->negotiate(xid, ses);
4995 spin_lock(&GlobalMid_Lock);
4996 if (server->tcpStatus == CifsNeedNegotiate)
4997 server->tcpStatus = CifsGood;
5000 spin_unlock(&GlobalMid_Lock);
5007 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
5008 struct nls_table *nls_info)
5011 struct TCP_Server_Info *server = ses->server;
5013 ses->capabilities = server->capabilities;
5014 if (linuxExtEnabled == 0)
5015 ses->capabilities &= (~server->vals->cap_unix);
5017 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
5018 server->sec_mode, server->capabilities, server->timeAdj);
5020 if (ses->auth_key.response) {
5021 cifs_dbg(FYI, "Free previous auth_key.response = %p\n",
5022 ses->auth_key.response);
5023 kfree(ses->auth_key.response);
5024 ses->auth_key.response = NULL;
5025 ses->auth_key.len = 0;
5028 if (server->ops->sess_setup)
5029 rc = server->ops->sess_setup(xid, ses, nls_info);
5032 cifs_dbg(VFS, "Send error in SessSetup = %d\n", rc);
5038 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
5040 vol->sectype = ses->sectype;
5042 /* krb5 is special, since we don't need username or pw */
5043 if (vol->sectype == Kerberos)
5046 return cifs_set_cifscreds(vol, ses);
5049 static struct cifs_tcon *
5050 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
5053 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
5054 struct cifs_ses *ses;
5055 struct cifs_tcon *tcon = NULL;
5056 struct smb_vol *vol_info;
5058 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
5059 if (vol_info == NULL)
5060 return ERR_PTR(-ENOMEM);
5062 vol_info->local_nls = cifs_sb->local_nls;
5063 vol_info->linux_uid = fsuid;
5064 vol_info->cred_uid = fsuid;
5065 vol_info->UNC = master_tcon->treeName;
5066 vol_info->retry = master_tcon->retry;
5067 vol_info->nocase = master_tcon->nocase;
5068 vol_info->nohandlecache = master_tcon->nohandlecache;
5069 vol_info->local_lease = master_tcon->local_lease;
5070 vol_info->no_linux_ext = !master_tcon->unix_ext;
5071 vol_info->sectype = master_tcon->ses->sectype;
5072 vol_info->sign = master_tcon->ses->sign;
5074 rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
5080 /* get a reference for the same TCP session */
5081 spin_lock(&cifs_tcp_ses_lock);
5082 ++master_tcon->ses->server->srv_count;
5083 spin_unlock(&cifs_tcp_ses_lock);
5085 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
5087 tcon = (struct cifs_tcon *)ses;
5088 cifs_put_tcp_session(master_tcon->ses->server, 0);
5092 tcon = cifs_get_tcon(ses, vol_info);
5094 cifs_put_smb_ses(ses);
5098 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
5099 if (tcon->posix_extensions)
5100 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
5103 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
5106 kfree(vol_info->username);
5107 kzfree(vol_info->password);
5114 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
5116 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
5119 /* find and return a tlink with given uid */
5120 static struct tcon_link *
5121 tlink_rb_search(struct rb_root *root, kuid_t uid)
5123 struct rb_node *node = root->rb_node;
5124 struct tcon_link *tlink;
5127 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
5129 if (uid_gt(tlink->tl_uid, uid))
5130 node = node->rb_left;
5131 else if (uid_lt(tlink->tl_uid, uid))
5132 node = node->rb_right;
5139 /* insert a tcon_link into the tree */
5141 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
5143 struct rb_node **new = &(root->rb_node), *parent = NULL;
5144 struct tcon_link *tlink;
5147 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
5150 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
5151 new = &((*new)->rb_left);
5153 new = &((*new)->rb_right);
5156 rb_link_node(&new_tlink->tl_rbnode, parent, new);
5157 rb_insert_color(&new_tlink->tl_rbnode, root);
5161 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
5164 * If the superblock doesn't refer to a multiuser mount, then just return
5165 * the master tcon for the mount.
5167 * First, search the rbtree for an existing tcon for this fsuid. If one
5168 * exists, then check to see if it's pending construction. If it is then wait
5169 * for construction to complete. Once it's no longer pending, check to see if
5170 * it failed and either return an error or retry construction, depending on
5173 * If one doesn't exist then insert a new tcon_link struct into the tree and
5174 * try to construct a new one.
5177 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
5180 kuid_t fsuid = current_fsuid();
5181 struct tcon_link *tlink, *newtlink;
5183 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
5184 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
5186 spin_lock(&cifs_sb->tlink_tree_lock);
5187 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5189 cifs_get_tlink(tlink);
5190 spin_unlock(&cifs_sb->tlink_tree_lock);
5192 if (tlink == NULL) {
5193 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
5194 if (newtlink == NULL)
5195 return ERR_PTR(-ENOMEM);
5196 newtlink->tl_uid = fsuid;
5197 newtlink->tl_tcon = ERR_PTR(-EACCES);
5198 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
5199 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
5200 cifs_get_tlink(newtlink);
5202 spin_lock(&cifs_sb->tlink_tree_lock);
5203 /* was one inserted after previous search? */
5204 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5206 cifs_get_tlink(tlink);
5207 spin_unlock(&cifs_sb->tlink_tree_lock);
5209 goto wait_for_construction;
5212 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
5213 spin_unlock(&cifs_sb->tlink_tree_lock);
5215 wait_for_construction:
5216 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
5217 TASK_INTERRUPTIBLE);
5219 cifs_put_tlink(tlink);
5220 return ERR_PTR(-ERESTARTSYS);
5223 /* if it's good, return it */
5224 if (!IS_ERR(tlink->tl_tcon))
5227 /* return error if we tried this already recently */
5228 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
5229 cifs_put_tlink(tlink);
5230 return ERR_PTR(-EACCES);
5233 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
5234 goto wait_for_construction;
5237 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
5238 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
5239 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
5241 if (IS_ERR(tlink->tl_tcon)) {
5242 cifs_put_tlink(tlink);
5243 return ERR_PTR(-EACCES);
5250 * periodic workqueue job that scans tcon_tree for a superblock and closes
5254 cifs_prune_tlinks(struct work_struct *work)
5256 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
5258 struct rb_root *root = &cifs_sb->tlink_tree;
5259 struct rb_node *node;
5260 struct rb_node *tmp;
5261 struct tcon_link *tlink;
5264 * Because we drop the spinlock in the loop in order to put the tlink
5265 * it's not guarded against removal of links from the tree. The only
5266 * places that remove entries from the tree are this function and
5267 * umounts. Because this function is non-reentrant and is canceled
5268 * before umount can proceed, this is safe.
5270 spin_lock(&cifs_sb->tlink_tree_lock);
5271 node = rb_first(root);
5272 while (node != NULL) {
5274 node = rb_next(tmp);
5275 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
5277 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
5278 atomic_read(&tlink->tl_count) != 0 ||
5279 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
5282 cifs_get_tlink(tlink);
5283 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
5284 rb_erase(tmp, root);
5286 spin_unlock(&cifs_sb->tlink_tree_lock);
5287 cifs_put_tlink(tlink);
5288 spin_lock(&cifs_sb->tlink_tree_lock);
5290 spin_unlock(&cifs_sb->tlink_tree_lock);
5292 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,