4 * Copyright (C) International Business Machines Corp., 2002,2011
7 * This library is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser General Public License as published
9 * by the Free Software Foundation; either version 2.1 of the License, or
10 * (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
15 * the GNU Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include <linux/net.h>
23 #include <linux/string.h>
24 #include <linux/sched/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, Opt_nodelete,
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_nodelete, "nodelete" },
145 { Opt_mapchars, "mapchars" }, /* SFU style */
146 { Opt_nomapchars, "nomapchars" },
147 { Opt_mapposix, "mapposix" }, /* SFM style */
148 { Opt_nomapposix, "nomapposix" },
150 { Opt_nosfu, "nosfu" },
151 { Opt_nodfs, "nodfs" },
152 { Opt_posixpaths, "posixpaths" },
153 { Opt_noposixpaths, "noposixpaths" },
154 { Opt_nounix, "nounix" },
155 { Opt_nounix, "nolinux" },
156 { Opt_nounix, "noposix" },
157 { Opt_unix, "unix" },
158 { Opt_unix, "linux" },
159 { Opt_unix, "posix" },
160 { Opt_nocase, "nocase" },
161 { Opt_nocase, "ignorecase" },
163 { Opt_nobrl, "nobrl" },
164 { Opt_handlecache, "handlecache" },
165 { Opt_nohandlecache, "nohandlecache" },
166 { Opt_nobrl, "nolock" },
167 { Opt_forcemandatorylock, "forcemandatorylock" },
168 { Opt_forcemandatorylock, "forcemand" },
169 { Opt_setuids, "setuids" },
170 { Opt_nosetuids, "nosetuids" },
171 { Opt_setuidfromacl, "idsfromsid" },
172 { Opt_dynperm, "dynperm" },
173 { Opt_nodynperm, "nodynperm" },
174 { Opt_nohard, "nohard" },
175 { Opt_nosoft, "nosoft" },
176 { Opt_nointr, "nointr" },
177 { Opt_intr, "intr" },
178 { Opt_nostrictsync, "nostrictsync" },
179 { Opt_strictsync, "strictsync" },
180 { Opt_serverino, "serverino" },
181 { Opt_noserverino, "noserverino" },
182 { Opt_rwpidforward, "rwpidforward" },
183 { Opt_modesid, "modefromsid" },
184 { Opt_cifsacl, "cifsacl" },
185 { Opt_nocifsacl, "nocifsacl" },
187 { Opt_noacl, "noacl" },
188 { Opt_locallease, "locallease" },
189 { Opt_sign, "sign" },
190 { Opt_ignore_signature, "signloosely" },
191 { Opt_seal, "seal" },
192 { Opt_noac, "noac" },
194 { Opt_mfsymlinks, "mfsymlinks" },
195 { Opt_multiuser, "multiuser" },
196 { Opt_sloppy, "sloppy" },
197 { Opt_nosharesock, "nosharesock" },
198 { Opt_persistent, "persistenthandles"},
199 { Opt_nopersistent, "nopersistenthandles"},
200 { Opt_resilient, "resilienthandles"},
201 { Opt_noresilient, "noresilienthandles"},
202 { Opt_domainauto, "domainauto"},
204 { Opt_multichannel, "multichannel" },
205 { Opt_nomultichannel, "nomultichannel" },
207 { Opt_backupuid, "backupuid=%s" },
208 { Opt_backupgid, "backupgid=%s" },
209 { Opt_uid, "uid=%s" },
210 { Opt_cruid, "cruid=%s" },
211 { Opt_gid, "gid=%s" },
212 { Opt_file_mode, "file_mode=%s" },
213 { Opt_dirmode, "dirmode=%s" },
214 { Opt_dirmode, "dir_mode=%s" },
215 { Opt_port, "port=%s" },
216 { Opt_min_enc_offload, "esize=%s" },
217 { Opt_blocksize, "bsize=%s" },
218 { Opt_rsize, "rsize=%s" },
219 { Opt_wsize, "wsize=%s" },
220 { Opt_actimeo, "actimeo=%s" },
221 { Opt_handletimeout, "handletimeout=%s" },
222 { Opt_echo_interval, "echo_interval=%s" },
223 { Opt_max_credits, "max_credits=%s" },
224 { Opt_snapshot, "snapshot=%s" },
225 { Opt_max_channels, "max_channels=%s" },
226 { Opt_compress, "compress=%s" },
228 { Opt_blank_user, "user=" },
229 { Opt_blank_user, "username=" },
230 { Opt_user, "user=%s" },
231 { Opt_user, "username=%s" },
232 { Opt_blank_pass, "pass=" },
233 { Opt_blank_pass, "password=" },
234 { Opt_pass, "pass=%s" },
235 { Opt_pass, "password=%s" },
236 { Opt_blank_ip, "ip=" },
237 { Opt_blank_ip, "addr=" },
239 { Opt_ip, "addr=%s" },
240 { Opt_ignore, "unc=%s" },
241 { Opt_ignore, "target=%s" },
242 { Opt_ignore, "path=%s" },
243 { Opt_domain, "dom=%s" },
244 { Opt_domain, "domain=%s" },
245 { Opt_domain, "workgroup=%s" },
246 { Opt_srcaddr, "srcaddr=%s" },
247 { Opt_ignore, "prefixpath=%s" },
248 { Opt_iocharset, "iocharset=%s" },
249 { Opt_netbiosname, "netbiosname=%s" },
250 { Opt_servern, "servern=%s" },
251 { Opt_ver, "ver=%s" },
252 { Opt_vers, "vers=%s" },
253 { Opt_sec, "sec=%s" },
254 { Opt_cache, "cache=%s" },
256 { Opt_ignore, "cred" },
257 { Opt_ignore, "credentials" },
258 { Opt_ignore, "cred=%s" },
259 { Opt_ignore, "credentials=%s" },
260 { Opt_ignore, "guest" },
261 { Opt_ignore, "rw" },
262 { Opt_ignore, "ro" },
263 { Opt_ignore, "suid" },
264 { Opt_ignore, "nosuid" },
265 { Opt_ignore, "exec" },
266 { Opt_ignore, "noexec" },
267 { Opt_ignore, "nodev" },
268 { Opt_ignore, "noauto" },
269 { Opt_ignore, "dev" },
270 { Opt_ignore, "mand" },
271 { Opt_ignore, "nomand" },
272 { Opt_ignore, "relatime" },
273 { Opt_ignore, "_netdev" },
274 { Opt_rootfs, "rootfs" },
280 Opt_sec_krb5, Opt_sec_krb5i, Opt_sec_krb5p,
281 Opt_sec_ntlmsspi, Opt_sec_ntlmssp,
282 Opt_ntlm, Opt_sec_ntlmi, Opt_sec_ntlmv2,
283 Opt_sec_ntlmv2i, Opt_sec_lanman,
289 static const match_table_t cifs_secflavor_tokens = {
290 { Opt_sec_krb5, "krb5" },
291 { Opt_sec_krb5i, "krb5i" },
292 { Opt_sec_krb5p, "krb5p" },
293 { Opt_sec_ntlmsspi, "ntlmsspi" },
294 { Opt_sec_ntlmssp, "ntlmssp" },
295 { Opt_ntlm, "ntlm" },
296 { Opt_sec_ntlmi, "ntlmi" },
297 { Opt_sec_ntlmv2, "nontlm" },
298 { Opt_sec_ntlmv2, "ntlmv2" },
299 { Opt_sec_ntlmv2i, "ntlmv2i" },
300 { Opt_sec_lanman, "lanman" },
301 { Opt_sec_none, "none" },
303 { Opt_sec_err, NULL }
316 static const match_table_t cifs_cacheflavor_tokens = {
317 { Opt_cache_loose, "loose" },
318 { Opt_cache_strict, "strict" },
319 { Opt_cache_none, "none" },
320 { Opt_cache_ro, "ro" },
321 { Opt_cache_rw, "singleclient" },
322 { Opt_cache_err, NULL }
325 static const match_table_t cifs_smb_version_tokens = {
326 { Smb_1, SMB1_VERSION_STRING },
327 { Smb_20, SMB20_VERSION_STRING},
328 { Smb_21, SMB21_VERSION_STRING },
329 { Smb_30, SMB30_VERSION_STRING },
330 { Smb_302, SMB302_VERSION_STRING },
331 { Smb_302, ALT_SMB302_VERSION_STRING },
332 { Smb_311, SMB311_VERSION_STRING },
333 { Smb_311, ALT_SMB311_VERSION_STRING },
334 { Smb_3any, SMB3ANY_VERSION_STRING },
335 { Smb_default, SMBDEFAULT_VERSION_STRING },
336 { Smb_version_err, NULL }
339 static int ip_connect(struct TCP_Server_Info *server);
340 static int generic_ip_connect(struct TCP_Server_Info *server);
341 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
342 static void cifs_prune_tlinks(struct work_struct *work);
343 static char *extract_hostname(const char *unc);
346 * Resolve hostname and set ip addr in tcp ses. Useful for hostnames that may
347 * get their ip addresses changed at some point.
349 * This should be called with server->srv_mutex held.
351 #ifdef CONFIG_CIFS_DFS_UPCALL
352 static int reconn_set_ipaddr(struct TCP_Server_Info *server)
356 char *unc, *ipaddr = NULL;
358 if (!server->hostname)
361 len = strlen(server->hostname) + 3;
363 unc = kmalloc(len, GFP_KERNEL);
365 cifs_dbg(FYI, "%s: failed to create UNC path\n", __func__);
368 scnprintf(unc, len, "\\\\%s", server->hostname);
370 rc = dns_resolve_server_name_to_ip(unc, &ipaddr);
374 cifs_dbg(FYI, "%s: failed to resolve server part of %s to IP: %d\n",
375 __func__, server->hostname, rc);
379 spin_lock(&cifs_tcp_ses_lock);
380 rc = cifs_convert_address((struct sockaddr *)&server->dstaddr, ipaddr,
382 spin_unlock(&cifs_tcp_ses_lock);
388 static inline int reconn_set_ipaddr(struct TCP_Server_Info *server)
394 #ifdef CONFIG_CIFS_DFS_UPCALL
395 /* These functions must be called with server->srv_mutex held */
396 static void reconn_inval_dfs_target(struct TCP_Server_Info *server,
397 struct cifs_sb_info *cifs_sb,
398 struct dfs_cache_tgt_list *tgt_list,
399 struct dfs_cache_tgt_iterator **tgt_it)
403 if (!cifs_sb || !cifs_sb->origin_fullpath || !tgt_list ||
408 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
410 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
412 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
415 cifs_dbg(FYI, "%s: UNC: %s\n", __func__, cifs_sb->origin_fullpath);
417 name = dfs_cache_get_tgt_name(*tgt_it);
419 kfree(server->hostname);
421 server->hostname = extract_hostname(name);
422 if (IS_ERR(server->hostname)) {
424 "%s: failed to extract hostname from target: %ld\n",
425 __func__, PTR_ERR(server->hostname));
429 static inline int reconn_setup_dfs_targets(struct cifs_sb_info *cifs_sb,
430 struct dfs_cache_tgt_list *tl)
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);
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 pr_warn_once("trying to dequeue a deleted mid\n");
884 list_del_init(&mid->qhead);
885 mid->mid_flags |= MID_DELETED;
887 spin_unlock(&GlobalMid_Lock);
891 smb2_get_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
893 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
896 * SMB1 does not use credits.
898 if (server->vals->header_preamble_size)
901 return le16_to_cpu(shdr->CreditRequest);
905 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
906 char *buf, int malformed)
908 if (server->ops->check_trans2 &&
909 server->ops->check_trans2(mid, server, buf, malformed))
911 mid->credits_received = smb2_get_credits_from_hdr(buf, server);
913 mid->large_buf = server->large_buf;
914 /* Was previous buf put in mpx struct for multi-rsp? */
915 if (!mid->multiRsp) {
916 /* smb buffer will be freed by user thread */
917 if (server->large_buf)
918 server->bigbuf = NULL;
920 server->smallbuf = NULL;
922 dequeue_mid(mid, malformed);
925 static void clean_demultiplex_info(struct TCP_Server_Info *server)
929 /* take it off the list, if it's not already */
930 spin_lock(&cifs_tcp_ses_lock);
931 list_del_init(&server->tcp_ses_list);
932 spin_unlock(&cifs_tcp_ses_lock);
934 spin_lock(&GlobalMid_Lock);
935 server->tcpStatus = CifsExiting;
936 spin_unlock(&GlobalMid_Lock);
937 wake_up_all(&server->response_q);
939 /* check if we have blocked requests that need to free */
940 spin_lock(&server->req_lock);
941 if (server->credits <= 0)
943 spin_unlock(&server->req_lock);
945 * Although there should not be any requests blocked on this queue it
946 * can not hurt to be paranoid and try to wake up requests that may
947 * haven been blocked when more than 50 at time were on the wire to the
948 * same server - they now will see the session is in exit state and get
949 * out of SendReceive.
951 wake_up_all(&server->request_q);
952 /* give those requests time to exit */
954 if (cifs_rdma_enabled(server))
955 smbd_destroy(server);
956 if (server->ssocket) {
957 sock_release(server->ssocket);
958 server->ssocket = NULL;
961 if (!list_empty(&server->pending_mid_q)) {
962 struct list_head dispose_list;
963 struct mid_q_entry *mid_entry;
964 struct list_head *tmp, *tmp2;
966 INIT_LIST_HEAD(&dispose_list);
967 spin_lock(&GlobalMid_Lock);
968 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
969 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
970 cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
971 kref_get(&mid_entry->refcount);
972 mid_entry->mid_state = MID_SHUTDOWN;
973 list_move(&mid_entry->qhead, &dispose_list);
974 mid_entry->mid_flags |= MID_DELETED;
976 spin_unlock(&GlobalMid_Lock);
978 /* now walk dispose list and issue callbacks */
979 list_for_each_safe(tmp, tmp2, &dispose_list) {
980 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
981 cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
982 list_del_init(&mid_entry->qhead);
983 mid_entry->callback(mid_entry);
984 cifs_mid_q_entry_release(mid_entry);
986 /* 1/8th of sec is more than enough time for them to exit */
990 if (!list_empty(&server->pending_mid_q)) {
992 * mpx threads have not exited yet give them at least the smb
993 * send timeout time for long ops.
995 * Due to delays on oplock break requests, we need to wait at
996 * least 45 seconds before giving up on a request getting a
997 * response and going ahead and killing cifsd.
999 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
1002 * If threads still have not exited they are probably never
1003 * coming home not much else we can do but free the memory.
1007 kfree(server->hostname);
1010 length = atomic_dec_return(&tcpSesAllocCount);
1012 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
1016 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1019 char *buf = server->smallbuf;
1020 unsigned int pdu_length = server->pdu_size;
1022 /* make sure this will fit in a large buffer */
1023 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
1024 server->vals->header_preamble_size) {
1025 cifs_server_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
1026 cifs_reconnect(server);
1027 return -ECONNABORTED;
1030 /* switch to large buffer if too big for a small one */
1031 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
1032 server->large_buf = true;
1033 memcpy(server->bigbuf, buf, server->total_read);
1034 buf = server->bigbuf;
1037 /* now read the rest */
1038 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
1039 pdu_length - HEADER_SIZE(server) + 1
1040 + server->vals->header_preamble_size);
1044 server->total_read += length;
1046 dump_smb(buf, server->total_read);
1048 return cifs_handle_standard(server, mid);
1052 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1054 char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
1058 * We know that we received enough to get to the MID as we
1059 * checked the pdu_length earlier. Now check to see
1060 * if the rest of the header is OK. We borrow the length
1061 * var for the rest of the loop to avoid a new stack var.
1063 * 48 bytes is enough to display the header and a little bit
1064 * into the payload for debugging purposes.
1066 length = server->ops->check_message(buf, server->total_read, server);
1068 cifs_dump_mem("Bad SMB: ", buf,
1069 min_t(unsigned int, server->total_read, 48));
1071 if (server->ops->is_session_expired &&
1072 server->ops->is_session_expired(buf)) {
1073 cifs_reconnect(server);
1077 if (server->ops->is_status_pending &&
1078 server->ops->is_status_pending(buf, server))
1084 handle_mid(mid, server, buf, length);
1089 smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
1091 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
1094 * SMB1 does not use credits.
1096 if (server->vals->header_preamble_size)
1099 if (shdr->CreditRequest) {
1100 spin_lock(&server->req_lock);
1101 server->credits += le16_to_cpu(shdr->CreditRequest);
1102 spin_unlock(&server->req_lock);
1103 wake_up(&server->request_q);
1109 cifs_demultiplex_thread(void *p)
1111 int i, num_mids, length;
1112 struct TCP_Server_Info *server = p;
1113 unsigned int pdu_length;
1114 unsigned int next_offset;
1116 struct task_struct *task_to_wake = NULL;
1117 struct mid_q_entry *mids[MAX_COMPOUND];
1118 char *bufs[MAX_COMPOUND];
1119 unsigned int noreclaim_flag;
1121 noreclaim_flag = memalloc_noreclaim_save();
1122 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
1124 length = atomic_inc_return(&tcpSesAllocCount);
1126 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
1129 allow_kernel_signal(SIGKILL);
1130 while (server->tcpStatus != CifsExiting) {
1131 if (try_to_freeze())
1134 if (!allocate_buffers(server))
1137 server->large_buf = false;
1138 buf = server->smallbuf;
1139 pdu_length = 4; /* enough to get RFC1001 header */
1141 length = cifs_read_from_socket(server, buf, pdu_length);
1145 if (server->vals->header_preamble_size == 0)
1146 server->total_read = 0;
1148 server->total_read = length;
1151 * The right amount was read from socket - 4 bytes,
1152 * so we can now interpret the length field.
1154 pdu_length = get_rfc1002_length(buf);
1156 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
1157 if (!is_smb_response(server, buf[0]))
1160 server->pdu_size = pdu_length;
1162 /* make sure we have enough to get to the MID */
1163 if (server->pdu_size < HEADER_SIZE(server) - 1 -
1164 server->vals->header_preamble_size) {
1165 cifs_server_dbg(VFS, "SMB response too short (%u bytes)\n",
1167 cifs_reconnect(server);
1171 /* read down to the MID */
1172 length = cifs_read_from_socket(server,
1173 buf + server->vals->header_preamble_size,
1174 HEADER_SIZE(server) - 1
1175 - server->vals->header_preamble_size);
1178 server->total_read += length;
1180 if (server->ops->next_header) {
1181 next_offset = server->ops->next_header(buf);
1183 server->pdu_size = next_offset;
1186 memset(mids, 0, sizeof(mids));
1187 memset(bufs, 0, sizeof(bufs));
1190 if (server->ops->is_transform_hdr &&
1191 server->ops->receive_transform &&
1192 server->ops->is_transform_hdr(buf)) {
1193 length = server->ops->receive_transform(server,
1198 mids[0] = server->ops->find_mid(server, buf);
1202 if (!mids[0] || !mids[0]->receive)
1203 length = standard_receive3(server, mids[0]);
1205 length = mids[0]->receive(server, mids[0]);
1209 for (i = 0; i < num_mids; i++)
1211 cifs_mid_q_entry_release(mids[i]);
1215 server->lstrp = jiffies;
1217 for (i = 0; i < num_mids; i++) {
1218 if (mids[i] != NULL) {
1219 mids[i]->resp_buf_size = server->pdu_size;
1221 if (!mids[i]->multiRsp || mids[i]->multiEnd)
1222 mids[i]->callback(mids[i]);
1224 cifs_mid_q_entry_release(mids[i]);
1225 } else if (server->ops->is_oplock_break &&
1226 server->ops->is_oplock_break(bufs[i],
1228 smb2_add_credits_from_hdr(bufs[i], server);
1229 cifs_dbg(FYI, "Received oplock break\n");
1231 cifs_server_dbg(VFS, "No task to wake, unknown frame received! NumMids %d\n",
1232 atomic_read(&midCount));
1233 cifs_dump_mem("Received Data is: ", bufs[i],
1234 HEADER_SIZE(server));
1235 smb2_add_credits_from_hdr(bufs[i], server);
1236 #ifdef CONFIG_CIFS_DEBUG2
1237 if (server->ops->dump_detail)
1238 server->ops->dump_detail(bufs[i],
1240 cifs_dump_mids(server);
1241 #endif /* CIFS_DEBUG2 */
1245 if (pdu_length > server->pdu_size) {
1246 if (!allocate_buffers(server))
1248 pdu_length -= server->pdu_size;
1249 server->total_read = 0;
1250 server->large_buf = false;
1251 buf = server->smallbuf;
1254 } /* end while !EXITING */
1256 /* buffer usually freed in free_mid - need to free it here on exit */
1257 cifs_buf_release(server->bigbuf);
1258 if (server->smallbuf) /* no sense logging a debug message if NULL */
1259 cifs_small_buf_release(server->smallbuf);
1261 task_to_wake = xchg(&server->tsk, NULL);
1262 clean_demultiplex_info(server);
1264 /* if server->tsk was NULL then wait for a signal before exiting */
1265 if (!task_to_wake) {
1266 set_current_state(TASK_INTERRUPTIBLE);
1267 while (!signal_pending(current)) {
1269 set_current_state(TASK_INTERRUPTIBLE);
1271 set_current_state(TASK_RUNNING);
1274 memalloc_noreclaim_restore(noreclaim_flag);
1275 module_put_and_exit(0);
1278 /* extract the host portion of the UNC string */
1280 extract_hostname(const char *unc)
1286 /* skip double chars at beginning of string */
1287 /* BB: check validity of these bytes? */
1288 if (strlen(unc) < 3)
1289 return ERR_PTR(-EINVAL);
1290 for (src = unc; *src && *src == '\\'; src++)
1293 return ERR_PTR(-EINVAL);
1295 /* delimiter between hostname and sharename is always '\\' now */
1296 delim = strchr(src, '\\');
1298 return ERR_PTR(-EINVAL);
1301 dst = kmalloc((len + 1), GFP_KERNEL);
1303 return ERR_PTR(-ENOMEM);
1305 memcpy(dst, src, len);
1311 static int get_option_ul(substring_t args[], unsigned long *option)
1316 string = match_strdup(args);
1319 rc = kstrtoul(string, 0, option);
1325 static int get_option_uid(substring_t args[], kuid_t *result)
1327 unsigned long value;
1331 rc = get_option_ul(args, &value);
1335 uid = make_kuid(current_user_ns(), value);
1336 if (!uid_valid(uid))
1343 static int get_option_gid(substring_t args[], kgid_t *result)
1345 unsigned long value;
1349 rc = get_option_ul(args, &value);
1353 gid = make_kgid(current_user_ns(), value);
1354 if (!gid_valid(gid))
1361 static int cifs_parse_security_flavors(char *value,
1362 struct smb_vol *vol)
1365 substring_t args[MAX_OPT_ARGS];
1368 * With mount options, the last one should win. Reset any existing
1369 * settings back to default.
1371 vol->sectype = Unspecified;
1374 switch (match_token(value, cifs_secflavor_tokens, args)) {
1376 cifs_dbg(VFS, "sec=krb5p is not supported!\n");
1382 vol->sectype = Kerberos;
1384 case Opt_sec_ntlmsspi:
1387 case Opt_sec_ntlmssp:
1388 vol->sectype = RawNTLMSSP;
1394 vol->sectype = NTLM;
1396 case Opt_sec_ntlmv2i:
1399 case Opt_sec_ntlmv2:
1400 vol->sectype = NTLMv2;
1402 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1403 case Opt_sec_lanman:
1404 vol->sectype = LANMAN;
1411 cifs_dbg(VFS, "bad security option: %s\n", value);
1419 cifs_parse_cache_flavor(char *value, struct smb_vol *vol)
1421 substring_t args[MAX_OPT_ARGS];
1423 switch (match_token(value, cifs_cacheflavor_tokens, args)) {
1424 case Opt_cache_loose:
1425 vol->direct_io = false;
1426 vol->strict_io = false;
1427 vol->cache_ro = false;
1428 vol->cache_rw = false;
1430 case Opt_cache_strict:
1431 vol->direct_io = false;
1432 vol->strict_io = true;
1433 vol->cache_ro = false;
1434 vol->cache_rw = false;
1436 case Opt_cache_none:
1437 vol->direct_io = true;
1438 vol->strict_io = false;
1439 vol->cache_ro = false;
1440 vol->cache_rw = false;
1443 vol->direct_io = false;
1444 vol->strict_io = false;
1445 vol->cache_ro = true;
1446 vol->cache_rw = false;
1449 vol->direct_io = false;
1450 vol->strict_io = false;
1451 vol->cache_ro = false;
1452 vol->cache_rw = true;
1455 cifs_dbg(VFS, "bad cache= option: %s\n", value);
1462 cifs_parse_smb_version(char *value, struct smb_vol *vol, bool is_smb3)
1464 substring_t args[MAX_OPT_ARGS];
1466 switch (match_token(value, cifs_smb_version_tokens, args)) {
1467 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY
1469 if (disable_legacy_dialects) {
1470 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1474 cifs_dbg(VFS, "vers=1.0 (cifs) not permitted when mounting with smb3\n");
1477 cifs_dbg(VFS, "Use of the less secure dialect vers=1.0 is not recommended unless required for access to very old servers\n");
1478 vol->ops = &smb1_operations;
1479 vol->vals = &smb1_values;
1482 if (disable_legacy_dialects) {
1483 cifs_dbg(VFS, "mount with legacy dialect disabled\n");
1487 cifs_dbg(VFS, "vers=2.0 not permitted when mounting with smb3\n");
1490 vol->ops = &smb20_operations;
1491 vol->vals = &smb20_values;
1495 cifs_dbg(VFS, "vers=1.0 (cifs) mount not permitted when legacy dialects disabled\n");
1498 cifs_dbg(VFS, "vers=2.0 mount not permitted when legacy dialects disabled\n");
1500 #endif /* CIFS_ALLOW_INSECURE_LEGACY */
1502 vol->ops = &smb21_operations;
1503 vol->vals = &smb21_values;
1506 vol->ops = &smb30_operations;
1507 vol->vals = &smb30_values;
1510 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1511 vol->vals = &smb302_values;
1514 vol->ops = &smb311_operations;
1515 vol->vals = &smb311_values;
1518 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1519 vol->vals = &smb3any_values;
1522 vol->ops = &smb30_operations; /* currently identical with 3.0 */
1523 vol->vals = &smbdefault_values;
1526 cifs_dbg(VFS, "Unknown vers= option specified: %s\n", value);
1533 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1534 * fields with the result. Returns 0 on success and an error otherwise.
1537 cifs_parse_devname(const char *devname, struct smb_vol *vol)
1540 const char *delims = "/\\";
1543 if (unlikely(!devname || !*devname)) {
1544 cifs_dbg(VFS, "Device name not specified\n");
1548 /* make sure we have a valid UNC double delimiter prefix */
1549 len = strspn(devname, delims);
1553 /* find delimiter between host and sharename */
1554 pos = strpbrk(devname + 2, delims);
1558 /* skip past delimiter */
1561 /* now go until next delimiter or end of string */
1562 len = strcspn(pos, delims);
1564 /* move "pos" up to delimiter or NULL */
1566 vol->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
1570 convert_delimiter(vol->UNC, '\\');
1572 /* skip any delimiter */
1573 if (*pos == '/' || *pos == '\\')
1576 /* If pos is NULL then no prepath */
1580 vol->prepath = kstrdup(pos, GFP_KERNEL);
1588 cifs_parse_mount_options(const char *mountdata, const char *devname,
1589 struct smb_vol *vol, bool is_smb3)
1592 char *mountdata_copy = NULL, *options;
1593 unsigned int temp_len, i, j;
1595 short int override_uid = -1;
1596 short int override_gid = -1;
1597 bool uid_specified = false;
1598 bool gid_specified = false;
1599 bool sloppy = false;
1600 char *invalid = NULL;
1601 char *nodename = utsname()->nodename;
1602 char *string = NULL;
1603 char *tmp_end, *value;
1605 bool got_ip = false;
1606 bool got_version = false;
1607 unsigned short port = 0;
1608 struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1612 delim = separator[0];
1614 /* ensure we always start with zeroed-out smb_vol */
1615 memset(vol, 0, sizeof(*vol));
1618 * does not have to be perfect mapping since field is
1619 * informational, only used for servers that do not support
1620 * port 445 and it can be overridden at mount time
1622 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1623 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1624 vol->source_rfc1001_name[i] = toupper(nodename[i]);
1626 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1627 /* null target name indicates to use *SMBSERVR default called name
1628 if we end up sending RFC1001 session initialize */
1629 vol->target_rfc1001_name[0] = 0;
1630 vol->cred_uid = current_uid();
1631 vol->linux_uid = current_uid();
1632 vol->linux_gid = current_gid();
1633 vol->bsize = 1024 * 1024; /* can improve cp performance significantly */
1635 * default to SFM style remapping of seven reserved characters
1636 * unless user overrides it or we negotiate CIFS POSIX where
1637 * it is unnecessary. Can not simultaneously use more than one mapping
1638 * since then readdir could list files that open could not open
1642 /* default to only allowing write access to owner of the mount */
1643 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1645 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1646 /* default is always to request posix paths. */
1647 vol->posix_paths = 1;
1648 /* default to using server inode numbers where available */
1649 vol->server_ino = 1;
1651 /* default is to use strict cifs caching semantics */
1652 vol->strict_io = true;
1654 vol->actimeo = CIFS_DEF_ACTIMEO;
1656 /* Most clients set timeout to 0, allows server to use its default */
1657 vol->handle_timeout = 0; /* See MS-SMB2 spec section 2.2.14.2.12 */
1659 /* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1660 vol->ops = &smb30_operations;
1661 vol->vals = &smbdefault_values;
1663 vol->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1665 /* default to no multichannel (single server connection) */
1666 vol->multichannel = false;
1667 vol->max_channels = 1;
1670 goto cifs_parse_mount_err;
1672 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1673 if (!mountdata_copy)
1674 goto cifs_parse_mount_err;
1676 options = mountdata_copy;
1677 end = options + strlen(options);
1679 if (strncmp(options, "sep=", 4) == 0) {
1680 if (options[4] != 0) {
1681 separator[0] = options[4];
1684 cifs_dbg(FYI, "Null separator not allowed\n");
1687 vol->backupuid_specified = false; /* no backup intent for a user */
1688 vol->backupgid_specified = false; /* no backup intent for a group */
1690 switch (cifs_parse_devname(devname, vol)) {
1694 cifs_dbg(VFS, "Unable to allocate memory for devname\n");
1695 goto cifs_parse_mount_err;
1697 cifs_dbg(VFS, "Malformed UNC in devname\n");
1698 goto cifs_parse_mount_err;
1700 cifs_dbg(VFS, "Unknown error parsing devname\n");
1701 goto cifs_parse_mount_err;
1704 while ((data = strsep(&options, separator)) != NULL) {
1705 substring_t args[MAX_OPT_ARGS];
1706 unsigned long option;
1712 token = match_token(data, cifs_mount_option_tokens, args);
1716 /* Ingnore the following */
1720 /* Boolean values */
1721 case Opt_user_xattr:
1724 case Opt_nouser_xattr:
1730 case Opt_noforceuid:
1736 case Opt_noforcegid:
1739 case Opt_noblocksend:
1740 vol->noblocksnd = 1;
1742 case Opt_noautotune:
1743 vol->noautotune = 1;
1764 vol->sfu_remap = true;
1765 vol->remap = false; /* disable SFM mapping */
1767 case Opt_nomapchars:
1768 vol->sfu_remap = false;
1772 vol->sfu_remap = false; /* disable SFU mapping */
1774 case Opt_nomapposix:
1787 #ifdef CONFIG_CIFS_ROOT
1791 case Opt_posixpaths:
1792 vol->posix_paths = 1;
1794 case Opt_noposixpaths:
1795 vol->posix_paths = 0;
1800 "conflicting unix mount options\n");
1801 vol->no_linux_ext = 1;
1804 if (vol->no_linux_ext)
1806 "conflicting unix mount options\n");
1818 * turn off mandatory locking in mode
1819 * if remote locking is turned off since the
1820 * local vfs will do advisory
1822 if (vol->file_mode ==
1823 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1824 vol->file_mode = S_IALLUGO;
1826 case Opt_nohandlecache:
1827 vol->nohandlecache = 1;
1829 case Opt_handlecache:
1830 vol->nohandlecache = 0;
1832 case Opt_forcemandatorylock:
1841 case Opt_setuidfromacl:
1842 vol->setuidfromacl = 1;
1845 vol->dynperm = true;
1848 vol->dynperm = false;
1862 case Opt_nostrictsync:
1863 vol->nostrictsync = 1;
1865 case Opt_strictsync:
1866 vol->nostrictsync = 0;
1869 vol->server_ino = 1;
1871 case Opt_noserverino:
1872 vol->server_ino = 0;
1874 case Opt_rwpidforward:
1875 vol->rwpidforward = 1;
1887 vol->no_psx_acl = 0;
1890 vol->no_psx_acl = 1;
1892 case Opt_locallease:
1893 vol->local_lease = 1;
1898 case Opt_ignore_signature:
1900 vol->ignore_signature = true;
1903 /* we do not do the following in secFlags because seal
1904 * is a per tree connection (mount) not a per socket
1905 * or per-smb connection option in the protocol
1906 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1911 pr_warn("Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1914 #ifndef CONFIG_CIFS_FSCACHE
1915 cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1916 goto cifs_parse_mount_err;
1920 case Opt_mfsymlinks:
1921 vol->mfsymlinks = true;
1924 vol->multiuser = true;
1929 case Opt_nosharesock:
1930 vol->nosharesock = true;
1932 case Opt_nopersistent:
1933 vol->nopersistent = true;
1934 if (vol->persistent) {
1936 "persistenthandles mount options conflict\n");
1937 goto cifs_parse_mount_err;
1940 case Opt_persistent:
1941 vol->persistent = true;
1942 if ((vol->nopersistent) || (vol->resilient)) {
1944 "persistenthandles mount options conflict\n");
1945 goto cifs_parse_mount_err;
1949 vol->resilient = true;
1950 if (vol->persistent) {
1952 "persistenthandles mount options conflict\n");
1953 goto cifs_parse_mount_err;
1956 case Opt_noresilient:
1957 vol->resilient = false; /* already the default */
1959 case Opt_domainauto:
1960 vol->domainauto = true;
1965 case Opt_multichannel:
1966 vol->multichannel = true;
1967 /* if number of channels not specified, default to 2 */
1968 if (vol->max_channels < 2)
1969 vol->max_channels = 2;
1971 case Opt_nomultichannel:
1972 vol->multichannel = false;
1973 vol->max_channels = 1;
1976 vol->compression = UNKNOWN_TYPE;
1978 "SMB3 compression support is experimental\n");
1981 /* Numeric Values */
1983 if (get_option_uid(args, &vol->backupuid)) {
1984 cifs_dbg(VFS, "%s: Invalid backupuid value\n",
1986 goto cifs_parse_mount_err;
1988 vol->backupuid_specified = true;
1991 if (get_option_gid(args, &vol->backupgid)) {
1992 cifs_dbg(VFS, "%s: Invalid backupgid value\n",
1994 goto cifs_parse_mount_err;
1996 vol->backupgid_specified = true;
1999 if (get_option_uid(args, &vol->linux_uid)) {
2000 cifs_dbg(VFS, "%s: Invalid uid value\n",
2002 goto cifs_parse_mount_err;
2004 uid_specified = true;
2007 if (get_option_uid(args, &vol->cred_uid)) {
2008 cifs_dbg(VFS, "%s: Invalid cruid value\n",
2010 goto cifs_parse_mount_err;
2014 if (get_option_gid(args, &vol->linux_gid)) {
2015 cifs_dbg(VFS, "%s: Invalid gid value\n",
2017 goto cifs_parse_mount_err;
2019 gid_specified = true;
2022 if (get_option_ul(args, &option)) {
2023 cifs_dbg(VFS, "%s: Invalid file_mode value\n",
2025 goto cifs_parse_mount_err;
2027 vol->file_mode = option;
2030 if (get_option_ul(args, &option)) {
2031 cifs_dbg(VFS, "%s: Invalid dir_mode value\n",
2033 goto cifs_parse_mount_err;
2035 vol->dir_mode = option;
2038 if (get_option_ul(args, &option) ||
2039 option > USHRT_MAX) {
2040 cifs_dbg(VFS, "%s: Invalid port value\n",
2042 goto cifs_parse_mount_err;
2044 port = (unsigned short)option;
2046 case Opt_min_enc_offload:
2047 if (get_option_ul(args, &option)) {
2048 cifs_dbg(VFS, "Invalid minimum encrypted read offload size (esize)\n");
2049 goto cifs_parse_mount_err;
2051 vol->min_offload = option;
2054 if (get_option_ul(args, &option)) {
2055 cifs_dbg(VFS, "%s: Invalid blocksize value\n",
2057 goto cifs_parse_mount_err;
2060 * inode blocksize realistically should never need to be
2061 * less than 16K or greater than 16M and default is 1MB.
2062 * Note that small inode block sizes (e.g. 64K) can lead
2063 * to very poor performance of common tools like cp and scp
2065 if ((option < CIFS_MAX_MSGSIZE) ||
2066 (option > (4 * SMB3_DEFAULT_IOSIZE))) {
2067 cifs_dbg(VFS, "%s: Invalid blocksize\n",
2069 goto cifs_parse_mount_err;
2071 vol->bsize = option;
2074 if (get_option_ul(args, &option)) {
2075 cifs_dbg(VFS, "%s: Invalid rsize value\n",
2077 goto cifs_parse_mount_err;
2079 vol->rsize = option;
2082 if (get_option_ul(args, &option)) {
2083 cifs_dbg(VFS, "%s: Invalid wsize value\n",
2085 goto cifs_parse_mount_err;
2087 vol->wsize = option;
2090 if (get_option_ul(args, &option)) {
2091 cifs_dbg(VFS, "%s: Invalid actimeo value\n",
2093 goto cifs_parse_mount_err;
2095 vol->actimeo = HZ * option;
2096 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
2097 cifs_dbg(VFS, "attribute cache timeout too large\n");
2098 goto cifs_parse_mount_err;
2101 case Opt_handletimeout:
2102 if (get_option_ul(args, &option)) {
2103 cifs_dbg(VFS, "%s: Invalid handletimeout value\n",
2105 goto cifs_parse_mount_err;
2107 vol->handle_timeout = option;
2108 if (vol->handle_timeout > SMB3_MAX_HANDLE_TIMEOUT) {
2109 cifs_dbg(VFS, "Invalid handle cache timeout, longer than 16 minutes\n");
2110 goto cifs_parse_mount_err;
2113 case Opt_echo_interval:
2114 if (get_option_ul(args, &option)) {
2115 cifs_dbg(VFS, "%s: Invalid echo interval value\n",
2117 goto cifs_parse_mount_err;
2119 vol->echo_interval = option;
2122 if (get_option_ul(args, &option)) {
2123 cifs_dbg(VFS, "%s: Invalid snapshot time\n",
2125 goto cifs_parse_mount_err;
2127 vol->snapshot_time = option;
2129 case Opt_max_credits:
2130 if (get_option_ul(args, &option) || (option < 20) ||
2132 cifs_dbg(VFS, "%s: Invalid max_credits value\n",
2134 goto cifs_parse_mount_err;
2136 vol->max_credits = option;
2138 case Opt_max_channels:
2139 if (get_option_ul(args, &option) || option < 1 ||
2140 option > CIFS_MAX_CHANNELS) {
2141 cifs_dbg(VFS, "%s: Invalid max_channels value, needs to be 1-%d\n",
2142 __func__, CIFS_MAX_CHANNELS);
2143 goto cifs_parse_mount_err;
2145 vol->max_channels = option;
2148 /* String Arguments */
2150 case Opt_blank_user:
2151 /* null user, ie. anonymous authentication */
2153 vol->username = NULL;
2156 string = match_strdup(args);
2160 if (strnlen(string, CIFS_MAX_USERNAME_LEN) >
2161 CIFS_MAX_USERNAME_LEN) {
2162 pr_warn("username too long\n");
2163 goto cifs_parse_mount_err;
2166 kfree(vol->username);
2167 vol->username = kstrdup(string, GFP_KERNEL);
2169 goto cifs_parse_mount_err;
2171 case Opt_blank_pass:
2172 /* passwords have to be handled differently
2173 * to allow the character used for deliminator
2174 * to be passed within them
2178 * Check if this is a case where the password
2179 * starts with a delimiter
2181 tmp_end = strchr(data, '=');
2183 if (!(tmp_end < end && tmp_end[1] == delim)) {
2184 /* No it is not. Set the password to NULL */
2185 kzfree(vol->password);
2186 vol->password = NULL;
2189 /* Fallthrough - to Opt_pass below.*/
2191 /* Obtain the value string */
2192 value = strchr(data, '=');
2195 /* Set tmp_end to end of the string */
2196 tmp_end = (char *) value + strlen(value);
2198 /* Check if following character is the deliminator
2199 * If yes, we have encountered a double deliminator
2200 * reset the NULL character to the deliminator
2202 if (tmp_end < end && tmp_end[1] == delim) {
2205 /* Keep iterating until we get to a single
2206 * deliminator OR the end
2208 while ((tmp_end = strchr(tmp_end, delim))
2209 != NULL && (tmp_end[1] == delim)) {
2210 tmp_end = (char *) &tmp_end[2];
2213 /* Reset var options to point to next element */
2216 options = (char *) &tmp_end[1];
2218 /* Reached the end of the mount option
2223 kzfree(vol->password);
2224 /* Now build new password string */
2225 temp_len = strlen(value);
2226 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
2227 if (vol->password == NULL) {
2228 pr_warn("no memory for password\n");
2229 goto cifs_parse_mount_err;
2232 for (i = 0, j = 0; i < temp_len; i++, j++) {
2233 vol->password[j] = value[i];
2234 if ((value[i] == delim) &&
2235 value[i+1] == delim)
2236 /* skip the second deliminator */
2239 vol->password[j] = '\0';
2242 /* FIXME: should this be an error instead? */
2246 string = match_strdup(args);
2250 if (!cifs_convert_address(dstaddr, string,
2252 pr_err("bad ip= option (%s)\n", string);
2253 goto cifs_parse_mount_err;
2258 string = match_strdup(args);
2262 if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
2263 == CIFS_MAX_DOMAINNAME_LEN) {
2264 pr_warn("domain name too long\n");
2265 goto cifs_parse_mount_err;
2268 kfree(vol->domainname);
2269 vol->domainname = kstrdup(string, GFP_KERNEL);
2270 if (!vol->domainname) {
2271 pr_warn("no memory for domainname\n");
2272 goto cifs_parse_mount_err;
2274 cifs_dbg(FYI, "Domain name set\n");
2277 string = match_strdup(args);
2281 if (!cifs_convert_address(
2282 (struct sockaddr *)&vol->srcaddr,
2283 string, strlen(string))) {
2284 pr_warn("Could not parse srcaddr: %s\n",
2286 goto cifs_parse_mount_err;
2290 string = match_strdup(args);
2294 if (strnlen(string, 1024) >= 65) {
2295 pr_warn("iocharset name too long\n");
2296 goto cifs_parse_mount_err;
2299 if (strncasecmp(string, "default", 7) != 0) {
2300 kfree(vol->iocharset);
2301 vol->iocharset = kstrdup(string,
2303 if (!vol->iocharset) {
2304 pr_warn("no memory for charset\n");
2305 goto cifs_parse_mount_err;
2308 /* if iocharset not set then load_nls_default
2311 cifs_dbg(FYI, "iocharset set to %s\n", string);
2313 case Opt_netbiosname:
2314 string = match_strdup(args);
2318 memset(vol->source_rfc1001_name, 0x20,
2321 * FIXME: are there cases in which a comma can
2322 * be valid in workstation netbios name (and
2323 * need special handling)?
2325 for (i = 0; i < RFC1001_NAME_LEN; i++) {
2326 /* don't ucase netbiosname for user */
2329 vol->source_rfc1001_name[i] = string[i];
2331 /* The string has 16th byte zero still from
2332 * set at top of the function
2334 if (i == RFC1001_NAME_LEN && string[i] != 0)
2335 pr_warn("netbiosname longer than 15 truncated\n");
2338 /* servernetbiosname specified override *SMBSERVER */
2339 string = match_strdup(args);
2343 /* last byte, type, is 0x20 for servr type */
2344 memset(vol->target_rfc1001_name, 0x20,
2345 RFC1001_NAME_LEN_WITH_NULL);
2347 /* BB are there cases in which a comma can be
2348 valid in this workstation netbios name
2349 (and need special handling)? */
2351 /* user or mount helper must uppercase the
2353 for (i = 0; i < 15; i++) {
2356 vol->target_rfc1001_name[i] = string[i];
2358 /* The string has 16th byte zero still from
2359 set at top of the function */
2360 if (i == RFC1001_NAME_LEN && string[i] != 0)
2361 pr_warn("server netbiosname longer than 15 truncated\n");
2364 /* version of mount userspace tools, not dialect */
2365 string = match_strdup(args);
2369 /* If interface changes in mount.cifs bump to new ver */
2370 if (strncasecmp(string, "1", 1) == 0) {
2371 if (strlen(string) > 1) {
2372 pr_warn("Bad mount helper ver=%s. Did you want SMB1 (CIFS) dialect and mean to type vers=1.0 instead?\n",
2374 goto cifs_parse_mount_err;
2376 /* This is the default */
2379 /* For all other value, error */
2380 pr_warn("Invalid mount helper version specified\n");
2381 goto cifs_parse_mount_err;
2383 /* protocol version (dialect) */
2384 string = match_strdup(args);
2388 if (cifs_parse_smb_version(string, vol, is_smb3) != 0)
2389 goto cifs_parse_mount_err;
2393 string = match_strdup(args);
2397 if (cifs_parse_security_flavors(string, vol) != 0)
2398 goto cifs_parse_mount_err;
2401 string = match_strdup(args);
2405 if (cifs_parse_cache_flavor(string, vol) != 0)
2406 goto cifs_parse_mount_err;
2410 * An option we don't recognize. Save it off for later
2411 * if we haven't already found one
2417 /* Free up any allocated string */
2422 if (!sloppy && invalid) {
2423 pr_err("Unknown mount option \"%s\"\n", invalid);
2424 goto cifs_parse_mount_err;
2427 if (vol->rdma && vol->vals->protocol_id < SMB30_PROT_ID) {
2428 cifs_dbg(VFS, "SMB Direct requires Version >=3.0\n");
2429 goto cifs_parse_mount_err;
2433 /* Muliuser mounts require CONFIG_KEYS support */
2434 if (vol->multiuser) {
2435 cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
2436 goto cifs_parse_mount_err;
2440 cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
2441 goto cifs_parse_mount_err;
2444 /* make sure UNC has a share name */
2445 if (!strchr(vol->UNC + 3, '\\')) {
2446 cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
2447 goto cifs_parse_mount_err;
2454 /* No ip= option specified? Try to get it from UNC */
2455 /* Use the address part of the UNC. */
2456 slash = strchr(&vol->UNC[2], '\\');
2457 len = slash - &vol->UNC[2];
2458 if (!cifs_convert_address(dstaddr, &vol->UNC[2], len)) {
2459 pr_err("Unable to determine destination address\n");
2460 goto cifs_parse_mount_err;
2464 /* set the port that we got earlier */
2465 cifs_set_port(dstaddr, port);
2468 vol->override_uid = override_uid;
2469 else if (override_uid == 1)
2470 pr_notice("ignoring forceuid mount option specified with no uid= option\n");
2473 vol->override_gid = override_gid;
2474 else if (override_gid == 1)
2475 pr_notice("ignoring forcegid mount option specified with no gid= option\n");
2477 if (got_version == false)
2478 pr_warn_once("No dialect specified on mount. Default has changed to a more secure dialect, SMB2.1 or later (e.g. SMB3.1.1), from CIFS (SMB1). To use the less secure SMB1 dialect to access old servers which do not support SMB3.1.1 (or even SMB3 or SMB2.1) specify vers=1.0 on mount.\n");
2480 kfree(mountdata_copy);
2484 pr_warn("Could not allocate temporary buffer\n");
2485 cifs_parse_mount_err:
2487 kfree(mountdata_copy);
2491 /** Returns true if srcaddr isn't specified and rhs isn't
2492 * specified, or if srcaddr is specified and
2493 * matches the IP address of the rhs argument.
2496 cifs_match_ipaddr(struct sockaddr *srcaddr, struct sockaddr *rhs)
2498 switch (srcaddr->sa_family) {
2500 return (rhs->sa_family == AF_UNSPEC);
2502 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
2503 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
2504 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
2507 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
2508 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
2509 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
2513 return false; /* don't expect to be here */
2518 * If no port is specified in addr structure, we try to match with 445 port
2519 * and if it fails - with 139 ports. It should be called only if address
2520 * families of server and addr are equal.
2523 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
2525 __be16 port, *sport;
2527 /* SMBDirect manages its own ports, don't match it here */
2531 switch (addr->sa_family) {
2533 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
2534 port = ((struct sockaddr_in *) addr)->sin_port;
2537 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
2538 port = ((struct sockaddr_in6 *) addr)->sin6_port;
2546 port = htons(CIFS_PORT);
2550 port = htons(RFC1001_PORT);
2553 return port == *sport;
2557 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
2558 struct sockaddr *srcaddr)
2560 switch (addr->sa_family) {
2562 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
2563 struct sockaddr_in *srv_addr4 =
2564 (struct sockaddr_in *)&server->dstaddr;
2566 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
2571 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
2572 struct sockaddr_in6 *srv_addr6 =
2573 (struct sockaddr_in6 *)&server->dstaddr;
2575 if (!ipv6_addr_equal(&addr6->sin6_addr,
2576 &srv_addr6->sin6_addr))
2578 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
2584 return false; /* don't expect to be here */
2587 if (!cifs_match_ipaddr(srcaddr, (struct sockaddr *)&server->srcaddr))
2594 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2597 * The select_sectype function should either return the vol->sectype
2598 * that was specified, or "Unspecified" if that sectype was not
2599 * compatible with the given NEGOTIATE request.
2601 if (server->ops->select_sectype(server, vol->sectype)
2606 * Now check if signing mode is acceptable. No need to check
2607 * global_secflags at this point since if MUST_SIGN is set then
2608 * the server->sign had better be too.
2610 if (vol->sign && !server->sign)
2616 static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
2618 struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2620 if (vol->nosharesock)
2623 /* If multidialect negotiation see if existing sessions match one */
2624 if (strcmp(vol->vals->version_string, SMB3ANY_VERSION_STRING) == 0) {
2625 if (server->vals->protocol_id < SMB30_PROT_ID)
2627 } else if (strcmp(vol->vals->version_string,
2628 SMBDEFAULT_VERSION_STRING) == 0) {
2629 if (server->vals->protocol_id < SMB21_PROT_ID)
2631 } else if ((server->vals != vol->vals) || (server->ops != vol->ops))
2634 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2637 if (!match_address(server, addr,
2638 (struct sockaddr *)&vol->srcaddr))
2641 if (!match_port(server, addr))
2644 if (!match_security(server, vol))
2647 if (server->echo_interval != vol->echo_interval * HZ)
2650 if (server->rdma != vol->rdma)
2653 if (server->ignore_signature != vol->ignore_signature)
2656 if (server->min_offload != vol->min_offload)
2662 struct TCP_Server_Info *
2663 cifs_find_tcp_session(struct smb_vol *vol)
2665 struct TCP_Server_Info *server;
2667 spin_lock(&cifs_tcp_ses_lock);
2668 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
2670 * Skip ses channels since they're only handled in lower layers
2671 * (e.g. cifs_send_recv).
2673 if (server->is_channel || !match_server(server, vol))
2676 ++server->srv_count;
2677 spin_unlock(&cifs_tcp_ses_lock);
2678 cifs_dbg(FYI, "Existing tcp session with server found\n");
2681 spin_unlock(&cifs_tcp_ses_lock);
2686 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
2688 struct task_struct *task;
2690 spin_lock(&cifs_tcp_ses_lock);
2691 if (--server->srv_count > 0) {
2692 spin_unlock(&cifs_tcp_ses_lock);
2696 put_net(cifs_net_ns(server));
2698 list_del_init(&server->tcp_ses_list);
2699 spin_unlock(&cifs_tcp_ses_lock);
2701 cancel_delayed_work_sync(&server->echo);
2705 * Avoid deadlock here: reconnect work calls
2706 * cifs_put_tcp_session() at its end. Need to be sure
2707 * that reconnect work does nothing with server pointer after
2710 cancel_delayed_work(&server->reconnect);
2712 cancel_delayed_work_sync(&server->reconnect);
2714 spin_lock(&GlobalMid_Lock);
2715 server->tcpStatus = CifsExiting;
2716 spin_unlock(&GlobalMid_Lock);
2718 cifs_crypto_secmech_release(server);
2719 cifs_fscache_release_client_cookie(server);
2721 kfree(server->session_key.response);
2722 server->session_key.response = NULL;
2723 server->session_key.len = 0;
2725 task = xchg(&server->tsk, NULL);
2727 send_sig(SIGKILL, task, 1);
2730 struct TCP_Server_Info *
2731 cifs_get_tcp_session(struct smb_vol *volume_info)
2733 struct TCP_Server_Info *tcp_ses = NULL;
2736 cifs_dbg(FYI, "UNC: %s\n", volume_info->UNC);
2738 /* see if we already have a matching tcp_ses */
2739 tcp_ses = cifs_find_tcp_session(volume_info);
2743 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2749 tcp_ses->ops = volume_info->ops;
2750 tcp_ses->vals = volume_info->vals;
2751 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2752 tcp_ses->hostname = extract_hostname(volume_info->UNC);
2753 if (IS_ERR(tcp_ses->hostname)) {
2754 rc = PTR_ERR(tcp_ses->hostname);
2755 goto out_err_crypto_release;
2758 tcp_ses->noblockcnt = volume_info->rootfs;
2759 tcp_ses->noblocksnd = volume_info->noblocksnd || volume_info->rootfs;
2760 tcp_ses->noautotune = volume_info->noautotune;
2761 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2762 tcp_ses->rdma = volume_info->rdma;
2763 tcp_ses->in_flight = 0;
2764 tcp_ses->max_in_flight = 0;
2765 tcp_ses->credits = 1;
2766 init_waitqueue_head(&tcp_ses->response_q);
2767 init_waitqueue_head(&tcp_ses->request_q);
2768 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2769 mutex_init(&tcp_ses->srv_mutex);
2770 memcpy(tcp_ses->workstation_RFC1001_name,
2771 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2772 memcpy(tcp_ses->server_RFC1001_name,
2773 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2774 tcp_ses->session_estab = false;
2775 tcp_ses->sequence_number = 0;
2776 tcp_ses->reconnect_instance = 1;
2777 tcp_ses->lstrp = jiffies;
2778 tcp_ses->compress_algorithm = cpu_to_le16(volume_info->compression);
2779 spin_lock_init(&tcp_ses->req_lock);
2780 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2781 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2782 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2783 INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
2784 mutex_init(&tcp_ses->reconnect_mutex);
2785 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2786 sizeof(tcp_ses->srcaddr));
2787 memcpy(&tcp_ses->dstaddr, &volume_info->dstaddr,
2788 sizeof(tcp_ses->dstaddr));
2789 if (volume_info->use_client_guid)
2790 memcpy(tcp_ses->client_guid, volume_info->client_guid,
2791 SMB2_CLIENT_GUID_SIZE);
2793 generate_random_uuid(tcp_ses->client_guid);
2795 * at this point we are the only ones with the pointer
2796 * to the struct since the kernel thread not created yet
2797 * no need to spinlock this init of tcpStatus or srv_count
2799 tcp_ses->tcpStatus = CifsNew;
2800 ++tcp_ses->srv_count;
2802 if (volume_info->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
2803 volume_info->echo_interval <= SMB_ECHO_INTERVAL_MAX)
2804 tcp_ses->echo_interval = volume_info->echo_interval * HZ;
2806 tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
2807 if (tcp_ses->rdma) {
2808 #ifndef CONFIG_CIFS_SMB_DIRECT
2809 cifs_dbg(VFS, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
2811 goto out_err_crypto_release;
2813 tcp_ses->smbd_conn = smbd_get_connection(
2814 tcp_ses, (struct sockaddr *)&volume_info->dstaddr);
2815 if (tcp_ses->smbd_conn) {
2816 cifs_dbg(VFS, "RDMA transport established\n");
2818 goto smbd_connected;
2821 goto out_err_crypto_release;
2824 rc = ip_connect(tcp_ses);
2826 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
2827 goto out_err_crypto_release;
2831 * since we're in a cifs function already, we know that
2832 * this will succeed. No need for try_module_get().
2834 __module_get(THIS_MODULE);
2835 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2837 if (IS_ERR(tcp_ses->tsk)) {
2838 rc = PTR_ERR(tcp_ses->tsk);
2839 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
2840 module_put(THIS_MODULE);
2841 goto out_err_crypto_release;
2843 tcp_ses->min_offload = volume_info->min_offload;
2844 tcp_ses->tcpStatus = CifsNeedNegotiate;
2846 tcp_ses->nr_targets = 1;
2847 tcp_ses->ignore_signature = volume_info->ignore_signature;
2848 /* thread spawned, put it on the list */
2849 spin_lock(&cifs_tcp_ses_lock);
2850 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2851 spin_unlock(&cifs_tcp_ses_lock);
2853 cifs_fscache_get_client_cookie(tcp_ses);
2855 /* queue echo request delayed work */
2856 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
2860 out_err_crypto_release:
2861 cifs_crypto_secmech_release(tcp_ses);
2863 put_net(cifs_net_ns(tcp_ses));
2867 if (!IS_ERR(tcp_ses->hostname))
2868 kfree(tcp_ses->hostname);
2869 if (tcp_ses->ssocket)
2870 sock_release(tcp_ses->ssocket);
2876 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2878 if (vol->sectype != Unspecified &&
2879 vol->sectype != ses->sectype)
2883 * If an existing session is limited to less channels than
2884 * requested, it should not be reused
2886 if (ses->chan_max < vol->max_channels)
2889 switch (ses->sectype) {
2891 if (!uid_eq(vol->cred_uid, ses->cred_uid))
2895 /* NULL username means anonymous session */
2896 if (ses->user_name == NULL) {
2902 /* anything else takes username/password */
2903 if (strncmp(ses->user_name,
2904 vol->username ? vol->username : "",
2905 CIFS_MAX_USERNAME_LEN))
2907 if ((vol->username && strlen(vol->username) != 0) &&
2908 ses->password != NULL &&
2909 strncmp(ses->password,
2910 vol->password ? vol->password : "",
2911 CIFS_MAX_PASSWORD_LEN))
2918 * cifs_setup_ipc - helper to setup the IPC tcon for the session
2920 * A new IPC connection is made and stored in the session
2921 * tcon_ipc. The IPC tcon has the same lifetime as the session.
2924 cifs_setup_ipc(struct cifs_ses *ses, struct smb_vol *volume_info)
2927 struct cifs_tcon *tcon;
2928 struct nls_table *nls_codepage;
2929 char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0};
2931 struct TCP_Server_Info *server = ses->server;
2934 * If the mount request that resulted in the creation of the
2935 * session requires encryption, force IPC to be encrypted too.
2937 if (volume_info->seal) {
2938 if (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
2941 cifs_server_dbg(VFS,
2942 "IPC: server doesn't support encryption\n");
2947 tcon = tconInfoAlloc();
2951 scnprintf(unc, sizeof(unc), "\\\\%s\\IPC$", server->hostname);
2954 nls_codepage = load_nls_default();
2960 rc = server->ops->tree_connect(xid, ses, unc, tcon, nls_codepage);
2964 cifs_server_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
2969 cifs_dbg(FYI, "IPC tcon rc = %d ipc tid = %d\n", rc, tcon->tid);
2971 ses->tcon_ipc = tcon;
2973 unload_nls(nls_codepage);
2978 * cifs_free_ipc - helper to release the session IPC tcon
2980 * Needs to be called everytime a session is destroyed
2983 cifs_free_ipc(struct cifs_ses *ses)
2986 struct cifs_tcon *tcon = ses->tcon_ipc;
2991 if (ses->server->ops->tree_disconnect) {
2993 rc = ses->server->ops->tree_disconnect(xid, tcon);
2998 cifs_dbg(FYI, "failed to disconnect IPC tcon (rc=%d)\n", rc);
3001 ses->tcon_ipc = NULL;
3005 static struct cifs_ses *
3006 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
3008 struct cifs_ses *ses;
3010 spin_lock(&cifs_tcp_ses_lock);
3011 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
3012 if (ses->status == CifsExiting)
3014 if (!match_session(ses, vol))
3017 spin_unlock(&cifs_tcp_ses_lock);
3020 spin_unlock(&cifs_tcp_ses_lock);
3024 void cifs_put_smb_ses(struct cifs_ses *ses)
3026 unsigned int rc, xid;
3027 struct TCP_Server_Info *server = ses->server;
3029 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
3031 spin_lock(&cifs_tcp_ses_lock);
3032 if (ses->status == CifsExiting) {
3033 spin_unlock(&cifs_tcp_ses_lock);
3036 if (--ses->ses_count > 0) {
3037 spin_unlock(&cifs_tcp_ses_lock);
3040 if (ses->status == CifsGood)
3041 ses->status = CifsExiting;
3042 spin_unlock(&cifs_tcp_ses_lock);
3046 if (ses->status == CifsExiting && server->ops->logoff) {
3048 rc = server->ops->logoff(xid, ses);
3050 cifs_server_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
3055 spin_lock(&cifs_tcp_ses_lock);
3056 list_del_init(&ses->smb_ses_list);
3057 spin_unlock(&cifs_tcp_ses_lock);
3059 /* close any extra channels */
3060 if (ses->chan_count > 1) {
3063 for (i = 1; i < ses->chan_count; i++)
3064 cifs_put_tcp_session(ses->chans[i].server, 0);
3068 cifs_put_tcp_session(server, 0);
3073 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
3074 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
3076 /* Populate username and pw fields from keyring if possible */
3078 cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
3082 const char *delim, *payload;
3086 struct TCP_Server_Info *server = ses->server;
3087 struct sockaddr_in *sa;
3088 struct sockaddr_in6 *sa6;
3089 const struct user_key_payload *upayload;
3091 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
3095 /* try to find an address key first */
3096 switch (server->dstaddr.ss_family) {
3098 sa = (struct sockaddr_in *)&server->dstaddr;
3099 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
3102 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
3103 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
3106 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
3107 server->dstaddr.ss_family);
3112 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
3113 key = request_key(&key_type_logon, desc, "");
3115 if (!ses->domainName) {
3116 cifs_dbg(FYI, "domainName is NULL\n");
3121 /* didn't work, try to find a domain key */
3122 sprintf(desc, "cifs:d:%s", ses->domainName);
3123 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
3124 key = request_key(&key_type_logon, desc, "");
3132 down_read(&key->sem);
3133 upayload = user_key_payload_locked(key);
3134 if (IS_ERR_OR_NULL(upayload)) {
3135 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
3139 /* find first : in payload */
3140 payload = upayload->data;
3141 delim = strnchr(payload, upayload->datalen, ':');
3142 cifs_dbg(FYI, "payload=%s\n", payload);
3144 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
3150 len = delim - payload;
3151 if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
3152 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
3158 vol->username = kstrndup(payload, len, GFP_KERNEL);
3159 if (!vol->username) {
3160 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
3165 cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
3167 len = key->datalen - (len + 1);
3168 if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
3169 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
3171 kfree(vol->username);
3172 vol->username = NULL;
3177 vol->password = kstrndup(delim, len, GFP_KERNEL);
3178 if (!vol->password) {
3179 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
3182 kfree(vol->username);
3183 vol->username = NULL;
3188 * If we have a domain key then we must set the domainName in the
3191 if (is_domain && ses->domainName) {
3192 vol->domainname = kstrndup(ses->domainName,
3193 strlen(ses->domainName),
3195 if (!vol->domainname) {
3196 cifs_dbg(FYI, "Unable to allocate %zd bytes for domain\n",
3199 kfree(vol->username);
3200 vol->username = NULL;
3201 kzfree(vol->password);
3202 vol->password = NULL;
3212 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
3215 #else /* ! CONFIG_KEYS */
3217 cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
3218 struct cifs_ses *ses __attribute__((unused)))
3222 #endif /* CONFIG_KEYS */
3225 * cifs_get_smb_ses - get a session matching @volume_info data from @server
3227 * This function assumes it is being called from cifs_mount() where we
3228 * already got a server reference (server refcount +1). See
3229 * cifs_get_tcon() for refcount explanations.
3232 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
3236 struct cifs_ses *ses;
3237 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3238 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3242 ses = cifs_find_smb_ses(server, volume_info);
3244 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
3247 mutex_lock(&ses->session_mutex);
3248 rc = cifs_negotiate_protocol(xid, ses);
3250 mutex_unlock(&ses->session_mutex);
3251 /* problem -- put our ses reference */
3252 cifs_put_smb_ses(ses);
3256 if (ses->need_reconnect) {
3257 cifs_dbg(FYI, "Session needs reconnect\n");
3258 rc = cifs_setup_session(xid, ses,
3259 volume_info->local_nls);
3261 mutex_unlock(&ses->session_mutex);
3262 /* problem -- put our reference */
3263 cifs_put_smb_ses(ses);
3268 mutex_unlock(&ses->session_mutex);
3270 /* existing SMB ses has a server reference already */
3271 cifs_put_tcp_session(server, 0);
3276 cifs_dbg(FYI, "Existing smb sess not found\n");
3277 ses = sesInfoAlloc();
3281 /* new SMB session uses our server ref */
3282 ses->server = server;
3283 if (server->dstaddr.ss_family == AF_INET6)
3284 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
3286 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
3288 if (volume_info->username) {
3289 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
3290 if (!ses->user_name)
3294 /* volume_info->password freed at unmount */
3295 if (volume_info->password) {
3296 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
3300 if (volume_info->domainname) {
3301 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
3302 if (!ses->domainName)
3305 if (volume_info->domainauto)
3306 ses->domainAuto = volume_info->domainauto;
3307 ses->cred_uid = volume_info->cred_uid;
3308 ses->linux_uid = volume_info->linux_uid;
3310 ses->sectype = volume_info->sectype;
3311 ses->sign = volume_info->sign;
3312 mutex_lock(&ses->session_mutex);
3314 /* add server as first channel */
3315 ses->chans[0].server = server;
3316 ses->chan_count = 1;
3317 ses->chan_max = volume_info->multichannel ? volume_info->max_channels:1;
3319 rc = cifs_negotiate_protocol(xid, ses);
3321 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
3323 /* each channel uses a different signing key */
3324 memcpy(ses->chans[0].signkey, ses->smb3signingkey,
3325 sizeof(ses->smb3signingkey));
3327 mutex_unlock(&ses->session_mutex);
3331 /* success, put it on the list and add it as first channel */
3332 spin_lock(&cifs_tcp_ses_lock);
3333 list_add(&ses->smb_ses_list, &server->smb_ses_list);
3334 spin_unlock(&cifs_tcp_ses_lock);
3338 cifs_setup_ipc(ses, volume_info);
3348 static int match_tcon(struct cifs_tcon *tcon, struct smb_vol *volume_info)
3350 if (tcon->tidStatus == CifsExiting)
3352 if (strncmp(tcon->treeName, volume_info->UNC, MAX_TREE_SIZE))
3354 if (tcon->seal != volume_info->seal)
3356 if (tcon->snapshot_time != volume_info->snapshot_time)
3358 if (tcon->handle_timeout != volume_info->handle_timeout)
3360 if (tcon->no_lease != volume_info->no_lease)
3362 if (tcon->nodelete != volume_info->nodelete)
3367 static struct cifs_tcon *
3368 cifs_find_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3370 struct list_head *tmp;
3371 struct cifs_tcon *tcon;
3373 spin_lock(&cifs_tcp_ses_lock);
3374 list_for_each(tmp, &ses->tcon_list) {
3375 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
3376 #ifdef CONFIG_CIFS_DFS_UPCALL
3380 if (!match_tcon(tcon, volume_info))
3383 spin_unlock(&cifs_tcp_ses_lock);
3386 spin_unlock(&cifs_tcp_ses_lock);
3391 cifs_put_tcon(struct cifs_tcon *tcon)
3394 struct cifs_ses *ses;
3397 * IPC tcon share the lifetime of their session and are
3398 * destroyed in the session put function
3400 if (tcon == NULL || tcon->ipc)
3404 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
3405 spin_lock(&cifs_tcp_ses_lock);
3406 if (--tcon->tc_count > 0) {
3407 spin_unlock(&cifs_tcp_ses_lock);
3411 list_del_init(&tcon->tcon_list);
3412 spin_unlock(&cifs_tcp_ses_lock);
3415 if (ses->server->ops->tree_disconnect)
3416 ses->server->ops->tree_disconnect(xid, tcon);
3419 cifs_fscache_release_super_cookie(tcon);
3421 cifs_put_smb_ses(ses);
3425 * cifs_get_tcon - get a tcon matching @volume_info data from @ses
3427 * - tcon refcount is the number of mount points using the tcon.
3428 * - ses refcount is the number of tcon using the session.
3430 * 1. This function assumes it is being called from cifs_mount() where
3431 * we already got a session reference (ses refcount +1).
3433 * 2. Since we're in the context of adding a mount point, the end
3434 * result should be either:
3436 * a) a new tcon already allocated with refcount=1 (1 mount point) and
3437 * its session refcount incremented (1 new tcon). This +1 was
3438 * already done in (1).
3440 * b) an existing tcon with refcount+1 (add a mount point to it) and
3441 * identical ses refcount (no new tcon). Because of (1) we need to
3442 * decrement the ses refcount.
3444 static struct cifs_tcon *
3445 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3448 struct cifs_tcon *tcon;
3450 tcon = cifs_find_tcon(ses, volume_info);
3453 * tcon has refcount already incremented but we need to
3454 * decrement extra ses reference gotten by caller (case b)
3456 cifs_dbg(FYI, "Found match on UNC path\n");
3457 cifs_put_smb_ses(ses);
3461 if (!ses->server->ops->tree_connect) {
3466 tcon = tconInfoAlloc();
3472 if (volume_info->snapshot_time) {
3473 if (ses->server->vals->protocol_id == 0) {
3475 "Use SMB2 or later for snapshot mount option\n");
3479 tcon->snapshot_time = volume_info->snapshot_time;
3482 if (volume_info->handle_timeout) {
3483 if (ses->server->vals->protocol_id == 0) {
3485 "Use SMB2.1 or later for handle timeout option\n");
3489 tcon->handle_timeout = volume_info->handle_timeout;
3493 if (volume_info->password) {
3494 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
3495 if (!tcon->password) {
3501 if (volume_info->seal) {
3502 if (ses->server->vals->protocol_id == 0) {
3504 "SMB3 or later required for encryption\n");
3507 } else if (tcon->ses->server->capabilities &
3508 SMB2_GLOBAL_CAP_ENCRYPTION)
3511 cifs_dbg(VFS, "Encryption is not supported on share\n");
3517 if (volume_info->linux_ext) {
3518 if (ses->server->posix_ext_supported) {
3519 tcon->posix_extensions = true;
3520 pr_warn_once("SMB3.11 POSIX Extensions are experimental\n");
3522 cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions\n");
3529 * BB Do we need to wrap session_mutex around this TCon call and Unix
3530 * SetFS as we do on SessSetup and reconnect?
3533 rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
3534 volume_info->local_nls);
3536 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
3540 tcon->use_persistent = false;
3541 /* check if SMB2 or later, CIFS does not support persistent handles */
3542 if (volume_info->persistent) {
3543 if (ses->server->vals->protocol_id == 0) {
3545 "SMB3 or later required for persistent handles\n");
3548 } else if (ses->server->capabilities &
3549 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3550 tcon->use_persistent = true;
3551 else /* persistent handles requested but not supported */ {
3553 "Persistent handles not supported on share\n");
3557 } else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
3558 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3559 && (volume_info->nopersistent == false)) {
3560 cifs_dbg(FYI, "enabling persistent handles\n");
3561 tcon->use_persistent = true;
3562 } else if (volume_info->resilient) {
3563 if (ses->server->vals->protocol_id == 0) {
3565 "SMB2.1 or later required for resilient handles\n");
3569 tcon->use_resilient = true;
3572 /* If the user really knows what they are doing they can override */
3573 if (tcon->share_flags & SMB2_SHAREFLAG_NO_CACHING) {
3574 if (volume_info->cache_ro)
3575 cifs_dbg(VFS, "cache=ro requested on mount but NO_CACHING flag set on share\n");
3576 else if (volume_info->cache_rw)
3577 cifs_dbg(VFS, "cache=singleclient requested on mount but NO_CACHING flag set on share\n");
3580 if (volume_info->no_lease) {
3581 if (ses->server->vals->protocol_id == 0) {
3583 "SMB2 or later required for nolease option\n");
3587 tcon->no_lease = volume_info->no_lease;
3591 * We can have only one retry value for a connection to a share so for
3592 * resources mounted more than once to the same server share the last
3593 * value passed in for the retry flag is used.
3595 tcon->retry = volume_info->retry;
3596 tcon->nocase = volume_info->nocase;
3597 tcon->nohandlecache = volume_info->nohandlecache;
3598 tcon->nodelete = volume_info->nodelete;
3599 tcon->local_lease = volume_info->local_lease;
3600 INIT_LIST_HEAD(&tcon->pending_opens);
3602 spin_lock(&cifs_tcp_ses_lock);
3603 list_add(&tcon->tcon_list, &ses->tcon_list);
3604 spin_unlock(&cifs_tcp_ses_lock);
3606 cifs_fscache_get_super_cookie(tcon);
3616 cifs_put_tlink(struct tcon_link *tlink)
3618 if (!tlink || IS_ERR(tlink))
3621 if (!atomic_dec_and_test(&tlink->tl_count) ||
3622 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
3623 tlink->tl_time = jiffies;
3627 if (!IS_ERR(tlink_tcon(tlink)))
3628 cifs_put_tcon(tlink_tcon(tlink));
3634 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3636 struct cifs_sb_info *old = CIFS_SB(sb);
3637 struct cifs_sb_info *new = mnt_data->cifs_sb;
3638 unsigned int oldflags = old->mnt_cifs_flags & CIFS_MOUNT_MASK;
3639 unsigned int newflags = new->mnt_cifs_flags & CIFS_MOUNT_MASK;
3641 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
3644 if (old->mnt_cifs_serverino_autodisabled)
3645 newflags &= ~CIFS_MOUNT_SERVER_INUM;
3647 if (oldflags != newflags)
3651 * We want to share sb only if we don't specify an r/wsize or
3652 * specified r/wsize is greater than or equal to existing one.
3654 if (new->wsize && new->wsize < old->wsize)
3657 if (new->rsize && new->rsize < old->rsize)
3660 if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))
3663 if (old->mnt_file_mode != new->mnt_file_mode ||
3664 old->mnt_dir_mode != new->mnt_dir_mode)
3667 if (strcmp(old->local_nls->charset, new->local_nls->charset))
3670 if (old->actimeo != new->actimeo)
3677 match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3679 struct cifs_sb_info *old = CIFS_SB(sb);
3680 struct cifs_sb_info *new = mnt_data->cifs_sb;
3681 bool old_set = (old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
3683 bool new_set = (new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
3686 if (old_set && new_set && !strcmp(new->prepath, old->prepath))
3688 else if (!old_set && !new_set)
3695 cifs_match_super(struct super_block *sb, void *data)
3697 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
3698 struct smb_vol *volume_info;
3699 struct cifs_sb_info *cifs_sb;
3700 struct TCP_Server_Info *tcp_srv;
3701 struct cifs_ses *ses;
3702 struct cifs_tcon *tcon;
3703 struct tcon_link *tlink;
3706 spin_lock(&cifs_tcp_ses_lock);
3707 cifs_sb = CIFS_SB(sb);
3708 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3709 if (IS_ERR(tlink)) {
3710 spin_unlock(&cifs_tcp_ses_lock);
3713 tcon = tlink_tcon(tlink);
3715 tcp_srv = ses->server;
3717 volume_info = mnt_data->vol;
3719 if (!match_server(tcp_srv, volume_info) ||
3720 !match_session(ses, volume_info) ||
3721 !match_tcon(tcon, volume_info) ||
3722 !match_prepath(sb, mnt_data)) {
3727 rc = compare_mount_options(sb, mnt_data);
3729 spin_unlock(&cifs_tcp_ses_lock);
3730 cifs_put_tlink(tlink);
3734 #ifdef CONFIG_DEBUG_LOCK_ALLOC
3735 static struct lock_class_key cifs_key[2];
3736 static struct lock_class_key cifs_slock_key[2];
3739 cifs_reclassify_socket4(struct socket *sock)
3741 struct sock *sk = sock->sk;
3742 BUG_ON(!sock_allow_reclassification(sk));
3743 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
3744 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
3748 cifs_reclassify_socket6(struct socket *sock)
3750 struct sock *sk = sock->sk;
3751 BUG_ON(!sock_allow_reclassification(sk));
3752 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
3753 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
3757 cifs_reclassify_socket4(struct socket *sock)
3762 cifs_reclassify_socket6(struct socket *sock)
3767 /* See RFC1001 section 14 on representation of Netbios names */
3768 static void rfc1002mangle(char *target, char *source, unsigned int length)
3772 for (i = 0, j = 0; i < (length); i++) {
3773 /* mask a nibble at a time and encode */
3774 target[j] = 'A' + (0x0F & (source[i] >> 4));
3775 target[j+1] = 'A' + (0x0F & source[i]);
3782 bind_socket(struct TCP_Server_Info *server)
3785 if (server->srcaddr.ss_family != AF_UNSPEC) {
3786 /* Bind to the specified local IP address */
3787 struct socket *socket = server->ssocket;
3788 rc = socket->ops->bind(socket,
3789 (struct sockaddr *) &server->srcaddr,
3790 sizeof(server->srcaddr));
3792 struct sockaddr_in *saddr4;
3793 struct sockaddr_in6 *saddr6;
3794 saddr4 = (struct sockaddr_in *)&server->srcaddr;
3795 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
3796 if (saddr6->sin6_family == AF_INET6)
3797 cifs_server_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
3798 &saddr6->sin6_addr, rc);
3800 cifs_server_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
3801 &saddr4->sin_addr.s_addr, rc);
3808 ip_rfc1001_connect(struct TCP_Server_Info *server)
3812 * some servers require RFC1001 sessinit before sending
3813 * negprot - BB check reconnection in case where second
3814 * sessinit is sent but no second negprot
3816 struct rfc1002_session_packet *ses_init_buf;
3817 struct smb_hdr *smb_buf;
3818 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
3821 ses_init_buf->trailer.session_req.called_len = 32;
3823 if (server->server_RFC1001_name[0] != 0)
3824 rfc1002mangle(ses_init_buf->trailer.
3825 session_req.called_name,
3826 server->server_RFC1001_name,
3827 RFC1001_NAME_LEN_WITH_NULL);
3829 rfc1002mangle(ses_init_buf->trailer.
3830 session_req.called_name,
3831 DEFAULT_CIFS_CALLED_NAME,
3832 RFC1001_NAME_LEN_WITH_NULL);
3834 ses_init_buf->trailer.session_req.calling_len = 32;
3837 * calling name ends in null (byte 16) from old smb
3840 if (server->workstation_RFC1001_name[0] != 0)
3841 rfc1002mangle(ses_init_buf->trailer.
3842 session_req.calling_name,
3843 server->workstation_RFC1001_name,
3844 RFC1001_NAME_LEN_WITH_NULL);
3846 rfc1002mangle(ses_init_buf->trailer.
3847 session_req.calling_name,
3849 RFC1001_NAME_LEN_WITH_NULL);
3851 ses_init_buf->trailer.session_req.scope1 = 0;
3852 ses_init_buf->trailer.session_req.scope2 = 0;
3853 smb_buf = (struct smb_hdr *)ses_init_buf;
3855 /* sizeof RFC1002_SESSION_REQUEST with no scope */
3856 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
3857 rc = smb_send(server, smb_buf, 0x44);
3858 kfree(ses_init_buf);
3860 * RFC1001 layer in at least one server
3861 * requires very short break before negprot
3862 * presumably because not expecting negprot
3863 * to follow so fast. This is a simple
3864 * solution that works without
3865 * complicating the code and causes no
3866 * significant slowing down on mount
3869 usleep_range(1000, 2000);
3872 * else the negprot may still work without this
3873 * even though malloc failed
3880 generic_ip_connect(struct TCP_Server_Info *server)
3885 struct socket *socket = server->ssocket;
3886 struct sockaddr *saddr;
3888 saddr = (struct sockaddr *) &server->dstaddr;
3890 if (server->dstaddr.ss_family == AF_INET6) {
3891 sport = ((struct sockaddr_in6 *) saddr)->sin6_port;
3892 slen = sizeof(struct sockaddr_in6);
3895 sport = ((struct sockaddr_in *) saddr)->sin_port;
3896 slen = sizeof(struct sockaddr_in);
3900 if (socket == NULL) {
3901 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3902 IPPROTO_TCP, &socket, 1);
3904 cifs_server_dbg(VFS, "Error %d creating socket\n", rc);
3905 server->ssocket = NULL;
3909 /* BB other socket options to set KEEPALIVE, NODELAY? */
3910 cifs_dbg(FYI, "Socket created\n");
3911 server->ssocket = socket;
3912 socket->sk->sk_allocation = GFP_NOFS;
3913 if (sfamily == AF_INET6)
3914 cifs_reclassify_socket6(socket);
3916 cifs_reclassify_socket4(socket);
3919 rc = bind_socket(server);
3924 * Eventually check for other socket options to change from
3925 * the default. sock_setsockopt not used because it expects
3928 socket->sk->sk_rcvtimeo = 7 * HZ;
3929 socket->sk->sk_sndtimeo = 5 * HZ;
3931 /* make the bufsizes depend on wsize/rsize and max requests */
3932 if (server->noautotune) {
3933 if (socket->sk->sk_sndbuf < (200 * 1024))
3934 socket->sk->sk_sndbuf = 200 * 1024;
3935 if (socket->sk->sk_rcvbuf < (140 * 1024))
3936 socket->sk->sk_rcvbuf = 140 * 1024;
3939 if (server->tcp_nodelay)
3940 tcp_sock_set_nodelay(socket->sk);
3942 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3943 socket->sk->sk_sndbuf,
3944 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3946 rc = socket->ops->connect(socket, saddr, slen,
3947 server->noblockcnt ? O_NONBLOCK : 0);
3949 * When mounting SMB root file systems, we do not want to block in
3950 * connect. Otherwise bail out and then let cifs_reconnect() perform
3951 * reconnect failover - if possible.
3953 if (server->noblockcnt && rc == -EINPROGRESS)
3956 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3957 sock_release(socket);
3958 server->ssocket = NULL;
3962 if (sport == htons(RFC1001_PORT))
3963 rc = ip_rfc1001_connect(server);
3969 ip_connect(struct TCP_Server_Info *server)
3972 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3973 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3975 if (server->dstaddr.ss_family == AF_INET6)
3976 sport = &addr6->sin6_port;
3978 sport = &addr->sin_port;
3983 /* try with 445 port at first */
3984 *sport = htons(CIFS_PORT);
3986 rc = generic_ip_connect(server);
3990 /* if it failed, try with 139 port */
3991 *sport = htons(RFC1001_PORT);
3994 return generic_ip_connect(server);
3997 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
3998 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
4000 /* if we are reconnecting then should we check to see if
4001 * any requested capabilities changed locally e.g. via
4002 * remount but we can not do much about it here
4003 * if they have (even if we could detect it by the following)
4004 * Perhaps we could add a backpointer to array of sb from tcon
4005 * or if we change to make all sb to same share the same
4006 * sb as NFS - then we only have one backpointer to sb.
4007 * What if we wanted to mount the server share twice once with
4008 * and once without posixacls or posix paths? */
4009 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
4011 if (vol_info && vol_info->no_linux_ext) {
4012 tcon->fsUnixInfo.Capability = 0;
4013 tcon->unix_ext = 0; /* Unix Extensions disabled */
4014 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
4016 } else if (vol_info)
4017 tcon->unix_ext = 1; /* Unix Extensions supported */
4019 if (tcon->unix_ext == 0) {
4020 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
4024 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
4025 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
4026 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
4027 /* check for reconnect case in which we do not
4028 want to change the mount behavior if we can avoid it */
4029 if (vol_info == NULL) {
4030 /* turn off POSIX ACL and PATHNAMES if not set
4031 originally at mount time */
4032 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
4033 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
4034 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
4035 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
4036 cifs_dbg(VFS, "POSIXPATH support change\n");
4037 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
4038 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
4039 cifs_dbg(VFS, "possible reconnect error\n");
4040 cifs_dbg(VFS, "server disabled POSIX path support\n");
4044 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
4045 cifs_dbg(VFS, "per-share encryption not supported yet\n");
4047 cap &= CIFS_UNIX_CAP_MASK;
4048 if (vol_info && vol_info->no_psx_acl)
4049 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
4050 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
4051 cifs_dbg(FYI, "negotiated posix acl support\n");
4053 cifs_sb->mnt_cifs_flags |=
4054 CIFS_MOUNT_POSIXACL;
4057 if (vol_info && vol_info->posix_paths == 0)
4058 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
4059 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
4060 cifs_dbg(FYI, "negotiate posix pathnames\n");
4062 cifs_sb->mnt_cifs_flags |=
4063 CIFS_MOUNT_POSIX_PATHS;
4066 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
4067 #ifdef CONFIG_CIFS_DEBUG2
4068 if (cap & CIFS_UNIX_FCNTL_CAP)
4069 cifs_dbg(FYI, "FCNTL cap\n");
4070 if (cap & CIFS_UNIX_EXTATTR_CAP)
4071 cifs_dbg(FYI, "EXTATTR cap\n");
4072 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
4073 cifs_dbg(FYI, "POSIX path cap\n");
4074 if (cap & CIFS_UNIX_XATTR_CAP)
4075 cifs_dbg(FYI, "XATTR cap\n");
4076 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
4077 cifs_dbg(FYI, "POSIX ACL cap\n");
4078 if (cap & CIFS_UNIX_LARGE_READ_CAP)
4079 cifs_dbg(FYI, "very large read cap\n");
4080 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
4081 cifs_dbg(FYI, "very large write cap\n");
4082 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
4083 cifs_dbg(FYI, "transport encryption cap\n");
4084 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
4085 cifs_dbg(FYI, "mandatory transport encryption cap\n");
4086 #endif /* CIFS_DEBUG2 */
4087 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
4088 if (vol_info == NULL) {
4089 cifs_dbg(FYI, "resetting capabilities failed\n");
4091 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");
4097 int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
4098 struct cifs_sb_info *cifs_sb)
4100 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
4102 spin_lock_init(&cifs_sb->tlink_tree_lock);
4103 cifs_sb->tlink_tree = RB_ROOT;
4105 cifs_sb->bsize = pvolume_info->bsize;
4107 * Temporarily set r/wsize for matching superblock. If we end up using
4108 * new sb then client will later negotiate it downward if needed.
4110 cifs_sb->rsize = pvolume_info->rsize;
4111 cifs_sb->wsize = pvolume_info->wsize;
4113 cifs_sb->mnt_uid = pvolume_info->linux_uid;
4114 cifs_sb->mnt_gid = pvolume_info->linux_gid;
4115 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
4116 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
4117 cifs_dbg(FYI, "file mode: %04ho dir mode: %04ho\n",
4118 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
4120 cifs_sb->actimeo = pvolume_info->actimeo;
4121 cifs_sb->local_nls = pvolume_info->local_nls;
4123 if (pvolume_info->nodfs)
4124 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_DFS;
4125 if (pvolume_info->noperm)
4126 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
4127 if (pvolume_info->setuids)
4128 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
4129 if (pvolume_info->setuidfromacl)
4130 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
4131 if (pvolume_info->server_ino)
4132 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
4133 if (pvolume_info->remap)
4134 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
4135 if (pvolume_info->sfu_remap)
4136 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
4137 if (pvolume_info->no_xattr)
4138 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
4139 if (pvolume_info->sfu_emul)
4140 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
4141 if (pvolume_info->nobrl)
4142 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
4143 if (pvolume_info->nohandlecache)
4144 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_HANDLE_CACHE;
4145 if (pvolume_info->nostrictsync)
4146 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
4147 if (pvolume_info->mand_lock)
4148 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
4149 if (pvolume_info->rwpidforward)
4150 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
4151 if (pvolume_info->mode_ace)
4152 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MODE_FROM_SID;
4153 if (pvolume_info->cifs_acl)
4154 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
4155 if (pvolume_info->backupuid_specified) {
4156 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
4157 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
4159 if (pvolume_info->backupgid_specified) {
4160 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
4161 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
4163 if (pvolume_info->override_uid)
4164 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
4165 if (pvolume_info->override_gid)
4166 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
4167 if (pvolume_info->dynperm)
4168 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
4169 if (pvolume_info->fsc)
4170 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
4171 if (pvolume_info->multiuser)
4172 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
4173 CIFS_MOUNT_NO_PERM);
4174 if (pvolume_info->strict_io)
4175 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
4176 if (pvolume_info->direct_io) {
4177 cifs_dbg(FYI, "mounting share using direct i/o\n");
4178 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
4180 if (pvolume_info->cache_ro) {
4181 cifs_dbg(VFS, "mounting share with read only caching. Ensure that the share will not be modified while in use.\n");
4182 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RO_CACHE;
4183 } else if (pvolume_info->cache_rw) {
4184 cifs_dbg(VFS, "mounting share in single client RW caching mode. Ensure that no other systems will be accessing the share.\n");
4185 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_RO_CACHE |
4186 CIFS_MOUNT_RW_CACHE);
4188 if (pvolume_info->mfsymlinks) {
4189 if (pvolume_info->sfu_emul) {
4191 * Our SFU ("Services for Unix" emulation does not allow
4192 * creating symlinks but does allow reading existing SFU
4193 * symlinks (it does allow both creating and reading SFU
4194 * style mknod and FIFOs though). When "mfsymlinks" and
4195 * "sfu" are both enabled at the same time, it allows
4196 * reading both types of symlinks, but will only create
4197 * them with mfsymlinks format. This allows better
4198 * Apple compatibility (probably better for Samba too)
4199 * while still recognizing old Windows style symlinks.
4201 cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
4203 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
4206 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
4207 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
4209 if (pvolume_info->prepath) {
4210 cifs_sb->prepath = kstrdup(pvolume_info->prepath, GFP_KERNEL);
4211 if (cifs_sb->prepath == NULL)
4219 cifs_cleanup_volume_info_contents(struct smb_vol *volume_info)
4221 kfree(volume_info->username);
4222 kzfree(volume_info->password);
4223 kfree(volume_info->UNC);
4224 kfree(volume_info->domainname);
4225 kfree(volume_info->iocharset);
4226 kfree(volume_info->prepath);
4230 cifs_cleanup_volume_info(struct smb_vol *volume_info)
4234 cifs_cleanup_volume_info_contents(volume_info);
4238 /* Release all succeed connections */
4239 static inline void mount_put_conns(struct cifs_sb_info *cifs_sb,
4241 struct TCP_Server_Info *server,
4242 struct cifs_ses *ses, struct cifs_tcon *tcon)
4247 cifs_put_tcon(tcon);
4249 cifs_put_smb_ses(ses);
4251 cifs_put_tcp_session(server, 0);
4252 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
4256 /* Get connections for tcp, ses and tcon */
4257 static int mount_get_conns(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
4259 struct TCP_Server_Info **nserver,
4260 struct cifs_ses **nses, struct cifs_tcon **ntcon)
4263 struct TCP_Server_Info *server;
4264 struct cifs_ses *ses;
4265 struct cifs_tcon *tcon;
4273 /* get a reference to a tcp session */
4274 server = cifs_get_tcp_session(vol);
4275 if (IS_ERR(server)) {
4276 rc = PTR_ERR(server);
4282 if ((vol->max_credits < 20) || (vol->max_credits > 60000))
4283 server->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
4285 server->max_credits = vol->max_credits;
4287 /* get a reference to a SMB session */
4288 ses = cifs_get_smb_ses(server, vol);
4296 if ((vol->persistent == true) && (!(ses->server->capabilities &
4297 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES))) {
4298 cifs_server_dbg(VFS, "persistent handles not supported by server\n");
4302 /* search for existing tcon to this server share */
4303 tcon = cifs_get_tcon(ses, vol);
4311 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
4312 if (tcon->posix_extensions)
4313 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
4315 /* tell server which Unix caps we support */
4316 if (cap_unix(tcon->ses)) {
4318 * reset of caps checks mount to see if unix extensions disabled
4319 * for just this mount.
4321 reset_cifs_unix_caps(*xid, tcon, cifs_sb, vol);
4322 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
4323 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
4324 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP))
4327 tcon->unix_ext = 0; /* server does not support them */
4329 /* do not care if a following call succeed - informational */
4330 if (!tcon->pipe && server->ops->qfs_tcon) {
4331 server->ops->qfs_tcon(*xid, tcon, cifs_sb);
4332 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE) {
4333 if (tcon->fsDevInfo.DeviceCharacteristics &
4334 cpu_to_le32(FILE_READ_ONLY_DEVICE))
4335 cifs_dbg(VFS, "mounted to read only share\n");
4336 else if ((cifs_sb->mnt_cifs_flags &
4337 CIFS_MOUNT_RW_CACHE) == 0)
4338 cifs_dbg(VFS, "read only mount of RW share\n");
4339 /* no need to log a RW mount of a typical RW share */
4343 cifs_sb->wsize = server->ops->negotiate_wsize(tcon, vol);
4344 cifs_sb->rsize = server->ops->negotiate_rsize(tcon, vol);
4349 static int mount_setup_tlink(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
4350 struct cifs_tcon *tcon)
4352 struct tcon_link *tlink;
4354 /* hang the tcon off of the superblock */
4355 tlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4359 tlink->tl_uid = ses->linux_uid;
4360 tlink->tl_tcon = tcon;
4361 tlink->tl_time = jiffies;
4362 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
4363 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4365 cifs_sb->master_tlink = tlink;
4366 spin_lock(&cifs_sb->tlink_tree_lock);
4367 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4368 spin_unlock(&cifs_sb->tlink_tree_lock);
4370 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4375 #ifdef CONFIG_CIFS_DFS_UPCALL
4377 * cifs_build_path_to_root returns full path to root when we do not have an
4378 * exiting connection (tcon)
4381 build_unc_path_to_root(const struct smb_vol *vol,
4382 const struct cifs_sb_info *cifs_sb, bool useppath)
4384 char *full_path, *pos;
4385 unsigned int pplen = useppath && vol->prepath ?
4386 strlen(vol->prepath) + 1 : 0;
4387 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
4389 if (unc_len > MAX_TREE_SIZE)
4390 return ERR_PTR(-EINVAL);
4392 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
4393 if (full_path == NULL)
4394 return ERR_PTR(-ENOMEM);
4396 memcpy(full_path, vol->UNC, unc_len);
4397 pos = full_path + unc_len;
4400 *pos = CIFS_DIR_SEP(cifs_sb);
4401 memcpy(pos + 1, vol->prepath, pplen);
4405 *pos = '\0'; /* add trailing null */
4406 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
4407 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
4412 * expand_dfs_referral - Perform a dfs referral query and update the cifs_sb
4415 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
4416 * to a string containing updated options for the submount. Otherwise it
4417 * will be left untouched.
4419 * Returns the rc from get_dfs_path to the caller, which can be used to
4420 * determine whether there were referrals.
4423 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
4424 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
4428 struct dfs_info3_param referral = {0};
4429 char *full_path = NULL, *ref_path = NULL, *mdata = NULL;
4431 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4434 full_path = build_unc_path_to_root(volume_info, cifs_sb, true);
4435 if (IS_ERR(full_path))
4436 return PTR_ERR(full_path);
4438 /* For DFS paths, skip the first '\' of the UNC */
4439 ref_path = check_prefix ? full_path + 1 : volume_info->UNC + 1;
4441 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4442 ref_path, &referral, NULL);
4444 char *fake_devname = NULL;
4446 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
4447 full_path + 1, &referral,
4449 free_dfs_info_param(&referral);
4451 if (IS_ERR(mdata)) {
4452 rc = PTR_ERR(mdata);
4455 cifs_cleanup_volume_info_contents(volume_info);
4456 rc = cifs_setup_volume_info(volume_info, mdata,
4457 fake_devname, false);
4459 kfree(fake_devname);
4460 kfree(cifs_sb->mountdata);
4461 cifs_sb->mountdata = mdata;
4467 static inline int get_next_dfs_tgt(const char *path,
4468 struct dfs_cache_tgt_list *tgt_list,
4469 struct dfs_cache_tgt_iterator **tgt_it)
4472 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
4474 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
4475 return !*tgt_it ? -EHOSTDOWN : 0;
4478 static int update_vol_info(const struct dfs_cache_tgt_iterator *tgt_it,
4479 struct smb_vol *fake_vol, struct smb_vol *vol)
4481 const char *tgt = dfs_cache_get_tgt_name(tgt_it);
4482 int len = strlen(tgt) + 2;
4485 new_unc = kmalloc(len, GFP_KERNEL);
4488 scnprintf(new_unc, len, "\\%s", tgt);
4493 if (fake_vol->prepath) {
4494 kfree(vol->prepath);
4495 vol->prepath = fake_vol->prepath;
4496 fake_vol->prepath = NULL;
4498 memcpy(&vol->dstaddr, &fake_vol->dstaddr, sizeof(vol->dstaddr));
4503 static int setup_dfs_tgt_conn(const char *path,
4504 const struct dfs_cache_tgt_iterator *tgt_it,
4505 struct cifs_sb_info *cifs_sb,
4506 struct smb_vol *vol,
4508 struct TCP_Server_Info **server,
4509 struct cifs_ses **ses,
4510 struct cifs_tcon **tcon)
4513 struct dfs_info3_param ref = {0};
4514 char *mdata = NULL, *fake_devname = NULL;
4515 struct smb_vol fake_vol = {NULL};
4517 cifs_dbg(FYI, "%s: dfs path: %s\n", __func__, path);
4519 rc = dfs_cache_get_tgt_referral(path, tgt_it, &ref);
4523 mdata = cifs_compose_mount_options(cifs_sb->mountdata, path, &ref,
4525 free_dfs_info_param(&ref);
4527 if (IS_ERR(mdata)) {
4528 rc = PTR_ERR(mdata);
4531 cifs_dbg(FYI, "%s: fake_devname: %s\n", __func__, fake_devname);
4532 rc = cifs_setup_volume_info(&fake_vol, mdata, fake_devname,
4536 kfree(fake_devname);
4540 * We use a 'fake_vol' here because we need pass it down to the
4541 * mount_{get,put} functions to test connection against new DFS
4544 mount_put_conns(cifs_sb, *xid, *server, *ses, *tcon);
4545 rc = mount_get_conns(&fake_vol, cifs_sb, xid, server, ses,
4549 * We were able to connect to new target server.
4550 * Update current volume info with new target server.
4552 rc = update_vol_info(tgt_it, &fake_vol, vol);
4555 cifs_cleanup_volume_info_contents(&fake_vol);
4559 static int mount_do_dfs_failover(const char *path,
4560 struct cifs_sb_info *cifs_sb,
4561 struct smb_vol *vol,
4562 struct cifs_ses *root_ses,
4564 struct TCP_Server_Info **server,
4565 struct cifs_ses **ses,
4566 struct cifs_tcon **tcon)
4569 struct dfs_cache_tgt_list tgt_list;
4570 struct dfs_cache_tgt_iterator *tgt_it = NULL;
4572 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4575 rc = dfs_cache_noreq_find(path, NULL, &tgt_list);
4580 /* Get next DFS target server - if any */
4581 rc = get_next_dfs_tgt(path, &tgt_list, &tgt_it);
4584 /* Connect to next DFS target */
4585 rc = setup_dfs_tgt_conn(path, tgt_it, cifs_sb, vol, xid, server,
4587 if (!rc || rc == -EACCES || rc == -EOPNOTSUPP)
4592 * Update DFS target hint in DFS referral cache with the target
4593 * server we successfully reconnected to.
4595 rc = dfs_cache_update_tgthint(*xid, root_ses ? root_ses : *ses,
4597 cifs_remap(cifs_sb), path,
4600 dfs_cache_free_tgts(&tgt_list);
4606 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
4607 const char *devname, bool is_smb3)
4611 if (cifs_parse_mount_options(mount_data, devname, volume_info, is_smb3))
4614 if (volume_info->nullauth) {
4615 cifs_dbg(FYI, "Anonymous login\n");
4616 kfree(volume_info->username);
4617 volume_info->username = NULL;
4618 } else if (volume_info->username) {
4619 /* BB fixme parse for domain name here */
4620 cifs_dbg(FYI, "Username: %s\n", volume_info->username);
4622 cifs_dbg(VFS, "No username specified\n");
4623 /* In userspace mount helper we can get user name from alternate
4624 locations such as env variables and files on disk */
4628 /* this is needed for ASCII cp to Unicode converts */
4629 if (volume_info->iocharset == NULL) {
4630 /* load_nls_default cannot return null */
4631 volume_info->local_nls = load_nls_default();
4633 volume_info->local_nls = load_nls(volume_info->iocharset);
4634 if (volume_info->local_nls == NULL) {
4635 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
4636 volume_info->iocharset);
4645 cifs_get_volume_info(char *mount_data, const char *devname, bool is_smb3)
4648 struct smb_vol *volume_info;
4650 volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
4652 return ERR_PTR(-ENOMEM);
4654 rc = cifs_setup_volume_info(volume_info, mount_data, devname, is_smb3);
4656 cifs_cleanup_volume_info(volume_info);
4657 volume_info = ERR_PTR(rc);
4664 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
4666 struct cifs_tcon *tcon,
4667 struct cifs_sb_info *cifs_sb,
4674 int skip = added_treename ? 1 : 0;
4676 sep = CIFS_DIR_SEP(cifs_sb);
4679 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
4681 /* skip separators */
4686 /* next separator */
4687 while (*s && *s != sep)
4690 * if the treename is added, we then have to skip the first
4691 * part within the separators
4698 * temporarily null-terminate the path at the end of
4699 * the current component
4703 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4711 * Check if path is remote (e.g. a DFS share). Return -EREMOTE if it is,
4714 static int is_path_remote(struct cifs_sb_info *cifs_sb, struct smb_vol *vol,
4715 const unsigned int xid,
4716 struct TCP_Server_Info *server,
4717 struct cifs_tcon *tcon)
4722 if (!server->ops->is_path_accessible)
4726 * cifs_build_path_to_root works only when we have a valid tcon
4728 full_path = cifs_build_path_to_root(vol, cifs_sb, tcon,
4729 tcon->Flags & SMB_SHARE_IS_IN_DFS);
4730 if (full_path == NULL)
4733 cifs_dbg(FYI, "%s: full_path: %s\n", __func__, full_path);
4735 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4737 if (rc != 0 && rc != -EREMOTE) {
4742 if (rc != -EREMOTE) {
4743 rc = cifs_are_all_path_components_accessible(server, xid, tcon,
4744 cifs_sb, full_path, tcon->Flags & SMB_SHARE_IS_IN_DFS);
4746 cifs_server_dbg(VFS, "cannot query dirs between root and final path, enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
4747 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
4756 #ifdef CONFIG_CIFS_DFS_UPCALL
4757 static inline void set_root_tcon(struct cifs_sb_info *cifs_sb,
4758 struct cifs_tcon *tcon,
4759 struct cifs_tcon **root)
4761 spin_lock(&cifs_tcp_ses_lock);
4763 tcon->remap = cifs_remap(cifs_sb);
4764 spin_unlock(&cifs_tcp_ses_lock);
4768 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4772 struct cifs_ses *ses;
4773 struct cifs_tcon *root_tcon = NULL;
4774 struct cifs_tcon *tcon = NULL;
4775 struct TCP_Server_Info *server;
4776 char *root_path = NULL, *full_path = NULL;
4777 char *old_mountdata, *origin_mountdata = NULL;
4780 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4782 /* If not a standalone DFS root, then check if path is remote */
4783 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls,
4784 cifs_remap(cifs_sb), vol->UNC + 1, NULL,
4787 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4795 * If first DFS target server went offline and we failed to connect it,
4796 * server and ses pointers are NULL at this point, though we still have
4797 * chance to get a cached DFS referral in expand_dfs_referral() and
4798 * retry next target available in it.
4800 * If a NULL ses ptr is passed to dfs_cache_find(), a lookup will be
4801 * performed against DFS path and *no* requests will be sent to server
4802 * for any new DFS referrals. Hence it's safe to skip checking whether
4803 * server or ses ptr is NULL.
4805 if (rc == -EACCES || rc == -EOPNOTSUPP)
4808 root_path = build_unc_path_to_root(vol, cifs_sb, false);
4809 if (IS_ERR(root_path)) {
4810 rc = PTR_ERR(root_path);
4815 full_path = build_unc_path_to_root(vol, cifs_sb, true);
4816 if (IS_ERR(full_path)) {
4817 rc = PTR_ERR(full_path);
4822 * Perform an unconditional check for whether there are DFS
4823 * referrals for this path without prefix, to provide support
4824 * for DFS referrals from w2k8 servers which don't seem to respond
4825 * with PATH_NOT_COVERED to requests that include the prefix.
4826 * Chase the referral if found, otherwise continue normally.
4828 old_mountdata = cifs_sb->mountdata;
4829 (void)expand_dfs_referral(xid, ses, vol, cifs_sb, false);
4831 if (cifs_sb->mountdata == NULL) {
4836 /* Save DFS root volume information for DFS refresh worker */
4837 origin_mountdata = kstrndup(cifs_sb->mountdata,
4838 strlen(cifs_sb->mountdata), GFP_KERNEL);
4839 if (!origin_mountdata) {
4844 if (cifs_sb->mountdata != old_mountdata) {
4845 /* If we were redirected, reconnect to new target server */
4846 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4847 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4850 if (rc == -EACCES || rc == -EOPNOTSUPP)
4852 /* Perform DFS failover to any other DFS targets */
4853 rc = mount_do_dfs_failover(root_path + 1, cifs_sb, vol, NULL,
4854 &xid, &server, &ses, &tcon);
4860 root_path = build_unc_path_to_root(vol, cifs_sb, false);
4861 if (IS_ERR(root_path)) {
4862 rc = PTR_ERR(root_path);
4866 /* Cache out resolved root server */
4867 (void)dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4868 root_path + 1, NULL, NULL);
4872 set_root_tcon(cifs_sb, tcon, &root_tcon);
4874 for (count = 1; ;) {
4876 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4877 if (!rc || rc != -EREMOTE)
4881 * BB: when we implement proper loop detection,
4882 * we will remove this check. But now we need it
4883 * to prevent an indefinite loop if 'DFS tree' is
4884 * misconfigured (i.e. has loops).
4886 if (count++ > MAX_NESTED_LINKS) {
4892 full_path = build_unc_path_to_root(vol, cifs_sb, true);
4893 if (IS_ERR(full_path)) {
4894 rc = PTR_ERR(full_path);
4899 old_mountdata = cifs_sb->mountdata;
4900 rc = expand_dfs_referral(xid, root_tcon->ses, vol, cifs_sb,
4905 if (cifs_sb->mountdata != old_mountdata) {
4906 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4907 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses,
4910 * Ensure that DFS referrals go through new root server.
4913 (tcon->share_flags & (SHI1005_FLAGS_DFS |
4914 SHI1005_FLAGS_DFS_ROOT))) {
4915 cifs_put_tcon(root_tcon);
4916 set_root_tcon(cifs_sb, tcon, &root_tcon);
4920 if (rc == -EACCES || rc == -EOPNOTSUPP)
4922 /* Perform DFS failover to any other DFS targets */
4923 rc = mount_do_dfs_failover(full_path + 1, cifs_sb, vol,
4924 root_tcon->ses, &xid,
4925 &server, &ses, &tcon);
4926 if (rc == -EACCES || rc == -EOPNOTSUPP || !server ||
4931 cifs_put_tcon(root_tcon);
4936 spin_lock(&cifs_tcp_ses_lock);
4937 if (!tcon->dfs_path) {
4938 /* Save full path in new tcon to do failover when reconnecting tcons */
4939 tcon->dfs_path = full_path;
4941 tcon->remap = cifs_remap(cifs_sb);
4943 cifs_sb->origin_fullpath = kstrndup(tcon->dfs_path,
4944 strlen(tcon->dfs_path),
4946 if (!cifs_sb->origin_fullpath) {
4947 spin_unlock(&cifs_tcp_ses_lock);
4951 spin_unlock(&cifs_tcp_ses_lock);
4953 rc = dfs_cache_add_vol(origin_mountdata, vol, cifs_sb->origin_fullpath);
4955 kfree(cifs_sb->origin_fullpath);
4959 * After reconnecting to a different server, unique ids won't
4960 * match anymore, so we disable serverino. This prevents
4961 * dentry revalidation to think the dentry are stale (ESTALE).
4963 cifs_autodisable_serverino(cifs_sb);
4965 * Force the use of prefix path to support failover on DFS paths that
4966 * resolve to targets that have different prefix paths.
4968 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
4969 kfree(cifs_sb->prepath);
4970 cifs_sb->prepath = vol->prepath;
4971 vol->prepath = NULL;
4975 cifs_try_adding_channels(ses);
4976 return mount_setup_tlink(cifs_sb, ses, tcon);
4981 kfree(origin_mountdata);
4982 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4986 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4990 struct cifs_ses *ses;
4991 struct cifs_tcon *tcon;
4992 struct TCP_Server_Info *server;
4994 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4999 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
5008 return mount_setup_tlink(cifs_sb, ses, tcon);
5011 mount_put_conns(cifs_sb, xid, server, ses, tcon);
5017 * Issue a TREE_CONNECT request.
5020 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
5021 const char *tree, struct cifs_tcon *tcon,
5022 const struct nls_table *nls_codepage)
5024 struct smb_hdr *smb_buffer;
5025 struct smb_hdr *smb_buffer_response;
5028 unsigned char *bcc_ptr;
5031 __u16 bytes_left, count;
5036 smb_buffer = cifs_buf_get();
5037 if (smb_buffer == NULL)
5040 smb_buffer_response = smb_buffer;
5042 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
5043 NULL /*no tid */ , 4 /*wct */ );
5045 smb_buffer->Mid = get_next_mid(ses->server);
5046 smb_buffer->Uid = ses->Suid;
5047 pSMB = (TCONX_REQ *) smb_buffer;
5048 pSMBr = (TCONX_RSP *) smb_buffer_response;
5050 pSMB->AndXCommand = 0xFF;
5051 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
5052 bcc_ptr = &pSMB->Password[0];
5053 if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
5054 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
5055 *bcc_ptr = 0; /* password is null byte */
5056 bcc_ptr++; /* skip password */
5057 /* already aligned so no need to do it below */
5059 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
5060 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
5061 specified as required (when that support is added to
5062 the vfs in the future) as only NTLM or the much
5063 weaker LANMAN (which we do not send by default) is accepted
5064 by Samba (not sure whether other servers allow
5065 NTLMv2 password here) */
5066 #ifdef CONFIG_CIFS_WEAK_PW_HASH
5067 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
5068 (ses->sectype == LANMAN))
5069 calc_lanman_hash(tcon->password, ses->server->cryptkey,
5070 ses->server->sec_mode &
5071 SECMODE_PW_ENCRYPT ? true : false,
5074 #endif /* CIFS_WEAK_PW_HASH */
5075 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
5076 bcc_ptr, nls_codepage);
5078 cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
5080 cifs_buf_release(smb_buffer);
5084 bcc_ptr += CIFS_AUTH_RESP_SIZE;
5085 if (ses->capabilities & CAP_UNICODE) {
5086 /* must align unicode strings */
5087 *bcc_ptr = 0; /* null byte password */
5092 if (ses->server->sign)
5093 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
5095 if (ses->capabilities & CAP_STATUS32) {
5096 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
5098 if (ses->capabilities & CAP_DFS) {
5099 smb_buffer->Flags2 |= SMBFLG2_DFS;
5101 if (ses->capabilities & CAP_UNICODE) {
5102 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
5104 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
5105 6 /* max utf8 char length in bytes */ *
5106 (/* server len*/ + 256 /* share len */), nls_codepage);
5107 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
5108 bcc_ptr += 2; /* skip trailing null */
5109 } else { /* ASCII */
5110 strcpy(bcc_ptr, tree);
5111 bcc_ptr += strlen(tree) + 1;
5113 strcpy(bcc_ptr, "?????");
5114 bcc_ptr += strlen("?????");
5116 count = bcc_ptr - &pSMB->Password[0];
5117 pSMB->hdr.smb_buf_length = cpu_to_be32(be32_to_cpu(
5118 pSMB->hdr.smb_buf_length) + count);
5119 pSMB->ByteCount = cpu_to_le16(count);
5121 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
5124 /* above now done in SendReceive */
5128 tcon->tidStatus = CifsGood;
5129 tcon->need_reconnect = false;
5130 tcon->tid = smb_buffer_response->Tid;
5131 bcc_ptr = pByteArea(smb_buffer_response);
5132 bytes_left = get_bcc(smb_buffer_response);
5133 length = strnlen(bcc_ptr, bytes_left - 2);
5134 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
5140 /* skip service field (NB: this field is always ASCII) */
5142 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
5143 (bcc_ptr[2] == 'C')) {
5144 cifs_dbg(FYI, "IPC connection\n");
5148 } else if (length == 2) {
5149 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
5150 /* the most common case */
5151 cifs_dbg(FYI, "disk share connection\n");
5154 bcc_ptr += length + 1;
5155 bytes_left -= (length + 1);
5156 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
5158 /* mostly informational -- no need to fail on error here */
5159 kfree(tcon->nativeFileSystem);
5160 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
5161 bytes_left, is_unicode,
5164 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
5166 if ((smb_buffer_response->WordCount == 3) ||
5167 (smb_buffer_response->WordCount == 7))
5168 /* field is in same location */
5169 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
5172 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
5175 cifs_buf_release(smb_buffer);
5179 static void delayed_free(struct rcu_head *p)
5181 struct cifs_sb_info *sbi = container_of(p, struct cifs_sb_info, rcu);
5182 unload_nls(sbi->local_nls);
5187 cifs_umount(struct cifs_sb_info *cifs_sb)
5189 struct rb_root *root = &cifs_sb->tlink_tree;
5190 struct rb_node *node;
5191 struct tcon_link *tlink;
5193 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
5195 spin_lock(&cifs_sb->tlink_tree_lock);
5196 while ((node = rb_first(root))) {
5197 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
5198 cifs_get_tlink(tlink);
5199 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
5200 rb_erase(node, root);
5202 spin_unlock(&cifs_sb->tlink_tree_lock);
5203 cifs_put_tlink(tlink);
5204 spin_lock(&cifs_sb->tlink_tree_lock);
5206 spin_unlock(&cifs_sb->tlink_tree_lock);
5208 kfree(cifs_sb->mountdata);
5209 kfree(cifs_sb->prepath);
5210 #ifdef CONFIG_CIFS_DFS_UPCALL
5211 dfs_cache_del_vol(cifs_sb->origin_fullpath);
5212 kfree(cifs_sb->origin_fullpath);
5214 call_rcu(&cifs_sb->rcu, delayed_free);
5218 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
5221 struct TCP_Server_Info *server = cifs_ses_server(ses);
5223 if (!server->ops->need_neg || !server->ops->negotiate)
5226 /* only send once per connect */
5227 if (!server->ops->need_neg(server))
5230 rc = server->ops->negotiate(xid, ses);
5232 spin_lock(&GlobalMid_Lock);
5233 if (server->tcpStatus == CifsNeedNegotiate)
5234 server->tcpStatus = CifsGood;
5237 spin_unlock(&GlobalMid_Lock);
5244 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
5245 struct nls_table *nls_info)
5248 struct TCP_Server_Info *server = cifs_ses_server(ses);
5250 if (!ses->binding) {
5251 ses->capabilities = server->capabilities;
5252 if (linuxExtEnabled == 0)
5253 ses->capabilities &= (~server->vals->cap_unix);
5255 if (ses->auth_key.response) {
5256 cifs_dbg(FYI, "Free previous auth_key.response = %p\n",
5257 ses->auth_key.response);
5258 kfree(ses->auth_key.response);
5259 ses->auth_key.response = NULL;
5260 ses->auth_key.len = 0;
5264 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
5265 server->sec_mode, server->capabilities, server->timeAdj);
5267 if (server->ops->sess_setup)
5268 rc = server->ops->sess_setup(xid, ses, nls_info);
5271 cifs_server_dbg(VFS, "Send error in SessSetup = %d\n", rc);
5277 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
5279 vol->sectype = ses->sectype;
5281 /* krb5 is special, since we don't need username or pw */
5282 if (vol->sectype == Kerberos)
5285 return cifs_set_cifscreds(vol, ses);
5288 static struct cifs_tcon *
5289 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
5292 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
5293 struct cifs_ses *ses;
5294 struct cifs_tcon *tcon = NULL;
5295 struct smb_vol *vol_info;
5297 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
5298 if (vol_info == NULL)
5299 return ERR_PTR(-ENOMEM);
5301 vol_info->local_nls = cifs_sb->local_nls;
5302 vol_info->linux_uid = fsuid;
5303 vol_info->cred_uid = fsuid;
5304 vol_info->UNC = master_tcon->treeName;
5305 vol_info->retry = master_tcon->retry;
5306 vol_info->nocase = master_tcon->nocase;
5307 vol_info->nohandlecache = master_tcon->nohandlecache;
5308 vol_info->local_lease = master_tcon->local_lease;
5309 vol_info->no_lease = master_tcon->no_lease;
5310 vol_info->resilient = master_tcon->use_resilient;
5311 vol_info->persistent = master_tcon->use_persistent;
5312 vol_info->handle_timeout = master_tcon->handle_timeout;
5313 vol_info->no_linux_ext = !master_tcon->unix_ext;
5314 vol_info->linux_ext = master_tcon->posix_extensions;
5315 vol_info->sectype = master_tcon->ses->sectype;
5316 vol_info->sign = master_tcon->ses->sign;
5317 vol_info->seal = master_tcon->seal;
5319 rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
5325 /* get a reference for the same TCP session */
5326 spin_lock(&cifs_tcp_ses_lock);
5327 ++master_tcon->ses->server->srv_count;
5328 spin_unlock(&cifs_tcp_ses_lock);
5330 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
5332 tcon = (struct cifs_tcon *)ses;
5333 cifs_put_tcp_session(master_tcon->ses->server, 0);
5337 tcon = cifs_get_tcon(ses, vol_info);
5339 cifs_put_smb_ses(ses);
5344 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
5347 kfree(vol_info->username);
5348 kzfree(vol_info->password);
5355 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
5357 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
5360 /* find and return a tlink with given uid */
5361 static struct tcon_link *
5362 tlink_rb_search(struct rb_root *root, kuid_t uid)
5364 struct rb_node *node = root->rb_node;
5365 struct tcon_link *tlink;
5368 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
5370 if (uid_gt(tlink->tl_uid, uid))
5371 node = node->rb_left;
5372 else if (uid_lt(tlink->tl_uid, uid))
5373 node = node->rb_right;
5380 /* insert a tcon_link into the tree */
5382 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
5384 struct rb_node **new = &(root->rb_node), *parent = NULL;
5385 struct tcon_link *tlink;
5388 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
5391 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
5392 new = &((*new)->rb_left);
5394 new = &((*new)->rb_right);
5397 rb_link_node(&new_tlink->tl_rbnode, parent, new);
5398 rb_insert_color(&new_tlink->tl_rbnode, root);
5402 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
5405 * If the superblock doesn't refer to a multiuser mount, then just return
5406 * the master tcon for the mount.
5408 * First, search the rbtree for an existing tcon for this fsuid. If one
5409 * exists, then check to see if it's pending construction. If it is then wait
5410 * for construction to complete. Once it's no longer pending, check to see if
5411 * it failed and either return an error or retry construction, depending on
5414 * If one doesn't exist then insert a new tcon_link struct into the tree and
5415 * try to construct a new one.
5418 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
5421 kuid_t fsuid = current_fsuid();
5422 struct tcon_link *tlink, *newtlink;
5424 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
5425 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
5427 spin_lock(&cifs_sb->tlink_tree_lock);
5428 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5430 cifs_get_tlink(tlink);
5431 spin_unlock(&cifs_sb->tlink_tree_lock);
5433 if (tlink == NULL) {
5434 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
5435 if (newtlink == NULL)
5436 return ERR_PTR(-ENOMEM);
5437 newtlink->tl_uid = fsuid;
5438 newtlink->tl_tcon = ERR_PTR(-EACCES);
5439 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
5440 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
5441 cifs_get_tlink(newtlink);
5443 spin_lock(&cifs_sb->tlink_tree_lock);
5444 /* was one inserted after previous search? */
5445 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5447 cifs_get_tlink(tlink);
5448 spin_unlock(&cifs_sb->tlink_tree_lock);
5450 goto wait_for_construction;
5453 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
5454 spin_unlock(&cifs_sb->tlink_tree_lock);
5456 wait_for_construction:
5457 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
5458 TASK_INTERRUPTIBLE);
5460 cifs_put_tlink(tlink);
5461 return ERR_PTR(-ERESTARTSYS);
5464 /* if it's good, return it */
5465 if (!IS_ERR(tlink->tl_tcon))
5468 /* return error if we tried this already recently */
5469 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
5470 cifs_put_tlink(tlink);
5471 return ERR_PTR(-EACCES);
5474 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
5475 goto wait_for_construction;
5478 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
5479 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
5480 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
5482 if (IS_ERR(tlink->tl_tcon)) {
5483 cifs_put_tlink(tlink);
5484 return ERR_PTR(-EACCES);
5491 * periodic workqueue job that scans tcon_tree for a superblock and closes
5495 cifs_prune_tlinks(struct work_struct *work)
5497 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
5499 struct rb_root *root = &cifs_sb->tlink_tree;
5500 struct rb_node *node;
5501 struct rb_node *tmp;
5502 struct tcon_link *tlink;
5505 * Because we drop the spinlock in the loop in order to put the tlink
5506 * it's not guarded against removal of links from the tree. The only
5507 * places that remove entries from the tree are this function and
5508 * umounts. Because this function is non-reentrant and is canceled
5509 * before umount can proceed, this is safe.
5511 spin_lock(&cifs_sb->tlink_tree_lock);
5512 node = rb_first(root);
5513 while (node != NULL) {
5515 node = rb_next(tmp);
5516 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
5518 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
5519 atomic_read(&tlink->tl_count) != 0 ||
5520 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
5523 cifs_get_tlink(tlink);
5524 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
5525 rb_erase(tmp, root);
5527 spin_unlock(&cifs_sb->tlink_tree_lock);
5528 cifs_put_tlink(tlink);
5529 spin_lock(&cifs_sb->tlink_tree_lock);
5531 spin_unlock(&cifs_sb->tlink_tree_lock);
5533 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,