4 * Copyright (C) International Business Machines Corp., 2002,2011
5 * Author(s): Steve French (sfrench@us.ibm.com)
7 * This library is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser General Public License as published
9 * by the Free Software Foundation; either version 2.1 of the License, or
10 * (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
15 * the GNU Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include <linux/net.h>
23 #include <linux/string.h>
24 #include <linux/sched/mm.h>
25 #include <linux/sched/signal.h>
26 #include <linux/list.h>
27 #include <linux/wait.h>
28 #include <linux/slab.h>
29 #include <linux/pagemap.h>
30 #include <linux/ctype.h>
31 #include <linux/utsname.h>
32 #include <linux/mempool.h>
33 #include <linux/delay.h>
34 #include <linux/completion.h>
35 #include <linux/kthread.h>
36 #include <linux/pagevec.h>
37 #include <linux/freezer.h>
38 #include <linux/namei.h>
39 #include <linux/uuid.h>
40 #include <linux/uaccess.h>
41 #include <asm/processor.h>
42 #include <linux/inet.h>
43 #include <linux/module.h>
44 #include <keys/user-type.h>
46 #include <linux/parser.h>
47 #include <linux/bvec.h>
50 #include "cifsproto.h"
51 #include "cifs_unicode.h"
52 #include "cifs_debug.h"
53 #include "cifs_fs_sb.h"
56 #include "rfc1002pdu.h"
58 #include "smb2proto.h"
59 #include "smbdirect.h"
60 #include "dns_resolve.h"
61 #ifdef CONFIG_CIFS_DFS_UPCALL
62 #include "dfs_cache.h"
65 extern mempool_t *cifs_req_poolp;
66 extern bool disable_legacy_dialects;
68 /* FIXME: should these be tunable? */
69 #define TLINK_ERROR_EXPIRE (1 * HZ)
70 #define TLINK_IDLE_EXPIRE (600 * HZ)
73 /* Mount options that take no arguments */
74 Opt_user_xattr, Opt_nouser_xattr,
75 Opt_forceuid, Opt_noforceuid,
76 Opt_forcegid, Opt_noforcegid,
77 Opt_noblocksend, Opt_noautotune, Opt_nolease,
78 Opt_hard, Opt_soft, Opt_perm, Opt_noperm,
79 Opt_mapposix, Opt_nomapposix,
80 Opt_mapchars, Opt_nomapchars, Opt_sfu,
81 Opt_nosfu, Opt_nodfs, Opt_posixpaths,
82 Opt_noposixpaths, Opt_nounix, Opt_unix,
85 Opt_handlecache, Opt_nohandlecache,
86 Opt_forcemandatorylock, Opt_setuidfromacl, Opt_setuids,
87 Opt_nosetuids, Opt_dynperm, Opt_nodynperm,
88 Opt_nohard, Opt_nosoft,
90 Opt_nostrictsync, Opt_strictsync,
91 Opt_serverino, Opt_noserverino,
92 Opt_rwpidforward, Opt_cifsacl, Opt_nocifsacl,
93 Opt_acl, Opt_noacl, Opt_locallease,
94 Opt_sign, Opt_ignore_signature, Opt_seal, Opt_noac,
95 Opt_fsc, Opt_mfsymlinks,
96 Opt_multiuser, Opt_sloppy, Opt_nosharesock,
97 Opt_persistent, Opt_nopersistent,
98 Opt_resilient, Opt_noresilient,
99 Opt_domainauto, Opt_rdma, Opt_modesid, Opt_rootfs,
100 Opt_multichannel, Opt_nomultichannel,
103 /* Mount options which take numeric value */
104 Opt_backupuid, Opt_backupgid, Opt_uid,
105 Opt_cruid, Opt_gid, Opt_file_mode,
106 Opt_dirmode, Opt_port,
108 Opt_blocksize, Opt_rsize, Opt_wsize, Opt_actimeo,
109 Opt_echo_interval, Opt_max_credits, Opt_handletimeout,
110 Opt_snapshot, Opt_max_channels,
112 /* Mount options which take string value */
113 Opt_user, Opt_pass, Opt_ip,
114 Opt_domain, Opt_srcaddr, Opt_iocharset,
115 Opt_netbiosname, Opt_servern,
116 Opt_ver, Opt_vers, Opt_sec, Opt_cache,
118 /* Mount options to be ignored */
121 /* Options which could be blank */
129 static const match_table_t cifs_mount_option_tokens = {
131 { Opt_user_xattr, "user_xattr" },
132 { Opt_nouser_xattr, "nouser_xattr" },
133 { Opt_forceuid, "forceuid" },
134 { Opt_noforceuid, "noforceuid" },
135 { Opt_forcegid, "forcegid" },
136 { Opt_noforcegid, "noforcegid" },
137 { Opt_noblocksend, "noblocksend" },
138 { Opt_noautotune, "noautotune" },
139 { Opt_nolease, "nolease" },
140 { Opt_hard, "hard" },
141 { Opt_soft, "soft" },
142 { Opt_perm, "perm" },
143 { Opt_noperm, "noperm" },
144 { Opt_mapchars, "mapchars" }, /* SFU style */
145 { Opt_nomapchars, "nomapchars" },
146 { Opt_mapposix, "mapposix" }, /* SFM style */
147 { Opt_nomapposix, "nomapposix" },
149 { Opt_nosfu, "nosfu" },
150 { Opt_nodfs, "nodfs" },
151 { Opt_posixpaths, "posixpaths" },
152 { Opt_noposixpaths, "noposixpaths" },
153 { Opt_nounix, "nounix" },
154 { Opt_nounix, "nolinux" },
155 { Opt_nounix, "noposix" },
156 { Opt_unix, "unix" },
157 { Opt_unix, "linux" },
158 { Opt_unix, "posix" },
159 { Opt_nocase, "nocase" },
160 { Opt_nocase, "ignorecase" },
162 { Opt_nobrl, "nobrl" },
163 { Opt_handlecache, "handlecache" },
164 { Opt_nohandlecache, "nohandlecache" },
165 { Opt_nobrl, "nolock" },
166 { Opt_forcemandatorylock, "forcemandatorylock" },
167 { Opt_forcemandatorylock, "forcemand" },
168 { Opt_setuids, "setuids" },
169 { Opt_nosetuids, "nosetuids" },
170 { Opt_setuidfromacl, "idsfromsid" },
171 { Opt_dynperm, "dynperm" },
172 { Opt_nodynperm, "nodynperm" },
173 { Opt_nohard, "nohard" },
174 { Opt_nosoft, "nosoft" },
175 { Opt_nointr, "nointr" },
176 { Opt_intr, "intr" },
177 { Opt_nostrictsync, "nostrictsync" },
178 { Opt_strictsync, "strictsync" },
179 { Opt_serverino, "serverino" },
180 { Opt_noserverino, "noserverino" },
181 { Opt_rwpidforward, "rwpidforward" },
182 { Opt_modesid, "modefromsid" },
183 { Opt_cifsacl, "cifsacl" },
184 { Opt_nocifsacl, "nocifsacl" },
186 { Opt_noacl, "noacl" },
187 { Opt_locallease, "locallease" },
188 { Opt_sign, "sign" },
189 { Opt_ignore_signature, "signloosely" },
190 { Opt_seal, "seal" },
191 { Opt_noac, "noac" },
193 { Opt_mfsymlinks, "mfsymlinks" },
194 { Opt_multiuser, "multiuser" },
195 { Opt_sloppy, "sloppy" },
196 { Opt_nosharesock, "nosharesock" },
197 { Opt_persistent, "persistenthandles"},
198 { Opt_nopersistent, "nopersistenthandles"},
199 { Opt_resilient, "resilienthandles"},
200 { Opt_noresilient, "noresilienthandles"},
201 { Opt_domainauto, "domainauto"},
203 { Opt_multichannel, "multichannel" },
204 { Opt_nomultichannel, "nomultichannel" },
206 { Opt_backupuid, "backupuid=%s" },
207 { Opt_backupgid, "backupgid=%s" },
208 { Opt_uid, "uid=%s" },
209 { Opt_cruid, "cruid=%s" },
210 { Opt_gid, "gid=%s" },
211 { Opt_file_mode, "file_mode=%s" },
212 { Opt_dirmode, "dirmode=%s" },
213 { Opt_dirmode, "dir_mode=%s" },
214 { Opt_port, "port=%s" },
215 { Opt_min_enc_offload, "esize=%s" },
216 { Opt_blocksize, "bsize=%s" },
217 { Opt_rsize, "rsize=%s" },
218 { Opt_wsize, "wsize=%s" },
219 { Opt_actimeo, "actimeo=%s" },
220 { Opt_handletimeout, "handletimeout=%s" },
221 { Opt_echo_interval, "echo_interval=%s" },
222 { Opt_max_credits, "max_credits=%s" },
223 { Opt_snapshot, "snapshot=%s" },
224 { Opt_max_channels, "max_channels=%s" },
225 { Opt_compress, "compress=%s" },
227 { Opt_blank_user, "user=" },
228 { Opt_blank_user, "username=" },
229 { Opt_user, "user=%s" },
230 { Opt_user, "username=%s" },
231 { Opt_blank_pass, "pass=" },
232 { Opt_blank_pass, "password=" },
233 { Opt_pass, "pass=%s" },
234 { Opt_pass, "password=%s" },
235 { Opt_blank_ip, "ip=" },
236 { Opt_blank_ip, "addr=" },
238 { Opt_ip, "addr=%s" },
239 { Opt_ignore, "unc=%s" },
240 { Opt_ignore, "target=%s" },
241 { Opt_ignore, "path=%s" },
242 { Opt_domain, "dom=%s" },
243 { Opt_domain, "domain=%s" },
244 { Opt_domain, "workgroup=%s" },
245 { Opt_srcaddr, "srcaddr=%s" },
246 { Opt_ignore, "prefixpath=%s" },
247 { Opt_iocharset, "iocharset=%s" },
248 { Opt_netbiosname, "netbiosname=%s" },
249 { Opt_servern, "servern=%s" },
250 { Opt_ver, "ver=%s" },
251 { Opt_vers, "vers=%s" },
252 { Opt_sec, "sec=%s" },
253 { Opt_cache, "cache=%s" },
255 { Opt_ignore, "cred" },
256 { Opt_ignore, "credentials" },
257 { Opt_ignore, "cred=%s" },
258 { Opt_ignore, "credentials=%s" },
259 { Opt_ignore, "guest" },
260 { Opt_ignore, "rw" },
261 { Opt_ignore, "ro" },
262 { Opt_ignore, "suid" },
263 { Opt_ignore, "nosuid" },
264 { Opt_ignore, "exec" },
265 { Opt_ignore, "noexec" },
266 { Opt_ignore, "nodev" },
267 { Opt_ignore, "noauto" },
268 { Opt_ignore, "dev" },
269 { Opt_ignore, "mand" },
270 { Opt_ignore, "nomand" },
271 { Opt_ignore, "relatime" },
272 { Opt_ignore, "_netdev" },
273 { Opt_rootfs, "rootfs" },
279 Opt_sec_krb5, Opt_sec_krb5i, Opt_sec_krb5p,
280 Opt_sec_ntlmsspi, Opt_sec_ntlmssp,
281 Opt_ntlm, Opt_sec_ntlmi, Opt_sec_ntlmv2,
282 Opt_sec_ntlmv2i, Opt_sec_lanman,
288 static const match_table_t cifs_secflavor_tokens = {
289 { Opt_sec_krb5, "krb5" },
290 { Opt_sec_krb5i, "krb5i" },
291 { Opt_sec_krb5p, "krb5p" },
292 { Opt_sec_ntlmsspi, "ntlmsspi" },
293 { Opt_sec_ntlmssp, "ntlmssp" },
294 { Opt_ntlm, "ntlm" },
295 { Opt_sec_ntlmi, "ntlmi" },
296 { Opt_sec_ntlmv2, "nontlm" },
297 { Opt_sec_ntlmv2, "ntlmv2" },
298 { Opt_sec_ntlmv2i, "ntlmv2i" },
299 { Opt_sec_lanman, "lanman" },
300 { Opt_sec_none, "none" },
302 { Opt_sec_err, NULL }
315 static const match_table_t cifs_cacheflavor_tokens = {
316 { Opt_cache_loose, "loose" },
317 { Opt_cache_strict, "strict" },
318 { Opt_cache_none, "none" },
319 { Opt_cache_ro, "ro" },
320 { Opt_cache_rw, "singleclient" },
321 { Opt_cache_err, NULL }
324 static const match_table_t cifs_smb_version_tokens = {
325 { Smb_1, SMB1_VERSION_STRING },
326 { Smb_20, SMB20_VERSION_STRING},
327 { Smb_21, SMB21_VERSION_STRING },
328 { Smb_30, SMB30_VERSION_STRING },
329 { Smb_302, SMB302_VERSION_STRING },
330 { Smb_302, ALT_SMB302_VERSION_STRING },
331 { Smb_311, SMB311_VERSION_STRING },
332 { Smb_311, ALT_SMB311_VERSION_STRING },
333 { Smb_3any, SMB3ANY_VERSION_STRING },
334 { Smb_default, SMBDEFAULT_VERSION_STRING },
335 { Smb_version_err, NULL }
338 static int ip_connect(struct TCP_Server_Info *server);
339 static int generic_ip_connect(struct TCP_Server_Info *server);
340 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
341 static void cifs_prune_tlinks(struct work_struct *work);
342 static char *extract_hostname(const char *unc);
345 * Resolve hostname and set ip addr in tcp ses. Useful for hostnames that may
346 * get their ip addresses changed at some point.
348 * This should be called with server->srv_mutex held.
350 #ifdef CONFIG_CIFS_DFS_UPCALL
351 static int reconn_set_ipaddr(struct TCP_Server_Info *server)
355 char *unc, *ipaddr = NULL;
357 if (!server->hostname)
360 len = strlen(server->hostname) + 3;
362 unc = kmalloc(len, GFP_KERNEL);
364 cifs_dbg(FYI, "%s: failed to create UNC path\n", __func__);
367 scnprintf(unc, len, "\\\\%s", server->hostname);
369 rc = dns_resolve_server_name_to_ip(unc, &ipaddr);
373 cifs_dbg(FYI, "%s: failed to resolve server part of %s to IP: %d\n",
374 __func__, server->hostname, rc);
378 spin_lock(&cifs_tcp_ses_lock);
379 rc = cifs_convert_address((struct sockaddr *)&server->dstaddr, ipaddr,
381 spin_unlock(&cifs_tcp_ses_lock);
387 static inline int reconn_set_ipaddr(struct TCP_Server_Info *server)
393 #ifdef CONFIG_CIFS_DFS_UPCALL
394 /* These functions must be called with server->srv_mutex held */
395 static void reconn_inval_dfs_target(struct TCP_Server_Info *server,
396 struct cifs_sb_info *cifs_sb,
397 struct dfs_cache_tgt_list *tgt_list,
398 struct dfs_cache_tgt_iterator **tgt_it)
402 if (!cifs_sb || !cifs_sb->origin_fullpath || !tgt_list ||
407 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
409 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
411 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
414 cifs_dbg(FYI, "%s: UNC: %s\n", __func__, cifs_sb->origin_fullpath);
416 name = dfs_cache_get_tgt_name(*tgt_it);
418 kfree(server->hostname);
420 server->hostname = extract_hostname(name);
421 if (IS_ERR(server->hostname)) {
423 "%s: failed to extract hostname from target: %ld\n",
424 __func__, PTR_ERR(server->hostname));
428 static inline int reconn_setup_dfs_targets(struct cifs_sb_info *cifs_sb,
429 struct dfs_cache_tgt_list *tl,
430 struct dfs_cache_tgt_iterator **it)
432 if (!cifs_sb->origin_fullpath)
434 return dfs_cache_noreq_find(cifs_sb->origin_fullpath + 1, NULL, tl);
439 * cifs tcp session reconnection
441 * mark tcp session as reconnecting so temporarily locked
442 * mark all smb sessions as reconnecting for tcp session
443 * reconnect tcp session
444 * wake up waiters on reconnection? - (not needed currently)
447 cifs_reconnect(struct TCP_Server_Info *server)
450 struct list_head *tmp, *tmp2;
451 struct cifs_ses *ses;
452 struct cifs_tcon *tcon;
453 struct mid_q_entry *mid_entry;
454 struct list_head retry_list;
455 #ifdef CONFIG_CIFS_DFS_UPCALL
456 struct super_block *sb = NULL;
457 struct cifs_sb_info *cifs_sb = NULL;
458 struct dfs_cache_tgt_list tgt_list = {0};
459 struct dfs_cache_tgt_iterator *tgt_it = NULL;
462 spin_lock(&GlobalMid_Lock);
463 server->nr_targets = 1;
464 #ifdef CONFIG_CIFS_DFS_UPCALL
465 spin_unlock(&GlobalMid_Lock);
466 sb = cifs_get_tcp_super(server);
469 cifs_dbg(FYI, "%s: will not do DFS failover: rc = %d\n",
473 cifs_sb = CIFS_SB(sb);
475 rc = reconn_setup_dfs_targets(cifs_sb, &tgt_list, &tgt_it);
476 if (rc && (rc != -EOPNOTSUPP)) {
477 cifs_server_dbg(VFS, "%s: no target servers for DFS failover\n",
480 server->nr_targets = dfs_cache_get_nr_tgts(&tgt_list);
483 cifs_dbg(FYI, "%s: will retry %d target(s)\n", __func__,
485 spin_lock(&GlobalMid_Lock);
487 if (server->tcpStatus == CifsExiting) {
488 /* the demux thread will exit normally
489 next time through the loop */
490 spin_unlock(&GlobalMid_Lock);
491 #ifdef CONFIG_CIFS_DFS_UPCALL
492 dfs_cache_free_tgts(&tgt_list);
493 cifs_put_tcp_super(sb);
495 wake_up(&server->response_q);
498 server->tcpStatus = CifsNeedReconnect;
499 spin_unlock(&GlobalMid_Lock);
501 server->max_read = 0;
503 cifs_dbg(FYI, "Mark tcp session as need reconnect\n");
504 trace_smb3_reconnect(server->CurrentMid, server->hostname);
506 /* before reconnecting the tcp session, mark the smb session (uid)
507 and the tid bad so they are not used until reconnected */
508 cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
510 spin_lock(&cifs_tcp_ses_lock);
511 list_for_each(tmp, &server->smb_ses_list) {
512 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
513 ses->need_reconnect = true;
514 list_for_each(tmp2, &ses->tcon_list) {
515 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
516 tcon->need_reconnect = true;
519 ses->tcon_ipc->need_reconnect = true;
521 spin_unlock(&cifs_tcp_ses_lock);
523 /* do not want to be sending data on a socket we are freeing */
524 cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
525 mutex_lock(&server->srv_mutex);
526 if (server->ssocket) {
527 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
528 server->ssocket->state, server->ssocket->flags);
529 kernel_sock_shutdown(server->ssocket, SHUT_WR);
530 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
531 server->ssocket->state, server->ssocket->flags);
532 sock_release(server->ssocket);
533 server->ssocket = NULL;
535 server->sequence_number = 0;
536 server->session_estab = false;
537 kfree(server->session_key.response);
538 server->session_key.response = NULL;
539 server->session_key.len = 0;
540 server->lstrp = jiffies;
542 /* mark submitted MIDs for retry and issue callback */
543 INIT_LIST_HEAD(&retry_list);
544 cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
545 spin_lock(&GlobalMid_Lock);
546 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
547 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
548 kref_get(&mid_entry->refcount);
549 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
550 mid_entry->mid_state = MID_RETRY_NEEDED;
551 list_move(&mid_entry->qhead, &retry_list);
552 mid_entry->mid_flags |= MID_DELETED;
554 spin_unlock(&GlobalMid_Lock);
555 mutex_unlock(&server->srv_mutex);
557 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
558 list_for_each_safe(tmp, tmp2, &retry_list) {
559 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
560 list_del_init(&mid_entry->qhead);
561 mid_entry->callback(mid_entry);
562 cifs_mid_q_entry_release(mid_entry);
565 if (cifs_rdma_enabled(server)) {
566 mutex_lock(&server->srv_mutex);
567 smbd_destroy(server);
568 mutex_unlock(&server->srv_mutex);
574 mutex_lock(&server->srv_mutex);
575 #ifdef CONFIG_CIFS_DFS_UPCALL
577 * Set up next DFS target server (if any) for reconnect. If DFS
578 * feature is disabled, then we will retry last server we
579 * connected to before.
581 reconn_inval_dfs_target(server, cifs_sb, &tgt_list, &tgt_it);
583 rc = reconn_set_ipaddr(server);
585 cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
589 if (cifs_rdma_enabled(server))
590 rc = smbd_reconnect(server);
592 rc = generic_ip_connect(server);
594 cifs_dbg(FYI, "reconnect error %d\n", rc);
595 mutex_unlock(&server->srv_mutex);
598 atomic_inc(&tcpSesReconnectCount);
599 set_credits(server, 1);
600 spin_lock(&GlobalMid_Lock);
601 if (server->tcpStatus != CifsExiting)
602 server->tcpStatus = CifsNeedNegotiate;
603 spin_unlock(&GlobalMid_Lock);
604 mutex_unlock(&server->srv_mutex);
606 } while (server->tcpStatus == CifsNeedReconnect);
608 #ifdef CONFIG_CIFS_DFS_UPCALL
610 rc = dfs_cache_noreq_update_tgthint(cifs_sb->origin_fullpath + 1,
613 cifs_server_dbg(VFS, "%s: failed to update DFS target hint: rc = %d\n",
616 rc = dfs_cache_update_vol(cifs_sb->origin_fullpath, server);
618 cifs_server_dbg(VFS, "%s: failed to update vol info in DFS cache: rc = %d\n",
621 dfs_cache_free_tgts(&tgt_list);
625 cifs_put_tcp_super(sb);
627 if (server->tcpStatus == CifsNeedNegotiate)
628 mod_delayed_work(cifsiod_wq, &server->echo, 0);
630 wake_up(&server->response_q);
635 cifs_echo_request(struct work_struct *work)
638 struct TCP_Server_Info *server = container_of(work,
639 struct TCP_Server_Info, echo.work);
640 unsigned long echo_interval;
643 * If we need to renegotiate, set echo interval to zero to
644 * immediately call echo service where we can renegotiate.
646 if (server->tcpStatus == CifsNeedNegotiate)
649 echo_interval = server->echo_interval;
652 * We cannot send an echo if it is disabled.
653 * Also, no need to ping if we got a response recently.
656 if (server->tcpStatus == CifsNeedReconnect ||
657 server->tcpStatus == CifsExiting ||
658 server->tcpStatus == CifsNew ||
659 (server->ops->can_echo && !server->ops->can_echo(server)) ||
660 time_before(jiffies, server->lstrp + echo_interval - HZ))
663 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
665 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
669 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
673 allocate_buffers(struct TCP_Server_Info *server)
675 if (!server->bigbuf) {
676 server->bigbuf = (char *)cifs_buf_get();
677 if (!server->bigbuf) {
678 cifs_server_dbg(VFS, "No memory for large SMB response\n");
680 /* retry will check if exiting */
683 } else if (server->large_buf) {
684 /* we are reusing a dirty large buf, clear its start */
685 memset(server->bigbuf, 0, HEADER_SIZE(server));
688 if (!server->smallbuf) {
689 server->smallbuf = (char *)cifs_small_buf_get();
690 if (!server->smallbuf) {
691 cifs_server_dbg(VFS, "No memory for SMB response\n");
693 /* retry will check if exiting */
696 /* beginning of smb buffer is cleared in our buf_get */
698 /* if existing small buf clear beginning */
699 memset(server->smallbuf, 0, HEADER_SIZE(server));
706 server_unresponsive(struct TCP_Server_Info *server)
709 * We need to wait 3 echo intervals to make sure we handle such
711 * 1s client sends a normal SMB request
712 * 2s client gets a response
713 * 30s echo workqueue job pops, and decides we got a response recently
714 * and don't need to send another
716 * 65s kernel_recvmsg times out, and we see that we haven't gotten
717 * a response in >60s.
719 if ((server->tcpStatus == CifsGood ||
720 server->tcpStatus == CifsNeedNegotiate) &&
721 time_after(jiffies, server->lstrp + 3 * server->echo_interval)) {
722 cifs_server_dbg(VFS, "has not responded in %lu seconds. Reconnecting...\n",
723 (3 * server->echo_interval) / HZ);
724 cifs_reconnect(server);
732 zero_credits(struct TCP_Server_Info *server)
736 spin_lock(&server->req_lock);
737 val = server->credits + server->echo_credits + server->oplock_credits;
738 if (server->in_flight == 0 && val == 0) {
739 spin_unlock(&server->req_lock);
742 spin_unlock(&server->req_lock);
747 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
752 smb_msg->msg_control = NULL;
753 smb_msg->msg_controllen = 0;
755 for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
758 /* reconnect if no credits and no requests in flight */
759 if (zero_credits(server)) {
760 cifs_reconnect(server);
761 return -ECONNABORTED;
764 if (server_unresponsive(server))
765 return -ECONNABORTED;
766 if (cifs_rdma_enabled(server) && server->smbd_conn)
767 length = smbd_recv(server->smbd_conn, smb_msg);
769 length = sock_recvmsg(server->ssocket, smb_msg, 0);
771 if (server->tcpStatus == CifsExiting)
774 if (server->tcpStatus == CifsNeedReconnect) {
775 cifs_reconnect(server);
776 return -ECONNABORTED;
779 if (length == -ERESTARTSYS ||
783 * Minimum sleep to prevent looping, allowing socket
784 * to clear and app threads to set tcpStatus
785 * CifsNeedReconnect if server hung.
787 usleep_range(1000, 2000);
793 cifs_dbg(FYI, "Received no data or error: %d\n", length);
794 cifs_reconnect(server);
795 return -ECONNABORTED;
802 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
803 unsigned int to_read)
805 struct msghdr smb_msg;
806 struct kvec iov = {.iov_base = buf, .iov_len = to_read};
807 iov_iter_kvec(&smb_msg.msg_iter, READ, &iov, 1, to_read);
809 return cifs_readv_from_socket(server, &smb_msg);
813 cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
814 unsigned int page_offset, unsigned int to_read)
816 struct msghdr smb_msg;
817 struct bio_vec bv = {
818 .bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
819 iov_iter_bvec(&smb_msg.msg_iter, READ, &bv, 1, to_read);
820 return cifs_readv_from_socket(server, &smb_msg);
824 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
827 * The first byte big endian of the length field,
828 * is actually not part of the length but the type
829 * with the most common, zero, as regular data.
832 case RFC1002_SESSION_MESSAGE:
833 /* Regular SMB response */
835 case RFC1002_SESSION_KEEP_ALIVE:
836 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
838 case RFC1002_POSITIVE_SESSION_RESPONSE:
839 cifs_dbg(FYI, "RFC 1002 positive session response\n");
841 case RFC1002_NEGATIVE_SESSION_RESPONSE:
843 * We get this from Windows 98 instead of an error on
844 * SMB negprot response.
846 cifs_dbg(FYI, "RFC 1002 negative session response\n");
847 /* give server a second to clean up */
850 * Always try 445 first on reconnect since we get NACK
851 * on some if we ever connected to port 139 (the NACK
852 * is since we do not begin with RFC1001 session
855 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
856 cifs_reconnect(server);
859 cifs_server_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 mid->mid_flags |= MID_DELETED;
888 spin_unlock(&GlobalMid_Lock);
892 smb2_get_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
894 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
897 * SMB1 does not use credits.
899 if (server->vals->header_preamble_size)
902 return le16_to_cpu(shdr->CreditRequest);
906 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
907 char *buf, int malformed)
909 if (server->ops->check_trans2 &&
910 server->ops->check_trans2(mid, server, buf, malformed))
912 mid->credits_received = smb2_get_credits_from_hdr(buf, server);
914 mid->large_buf = server->large_buf;
915 /* Was previous buf put in mpx struct for multi-rsp? */
916 if (!mid->multiRsp) {
917 /* smb buffer will be freed by user thread */
918 if (server->large_buf)
919 server->bigbuf = NULL;
921 server->smallbuf = NULL;
923 dequeue_mid(mid, malformed);
926 static void clean_demultiplex_info(struct TCP_Server_Info *server)
930 /* take it off the list, if it's not already */
931 spin_lock(&cifs_tcp_ses_lock);
932 list_del_init(&server->tcp_ses_list);
933 spin_unlock(&cifs_tcp_ses_lock);
935 spin_lock(&GlobalMid_Lock);
936 server->tcpStatus = CifsExiting;
937 spin_unlock(&GlobalMid_Lock);
938 wake_up_all(&server->response_q);
940 /* check if we have blocked requests that need to free */
941 spin_lock(&server->req_lock);
942 if (server->credits <= 0)
944 spin_unlock(&server->req_lock);
946 * Although there should not be any requests blocked on this queue it
947 * can not hurt to be paranoid and try to wake up requests that may
948 * haven been blocked when more than 50 at time were on the wire to the
949 * same server - they now will see the session is in exit state and get
950 * out of SendReceive.
952 wake_up_all(&server->request_q);
953 /* give those requests time to exit */
955 if (cifs_rdma_enabled(server))
956 smbd_destroy(server);
957 if (server->ssocket) {
958 sock_release(server->ssocket);
959 server->ssocket = NULL;
962 if (!list_empty(&server->pending_mid_q)) {
963 struct list_head dispose_list;
964 struct mid_q_entry *mid_entry;
965 struct list_head *tmp, *tmp2;
967 INIT_LIST_HEAD(&dispose_list);
968 spin_lock(&GlobalMid_Lock);
969 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
970 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
971 cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
972 kref_get(&mid_entry->refcount);
973 mid_entry->mid_state = MID_SHUTDOWN;
974 list_move(&mid_entry->qhead, &dispose_list);
975 mid_entry->mid_flags |= MID_DELETED;
977 spin_unlock(&GlobalMid_Lock);
979 /* now walk dispose list and issue callbacks */
980 list_for_each_safe(tmp, tmp2, &dispose_list) {
981 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
982 cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
983 list_del_init(&mid_entry->qhead);
984 mid_entry->callback(mid_entry);
985 cifs_mid_q_entry_release(mid_entry);
987 /* 1/8th of sec is more than enough time for them to exit */
991 if (!list_empty(&server->pending_mid_q)) {
993 * mpx threads have not exited yet give them at least the smb
994 * send timeout time for long ops.
996 * Due to delays on oplock break requests, we need to wait at
997 * least 45 seconds before giving up on a request getting a
998 * response and going ahead and killing cifsd.
1000 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
1003 * If threads still have not exited they are probably never
1004 * coming home not much else we can do but free the memory.
1008 kfree(server->hostname);
1011 length = atomic_dec_return(&tcpSesAllocCount);
1013 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
1017 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1020 char *buf = server->smallbuf;
1021 unsigned int pdu_length = server->pdu_size;
1023 /* make sure this will fit in a large buffer */
1024 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
1025 server->vals->header_preamble_size) {
1026 cifs_server_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
1027 cifs_reconnect(server);
1028 return -ECONNABORTED;
1031 /* switch to large buffer if too big for a small one */
1032 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
1033 server->large_buf = true;
1034 memcpy(server->bigbuf, buf, server->total_read);
1035 buf = server->bigbuf;
1038 /* now read the rest */
1039 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
1040 pdu_length - HEADER_SIZE(server) + 1
1041 + server->vals->header_preamble_size);
1045 server->total_read += length;
1047 dump_smb(buf, server->total_read);
1049 return cifs_handle_standard(server, mid);
1053 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1055 char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
1059 * We know that we received enough to get to the MID as we
1060 * checked the pdu_length earlier. Now check to see
1061 * if the rest of the header is OK. We borrow the length
1062 * var for the rest of the loop to avoid a new stack var.
1064 * 48 bytes is enough to display the header and a little bit
1065 * into the payload for debugging purposes.
1067 length = server->ops->check_message(buf, server->total_read, server);
1069 cifs_dump_mem("Bad SMB: ", buf,
1070 min_t(unsigned int, server->total_read, 48));
1072 if (server->ops->is_session_expired &&
1073 server->ops->is_session_expired(buf)) {
1074 cifs_reconnect(server);
1078 if (server->ops->is_status_pending &&
1079 server->ops->is_status_pending(buf, server))
1085 handle_mid(mid, server, buf, length);
1090 smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
1092 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
1095 * SMB1 does not use credits.
1097 if (server->vals->header_preamble_size)
1100 if (shdr->CreditRequest) {
1101 spin_lock(&server->req_lock);
1102 server->credits += le16_to_cpu(shdr->CreditRequest);
1103 spin_unlock(&server->req_lock);
1104 wake_up(&server->request_q);
1110 cifs_demultiplex_thread(void *p)
1112 int i, num_mids, length;
1113 struct TCP_Server_Info *server = p;
1114 unsigned int pdu_length;
1115 unsigned int next_offset;
1117 struct task_struct *task_to_wake = NULL;
1118 struct mid_q_entry *mids[MAX_COMPOUND];
1119 char *bufs[MAX_COMPOUND];
1120 unsigned int noreclaim_flag;
1122 noreclaim_flag = memalloc_noreclaim_save();
1123 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
1125 length = atomic_inc_return(&tcpSesAllocCount);
1127 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
1130 allow_kernel_signal(SIGKILL);
1131 while (server->tcpStatus != CifsExiting) {
1132 if (try_to_freeze())
1135 if (!allocate_buffers(server))
1138 server->large_buf = false;
1139 buf = server->smallbuf;
1140 pdu_length = 4; /* enough to get RFC1001 header */
1142 length = cifs_read_from_socket(server, buf, pdu_length);
1146 if (server->vals->header_preamble_size == 0)
1147 server->total_read = 0;
1149 server->total_read = length;
1152 * The right amount was read from socket - 4 bytes,
1153 * so we can now interpret the length field.
1155 pdu_length = get_rfc1002_length(buf);
1157 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
1158 if (!is_smb_response(server, buf[0]))
1161 server->pdu_size = pdu_length;
1163 /* make sure we have enough to get to the MID */
1164 if (server->pdu_size < HEADER_SIZE(server) - 1 -
1165 server->vals->header_preamble_size) {
1166 cifs_server_dbg(VFS, "SMB response too short (%u bytes)\n",
1168 cifs_reconnect(server);
1172 /* read down to the MID */
1173 length = cifs_read_from_socket(server,
1174 buf + server->vals->header_preamble_size,
1175 HEADER_SIZE(server) - 1
1176 - server->vals->header_preamble_size);
1179 server->total_read += length;
1181 if (server->ops->next_header) {
1182 next_offset = server->ops->next_header(buf);
1184 server->pdu_size = next_offset;
1187 memset(mids, 0, sizeof(mids));
1188 memset(bufs, 0, sizeof(bufs));
1191 if (server->ops->is_transform_hdr &&
1192 server->ops->receive_transform &&
1193 server->ops->is_transform_hdr(buf)) {
1194 length = server->ops->receive_transform(server,
1199 mids[0] = server->ops->find_mid(server, buf);
1203 if (!mids[0] || !mids[0]->receive)
1204 length = standard_receive3(server, mids[0]);
1206 length = mids[0]->receive(server, mids[0]);
1210 for (i = 0; i < num_mids; i++)
1212 cifs_mid_q_entry_release(mids[i]);
1216 server->lstrp = jiffies;
1218 for (i = 0; i < num_mids; i++) {
1219 if (mids[i] != NULL) {
1220 mids[i]->resp_buf_size = server->pdu_size;
1222 if (!mids[i]->multiRsp || mids[i]->multiEnd)
1223 mids[i]->callback(mids[i]);
1225 cifs_mid_q_entry_release(mids[i]);
1226 } else if (server->ops->is_oplock_break &&
1227 server->ops->is_oplock_break(bufs[i],
1229 smb2_add_credits_from_hdr(bufs[i], server);
1230 cifs_dbg(FYI, "Received oplock break\n");
1232 cifs_server_dbg(VFS, "No task to wake, unknown frame "
1233 "received! NumMids %d\n",
1234 atomic_read(&midCount));
1235 cifs_dump_mem("Received Data is: ", bufs[i],
1236 HEADER_SIZE(server));
1237 smb2_add_credits_from_hdr(bufs[i], server);
1238 #ifdef CONFIG_CIFS_DEBUG2
1239 if (server->ops->dump_detail)
1240 server->ops->dump_detail(bufs[i],
1242 cifs_dump_mids(server);
1243 #endif /* CIFS_DEBUG2 */
1247 if (pdu_length > server->pdu_size) {
1248 if (!allocate_buffers(server))
1250 pdu_length -= server->pdu_size;
1251 server->total_read = 0;
1252 server->large_buf = false;
1253 buf = server->smallbuf;
1256 } /* end while !EXITING */
1258 /* buffer usually freed in free_mid - need to free it here on exit */
1259 cifs_buf_release(server->bigbuf);
1260 if (server->smallbuf) /* no sense logging a debug message if NULL */
1261 cifs_small_buf_release(server->smallbuf);
1263 task_to_wake = xchg(&server->tsk, NULL);
1264 clean_demultiplex_info(server);
1266 /* if server->tsk was NULL then wait for a signal before exiting */
1267 if (!task_to_wake) {
1268 set_current_state(TASK_INTERRUPTIBLE);
1269 while (!signal_pending(current)) {
1271 set_current_state(TASK_INTERRUPTIBLE);
1273 set_current_state(TASK_RUNNING);
1276 memalloc_noreclaim_restore(noreclaim_flag);
1277 module_put_and_exit(0);
1280 /* extract the host portion of the UNC string */
1282 extract_hostname(const char *unc)
1288 /* skip double chars at beginning of string */
1289 /* BB: check validity of these bytes? */
1290 if (strlen(unc) < 3)
1291 return ERR_PTR(-EINVAL);
1292 for (src = unc; *src && *src == '\\'; src++)
1295 return ERR_PTR(-EINVAL);
1297 /* delimiter between hostname and sharename is always '\\' now */
1298 delim = strchr(src, '\\');
1300 return ERR_PTR(-EINVAL);
1303 dst = kmalloc((len + 1), GFP_KERNEL);
1305 return ERR_PTR(-ENOMEM);
1307 memcpy(dst, src, len);
1313 static int get_option_ul(substring_t args[], unsigned long *option)
1318 string = match_strdup(args);
1321 rc = kstrtoul(string, 0, option);
1327 static int get_option_uid(substring_t args[], kuid_t *result)
1329 unsigned long value;
1333 rc = get_option_ul(args, &value);
1337 uid = make_kuid(current_user_ns(), value);
1338 if (!uid_valid(uid))
1345 static int get_option_gid(substring_t args[], kgid_t *result)
1347 unsigned long value;
1351 rc = get_option_ul(args, &value);
1355 gid = make_kgid(current_user_ns(), value);
1356 if (!gid_valid(gid))
1363 static int cifs_parse_security_flavors(char *value,
1364 struct smb_vol *vol)
1367 substring_t args[MAX_OPT_ARGS];
1370 * With mount options, the last one should win. Reset any existing
1371 * settings back to default.
1373 vol->sectype = Unspecified;
1376 switch (match_token(value, cifs_secflavor_tokens, args)) {
1378 cifs_dbg(VFS, "sec=krb5p is not supported!\n");
1384 vol->sectype = Kerberos;
1386 case Opt_sec_ntlmsspi:
1389 case Opt_sec_ntlmssp:
1390 vol->sectype = RawNTLMSSP;
1396 vol->sectype = NTLM;
1398 case Opt_sec_ntlmv2i:
1401 case Opt_sec_ntlmv2:
1402 vol->sectype = NTLMv2;
1404 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1405 case Opt_sec_lanman:
1406 vol->sectype = LANMAN;
1413 cifs_dbg(VFS, "bad security option: %s\n", value);
1421 cifs_parse_cache_flavor(char *value, struct smb_vol *vol)
1423 substring_t args[MAX_OPT_ARGS];
1425 switch (match_token(value, cifs_cacheflavor_tokens, args)) {
1426 case Opt_cache_loose:
1427 vol->direct_io = false;
1428 vol->strict_io = false;
1429 vol->cache_ro = false;
1430 vol->cache_rw = false;
1432 case Opt_cache_strict:
1433 vol->direct_io = false;
1434 vol->strict_io = true;
1435 vol->cache_ro = false;
1436 vol->cache_rw = false;
1438 case Opt_cache_none:
1439 vol->direct_io = true;
1440 vol->strict_io = false;
1441 vol->cache_ro = false;
1442 vol->cache_rw = false;
1445 vol->direct_io = false;
1446 vol->strict_io = false;
1447 vol->cache_ro = true;
1448 vol->cache_rw = false;
1451 vol->direct_io = false;
1452 vol->strict_io = false;
1453 vol->cache_ro = false;
1454 vol->cache_rw = true;
1457 cifs_dbg(VFS, "bad cache= option: %s\n", value);
1464 cifs_parse_smb_version(char *value, struct smb_vol *vol, bool is_smb3)
1466 substring_t args[MAX_OPT_ARGS];
1468 switch (match_token(value, cifs_smb_version_tokens, args)) {
1469 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1471 if (disable_legacy_dialects) {
1472 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1476 cifs_dbg(VFS, "vers=1.0 (cifs) not permitted when mounting with smb3\n");
1479 cifs_dbg(VFS, "Use of the less secure dialect vers=1.0 "
1480 "is not recommended unless required for "
1481 "access to very old servers\n");
1482 vol->ops = &smb1_operations;
1483 vol->vals = &smb1_values;
1486 if (disable_legacy_dialects) {
1487 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1491 cifs_dbg(VFS, "vers=2.0 not permitted when mounting with smb3\n");
1494 vol->ops = &smb20_operations;
1495 vol->vals = &smb20_values;
1499 cifs_dbg(VFS, "vers=1.0 (cifs) mount not permitted when legacy dialects disabled\n");
1502 cifs_dbg(VFS, "vers=2.0 mount not permitted when legacy dialects disabled\n");
1504 #endif /* CIFS_ALLOW_INSECURE_LEGACY */
1506 vol->ops = &smb21_operations;
1507 vol->vals = &smb21_values;
1510 vol->ops = &smb30_operations;
1511 vol->vals = &smb30_values;
1514 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1515 vol->vals = &smb302_values;
1518 vol->ops = &smb311_operations;
1519 vol->vals = &smb311_values;
1522 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1523 vol->vals = &smb3any_values;
1526 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1527 vol->vals = &smbdefault_values;
1530 cifs_dbg(VFS, "Unknown vers= option specified: %s\n", value);
1537 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1538 * fields with the result. Returns 0 on success and an error otherwise.
1541 cifs_parse_devname(const char *devname, struct smb_vol *vol)
1544 const char *delims = "/\\";
1547 if (unlikely(!devname || !*devname)) {
1548 cifs_dbg(VFS, "Device name not specified.\n");
1552 /* make sure we have a valid UNC double delimiter prefix */
1553 len = strspn(devname, delims);
1557 /* find delimiter between host and sharename */
1558 pos = strpbrk(devname + 2, delims);
1562 /* skip past delimiter */
1565 /* now go until next delimiter or end of string */
1566 len = strcspn(pos, delims);
1568 /* move "pos" up to delimiter or NULL */
1570 vol->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
1574 convert_delimiter(vol->UNC, '\\');
1576 /* skip any delimiter */
1577 if (*pos == '/' || *pos == '\\')
1580 /* If pos is NULL then no prepath */
1584 vol->prepath = kstrdup(pos, GFP_KERNEL);
1592 cifs_parse_mount_options(const char *mountdata, const char *devname,
1593 struct smb_vol *vol, bool is_smb3)
1596 char *mountdata_copy = NULL, *options;
1597 unsigned int temp_len, i, j;
1599 short int override_uid = -1;
1600 short int override_gid = -1;
1601 bool uid_specified = false;
1602 bool gid_specified = false;
1603 bool sloppy = false;
1604 char *invalid = NULL;
1605 char *nodename = utsname()->nodename;
1606 char *string = NULL;
1607 char *tmp_end, *value;
1609 bool got_ip = false;
1610 bool got_version = false;
1611 unsigned short port = 0;
1612 struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1616 delim = separator[0];
1618 /* ensure we always start with zeroed-out smb_vol */
1619 memset(vol, 0, sizeof(*vol));
1622 * does not have to be perfect mapping since field is
1623 * informational, only used for servers that do not support
1624 * port 445 and it can be overridden at mount time
1626 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1627 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1628 vol->source_rfc1001_name[i] = toupper(nodename[i]);
1630 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1631 /* null target name indicates to use *SMBSERVR default called name
1632 if we end up sending RFC1001 session initialize */
1633 vol->target_rfc1001_name[0] = 0;
1634 vol->cred_uid = current_uid();
1635 vol->linux_uid = current_uid();
1636 vol->linux_gid = current_gid();
1637 vol->bsize = 1024 * 1024; /* can improve cp performance significantly */
1639 * default to SFM style remapping of seven reserved characters
1640 * unless user overrides it or we negotiate CIFS POSIX where
1641 * it is unnecessary. Can not simultaneously use more than one mapping
1642 * since then readdir could list files that open could not open
1646 /* default to only allowing write access to owner of the mount */
1647 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1649 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1650 /* default is always to request posix paths. */
1651 vol->posix_paths = 1;
1652 /* default to using server inode numbers where available */
1653 vol->server_ino = 1;
1655 /* default is to use strict cifs caching semantics */
1656 vol->strict_io = true;
1658 vol->actimeo = CIFS_DEF_ACTIMEO;
1660 /* Most clients set timeout to 0, allows server to use its default */
1661 vol->handle_timeout = 0; /* See MS-SMB2 spec section 2.2.14.2.12 */
1663 /* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1664 vol->ops = &smb30_operations;
1665 vol->vals = &smbdefault_values;
1667 vol->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1669 /* default to no multichannel (single server connection) */
1670 vol->multichannel = false;
1671 vol->max_channels = 1;
1674 goto cifs_parse_mount_err;
1676 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1677 if (!mountdata_copy)
1678 goto cifs_parse_mount_err;
1680 options = mountdata_copy;
1681 end = options + strlen(options);
1683 if (strncmp(options, "sep=", 4) == 0) {
1684 if (options[4] != 0) {
1685 separator[0] = options[4];
1688 cifs_dbg(FYI, "Null separator not allowed\n");
1691 vol->backupuid_specified = false; /* no backup intent for a user */
1692 vol->backupgid_specified = false; /* no backup intent for a group */
1694 switch (cifs_parse_devname(devname, vol)) {
1698 cifs_dbg(VFS, "Unable to allocate memory for devname.\n");
1699 goto cifs_parse_mount_err;
1701 cifs_dbg(VFS, "Malformed UNC in devname.\n");
1702 goto cifs_parse_mount_err;
1704 cifs_dbg(VFS, "Unknown error parsing devname.\n");
1705 goto cifs_parse_mount_err;
1708 while ((data = strsep(&options, separator)) != NULL) {
1709 substring_t args[MAX_OPT_ARGS];
1710 unsigned long option;
1716 token = match_token(data, cifs_mount_option_tokens, args);
1720 /* Ingnore the following */
1724 /* Boolean values */
1725 case Opt_user_xattr:
1728 case Opt_nouser_xattr:
1734 case Opt_noforceuid:
1740 case Opt_noforcegid:
1743 case Opt_noblocksend:
1744 vol->noblocksnd = 1;
1746 case Opt_noautotune:
1747 vol->noautotune = 1;
1765 vol->sfu_remap = true;
1766 vol->remap = false; /* disable SFM mapping */
1768 case Opt_nomapchars:
1769 vol->sfu_remap = false;
1773 vol->sfu_remap = false; /* disable SFU mapping */
1775 case Opt_nomapposix:
1788 #ifdef CONFIG_CIFS_ROOT
1792 case Opt_posixpaths:
1793 vol->posix_paths = 1;
1795 case Opt_noposixpaths:
1796 vol->posix_paths = 0;
1801 "conflicting unix mount options\n");
1802 vol->no_linux_ext = 1;
1805 if (vol->no_linux_ext)
1807 "conflicting unix mount options\n");
1819 * turn off mandatory locking in mode
1820 * if remote locking is turned off since the
1821 * local vfs will do advisory
1823 if (vol->file_mode ==
1824 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1825 vol->file_mode = S_IALLUGO;
1827 case Opt_nohandlecache:
1828 vol->nohandlecache = 1;
1830 case Opt_handlecache:
1831 vol->nohandlecache = 0;
1833 case Opt_forcemandatorylock:
1842 case Opt_setuidfromacl:
1843 vol->setuidfromacl = 1;
1846 vol->dynperm = true;
1849 vol->dynperm = false;
1863 case Opt_nostrictsync:
1864 vol->nostrictsync = 1;
1866 case Opt_strictsync:
1867 vol->nostrictsync = 0;
1870 vol->server_ino = 1;
1872 case Opt_noserverino:
1873 vol->server_ino = 0;
1875 case Opt_rwpidforward:
1876 vol->rwpidforward = 1;
1888 vol->no_psx_acl = 0;
1891 vol->no_psx_acl = 1;
1893 case Opt_locallease:
1894 vol->local_lease = 1;
1899 case Opt_ignore_signature:
1901 vol->ignore_signature = true;
1904 /* we do not do the following in secFlags because seal
1905 * is a per tree connection (mount) not a per socket
1906 * or per-smb connection option in the protocol
1907 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1912 pr_warn("CIFS: Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1915 #ifndef CONFIG_CIFS_FSCACHE
1916 cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1917 goto cifs_parse_mount_err;
1921 case Opt_mfsymlinks:
1922 vol->mfsymlinks = true;
1925 vol->multiuser = true;
1930 case Opt_nosharesock:
1931 vol->nosharesock = true;
1933 case Opt_nopersistent:
1934 vol->nopersistent = true;
1935 if (vol->persistent) {
1937 "persistenthandles mount options conflict\n");
1938 goto cifs_parse_mount_err;
1941 case Opt_persistent:
1942 vol->persistent = true;
1943 if ((vol->nopersistent) || (vol->resilient)) {
1945 "persistenthandles mount options conflict\n");
1946 goto cifs_parse_mount_err;
1950 vol->resilient = true;
1951 if (vol->persistent) {
1953 "persistenthandles mount options conflict\n");
1954 goto cifs_parse_mount_err;
1957 case Opt_noresilient:
1958 vol->resilient = false; /* already the default */
1960 case Opt_domainauto:
1961 vol->domainauto = true;
1966 case Opt_multichannel:
1967 vol->multichannel = true;
1969 case Opt_nomultichannel:
1970 vol->multichannel = false;
1973 vol->compression = UNKNOWN_TYPE;
1975 "SMB3 compression support is experimental\n");
1978 /* Numeric Values */
1980 if (get_option_uid(args, &vol->backupuid)) {
1981 cifs_dbg(VFS, "%s: Invalid backupuid value\n",
1983 goto cifs_parse_mount_err;
1985 vol->backupuid_specified = true;
1988 if (get_option_gid(args, &vol->backupgid)) {
1989 cifs_dbg(VFS, "%s: Invalid backupgid value\n",
1991 goto cifs_parse_mount_err;
1993 vol->backupgid_specified = true;
1996 if (get_option_uid(args, &vol->linux_uid)) {
1997 cifs_dbg(VFS, "%s: Invalid uid value\n",
1999 goto cifs_parse_mount_err;
2001 uid_specified = true;
2004 if (get_option_uid(args, &vol->cred_uid)) {
2005 cifs_dbg(VFS, "%s: Invalid cruid value\n",
2007 goto cifs_parse_mount_err;
2011 if (get_option_gid(args, &vol->linux_gid)) {
2012 cifs_dbg(VFS, "%s: Invalid gid value\n",
2014 goto cifs_parse_mount_err;
2016 gid_specified = true;
2019 if (get_option_ul(args, &option)) {
2020 cifs_dbg(VFS, "%s: Invalid file_mode value\n",
2022 goto cifs_parse_mount_err;
2024 vol->file_mode = option;
2027 if (get_option_ul(args, &option)) {
2028 cifs_dbg(VFS, "%s: Invalid dir_mode value\n",
2030 goto cifs_parse_mount_err;
2032 vol->dir_mode = option;
2035 if (get_option_ul(args, &option) ||
2036 option > USHRT_MAX) {
2037 cifs_dbg(VFS, "%s: Invalid port value\n",
2039 goto cifs_parse_mount_err;
2041 port = (unsigned short)option;
2043 case Opt_min_enc_offload:
2044 if (get_option_ul(args, &option)) {
2045 cifs_dbg(VFS, "Invalid minimum encrypted read offload size (esize)\n");
2046 goto cifs_parse_mount_err;
2048 vol->min_offload = option;
2051 if (get_option_ul(args, &option)) {
2052 cifs_dbg(VFS, "%s: Invalid blocksize value\n",
2054 goto cifs_parse_mount_err;
2057 * inode blocksize realistically should never need to be
2058 * less than 16K or greater than 16M and default is 1MB.
2059 * Note that small inode block sizes (e.g. 64K) can lead
2060 * to very poor performance of common tools like cp and scp
2062 if ((option < CIFS_MAX_MSGSIZE) ||
2063 (option > (4 * SMB3_DEFAULT_IOSIZE))) {
2064 cifs_dbg(VFS, "%s: Invalid blocksize\n",
2066 goto cifs_parse_mount_err;
2068 vol->bsize = option;
2071 if (get_option_ul(args, &option)) {
2072 cifs_dbg(VFS, "%s: Invalid rsize value\n",
2074 goto cifs_parse_mount_err;
2076 vol->rsize = option;
2079 if (get_option_ul(args, &option)) {
2080 cifs_dbg(VFS, "%s: Invalid wsize value\n",
2082 goto cifs_parse_mount_err;
2084 vol->wsize = option;
2087 if (get_option_ul(args, &option)) {
2088 cifs_dbg(VFS, "%s: Invalid actimeo value\n",
2090 goto cifs_parse_mount_err;
2092 vol->actimeo = HZ * option;
2093 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
2094 cifs_dbg(VFS, "attribute cache timeout too large\n");
2095 goto cifs_parse_mount_err;
2098 case Opt_handletimeout:
2099 if (get_option_ul(args, &option)) {
2100 cifs_dbg(VFS, "%s: Invalid handletimeout value\n",
2102 goto cifs_parse_mount_err;
2104 vol->handle_timeout = option;
2105 if (vol->handle_timeout > SMB3_MAX_HANDLE_TIMEOUT) {
2106 cifs_dbg(VFS, "Invalid handle cache timeout, longer than 16 minutes\n");
2107 goto cifs_parse_mount_err;
2110 case Opt_echo_interval:
2111 if (get_option_ul(args, &option)) {
2112 cifs_dbg(VFS, "%s: Invalid echo interval value\n",
2114 goto cifs_parse_mount_err;
2116 vol->echo_interval = option;
2119 if (get_option_ul(args, &option)) {
2120 cifs_dbg(VFS, "%s: Invalid snapshot time\n",
2122 goto cifs_parse_mount_err;
2124 vol->snapshot_time = option;
2126 case Opt_max_credits:
2127 if (get_option_ul(args, &option) || (option < 20) ||
2129 cifs_dbg(VFS, "%s: Invalid max_credits value\n",
2131 goto cifs_parse_mount_err;
2133 vol->max_credits = option;
2135 case Opt_max_channels:
2136 if (get_option_ul(args, &option) || option < 1 ||
2137 option > CIFS_MAX_CHANNELS) {
2138 cifs_dbg(VFS, "%s: Invalid max_channels value, needs to be 1-%d\n",
2139 __func__, CIFS_MAX_CHANNELS);
2140 goto cifs_parse_mount_err;
2142 vol->max_channels = option;
2145 /* String Arguments */
2147 case Opt_blank_user:
2148 /* null user, ie. anonymous authentication */
2150 vol->username = NULL;
2153 string = match_strdup(args);
2157 if (strnlen(string, CIFS_MAX_USERNAME_LEN) >
2158 CIFS_MAX_USERNAME_LEN) {
2159 pr_warn("CIFS: username too long\n");
2160 goto cifs_parse_mount_err;
2163 kfree(vol->username);
2164 vol->username = kstrdup(string, GFP_KERNEL);
2166 goto cifs_parse_mount_err;
2168 case Opt_blank_pass:
2169 /* passwords have to be handled differently
2170 * to allow the character used for deliminator
2171 * to be passed within them
2175 * Check if this is a case where the password
2176 * starts with a delimiter
2178 tmp_end = strchr(data, '=');
2180 if (!(tmp_end < end && tmp_end[1] == delim)) {
2181 /* No it is not. Set the password to NULL */
2182 kzfree(vol->password);
2183 vol->password = NULL;
2186 /* Fallthrough - to Opt_pass below.*/
2188 /* Obtain the value string */
2189 value = strchr(data, '=');
2192 /* Set tmp_end to end of the string */
2193 tmp_end = (char *) value + strlen(value);
2195 /* Check if following character is the deliminator
2196 * If yes, we have encountered a double deliminator
2197 * reset the NULL character to the deliminator
2199 if (tmp_end < end && tmp_end[1] == delim) {
2202 /* Keep iterating until we get to a single
2203 * deliminator OR the end
2205 while ((tmp_end = strchr(tmp_end, delim))
2206 != NULL && (tmp_end[1] == delim)) {
2207 tmp_end = (char *) &tmp_end[2];
2210 /* Reset var options to point to next element */
2213 options = (char *) &tmp_end[1];
2215 /* Reached the end of the mount option
2220 kzfree(vol->password);
2221 /* Now build new password string */
2222 temp_len = strlen(value);
2223 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
2224 if (vol->password == NULL) {
2225 pr_warn("CIFS: no memory for password\n");
2226 goto cifs_parse_mount_err;
2229 for (i = 0, j = 0; i < temp_len; i++, j++) {
2230 vol->password[j] = value[i];
2231 if ((value[i] == delim) &&
2232 value[i+1] == delim)
2233 /* skip the second deliminator */
2236 vol->password[j] = '\0';
2239 /* FIXME: should this be an error instead? */
2243 string = match_strdup(args);
2247 if (!cifs_convert_address(dstaddr, string,
2249 pr_err("CIFS: bad ip= option (%s).\n", string);
2250 goto cifs_parse_mount_err;
2255 string = match_strdup(args);
2259 if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
2260 == CIFS_MAX_DOMAINNAME_LEN) {
2261 pr_warn("CIFS: domain name too long\n");
2262 goto cifs_parse_mount_err;
2265 kfree(vol->domainname);
2266 vol->domainname = kstrdup(string, GFP_KERNEL);
2267 if (!vol->domainname) {
2268 pr_warn("CIFS: no memory for domainname\n");
2269 goto cifs_parse_mount_err;
2271 cifs_dbg(FYI, "Domain name set\n");
2274 string = match_strdup(args);
2278 if (!cifs_convert_address(
2279 (struct sockaddr *)&vol->srcaddr,
2280 string, strlen(string))) {
2281 pr_warn("CIFS: Could not parse srcaddr: %s\n",
2283 goto cifs_parse_mount_err;
2287 string = match_strdup(args);
2291 if (strnlen(string, 1024) >= 65) {
2292 pr_warn("CIFS: iocharset name too long.\n");
2293 goto cifs_parse_mount_err;
2296 if (strncasecmp(string, "default", 7) != 0) {
2297 kfree(vol->iocharset);
2298 vol->iocharset = kstrdup(string,
2300 if (!vol->iocharset) {
2301 pr_warn("CIFS: no memory for charset\n");
2302 goto cifs_parse_mount_err;
2305 /* if iocharset not set then load_nls_default
2308 cifs_dbg(FYI, "iocharset set to %s\n", string);
2310 case Opt_netbiosname:
2311 string = match_strdup(args);
2315 memset(vol->source_rfc1001_name, 0x20,
2318 * FIXME: are there cases in which a comma can
2319 * be valid in workstation netbios name (and
2320 * need special handling)?
2322 for (i = 0; i < RFC1001_NAME_LEN; i++) {
2323 /* don't ucase netbiosname for user */
2326 vol->source_rfc1001_name[i] = string[i];
2328 /* The string has 16th byte zero still from
2329 * set at top of the function
2331 if (i == RFC1001_NAME_LEN && string[i] != 0)
2332 pr_warn("CIFS: netbiosname longer than 15 truncated.\n");
2335 /* servernetbiosname specified override *SMBSERVER */
2336 string = match_strdup(args);
2340 /* last byte, type, is 0x20 for servr type */
2341 memset(vol->target_rfc1001_name, 0x20,
2342 RFC1001_NAME_LEN_WITH_NULL);
2344 /* BB are there cases in which a comma can be
2345 valid in this workstation netbios name
2346 (and need special handling)? */
2348 /* user or mount helper must uppercase the
2350 for (i = 0; i < 15; i++) {
2353 vol->target_rfc1001_name[i] = string[i];
2355 /* The string has 16th byte zero still from
2356 set at top of the function */
2357 if (i == RFC1001_NAME_LEN && string[i] != 0)
2358 pr_warn("CIFS: server netbiosname longer than 15 truncated.\n");
2361 /* version of mount userspace tools, not dialect */
2362 string = match_strdup(args);
2366 /* If interface changes in mount.cifs bump to new ver */
2367 if (strncasecmp(string, "1", 1) == 0) {
2368 if (strlen(string) > 1) {
2369 pr_warn("Bad mount helper ver=%s. Did "
2370 "you want SMB1 (CIFS) dialect "
2371 "and mean to type vers=1.0 "
2372 "instead?\n", string);
2373 goto cifs_parse_mount_err;
2375 /* This is the default */
2378 /* For all other value, error */
2379 pr_warn("CIFS: Invalid mount helper version specified\n");
2380 goto cifs_parse_mount_err;
2382 /* protocol version (dialect) */
2383 string = match_strdup(args);
2387 if (cifs_parse_smb_version(string, vol, is_smb3) != 0)
2388 goto cifs_parse_mount_err;
2392 string = match_strdup(args);
2396 if (cifs_parse_security_flavors(string, vol) != 0)
2397 goto cifs_parse_mount_err;
2400 string = match_strdup(args);
2404 if (cifs_parse_cache_flavor(string, vol) != 0)
2405 goto cifs_parse_mount_err;
2409 * An option we don't recognize. Save it off for later
2410 * if we haven't already found one
2416 /* Free up any allocated string */
2421 if (!sloppy && invalid) {
2422 pr_err("CIFS: Unknown mount option \"%s\"\n", invalid);
2423 goto cifs_parse_mount_err;
2426 if (vol->rdma && vol->vals->protocol_id < SMB30_PROT_ID) {
2427 cifs_dbg(VFS, "SMB Direct requires Version >=3.0\n");
2428 goto cifs_parse_mount_err;
2432 /* Muliuser mounts require CONFIG_KEYS support */
2433 if (vol->multiuser) {
2434 cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
2435 goto cifs_parse_mount_err;
2439 cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
2440 goto cifs_parse_mount_err;
2443 /* make sure UNC has a share name */
2444 if (!strchr(vol->UNC + 3, '\\')) {
2445 cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
2446 goto cifs_parse_mount_err;
2453 /* No ip= option specified? Try to get it from UNC */
2454 /* Use the address part of the UNC. */
2455 slash = strchr(&vol->UNC[2], '\\');
2456 len = slash - &vol->UNC[2];
2457 if (!cifs_convert_address(dstaddr, &vol->UNC[2], len)) {
2458 pr_err("Unable to determine destination address.\n");
2459 goto cifs_parse_mount_err;
2463 /* set the port that we got earlier */
2464 cifs_set_port(dstaddr, port);
2467 vol->override_uid = override_uid;
2468 else if (override_uid == 1)
2469 pr_notice("CIFS: ignoring forceuid mount option specified with no uid= option.\n");
2472 vol->override_gid = override_gid;
2473 else if (override_gid == 1)
2474 pr_notice("CIFS: ignoring forcegid mount option specified with no gid= option.\n");
2476 if (got_version == false)
2477 pr_warn_once("No dialect specified on mount. Default has changed"
2478 " to a more secure dialect, SMB2.1 or later (e.g. "
2479 "SMB3.1.1), from CIFS (SMB1). To use the less secure "
2480 "SMB1 dialect to access old servers which do not "
2481 "support SMB3.1.1 (or even SMB3 or SMB2.1) specify "
2482 "vers=1.0 on mount.\n");
2484 kfree(mountdata_copy);
2488 pr_warn("Could not allocate temporary buffer\n");
2489 cifs_parse_mount_err:
2491 kfree(mountdata_copy);
2495 /** Returns true if srcaddr isn't specified and rhs isn't
2496 * specified, or if srcaddr is specified and
2497 * matches the IP address of the rhs argument.
2500 srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs)
2502 switch (srcaddr->sa_family) {
2504 return (rhs->sa_family == AF_UNSPEC);
2506 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
2507 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
2508 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
2511 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
2512 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
2513 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
2517 return false; /* don't expect to be here */
2522 * If no port is specified in addr structure, we try to match with 445 port
2523 * and if it fails - with 139 ports. It should be called only if address
2524 * families of server and addr are equal.
2527 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
2529 __be16 port, *sport;
2531 /* SMBDirect manages its own ports, don't match it here */
2535 switch (addr->sa_family) {
2537 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
2538 port = ((struct sockaddr_in *) addr)->sin_port;
2541 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
2542 port = ((struct sockaddr_in6 *) addr)->sin6_port;
2550 port = htons(CIFS_PORT);
2554 port = htons(RFC1001_PORT);
2557 return port == *sport;
2561 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
2562 struct sockaddr *srcaddr)
2564 switch (addr->sa_family) {
2566 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
2567 struct sockaddr_in *srv_addr4 =
2568 (struct sockaddr_in *)&server->dstaddr;
2570 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
2575 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
2576 struct sockaddr_in6 *srv_addr6 =
2577 (struct sockaddr_in6 *)&server->dstaddr;
2579 if (!ipv6_addr_equal(&addr6->sin6_addr,
2580 &srv_addr6->sin6_addr))
2582 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
2588 return false; /* don't expect to be here */
2591 if (!srcip_matches(srcaddr, (struct sockaddr *)&server->srcaddr))
2598 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2601 * The select_sectype function should either return the vol->sectype
2602 * that was specified, or "Unspecified" if that sectype was not
2603 * compatible with the given NEGOTIATE request.
2605 if (server->ops->select_sectype(server, vol->sectype)
2610 * Now check if signing mode is acceptable. No need to check
2611 * global_secflags at this point since if MUST_SIGN is set then
2612 * the server->sign had better be too.
2614 if (vol->sign && !server->sign)
2620 static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
2622 struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2624 if (vol->nosharesock)
2627 /* If multidialect negotiation see if existing sessions match one */
2628 if (strcmp(vol->vals->version_string, SMB3ANY_VERSION_STRING) == 0) {
2629 if (server->vals->protocol_id < SMB30_PROT_ID)
2631 } else if (strcmp(vol->vals->version_string,
2632 SMBDEFAULT_VERSION_STRING) == 0) {
2633 if (server->vals->protocol_id < SMB21_PROT_ID)
2635 } else if ((server->vals != vol->vals) || (server->ops != vol->ops))
2638 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2641 if (!match_address(server, addr,
2642 (struct sockaddr *)&vol->srcaddr))
2645 if (!match_port(server, addr))
2648 if (!match_security(server, vol))
2651 if (server->echo_interval != vol->echo_interval * HZ)
2654 if (server->rdma != vol->rdma)
2657 if (server->ignore_signature != vol->ignore_signature)
2660 if (server->min_offload != vol->min_offload)
2666 struct TCP_Server_Info *
2667 cifs_find_tcp_session(struct smb_vol *vol)
2669 struct TCP_Server_Info *server;
2671 spin_lock(&cifs_tcp_ses_lock);
2672 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
2674 * Skip ses channels since they're only handled in lower layers
2675 * (e.g. cifs_send_recv).
2677 if (server->is_channel || !match_server(server, vol))
2680 ++server->srv_count;
2681 spin_unlock(&cifs_tcp_ses_lock);
2682 cifs_dbg(FYI, "Existing tcp session with server found\n");
2685 spin_unlock(&cifs_tcp_ses_lock);
2690 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
2692 struct task_struct *task;
2694 spin_lock(&cifs_tcp_ses_lock);
2695 if (--server->srv_count > 0) {
2696 spin_unlock(&cifs_tcp_ses_lock);
2700 put_net(cifs_net_ns(server));
2702 list_del_init(&server->tcp_ses_list);
2703 spin_unlock(&cifs_tcp_ses_lock);
2705 cancel_delayed_work_sync(&server->echo);
2709 * Avoid deadlock here: reconnect work calls
2710 * cifs_put_tcp_session() at its end. Need to be sure
2711 * that reconnect work does nothing with server pointer after
2714 cancel_delayed_work(&server->reconnect);
2716 cancel_delayed_work_sync(&server->reconnect);
2718 spin_lock(&GlobalMid_Lock);
2719 server->tcpStatus = CifsExiting;
2720 spin_unlock(&GlobalMid_Lock);
2722 cifs_crypto_secmech_release(server);
2723 cifs_fscache_release_client_cookie(server);
2725 kfree(server->session_key.response);
2726 server->session_key.response = NULL;
2727 server->session_key.len = 0;
2729 task = xchg(&server->tsk, NULL);
2731 send_sig(SIGKILL, task, 1);
2734 struct TCP_Server_Info *
2735 cifs_get_tcp_session(struct smb_vol *volume_info)
2737 struct TCP_Server_Info *tcp_ses = NULL;
2740 cifs_dbg(FYI, "UNC: %s\n", volume_info->UNC);
2742 /* see if we already have a matching tcp_ses */
2743 tcp_ses = cifs_find_tcp_session(volume_info);
2747 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2753 tcp_ses->ops = volume_info->ops;
2754 tcp_ses->vals = volume_info->vals;
2755 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2756 tcp_ses->hostname = extract_hostname(volume_info->UNC);
2757 if (IS_ERR(tcp_ses->hostname)) {
2758 rc = PTR_ERR(tcp_ses->hostname);
2759 goto out_err_crypto_release;
2762 tcp_ses->noblockcnt = volume_info->rootfs;
2763 tcp_ses->noblocksnd = volume_info->noblocksnd || volume_info->rootfs;
2764 tcp_ses->noautotune = volume_info->noautotune;
2765 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2766 tcp_ses->rdma = volume_info->rdma;
2767 tcp_ses->in_flight = 0;
2768 tcp_ses->max_in_flight = 0;
2769 tcp_ses->credits = 1;
2770 init_waitqueue_head(&tcp_ses->response_q);
2771 init_waitqueue_head(&tcp_ses->request_q);
2772 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2773 mutex_init(&tcp_ses->srv_mutex);
2774 memcpy(tcp_ses->workstation_RFC1001_name,
2775 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2776 memcpy(tcp_ses->server_RFC1001_name,
2777 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2778 tcp_ses->session_estab = false;
2779 tcp_ses->sequence_number = 0;
2780 tcp_ses->reconnect_instance = 1;
2781 tcp_ses->lstrp = jiffies;
2782 tcp_ses->compress_algorithm = cpu_to_le16(volume_info->compression);
2783 spin_lock_init(&tcp_ses->req_lock);
2784 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2785 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2786 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2787 INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
2788 mutex_init(&tcp_ses->reconnect_mutex);
2789 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2790 sizeof(tcp_ses->srcaddr));
2791 memcpy(&tcp_ses->dstaddr, &volume_info->dstaddr,
2792 sizeof(tcp_ses->dstaddr));
2793 if (volume_info->use_client_guid)
2794 memcpy(tcp_ses->client_guid, volume_info->client_guid,
2795 SMB2_CLIENT_GUID_SIZE);
2797 generate_random_uuid(tcp_ses->client_guid);
2799 * at this point we are the only ones with the pointer
2800 * to the struct since the kernel thread not created yet
2801 * no need to spinlock this init of tcpStatus or srv_count
2803 tcp_ses->tcpStatus = CifsNew;
2804 ++tcp_ses->srv_count;
2806 if (volume_info->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
2807 volume_info->echo_interval <= SMB_ECHO_INTERVAL_MAX)
2808 tcp_ses->echo_interval = volume_info->echo_interval * HZ;
2810 tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
2811 if (tcp_ses->rdma) {
2812 #ifndef CONFIG_CIFS_SMB_DIRECT
2813 cifs_dbg(VFS, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
2815 goto out_err_crypto_release;
2817 tcp_ses->smbd_conn = smbd_get_connection(
2818 tcp_ses, (struct sockaddr *)&volume_info->dstaddr);
2819 if (tcp_ses->smbd_conn) {
2820 cifs_dbg(VFS, "RDMA transport established\n");
2822 goto smbd_connected;
2825 goto out_err_crypto_release;
2828 rc = ip_connect(tcp_ses);
2830 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
2831 goto out_err_crypto_release;
2835 * since we're in a cifs function already, we know that
2836 * this will succeed. No need for try_module_get().
2838 __module_get(THIS_MODULE);
2839 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2841 if (IS_ERR(tcp_ses->tsk)) {
2842 rc = PTR_ERR(tcp_ses->tsk);
2843 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
2844 module_put(THIS_MODULE);
2845 goto out_err_crypto_release;
2847 tcp_ses->min_offload = volume_info->min_offload;
2848 tcp_ses->tcpStatus = CifsNeedNegotiate;
2850 tcp_ses->nr_targets = 1;
2851 tcp_ses->ignore_signature = volume_info->ignore_signature;
2852 /* thread spawned, put it on the list */
2853 spin_lock(&cifs_tcp_ses_lock);
2854 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2855 spin_unlock(&cifs_tcp_ses_lock);
2857 cifs_fscache_get_client_cookie(tcp_ses);
2859 /* queue echo request delayed work */
2860 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
2864 out_err_crypto_release:
2865 cifs_crypto_secmech_release(tcp_ses);
2867 put_net(cifs_net_ns(tcp_ses));
2871 if (!IS_ERR(tcp_ses->hostname))
2872 kfree(tcp_ses->hostname);
2873 if (tcp_ses->ssocket)
2874 sock_release(tcp_ses->ssocket);
2880 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2882 if (vol->sectype != Unspecified &&
2883 vol->sectype != ses->sectype)
2887 * If an existing session is limited to less channels than
2888 * requested, it should not be reused
2890 if (ses->chan_max < vol->max_channels)
2893 switch (ses->sectype) {
2895 if (!uid_eq(vol->cred_uid, ses->cred_uid))
2899 /* NULL username means anonymous session */
2900 if (ses->user_name == NULL) {
2906 /* anything else takes username/password */
2907 if (strncmp(ses->user_name,
2908 vol->username ? vol->username : "",
2909 CIFS_MAX_USERNAME_LEN))
2911 if ((vol->username && strlen(vol->username) != 0) &&
2912 ses->password != NULL &&
2913 strncmp(ses->password,
2914 vol->password ? vol->password : "",
2915 CIFS_MAX_PASSWORD_LEN))
2922 * cifs_setup_ipc - helper to setup the IPC tcon for the session
2924 * A new IPC connection is made and stored in the session
2925 * tcon_ipc. The IPC tcon has the same lifetime as the session.
2928 cifs_setup_ipc(struct cifs_ses *ses, struct smb_vol *volume_info)
2931 struct cifs_tcon *tcon;
2932 struct nls_table *nls_codepage;
2933 char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0};
2935 struct TCP_Server_Info *server = ses->server;
2938 * If the mount request that resulted in the creation of the
2939 * session requires encryption, force IPC to be encrypted too.
2941 if (volume_info->seal) {
2942 if (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
2945 cifs_server_dbg(VFS,
2946 "IPC: server doesn't support encryption\n");
2951 tcon = tconInfoAlloc();
2955 scnprintf(unc, sizeof(unc), "\\\\%s\\IPC$", server->hostname);
2958 nls_codepage = load_nls_default();
2964 rc = server->ops->tree_connect(xid, ses, unc, tcon, nls_codepage);
2968 cifs_server_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
2973 cifs_dbg(FYI, "IPC tcon rc = %d ipc tid = %d\n", rc, tcon->tid);
2975 ses->tcon_ipc = tcon;
2977 unload_nls(nls_codepage);
2982 * cifs_free_ipc - helper to release the session IPC tcon
2984 * Needs to be called everytime a session is destroyed
2987 cifs_free_ipc(struct cifs_ses *ses)
2990 struct cifs_tcon *tcon = ses->tcon_ipc;
2995 if (ses->server->ops->tree_disconnect) {
2997 rc = ses->server->ops->tree_disconnect(xid, tcon);
3002 cifs_dbg(FYI, "failed to disconnect IPC tcon (rc=%d)\n", rc);
3005 ses->tcon_ipc = NULL;
3009 static struct cifs_ses *
3010 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
3012 struct cifs_ses *ses;
3014 spin_lock(&cifs_tcp_ses_lock);
3015 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
3016 if (ses->status == CifsExiting)
3018 if (!match_session(ses, vol))
3021 spin_unlock(&cifs_tcp_ses_lock);
3024 spin_unlock(&cifs_tcp_ses_lock);
3028 void cifs_put_smb_ses(struct cifs_ses *ses)
3030 unsigned int rc, xid;
3031 struct TCP_Server_Info *server = ses->server;
3033 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
3035 spin_lock(&cifs_tcp_ses_lock);
3036 if (ses->status == CifsExiting) {
3037 spin_unlock(&cifs_tcp_ses_lock);
3040 if (--ses->ses_count > 0) {
3041 spin_unlock(&cifs_tcp_ses_lock);
3044 if (ses->status == CifsGood)
3045 ses->status = CifsExiting;
3046 spin_unlock(&cifs_tcp_ses_lock);
3050 if (ses->status == CifsExiting && server->ops->logoff) {
3052 rc = server->ops->logoff(xid, ses);
3054 cifs_server_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
3059 spin_lock(&cifs_tcp_ses_lock);
3060 list_del_init(&ses->smb_ses_list);
3061 spin_unlock(&cifs_tcp_ses_lock);
3063 /* close any extra channels */
3064 if (ses->chan_count > 1) {
3067 for (i = 1; i < ses->chan_count; i++)
3068 cifs_put_tcp_session(ses->chans[i].server, 0);
3072 cifs_put_tcp_session(server, 0);
3077 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
3078 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
3080 /* Populate username and pw fields from keyring if possible */
3082 cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
3086 const char *delim, *payload;
3090 struct TCP_Server_Info *server = ses->server;
3091 struct sockaddr_in *sa;
3092 struct sockaddr_in6 *sa6;
3093 const struct user_key_payload *upayload;
3095 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
3099 /* try to find an address key first */
3100 switch (server->dstaddr.ss_family) {
3102 sa = (struct sockaddr_in *)&server->dstaddr;
3103 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
3106 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
3107 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
3110 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
3111 server->dstaddr.ss_family);
3116 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
3117 key = request_key(&key_type_logon, desc, "");
3119 if (!ses->domainName) {
3120 cifs_dbg(FYI, "domainName is NULL\n");
3125 /* didn't work, try to find a domain key */
3126 sprintf(desc, "cifs:d:%s", ses->domainName);
3127 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
3128 key = request_key(&key_type_logon, desc, "");
3136 down_read(&key->sem);
3137 upayload = user_key_payload_locked(key);
3138 if (IS_ERR_OR_NULL(upayload)) {
3139 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
3143 /* find first : in payload */
3144 payload = upayload->data;
3145 delim = strnchr(payload, upayload->datalen, ':');
3146 cifs_dbg(FYI, "payload=%s\n", payload);
3148 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
3154 len = delim - payload;
3155 if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
3156 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
3162 vol->username = kstrndup(payload, len, GFP_KERNEL);
3163 if (!vol->username) {
3164 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
3169 cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
3171 len = key->datalen - (len + 1);
3172 if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
3173 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
3175 kfree(vol->username);
3176 vol->username = NULL;
3181 vol->password = kstrndup(delim, len, GFP_KERNEL);
3182 if (!vol->password) {
3183 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
3186 kfree(vol->username);
3187 vol->username = NULL;
3192 * If we have a domain key then we must set the domainName in the
3195 if (is_domain && ses->domainName) {
3196 vol->domainname = kstrndup(ses->domainName,
3197 strlen(ses->domainName),
3199 if (!vol->domainname) {
3200 cifs_dbg(FYI, "Unable to allocate %zd bytes for "
3203 kfree(vol->username);
3204 vol->username = NULL;
3205 kzfree(vol->password);
3206 vol->password = NULL;
3216 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
3219 #else /* ! CONFIG_KEYS */
3221 cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
3222 struct cifs_ses *ses __attribute__((unused)))
3226 #endif /* CONFIG_KEYS */
3229 * cifs_get_smb_ses - get a session matching @volume_info data from @server
3231 * This function assumes it is being called from cifs_mount() where we
3232 * already got a server reference (server refcount +1). See
3233 * cifs_get_tcon() for refcount explanations.
3236 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
3240 struct cifs_ses *ses;
3241 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3242 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3246 ses = cifs_find_smb_ses(server, volume_info);
3248 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
3251 mutex_lock(&ses->session_mutex);
3252 rc = cifs_negotiate_protocol(xid, ses);
3254 mutex_unlock(&ses->session_mutex);
3255 /* problem -- put our ses reference */
3256 cifs_put_smb_ses(ses);
3260 if (ses->need_reconnect) {
3261 cifs_dbg(FYI, "Session needs reconnect\n");
3262 rc = cifs_setup_session(xid, ses,
3263 volume_info->local_nls);
3265 mutex_unlock(&ses->session_mutex);
3266 /* problem -- put our reference */
3267 cifs_put_smb_ses(ses);
3272 mutex_unlock(&ses->session_mutex);
3274 /* existing SMB ses has a server reference already */
3275 cifs_put_tcp_session(server, 0);
3280 cifs_dbg(FYI, "Existing smb sess not found\n");
3281 ses = sesInfoAlloc();
3285 /* new SMB session uses our server ref */
3286 ses->server = server;
3287 if (server->dstaddr.ss_family == AF_INET6)
3288 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
3290 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
3292 if (volume_info->username) {
3293 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
3294 if (!ses->user_name)
3298 /* volume_info->password freed at unmount */
3299 if (volume_info->password) {
3300 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
3304 if (volume_info->domainname) {
3305 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
3306 if (!ses->domainName)
3309 if (volume_info->domainauto)
3310 ses->domainAuto = volume_info->domainauto;
3311 ses->cred_uid = volume_info->cred_uid;
3312 ses->linux_uid = volume_info->linux_uid;
3314 ses->sectype = volume_info->sectype;
3315 ses->sign = volume_info->sign;
3316 mutex_lock(&ses->session_mutex);
3318 /* add server as first channel */
3319 ses->chans[0].server = server;
3320 ses->chan_count = 1;
3321 ses->chan_max = volume_info->multichannel ? volume_info->max_channels:1;
3323 rc = cifs_negotiate_protocol(xid, ses);
3325 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
3327 /* each channel uses a different signing key */
3328 memcpy(ses->chans[0].signkey, ses->smb3signingkey,
3329 sizeof(ses->smb3signingkey));
3331 mutex_unlock(&ses->session_mutex);
3335 /* success, put it on the list and add it as first channel */
3336 spin_lock(&cifs_tcp_ses_lock);
3337 list_add(&ses->smb_ses_list, &server->smb_ses_list);
3338 spin_unlock(&cifs_tcp_ses_lock);
3342 cifs_setup_ipc(ses, volume_info);
3352 static int match_tcon(struct cifs_tcon *tcon, struct smb_vol *volume_info)
3354 if (tcon->tidStatus == CifsExiting)
3356 if (strncmp(tcon->treeName, volume_info->UNC, MAX_TREE_SIZE))
3358 if (tcon->seal != volume_info->seal)
3360 if (tcon->snapshot_time != volume_info->snapshot_time)
3362 if (tcon->handle_timeout != volume_info->handle_timeout)
3364 if (tcon->no_lease != volume_info->no_lease)
3369 static struct cifs_tcon *
3370 cifs_find_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3372 struct list_head *tmp;
3373 struct cifs_tcon *tcon;
3375 spin_lock(&cifs_tcp_ses_lock);
3376 list_for_each(tmp, &ses->tcon_list) {
3377 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
3378 #ifdef CONFIG_CIFS_DFS_UPCALL
3382 if (!match_tcon(tcon, volume_info))
3385 spin_unlock(&cifs_tcp_ses_lock);
3388 spin_unlock(&cifs_tcp_ses_lock);
3393 cifs_put_tcon(struct cifs_tcon *tcon)
3396 struct cifs_ses *ses;
3399 * IPC tcon share the lifetime of their session and are
3400 * destroyed in the session put function
3402 if (tcon == NULL || tcon->ipc)
3406 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
3407 spin_lock(&cifs_tcp_ses_lock);
3408 if (--tcon->tc_count > 0) {
3409 spin_unlock(&cifs_tcp_ses_lock);
3413 list_del_init(&tcon->tcon_list);
3414 spin_unlock(&cifs_tcp_ses_lock);
3417 if (ses->server->ops->tree_disconnect)
3418 ses->server->ops->tree_disconnect(xid, tcon);
3421 cifs_fscache_release_super_cookie(tcon);
3423 cifs_put_smb_ses(ses);
3427 * cifs_get_tcon - get a tcon matching @volume_info data from @ses
3429 * - tcon refcount is the number of mount points using the tcon.
3430 * - ses refcount is the number of tcon using the session.
3432 * 1. This function assumes it is being called from cifs_mount() where
3433 * we already got a session reference (ses refcount +1).
3435 * 2. Since we're in the context of adding a mount point, the end
3436 * result should be either:
3438 * a) a new tcon already allocated with refcount=1 (1 mount point) and
3439 * its session refcount incremented (1 new tcon). This +1 was
3440 * already done in (1).
3442 * b) an existing tcon with refcount+1 (add a mount point to it) and
3443 * identical ses refcount (no new tcon). Because of (1) we need to
3444 * decrement the ses refcount.
3446 static struct cifs_tcon *
3447 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3450 struct cifs_tcon *tcon;
3452 tcon = cifs_find_tcon(ses, volume_info);
3455 * tcon has refcount already incremented but we need to
3456 * decrement extra ses reference gotten by caller (case b)
3458 cifs_dbg(FYI, "Found match on UNC path\n");
3459 cifs_put_smb_ses(ses);
3463 if (!ses->server->ops->tree_connect) {
3468 tcon = tconInfoAlloc();
3474 if (volume_info->snapshot_time) {
3475 if (ses->server->vals->protocol_id == 0) {
3477 "Use SMB2 or later for snapshot mount option\n");
3481 tcon->snapshot_time = volume_info->snapshot_time;
3484 if (volume_info->handle_timeout) {
3485 if (ses->server->vals->protocol_id == 0) {
3487 "Use SMB2.1 or later for handle timeout option\n");
3491 tcon->handle_timeout = volume_info->handle_timeout;
3495 if (volume_info->password) {
3496 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
3497 if (!tcon->password) {
3503 if (volume_info->seal) {
3504 if (ses->server->vals->protocol_id == 0) {
3506 "SMB3 or later required for encryption\n");
3509 } else if (tcon->ses->server->capabilities &
3510 SMB2_GLOBAL_CAP_ENCRYPTION)
3513 cifs_dbg(VFS, "Encryption is not supported on share\n");
3519 if (volume_info->linux_ext) {
3520 if (ses->server->posix_ext_supported) {
3521 tcon->posix_extensions = true;
3522 printk_once(KERN_WARNING
3523 "SMB3.11 POSIX Extensions are experimental\n");
3525 cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions.\n");
3532 * BB Do we need to wrap session_mutex around this TCon call and Unix
3533 * SetFS as we do on SessSetup and reconnect?
3536 rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
3537 volume_info->local_nls);
3539 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
3543 tcon->use_persistent = false;
3544 /* check if SMB2 or later, CIFS does not support persistent handles */
3545 if (volume_info->persistent) {
3546 if (ses->server->vals->protocol_id == 0) {
3548 "SMB3 or later required for persistent handles\n");
3551 } else if (ses->server->capabilities &
3552 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3553 tcon->use_persistent = true;
3554 else /* persistent handles requested but not supported */ {
3556 "Persistent handles not supported on share\n");
3560 } else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
3561 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3562 && (volume_info->nopersistent == false)) {
3563 cifs_dbg(FYI, "enabling persistent handles\n");
3564 tcon->use_persistent = true;
3565 } else if (volume_info->resilient) {
3566 if (ses->server->vals->protocol_id == 0) {
3568 "SMB2.1 or later required for resilient handles\n");
3572 tcon->use_resilient = true;
3575 /* If the user really knows what they are doing they can override */
3576 if (tcon->share_flags & SMB2_SHAREFLAG_NO_CACHING) {
3577 if (volume_info->cache_ro)
3578 cifs_dbg(VFS, "cache=ro requested on mount but NO_CACHING flag set on share\n");
3579 else if (volume_info->cache_rw)
3580 cifs_dbg(VFS, "cache=singleclient requested on mount but NO_CACHING flag set on share\n");
3583 if (volume_info->no_lease) {
3584 if (ses->server->vals->protocol_id == 0) {
3586 "SMB2 or later required for nolease option\n");
3590 tcon->no_lease = volume_info->no_lease;
3594 * We can have only one retry value for a connection to a share so for
3595 * resources mounted more than once to the same server share the last
3596 * value passed in for the retry flag is used.
3598 tcon->retry = volume_info->retry;
3599 tcon->nocase = volume_info->nocase;
3600 tcon->nohandlecache = volume_info->nohandlecache;
3601 tcon->local_lease = volume_info->local_lease;
3602 INIT_LIST_HEAD(&tcon->pending_opens);
3604 spin_lock(&cifs_tcp_ses_lock);
3605 list_add(&tcon->tcon_list, &ses->tcon_list);
3606 spin_unlock(&cifs_tcp_ses_lock);
3608 cifs_fscache_get_super_cookie(tcon);
3618 cifs_put_tlink(struct tcon_link *tlink)
3620 if (!tlink || IS_ERR(tlink))
3623 if (!atomic_dec_and_test(&tlink->tl_count) ||
3624 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
3625 tlink->tl_time = jiffies;
3629 if (!IS_ERR(tlink_tcon(tlink)))
3630 cifs_put_tcon(tlink_tcon(tlink));
3636 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3638 struct cifs_sb_info *old = CIFS_SB(sb);
3639 struct cifs_sb_info *new = mnt_data->cifs_sb;
3640 unsigned int oldflags = old->mnt_cifs_flags & CIFS_MOUNT_MASK;
3641 unsigned int newflags = new->mnt_cifs_flags & CIFS_MOUNT_MASK;
3643 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
3646 if (old->mnt_cifs_serverino_autodisabled)
3647 newflags &= ~CIFS_MOUNT_SERVER_INUM;
3649 if (oldflags != newflags)
3653 * We want to share sb only if we don't specify an r/wsize or
3654 * specified r/wsize is greater than or equal to existing one.
3656 if (new->wsize && new->wsize < old->wsize)
3659 if (new->rsize && new->rsize < old->rsize)
3662 if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))
3665 if (old->mnt_file_mode != new->mnt_file_mode ||
3666 old->mnt_dir_mode != new->mnt_dir_mode)
3669 if (strcmp(old->local_nls->charset, new->local_nls->charset))
3672 if (old->actimeo != new->actimeo)
3679 match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3681 struct cifs_sb_info *old = CIFS_SB(sb);
3682 struct cifs_sb_info *new = mnt_data->cifs_sb;
3683 bool old_set = (old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
3685 bool new_set = (new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
3688 if (old_set && new_set && !strcmp(new->prepath, old->prepath))
3690 else if (!old_set && !new_set)
3697 cifs_match_super(struct super_block *sb, void *data)
3699 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
3700 struct smb_vol *volume_info;
3701 struct cifs_sb_info *cifs_sb;
3702 struct TCP_Server_Info *tcp_srv;
3703 struct cifs_ses *ses;
3704 struct cifs_tcon *tcon;
3705 struct tcon_link *tlink;
3708 spin_lock(&cifs_tcp_ses_lock);
3709 cifs_sb = CIFS_SB(sb);
3710 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3711 if (IS_ERR(tlink)) {
3712 spin_unlock(&cifs_tcp_ses_lock);
3715 tcon = tlink_tcon(tlink);
3717 tcp_srv = ses->server;
3719 volume_info = mnt_data->vol;
3721 if (!match_server(tcp_srv, volume_info) ||
3722 !match_session(ses, volume_info) ||
3723 !match_tcon(tcon, volume_info) ||
3724 !match_prepath(sb, mnt_data)) {
3729 rc = compare_mount_options(sb, mnt_data);
3731 spin_unlock(&cifs_tcp_ses_lock);
3732 cifs_put_tlink(tlink);
3736 #ifdef CONFIG_DEBUG_LOCK_ALLOC
3737 static struct lock_class_key cifs_key[2];
3738 static struct lock_class_key cifs_slock_key[2];
3741 cifs_reclassify_socket4(struct socket *sock)
3743 struct sock *sk = sock->sk;
3744 BUG_ON(!sock_allow_reclassification(sk));
3745 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
3746 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
3750 cifs_reclassify_socket6(struct socket *sock)
3752 struct sock *sk = sock->sk;
3753 BUG_ON(!sock_allow_reclassification(sk));
3754 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
3755 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
3759 cifs_reclassify_socket4(struct socket *sock)
3764 cifs_reclassify_socket6(struct socket *sock)
3769 /* See RFC1001 section 14 on representation of Netbios names */
3770 static void rfc1002mangle(char *target, char *source, unsigned int length)
3774 for (i = 0, j = 0; i < (length); i++) {
3775 /* mask a nibble at a time and encode */
3776 target[j] = 'A' + (0x0F & (source[i] >> 4));
3777 target[j+1] = 'A' + (0x0F & source[i]);
3784 bind_socket(struct TCP_Server_Info *server)
3787 if (server->srcaddr.ss_family != AF_UNSPEC) {
3788 /* Bind to the specified local IP address */
3789 struct socket *socket = server->ssocket;
3790 rc = socket->ops->bind(socket,
3791 (struct sockaddr *) &server->srcaddr,
3792 sizeof(server->srcaddr));
3794 struct sockaddr_in *saddr4;
3795 struct sockaddr_in6 *saddr6;
3796 saddr4 = (struct sockaddr_in *)&server->srcaddr;
3797 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
3798 if (saddr6->sin6_family == AF_INET6)
3799 cifs_server_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
3800 &saddr6->sin6_addr, rc);
3802 cifs_server_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
3803 &saddr4->sin_addr.s_addr, rc);
3810 ip_rfc1001_connect(struct TCP_Server_Info *server)
3814 * some servers require RFC1001 sessinit before sending
3815 * negprot - BB check reconnection in case where second
3816 * sessinit is sent but no second negprot
3818 struct rfc1002_session_packet *ses_init_buf;
3819 struct smb_hdr *smb_buf;
3820 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
3823 ses_init_buf->trailer.session_req.called_len = 32;
3825 if (server->server_RFC1001_name[0] != 0)
3826 rfc1002mangle(ses_init_buf->trailer.
3827 session_req.called_name,
3828 server->server_RFC1001_name,
3829 RFC1001_NAME_LEN_WITH_NULL);
3831 rfc1002mangle(ses_init_buf->trailer.
3832 session_req.called_name,
3833 DEFAULT_CIFS_CALLED_NAME,
3834 RFC1001_NAME_LEN_WITH_NULL);
3836 ses_init_buf->trailer.session_req.calling_len = 32;
3839 * calling name ends in null (byte 16) from old smb
3842 if (server->workstation_RFC1001_name[0] != 0)
3843 rfc1002mangle(ses_init_buf->trailer.
3844 session_req.calling_name,
3845 server->workstation_RFC1001_name,
3846 RFC1001_NAME_LEN_WITH_NULL);
3848 rfc1002mangle(ses_init_buf->trailer.
3849 session_req.calling_name,
3851 RFC1001_NAME_LEN_WITH_NULL);
3853 ses_init_buf->trailer.session_req.scope1 = 0;
3854 ses_init_buf->trailer.session_req.scope2 = 0;
3855 smb_buf = (struct smb_hdr *)ses_init_buf;
3857 /* sizeof RFC1002_SESSION_REQUEST with no scope */
3858 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
3859 rc = smb_send(server, smb_buf, 0x44);
3860 kfree(ses_init_buf);
3862 * RFC1001 layer in at least one server
3863 * requires very short break before negprot
3864 * presumably because not expecting negprot
3865 * to follow so fast. This is a simple
3866 * solution that works without
3867 * complicating the code and causes no
3868 * significant slowing down on mount
3871 usleep_range(1000, 2000);
3874 * else the negprot may still work without this
3875 * even though malloc failed
3882 generic_ip_connect(struct TCP_Server_Info *server)
3887 struct socket *socket = server->ssocket;
3888 struct sockaddr *saddr;
3890 saddr = (struct sockaddr *) &server->dstaddr;
3892 if (server->dstaddr.ss_family == AF_INET6) {
3893 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
3894 slen = sizeof(struct sockaddr_in6);
3897 sport = ((struct sockaddr_in *) saddr)->sin_port;
3898 slen = sizeof(struct sockaddr_in);
3902 if (socket == NULL) {
3903 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3904 IPPROTO_TCP, &socket, 1);
3906 cifs_server_dbg(VFS, "Error %d creating socket\n", rc);
3907 server->ssocket = NULL;
3911 /* BB other socket options to set KEEPALIVE, NODELAY? */
3912 cifs_dbg(FYI, "Socket created\n");
3913 server->ssocket = socket;
3914 socket->sk->sk_allocation = GFP_NOFS;
3915 if (sfamily == AF_INET6)
3916 cifs_reclassify_socket6(socket);
3918 cifs_reclassify_socket4(socket);
3921 rc = bind_socket(server);
3926 * Eventually check for other socket options to change from
3927 * the default. sock_setsockopt not used because it expects
3930 socket->sk->sk_rcvtimeo = 7 * HZ;
3931 socket->sk->sk_sndtimeo = 5 * HZ;
3933 /* make the bufsizes depend on wsize/rsize and max requests */
3934 if (server->noautotune) {
3935 if (socket->sk->sk_sndbuf < (200 * 1024))
3936 socket->sk->sk_sndbuf = 200 * 1024;
3937 if (socket->sk->sk_rcvbuf < (140 * 1024))
3938 socket->sk->sk_rcvbuf = 140 * 1024;
3941 if (server->tcp_nodelay) {
3943 rc = kernel_setsockopt(socket, SOL_TCP, TCP_NODELAY,
3944 (char *)&val, sizeof(val));
3946 cifs_dbg(FYI, "set TCP_NODELAY socket option error %d\n",
3950 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3951 socket->sk->sk_sndbuf,
3952 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3954 rc = socket->ops->connect(socket, saddr, slen,
3955 server->noblockcnt ? O_NONBLOCK : 0);
3957 * When mounting SMB root file systems, we do not want to block in
3958 * connect. Otherwise bail out and then let cifs_reconnect() perform
3959 * reconnect failover - if possible.
3961 if (server->noblockcnt && rc == -EINPROGRESS)
3964 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3965 sock_release(socket);
3966 server->ssocket = NULL;
3970 if (sport == htons(RFC1001_PORT))
3971 rc = ip_rfc1001_connect(server);
3977 ip_connect(struct TCP_Server_Info *server)
3980 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3981 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3983 if (server->dstaddr.ss_family == AF_INET6)
3984 sport = &addr6->sin6_port;
3986 sport = &addr->sin_port;
3991 /* try with 445 port at first */
3992 *sport = htons(CIFS_PORT);
3994 rc = generic_ip_connect(server);
3998 /* if it failed, try with 139 port */
3999 *sport = htons(RFC1001_PORT);
4002 return generic_ip_connect(server);
4005 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
4006 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
4008 /* if we are reconnecting then should we check to see if
4009 * any requested capabilities changed locally e.g. via
4010 * remount but we can not do much about it here
4011 * if they have (even if we could detect it by the following)
4012 * Perhaps we could add a backpointer to array of sb from tcon
4013 * or if we change to make all sb to same share the same
4014 * sb as NFS - then we only have one backpointer to sb.
4015 * What if we wanted to mount the server share twice once with
4016 * and once without posixacls or posix paths? */
4017 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
4019 if (vol_info && vol_info->no_linux_ext) {
4020 tcon->fsUnixInfo.Capability = 0;
4021 tcon->unix_ext = 0; /* Unix Extensions disabled */
4022 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
4024 } else if (vol_info)
4025 tcon->unix_ext = 1; /* Unix Extensions supported */
4027 if (tcon->unix_ext == 0) {
4028 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
4032 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
4033 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
4034 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
4035 /* check for reconnect case in which we do not
4036 want to change the mount behavior if we can avoid it */
4037 if (vol_info == NULL) {
4038 /* turn off POSIX ACL and PATHNAMES if not set
4039 originally at mount time */
4040 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
4041 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
4042 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
4043 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
4044 cifs_dbg(VFS, "POSIXPATH support change\n");
4045 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
4046 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
4047 cifs_dbg(VFS, "possible reconnect error\n");
4048 cifs_dbg(VFS, "server disabled POSIX path support\n");
4052 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
4053 cifs_dbg(VFS, "per-share encryption not supported yet\n");
4055 cap &= CIFS_UNIX_CAP_MASK;
4056 if (vol_info && vol_info->no_psx_acl)
4057 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
4058 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
4059 cifs_dbg(FYI, "negotiated posix acl support\n");
4061 cifs_sb->mnt_cifs_flags |=
4062 CIFS_MOUNT_POSIXACL;
4065 if (vol_info && vol_info->posix_paths == 0)
4066 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
4067 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
4068 cifs_dbg(FYI, "negotiate posix pathnames\n");
4070 cifs_sb->mnt_cifs_flags |=
4071 CIFS_MOUNT_POSIX_PATHS;
4074 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
4075 #ifdef CONFIG_CIFS_DEBUG2
4076 if (cap & CIFS_UNIX_FCNTL_CAP)
4077 cifs_dbg(FYI, "FCNTL cap\n");
4078 if (cap & CIFS_UNIX_EXTATTR_CAP)
4079 cifs_dbg(FYI, "EXTATTR cap\n");
4080 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
4081 cifs_dbg(FYI, "POSIX path cap\n");
4082 if (cap & CIFS_UNIX_XATTR_CAP)
4083 cifs_dbg(FYI, "XATTR cap\n");
4084 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
4085 cifs_dbg(FYI, "POSIX ACL cap\n");
4086 if (cap & CIFS_UNIX_LARGE_READ_CAP)
4087 cifs_dbg(FYI, "very large read cap\n");
4088 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
4089 cifs_dbg(FYI, "very large write cap\n");
4090 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
4091 cifs_dbg(FYI, "transport encryption cap\n");
4092 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
4093 cifs_dbg(FYI, "mandatory transport encryption cap\n");
4094 #endif /* CIFS_DEBUG2 */
4095 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
4096 if (vol_info == NULL) {
4097 cifs_dbg(FYI, "resetting capabilities failed\n");
4099 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");
4105 int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
4106 struct cifs_sb_info *cifs_sb)
4108 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
4110 spin_lock_init(&cifs_sb->tlink_tree_lock);
4111 cifs_sb->tlink_tree = RB_ROOT;
4113 cifs_sb->bsize = pvolume_info->bsize;
4115 * Temporarily set r/wsize for matching superblock. If we end up using
4116 * new sb then client will later negotiate it downward if needed.
4118 cifs_sb->rsize = pvolume_info->rsize;
4119 cifs_sb->wsize = pvolume_info->wsize;
4121 cifs_sb->mnt_uid = pvolume_info->linux_uid;
4122 cifs_sb->mnt_gid = pvolume_info->linux_gid;
4123 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
4124 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
4125 cifs_dbg(FYI, "file mode: %04ho dir mode: %04ho\n",
4126 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
4128 cifs_sb->actimeo = pvolume_info->actimeo;
4129 cifs_sb->local_nls = pvolume_info->local_nls;
4131 if (pvolume_info->nodfs)
4132 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_DFS;
4133 if (pvolume_info->noperm)
4134 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
4135 if (pvolume_info->setuids)
4136 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
4137 if (pvolume_info->setuidfromacl)
4138 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
4139 if (pvolume_info->server_ino)
4140 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
4141 if (pvolume_info->remap)
4142 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
4143 if (pvolume_info->sfu_remap)
4144 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
4145 if (pvolume_info->no_xattr)
4146 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
4147 if (pvolume_info->sfu_emul)
4148 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
4149 if (pvolume_info->nobrl)
4150 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
4151 if (pvolume_info->nohandlecache)
4152 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_HANDLE_CACHE;
4153 if (pvolume_info->nostrictsync)
4154 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
4155 if (pvolume_info->mand_lock)
4156 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
4157 if (pvolume_info->rwpidforward)
4158 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
4159 if (pvolume_info->mode_ace)
4160 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MODE_FROM_SID;
4161 if (pvolume_info->cifs_acl)
4162 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
4163 if (pvolume_info->backupuid_specified) {
4164 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
4165 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
4167 if (pvolume_info->backupgid_specified) {
4168 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
4169 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
4171 if (pvolume_info->override_uid)
4172 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
4173 if (pvolume_info->override_gid)
4174 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
4175 if (pvolume_info->dynperm)
4176 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
4177 if (pvolume_info->fsc)
4178 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
4179 if (pvolume_info->multiuser)
4180 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
4181 CIFS_MOUNT_NO_PERM);
4182 if (pvolume_info->strict_io)
4183 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
4184 if (pvolume_info->direct_io) {
4185 cifs_dbg(FYI, "mounting share using direct i/o\n");
4186 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
4188 if (pvolume_info->cache_ro) {
4189 cifs_dbg(VFS, "mounting share with read only caching. Ensure that the share will not be modified while in use.\n");
4190 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RO_CACHE;
4191 } else if (pvolume_info->cache_rw) {
4192 cifs_dbg(VFS, "mounting share in single client RW caching mode. Ensure that no other systems will be accessing the share.\n");
4193 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_RO_CACHE |
4194 CIFS_MOUNT_RW_CACHE);
4196 if (pvolume_info->mfsymlinks) {
4197 if (pvolume_info->sfu_emul) {
4199 * Our SFU ("Services for Unix" emulation does not allow
4200 * creating symlinks but does allow reading existing SFU
4201 * symlinks (it does allow both creating and reading SFU
4202 * style mknod and FIFOs though). When "mfsymlinks" and
4203 * "sfu" are both enabled at the same time, it allows
4204 * reading both types of symlinks, but will only create
4205 * them with mfsymlinks format. This allows better
4206 * Apple compatibility (probably better for Samba too)
4207 * while still recognizing old Windows style symlinks.
4209 cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
4211 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
4214 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
4215 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
4217 if (pvolume_info->prepath) {
4218 cifs_sb->prepath = kstrdup(pvolume_info->prepath, GFP_KERNEL);
4219 if (cifs_sb->prepath == NULL)
4227 cifs_cleanup_volume_info_contents(struct smb_vol *volume_info)
4229 kfree(volume_info->username);
4230 kzfree(volume_info->password);
4231 kfree(volume_info->UNC);
4232 kfree(volume_info->domainname);
4233 kfree(volume_info->iocharset);
4234 kfree(volume_info->prepath);
4238 cifs_cleanup_volume_info(struct smb_vol *volume_info)
4242 cifs_cleanup_volume_info_contents(volume_info);
4246 /* Release all succeed connections */
4247 static inline void mount_put_conns(struct cifs_sb_info *cifs_sb,
4249 struct TCP_Server_Info *server,
4250 struct cifs_ses *ses, struct cifs_tcon *tcon)
4255 cifs_put_tcon(tcon);
4257 cifs_put_smb_ses(ses);
4259 cifs_put_tcp_session(server, 0);
4260 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
4264 /* Get connections for tcp, ses and tcon */
4265 static int mount_get_conns(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
4267 struct TCP_Server_Info **nserver,
4268 struct cifs_ses **nses, struct cifs_tcon **ntcon)
4271 struct TCP_Server_Info *server;
4272 struct cifs_ses *ses;
4273 struct cifs_tcon *tcon;
4281 /* get a reference to a tcp session */
4282 server = cifs_get_tcp_session(vol);
4283 if (IS_ERR(server)) {
4284 rc = PTR_ERR(server);
4290 if ((vol->max_credits < 20) || (vol->max_credits > 60000))
4291 server->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
4293 server->max_credits = vol->max_credits;
4295 /* get a reference to a SMB session */
4296 ses = cifs_get_smb_ses(server, vol);
4304 if ((vol->persistent == true) && (!(ses->server->capabilities &
4305 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES))) {
4306 cifs_server_dbg(VFS, "persistent handles not supported by server\n");
4310 /* search for existing tcon to this server share */
4311 tcon = cifs_get_tcon(ses, vol);
4319 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
4320 if (tcon->posix_extensions)
4321 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
4323 /* tell server which Unix caps we support */
4324 if (cap_unix(tcon->ses)) {
4326 * reset of caps checks mount to see if unix extensions disabled
4327 * for just this mount.
4329 reset_cifs_unix_caps(*xid, tcon, cifs_sb, vol);
4330 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
4331 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
4332 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP))
4335 tcon->unix_ext = 0; /* server does not support them */
4337 /* do not care if a following call succeed - informational */
4338 if (!tcon->pipe && server->ops->qfs_tcon) {
4339 server->ops->qfs_tcon(*xid, tcon, cifs_sb);
4340 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE) {
4341 if (tcon->fsDevInfo.DeviceCharacteristics &
4342 cpu_to_le32(FILE_READ_ONLY_DEVICE))
4343 cifs_dbg(VFS, "mounted to read only share\n");
4344 else if ((cifs_sb->mnt_cifs_flags &
4345 CIFS_MOUNT_RW_CACHE) == 0)
4346 cifs_dbg(VFS, "read only mount of RW share\n");
4347 /* no need to log a RW mount of a typical RW share */
4351 cifs_sb->wsize = server->ops->negotiate_wsize(tcon, vol);
4352 cifs_sb->rsize = server->ops->negotiate_rsize(tcon, vol);
4357 static int mount_setup_tlink(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
4358 struct cifs_tcon *tcon)
4360 struct tcon_link *tlink;
4362 /* hang the tcon off of the superblock */
4363 tlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4367 tlink->tl_uid = ses->linux_uid;
4368 tlink->tl_tcon = tcon;
4369 tlink->tl_time = jiffies;
4370 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
4371 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4373 cifs_sb->master_tlink = tlink;
4374 spin_lock(&cifs_sb->tlink_tree_lock);
4375 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4376 spin_unlock(&cifs_sb->tlink_tree_lock);
4378 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4383 #ifdef CONFIG_CIFS_DFS_UPCALL
4385 * cifs_build_path_to_root returns full path to root when we do not have an
4386 * exiting connection (tcon)
4389 build_unc_path_to_root(const struct smb_vol *vol,
4390 const struct cifs_sb_info *cifs_sb, bool useppath)
4392 char *full_path, *pos;
4393 unsigned int pplen = useppath && vol->prepath ?
4394 strlen(vol->prepath) + 1 : 0;
4395 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
4397 if (unc_len > MAX_TREE_SIZE)
4398 return ERR_PTR(-EINVAL);
4400 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
4401 if (full_path == NULL)
4402 return ERR_PTR(-ENOMEM);
4404 memcpy(full_path, vol->UNC, unc_len);
4405 pos = full_path + unc_len;
4408 *pos = CIFS_DIR_SEP(cifs_sb);
4409 memcpy(pos + 1, vol->prepath, pplen);
4413 *pos = '\0'; /* add trailing null */
4414 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
4415 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
4420 * expand_dfs_referral - Perform a dfs referral query and update the cifs_sb
4423 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
4424 * to a string containing updated options for the submount. Otherwise it
4425 * will be left untouched.
4427 * Returns the rc from get_dfs_path to the caller, which can be used to
4428 * determine whether there were referrals.
4431 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
4432 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
4436 struct dfs_info3_param referral = {0};
4437 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
4439 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4442 full_path = build_unc_path_to_root(volume_info, cifs_sb, true);
4443 if (IS_ERR(full_path))
4444 return PTR_ERR(full_path);
4446 /* For DFS paths, skip the first '\' of the UNC */
4447 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
4449 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4450 ref_path, &referral, NULL);
4452 char *fake_devname = NULL;
4454 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
4455 full_path + 1, &referral,
4457 free_dfs_info_param(&referral);
4459 if (IS_ERR(mdata)) {
4460 rc = PTR_ERR(mdata);
4463 cifs_cleanup_volume_info_contents(volume_info);
4464 rc = cifs_setup_volume_info(volume_info, mdata,
4465 fake_devname, false);
4467 kfree(fake_devname);
4468 kfree(cifs_sb->mountdata);
4469 cifs_sb->mountdata = mdata;
4475 static inline int get_next_dfs_tgt(const char *path,
4476 struct dfs_cache_tgt_list *tgt_list,
4477 struct dfs_cache_tgt_iterator **tgt_it)
4480 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
4482 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
4483 return !*tgt_it ? -EHOSTDOWN : 0;
4486 static int update_vol_info(const struct dfs_cache_tgt_iterator *tgt_it,
4487 struct smb_vol *fake_vol, struct smb_vol *vol)
4489 const char *tgt = dfs_cache_get_tgt_name(tgt_it);
4490 int len = strlen(tgt) + 2;
4493 new_unc = kmalloc(len, GFP_KERNEL);
4496 scnprintf(new_unc, len, "\\%s", tgt);
4501 if (fake_vol->prepath) {
4502 kfree(vol->prepath);
4503 vol->prepath = fake_vol->prepath;
4504 fake_vol->prepath = NULL;
4506 memcpy(&vol->dstaddr, &fake_vol->dstaddr, sizeof(vol->dstaddr));
4511 static int setup_dfs_tgt_conn(const char *path,
4512 const struct dfs_cache_tgt_iterator *tgt_it,
4513 struct cifs_sb_info *cifs_sb,
4514 struct smb_vol *vol,
4516 struct TCP_Server_Info **server,
4517 struct cifs_ses **ses,
4518 struct cifs_tcon **tcon)
4521 struct dfs_info3_param ref = {0};
4522 char *mdata = NULL, *fake_devname = NULL;
4523 struct smb_vol fake_vol = {NULL};
4525 cifs_dbg(FYI, "%s: dfs path: %s\n", __func__, path);
4527 rc = dfs_cache_get_tgt_referral(path, tgt_it, &ref);
4531 mdata = cifs_compose_mount_options(cifs_sb->mountdata, path, &ref,
4533 free_dfs_info_param(&ref);
4535 if (IS_ERR(mdata)) {
4536 rc = PTR_ERR(mdata);
4539 cifs_dbg(FYI, "%s: fake_devname: %s\n", __func__, fake_devname);
4540 rc = cifs_setup_volume_info(&fake_vol, mdata, fake_devname,
4544 kfree(fake_devname);
4548 * We use a 'fake_vol' here because we need pass it down to the
4549 * mount_{get,put} functions to test connection against new DFS
4552 mount_put_conns(cifs_sb, *xid, *server, *ses, *tcon);
4553 rc = mount_get_conns(&fake_vol, cifs_sb, xid, server, ses,
4557 * We were able to connect to new target server.
4558 * Update current volume info with new target server.
4560 rc = update_vol_info(tgt_it, &fake_vol, vol);
4563 cifs_cleanup_volume_info_contents(&fake_vol);
4567 static int mount_do_dfs_failover(const char *path,
4568 struct cifs_sb_info *cifs_sb,
4569 struct smb_vol *vol,
4570 struct cifs_ses *root_ses,
4572 struct TCP_Server_Info **server,
4573 struct cifs_ses **ses,
4574 struct cifs_tcon **tcon)
4577 struct dfs_cache_tgt_list tgt_list;
4578 struct dfs_cache_tgt_iterator *tgt_it = NULL;
4580 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4583 rc = dfs_cache_noreq_find(path, NULL, &tgt_list);
4588 /* Get next DFS target server - if any */
4589 rc = get_next_dfs_tgt(path, &tgt_list, &tgt_it);
4592 /* Connect to next DFS target */
4593 rc = setup_dfs_tgt_conn(path, tgt_it, cifs_sb, vol, xid, server,
4595 if (!rc || rc == -EACCES || rc == -EOPNOTSUPP)
4600 * Update DFS target hint in DFS referral cache with the target
4601 * server we successfully reconnected to.
4603 rc = dfs_cache_update_tgthint(*xid, root_ses ? root_ses : *ses,
4605 cifs_remap(cifs_sb), path,
4608 dfs_cache_free_tgts(&tgt_list);
4614 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
4615 const char *devname, bool is_smb3)
4619 if (cifs_parse_mount_options(mount_data, devname, volume_info, is_smb3))
4622 if (volume_info->nullauth) {
4623 cifs_dbg(FYI, "Anonymous login\n");
4624 kfree(volume_info->username);
4625 volume_info->username = NULL;
4626 } else if (volume_info->username) {
4627 /* BB fixme parse for domain name here */
4628 cifs_dbg(FYI, "Username: %s\n", volume_info->username);
4630 cifs_dbg(VFS, "No username specified\n");
4631 /* In userspace mount helper we can get user name from alternate
4632 locations such as env variables and files on disk */
4636 /* this is needed for ASCII cp to Unicode converts */
4637 if (volume_info->iocharset == NULL) {
4638 /* load_nls_default cannot return null */
4639 volume_info->local_nls = load_nls_default();
4641 volume_info->local_nls = load_nls(volume_info->iocharset);
4642 if (volume_info->local_nls == NULL) {
4643 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
4644 volume_info->iocharset);
4653 cifs_get_volume_info(char *mount_data, const char *devname, bool is_smb3)
4656 struct smb_vol *volume_info;
4658 volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
4660 return ERR_PTR(-ENOMEM);
4662 rc = cifs_setup_volume_info(volume_info, mount_data, devname, is_smb3);
4664 cifs_cleanup_volume_info(volume_info);
4665 volume_info = ERR_PTR(rc);
4672 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
4674 struct cifs_tcon *tcon,
4675 struct cifs_sb_info *cifs_sb,
4682 int skip = added_treename ? 1 : 0;
4684 sep = CIFS_DIR_SEP(cifs_sb);
4687 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
4689 /* skip separators */
4694 /* next separator */
4695 while (*s && *s != sep)
4698 * if the treename is added, we then have to skip the first
4699 * part within the separators
4706 * temporarily null-terminate the path at the end of
4707 * the current component
4711 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4719 * Check if path is remote (e.g. a DFS share). Return -EREMOTE if it is,
4722 static int is_path_remote(struct cifs_sb_info *cifs_sb, struct smb_vol *vol,
4723 const unsigned int xid,
4724 struct TCP_Server_Info *server,
4725 struct cifs_tcon *tcon)
4730 if (!server->ops->is_path_accessible)
4734 * cifs_build_path_to_root works only when we have a valid tcon
4736 full_path = cifs_build_path_to_root(vol, cifs_sb, tcon,
4737 tcon->Flags & SMB_SHARE_IS_IN_DFS);
4738 if (full_path == NULL)
4741 cifs_dbg(FYI, "%s: full_path: %s\n", __func__, full_path);
4743 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4745 if (rc != 0 && rc != -EREMOTE) {
4750 if (rc != -EREMOTE) {
4751 rc = cifs_are_all_path_components_accessible(server, xid, tcon,
4752 cifs_sb, full_path, tcon->Flags & SMB_SHARE_IS_IN_DFS);
4754 cifs_server_dbg(VFS, "cannot query dirs between root and final path, "
4755 "enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
4756 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
4765 #ifdef CONFIG_CIFS_DFS_UPCALL
4766 static inline void set_root_tcon(struct cifs_sb_info *cifs_sb,
4767 struct cifs_tcon *tcon,
4768 struct cifs_tcon **root)
4770 spin_lock(&cifs_tcp_ses_lock);
4772 tcon->remap = cifs_remap(cifs_sb);
4773 spin_unlock(&cifs_tcp_ses_lock);
4777 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4781 struct cifs_ses *ses;
4782 struct cifs_tcon *root_tcon = NULL;
4783 struct cifs_tcon *tcon = NULL;
4784 struct TCP_Server_Info *server;
4785 char *root_path = NULL, *full_path = NULL;
4786 char *old_mountdata, *origin_mountdata = NULL;
4789 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4791 /* If not a standalone DFS root, then check if path is remote */
4792 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls,
4793 cifs_remap(cifs_sb), vol->UNC + 1, NULL,
4796 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4804 * If first DFS target server went offline and we failed to connect it,
4805 * server and ses pointers are NULL at this point, though we still have
4806 * chance to get a cached DFS referral in expand_dfs_referral() and
4807 * retry next target available in it.
4809 * If a NULL ses ptr is passed to dfs_cache_find(), a lookup will be
4810 * performed against DFS path and *no* requests will be sent to server
4811 * for any new DFS referrals. Hence it's safe to skip checking whether
4812 * server or ses ptr is NULL.
4814 if (rc == -EACCES || rc == -EOPNOTSUPP)
4817 root_path = build_unc_path_to_root(vol, cifs_sb, false);
4818 if (IS_ERR(root_path)) {
4819 rc = PTR_ERR(root_path);
4824 full_path = build_unc_path_to_root(vol, cifs_sb, true);
4825 if (IS_ERR(full_path)) {
4826 rc = PTR_ERR(full_path);
4831 * Perform an unconditional check for whether there are DFS
4832 * referrals for this path without prefix, to provide support
4833 * for DFS referrals from w2k8 servers which don't seem to respond
4834 * with PATH_NOT_COVERED to requests that include the prefix.
4835 * Chase the referral if found, otherwise continue normally.
4837 old_mountdata = cifs_sb->mountdata;
4838 (void)expand_dfs_referral(xid, ses, vol, cifs_sb, false);
4840 if (cifs_sb->mountdata == NULL) {
4845 /* Save DFS root volume information for DFS refresh worker */
4846 origin_mountdata = kstrndup(cifs_sb->mountdata,
4847 strlen(cifs_sb->mountdata), GFP_KERNEL);
4848 if (!origin_mountdata) {
4853 if (cifs_sb->mountdata != old_mountdata) {
4854 /* If we were redirected, reconnect to new target server */
4855 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4856 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4859 if (rc == -EACCES || rc == -EOPNOTSUPP)
4861 /* Perform DFS failover to any other DFS targets */
4862 rc = mount_do_dfs_failover(root_path + 1, cifs_sb, vol, NULL,
4863 &xid, &server, &ses, &tcon);
4869 root_path = build_unc_path_to_root(vol, cifs_sb, false);
4870 if (IS_ERR(root_path)) {
4871 rc = PTR_ERR(root_path);
4875 /* Cache out resolved root server */
4876 (void)dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4877 root_path + 1, NULL, NULL);
4881 set_root_tcon(cifs_sb, tcon, &root_tcon);
4883 for (count = 1; ;) {
4885 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4886 if (!rc || rc != -EREMOTE)
4890 * BB: when we implement proper loop detection,
4891 * we will remove this check. But now we need it
4892 * to prevent an indefinite loop if 'DFS tree' is
4893 * misconfigured (i.e. has loops).
4895 if (count++ > MAX_NESTED_LINKS) {
4901 full_path = build_unc_path_to_root(vol, cifs_sb, true);
4902 if (IS_ERR(full_path)) {
4903 rc = PTR_ERR(full_path);
4908 old_mountdata = cifs_sb->mountdata;
4909 rc = expand_dfs_referral(xid, root_tcon->ses, vol, cifs_sb,
4914 if (cifs_sb->mountdata != old_mountdata) {
4915 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4916 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses,
4919 * Ensure that DFS referrals go through new root server.
4922 (tcon->share_flags & (SHI1005_FLAGS_DFS |
4923 SHI1005_FLAGS_DFS_ROOT))) {
4924 cifs_put_tcon(root_tcon);
4925 set_root_tcon(cifs_sb, tcon, &root_tcon);
4929 if (rc == -EACCES || rc == -EOPNOTSUPP)
4931 /* Perform DFS failover to any other DFS targets */
4932 rc = mount_do_dfs_failover(full_path + 1, cifs_sb, vol,
4933 root_tcon->ses, &xid,
4934 &server, &ses, &tcon);
4935 if (rc == -EACCES || rc == -EOPNOTSUPP || !server ||
4940 cifs_put_tcon(root_tcon);
4945 spin_lock(&cifs_tcp_ses_lock);
4946 if (!tcon->dfs_path) {
4947 /* Save full path in new tcon to do failover when reconnecting tcons */
4948 tcon->dfs_path = full_path;
4950 tcon->remap = cifs_remap(cifs_sb);
4952 cifs_sb->origin_fullpath = kstrndup(tcon->dfs_path,
4953 strlen(tcon->dfs_path),
4955 if (!cifs_sb->origin_fullpath) {
4956 spin_unlock(&cifs_tcp_ses_lock);
4960 spin_unlock(&cifs_tcp_ses_lock);
4962 rc = dfs_cache_add_vol(origin_mountdata, vol, cifs_sb->origin_fullpath);
4964 kfree(cifs_sb->origin_fullpath);
4968 * After reconnecting to a different server, unique ids won't
4969 * match anymore, so we disable serverino. This prevents
4970 * dentry revalidation to think the dentry are stale (ESTALE).
4972 cifs_autodisable_serverino(cifs_sb);
4974 * Force the use of prefix path to support failover on DFS paths that
4975 * resolve to targets that have different prefix paths.
4977 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
4978 kfree(cifs_sb->prepath);
4979 cifs_sb->prepath = vol->prepath;
4980 vol->prepath = NULL;
4984 cifs_try_adding_channels(ses);
4985 return mount_setup_tlink(cifs_sb, ses, tcon);
4990 kfree(origin_mountdata);
4991 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4995 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4999 struct cifs_ses *ses;
5000 struct cifs_tcon *tcon;
5001 struct TCP_Server_Info *server;
5003 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
5008 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
5017 return mount_setup_tlink(cifs_sb, ses, tcon);
5020 mount_put_conns(cifs_sb, xid, server, ses, tcon);
5026 * Issue a TREE_CONNECT request.
5029 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
5030 const char *tree, struct cifs_tcon *tcon,
5031 const struct nls_table *nls_codepage)
5033 struct smb_hdr *smb_buffer;
5034 struct smb_hdr *smb_buffer_response;
5037 unsigned char *bcc_ptr;
5040 __u16 bytes_left, count;
5045 smb_buffer = cifs_buf_get();
5046 if (smb_buffer == NULL)
5049 smb_buffer_response = smb_buffer;
5051 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
5052 NULL /*no tid */ , 4 /*wct */ );
5054 smb_buffer->Mid = get_next_mid(ses->server);
5055 smb_buffer->Uid = ses->Suid;
5056 pSMB = (TCONX_REQ *) smb_buffer;
5057 pSMBr = (TCONX_RSP *) smb_buffer_response;
5059 pSMB->AndXCommand = 0xFF;
5060 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
5061 bcc_ptr = &pSMB->Password[0];
5062 if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
5063 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
5064 *bcc_ptr = 0; /* password is null byte */
5065 bcc_ptr++; /* skip password */
5066 /* already aligned so no need to do it below */
5068 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
5069 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
5070 specified as required (when that support is added to
5071 the vfs in the future) as only NTLM or the much
5072 weaker LANMAN (which we do not send by default) is accepted
5073 by Samba (not sure whether other servers allow
5074 NTLMv2 password here) */
5075 #ifdef CONFIG_CIFS_WEAK_PW_HASH
5076 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
5077 (ses->sectype == LANMAN))
5078 calc_lanman_hash(tcon->password, ses->server->cryptkey,
5079 ses->server->sec_mode &
5080 SECMODE_PW_ENCRYPT ? true : false,
5083 #endif /* CIFS_WEAK_PW_HASH */
5084 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
5085 bcc_ptr, nls_codepage);
5087 cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
5089 cifs_buf_release(smb_buffer);
5093 bcc_ptr += CIFS_AUTH_RESP_SIZE;
5094 if (ses->capabilities & CAP_UNICODE) {
5095 /* must align unicode strings */
5096 *bcc_ptr = 0; /* null byte password */
5101 if (ses->server->sign)
5102 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
5104 if (ses->capabilities & CAP_STATUS32) {
5105 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
5107 if (ses->capabilities & CAP_DFS) {
5108 smb_buffer->Flags2 |= SMBFLG2_DFS;
5110 if (ses->capabilities & CAP_UNICODE) {
5111 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
5113 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
5114 6 /* max utf8 char length in bytes */ *
5115 (/* server len*/ + 256 /* share len */), nls_codepage);
5116 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
5117 bcc_ptr += 2; /* skip trailing null */
5118 } else { /* ASCII */
5119 strcpy(bcc_ptr, tree);
5120 bcc_ptr += strlen(tree) + 1;
5122 strcpy(bcc_ptr, "?????");
5123 bcc_ptr += strlen("?????");
5125 count = bcc_ptr - &pSMB->Password[0];
5126 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
5127 pSMB->hdr.smb_buf_length) + count);
5128 pSMB->ByteCount = cpu_to_le16(count);
5130 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
5133 /* above now done in SendReceive */
5137 tcon->tidStatus = CifsGood;
5138 tcon->need_reconnect = false;
5139 tcon->tid = smb_buffer_response->Tid;
5140 bcc_ptr = pByteArea(smb_buffer_response);
5141 bytes_left = get_bcc(smb_buffer_response);
5142 length = strnlen(bcc_ptr, bytes_left - 2);
5143 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
5149 /* skip service field (NB: this field is always ASCII) */
5151 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
5152 (bcc_ptr[2] == 'C')) {
5153 cifs_dbg(FYI, "IPC connection\n");
5157 } else if (length == 2) {
5158 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
5159 /* the most common case */
5160 cifs_dbg(FYI, "disk share connection\n");
5163 bcc_ptr += length + 1;
5164 bytes_left -= (length + 1);
5165 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
5167 /* mostly informational -- no need to fail on error here */
5168 kfree(tcon->nativeFileSystem);
5169 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
5170 bytes_left, is_unicode,
5173 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
5175 if ((smb_buffer_response->WordCount == 3) ||
5176 (smb_buffer_response->WordCount == 7))
5177 /* field is in same location */
5178 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
5181 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
5184 cifs_buf_release(smb_buffer);
5188 static void delayed_free(struct rcu_head *p)
5190 struct cifs_sb_info *sbi = container_of(p, struct cifs_sb_info, rcu);
5191 unload_nls(sbi->local_nls);
5196 cifs_umount(struct cifs_sb_info *cifs_sb)
5198 struct rb_root *root = &cifs_sb->tlink_tree;
5199 struct rb_node *node;
5200 struct tcon_link *tlink;
5202 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
5204 spin_lock(&cifs_sb->tlink_tree_lock);
5205 while ((node = rb_first(root))) {
5206 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
5207 cifs_get_tlink(tlink);
5208 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
5209 rb_erase(node, root);
5211 spin_unlock(&cifs_sb->tlink_tree_lock);
5212 cifs_put_tlink(tlink);
5213 spin_lock(&cifs_sb->tlink_tree_lock);
5215 spin_unlock(&cifs_sb->tlink_tree_lock);
5217 kfree(cifs_sb->mountdata);
5218 kfree(cifs_sb->prepath);
5219 #ifdef CONFIG_CIFS_DFS_UPCALL
5220 dfs_cache_del_vol(cifs_sb->origin_fullpath);
5221 kfree(cifs_sb->origin_fullpath);
5223 call_rcu(&cifs_sb->rcu, delayed_free);
5227 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
5230 struct TCP_Server_Info *server = cifs_ses_server(ses);
5232 if (!server->ops->need_neg || !server->ops->negotiate)
5235 /* only send once per connect */
5236 if (!server->ops->need_neg(server))
5239 rc = server->ops->negotiate(xid, ses);
5241 spin_lock(&GlobalMid_Lock);
5242 if (server->tcpStatus == CifsNeedNegotiate)
5243 server->tcpStatus = CifsGood;
5246 spin_unlock(&GlobalMid_Lock);
5253 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
5254 struct nls_table *nls_info)
5257 struct TCP_Server_Info *server = cifs_ses_server(ses);
5259 if (!ses->binding) {
5260 ses->capabilities = server->capabilities;
5261 if (linuxExtEnabled == 0)
5262 ses->capabilities &= (~server->vals->cap_unix);
5264 if (ses->auth_key.response) {
5265 cifs_dbg(FYI, "Free previous auth_key.response = %p\n",
5266 ses->auth_key.response);
5267 kfree(ses->auth_key.response);
5268 ses->auth_key.response = NULL;
5269 ses->auth_key.len = 0;
5273 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
5274 server->sec_mode, server->capabilities, server->timeAdj);
5276 if (server->ops->sess_setup)
5277 rc = server->ops->sess_setup(xid, ses, nls_info);
5280 cifs_server_dbg(VFS, "Send error in SessSetup = %d\n", rc);
5286 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
5288 vol->sectype = ses->sectype;
5290 /* krb5 is special, since we don't need username or pw */
5291 if (vol->sectype == Kerberos)
5294 return cifs_set_cifscreds(vol, ses);
5297 static struct cifs_tcon *
5298 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
5301 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
5302 struct cifs_ses *ses;
5303 struct cifs_tcon *tcon = NULL;
5304 struct smb_vol *vol_info;
5306 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
5307 if (vol_info == NULL)
5308 return ERR_PTR(-ENOMEM);
5310 vol_info->local_nls = cifs_sb->local_nls;
5311 vol_info->linux_uid = fsuid;
5312 vol_info->cred_uid = fsuid;
5313 vol_info->UNC = master_tcon->treeName;
5314 vol_info->retry = master_tcon->retry;
5315 vol_info->nocase = master_tcon->nocase;
5316 vol_info->nohandlecache = master_tcon->nohandlecache;
5317 vol_info->local_lease = master_tcon->local_lease;
5318 vol_info->no_linux_ext = !master_tcon->unix_ext;
5319 vol_info->sectype = master_tcon->ses->sectype;
5320 vol_info->sign = master_tcon->ses->sign;
5322 rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
5328 /* get a reference for the same TCP session */
5329 spin_lock(&cifs_tcp_ses_lock);
5330 ++master_tcon->ses->server->srv_count;
5331 spin_unlock(&cifs_tcp_ses_lock);
5333 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
5335 tcon = (struct cifs_tcon *)ses;
5336 cifs_put_tcp_session(master_tcon->ses->server, 0);
5340 tcon = cifs_get_tcon(ses, vol_info);
5342 cifs_put_smb_ses(ses);
5346 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
5347 if (tcon->posix_extensions)
5348 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
5351 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
5354 kfree(vol_info->username);
5355 kzfree(vol_info->password);
5362 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
5364 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
5367 /* find and return a tlink with given uid */
5368 static struct tcon_link *
5369 tlink_rb_search(struct rb_root *root, kuid_t uid)
5371 struct rb_node *node = root->rb_node;
5372 struct tcon_link *tlink;
5375 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
5377 if (uid_gt(tlink->tl_uid, uid))
5378 node = node->rb_left;
5379 else if (uid_lt(tlink->tl_uid, uid))
5380 node = node->rb_right;
5387 /* insert a tcon_link into the tree */
5389 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
5391 struct rb_node **new = &(root->rb_node), *parent = NULL;
5392 struct tcon_link *tlink;
5395 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
5398 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
5399 new = &((*new)->rb_left);
5401 new = &((*new)->rb_right);
5404 rb_link_node(&new_tlink->tl_rbnode, parent, new);
5405 rb_insert_color(&new_tlink->tl_rbnode, root);
5409 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
5412 * If the superblock doesn't refer to a multiuser mount, then just return
5413 * the master tcon for the mount.
5415 * First, search the rbtree for an existing tcon for this fsuid. If one
5416 * exists, then check to see if it's pending construction. If it is then wait
5417 * for construction to complete. Once it's no longer pending, check to see if
5418 * it failed and either return an error or retry construction, depending on
5421 * If one doesn't exist then insert a new tcon_link struct into the tree and
5422 * try to construct a new one.
5425 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
5428 kuid_t fsuid = current_fsuid();
5429 struct tcon_link *tlink, *newtlink;
5431 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
5432 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
5434 spin_lock(&cifs_sb->tlink_tree_lock);
5435 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5437 cifs_get_tlink(tlink);
5438 spin_unlock(&cifs_sb->tlink_tree_lock);
5440 if (tlink == NULL) {
5441 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
5442 if (newtlink == NULL)
5443 return ERR_PTR(-ENOMEM);
5444 newtlink->tl_uid = fsuid;
5445 newtlink->tl_tcon = ERR_PTR(-EACCES);
5446 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
5447 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
5448 cifs_get_tlink(newtlink);
5450 spin_lock(&cifs_sb->tlink_tree_lock);
5451 /* was one inserted after previous search? */
5452 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5454 cifs_get_tlink(tlink);
5455 spin_unlock(&cifs_sb->tlink_tree_lock);
5457 goto wait_for_construction;
5460 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
5461 spin_unlock(&cifs_sb->tlink_tree_lock);
5463 wait_for_construction:
5464 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
5465 TASK_INTERRUPTIBLE);
5467 cifs_put_tlink(tlink);
5468 return ERR_PTR(-ERESTARTSYS);
5471 /* if it's good, return it */
5472 if (!IS_ERR(tlink->tl_tcon))
5475 /* return error if we tried this already recently */
5476 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
5477 cifs_put_tlink(tlink);
5478 return ERR_PTR(-EACCES);
5481 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
5482 goto wait_for_construction;
5485 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
5486 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
5487 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
5489 if (IS_ERR(tlink->tl_tcon)) {
5490 cifs_put_tlink(tlink);
5491 return ERR_PTR(-EACCES);
5498 * periodic workqueue job that scans tcon_tree for a superblock and closes
5502 cifs_prune_tlinks(struct work_struct *work)
5504 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
5506 struct rb_root *root = &cifs_sb->tlink_tree;
5507 struct rb_node *node;
5508 struct rb_node *tmp;
5509 struct tcon_link *tlink;
5512 * Because we drop the spinlock in the loop in order to put the tlink
5513 * it's not guarded against removal of links from the tree. The only
5514 * places that remove entries from the tree are this function and
5515 * umounts. Because this function is non-reentrant and is canceled
5516 * before umount can proceed, this is safe.
5518 spin_lock(&cifs_sb->tlink_tree_lock);
5519 node = rb_first(root);
5520 while (node != NULL) {
5522 node = rb_next(tmp);
5523 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
5525 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
5526 atomic_read(&tlink->tl_count) != 0 ||
5527 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
5530 cifs_get_tlink(tlink);
5531 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
5532 rb_erase(tmp, root);
5534 spin_unlock(&cifs_sb->tlink_tree_lock);
5535 cifs_put_tlink(tlink);
5536 spin_lock(&cifs_sb->tlink_tree_lock);
5538 spin_unlock(&cifs_sb->tlink_tree_lock);
5540 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,