4 * Copyright (C) International Business Machines Corp., 2002,2011
5 * Author(s): Steve French (sfrench@us.ibm.com)
7 * This library is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser General Public License as published
9 * by the Free Software Foundation; either version 2.1 of the License, or
10 * (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
15 * the GNU Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include <linux/net.h>
23 #include <linux/string.h>
24 #include <linux/sched/mm.h>
25 #include <linux/sched/signal.h>
26 #include <linux/list.h>
27 #include <linux/wait.h>
28 #include <linux/slab.h>
29 #include <linux/pagemap.h>
30 #include <linux/ctype.h>
31 #include <linux/utsname.h>
32 #include <linux/mempool.h>
33 #include <linux/delay.h>
34 #include <linux/completion.h>
35 #include <linux/kthread.h>
36 #include <linux/pagevec.h>
37 #include <linux/freezer.h>
38 #include <linux/namei.h>
39 #include <linux/uuid.h>
40 #include <linux/uaccess.h>
41 #include <asm/processor.h>
42 #include <linux/inet.h>
43 #include <linux/module.h>
44 #include <keys/user-type.h>
46 #include <linux/parser.h>
47 #include <linux/bvec.h>
50 #include "cifsproto.h"
51 #include "cifs_unicode.h"
52 #include "cifs_debug.h"
53 #include "cifs_fs_sb.h"
56 #include "rfc1002pdu.h"
58 #include "smb2proto.h"
59 #include "smbdirect.h"
60 #include "dns_resolve.h"
61 #ifdef CONFIG_CIFS_DFS_UPCALL
62 #include "dfs_cache.h"
64 #include "fs_context.h"
66 extern mempool_t *cifs_req_poolp;
67 extern bool disable_legacy_dialects;
69 /* FIXME: should these be tunable? */
70 #define TLINK_ERROR_EXPIRE (1 * HZ)
71 #define TLINK_IDLE_EXPIRE (600 * HZ)
73 /* Drop the connection to not overload the server */
74 #define NUM_STATUS_IO_TIMEOUT 5
77 /* Mount options that take no arguments */
78 Opt_user_xattr, Opt_nouser_xattr,
79 Opt_forceuid, Opt_noforceuid,
80 Opt_forcegid, Opt_noforcegid,
81 Opt_noblocksend, Opt_noautotune, Opt_nolease,
82 Opt_hard, Opt_soft, Opt_perm, Opt_noperm, Opt_nodelete,
83 Opt_mapposix, Opt_nomapposix,
84 Opt_mapchars, Opt_nomapchars, Opt_sfu,
85 Opt_nosfu, Opt_nodfs, Opt_posixpaths,
86 Opt_noposixpaths, Opt_nounix, Opt_unix,
89 Opt_handlecache, Opt_nohandlecache,
90 Opt_forcemandatorylock, Opt_setuidfromacl, Opt_setuids,
91 Opt_nosetuids, Opt_dynperm, Opt_nodynperm,
92 Opt_nohard, Opt_nosoft,
94 Opt_nostrictsync, Opt_strictsync,
95 Opt_serverino, Opt_noserverino,
96 Opt_rwpidforward, Opt_cifsacl, Opt_nocifsacl,
97 Opt_acl, Opt_noacl, Opt_locallease,
98 Opt_sign, Opt_ignore_signature, Opt_seal, Opt_noac,
99 Opt_fsc, Opt_mfsymlinks,
100 Opt_multiuser, Opt_sloppy, Opt_nosharesock,
101 Opt_persistent, Opt_nopersistent,
102 Opt_resilient, Opt_noresilient,
103 Opt_domainauto, Opt_rdma, Opt_modesid, Opt_rootfs,
104 Opt_multichannel, Opt_nomultichannel,
107 /* Mount options which take numeric value */
108 Opt_backupuid, Opt_backupgid, Opt_uid,
109 Opt_cruid, Opt_gid, Opt_file_mode,
110 Opt_dirmode, Opt_port,
112 Opt_blocksize, Opt_rsize, Opt_wsize, Opt_actimeo,
113 Opt_echo_interval, Opt_max_credits, Opt_handletimeout,
114 Opt_snapshot, Opt_max_channels,
116 /* Mount options which take string value */
117 Opt_user, Opt_pass, Opt_ip,
118 Opt_domain, Opt_srcaddr, Opt_iocharset,
119 Opt_netbiosname, Opt_servern,
120 Opt_ver, Opt_vers, Opt_sec, Opt_cache,
122 /* Mount options to be ignored */
125 /* Options which could be blank */
133 static const match_table_t cifs_mount_option_tokens = {
135 { Opt_user_xattr, "user_xattr" },
136 { Opt_nouser_xattr, "nouser_xattr" },
137 { Opt_forceuid, "forceuid" },
138 { Opt_noforceuid, "noforceuid" },
139 { Opt_forcegid, "forcegid" },
140 { Opt_noforcegid, "noforcegid" },
141 { Opt_noblocksend, "noblocksend" },
142 { Opt_noautotune, "noautotune" },
143 { Opt_nolease, "nolease" },
144 { Opt_hard, "hard" },
145 { Opt_soft, "soft" },
146 { Opt_perm, "perm" },
147 { Opt_noperm, "noperm" },
148 { Opt_nodelete, "nodelete" },
149 { Opt_mapchars, "mapchars" }, /* SFU style */
150 { Opt_nomapchars, "nomapchars" },
151 { Opt_mapposix, "mapposix" }, /* SFM style */
152 { Opt_nomapposix, "nomapposix" },
154 { Opt_nosfu, "nosfu" },
155 { Opt_nodfs, "nodfs" },
156 { Opt_posixpaths, "posixpaths" },
157 { Opt_noposixpaths, "noposixpaths" },
158 { Opt_nounix, "nounix" },
159 { Opt_nounix, "nolinux" },
160 { Opt_nounix, "noposix" },
161 { Opt_unix, "unix" },
162 { Opt_unix, "linux" },
163 { Opt_unix, "posix" },
164 { Opt_nocase, "nocase" },
165 { Opt_nocase, "ignorecase" },
167 { Opt_nobrl, "nobrl" },
168 { Opt_handlecache, "handlecache" },
169 { Opt_nohandlecache, "nohandlecache" },
170 { Opt_nobrl, "nolock" },
171 { Opt_forcemandatorylock, "forcemandatorylock" },
172 { Opt_forcemandatorylock, "forcemand" },
173 { Opt_setuids, "setuids" },
174 { Opt_nosetuids, "nosetuids" },
175 { Opt_setuidfromacl, "idsfromsid" },
176 { Opt_dynperm, "dynperm" },
177 { Opt_nodynperm, "nodynperm" },
178 { Opt_nohard, "nohard" },
179 { Opt_nosoft, "nosoft" },
180 { Opt_nointr, "nointr" },
181 { Opt_intr, "intr" },
182 { Opt_nostrictsync, "nostrictsync" },
183 { Opt_strictsync, "strictsync" },
184 { Opt_serverino, "serverino" },
185 { Opt_noserverino, "noserverino" },
186 { Opt_rwpidforward, "rwpidforward" },
187 { Opt_modesid, "modefromsid" },
188 { Opt_cifsacl, "cifsacl" },
189 { Opt_nocifsacl, "nocifsacl" },
191 { Opt_noacl, "noacl" },
192 { Opt_locallease, "locallease" },
193 { Opt_sign, "sign" },
194 { Opt_ignore_signature, "signloosely" },
195 { Opt_seal, "seal" },
196 { Opt_noac, "noac" },
198 { Opt_mfsymlinks, "mfsymlinks" },
199 { Opt_multiuser, "multiuser" },
200 { Opt_sloppy, "sloppy" },
201 { Opt_nosharesock, "nosharesock" },
202 { Opt_persistent, "persistenthandles"},
203 { Opt_nopersistent, "nopersistenthandles"},
204 { Opt_resilient, "resilienthandles"},
205 { Opt_noresilient, "noresilienthandles"},
206 { Opt_domainauto, "domainauto"},
208 { Opt_multichannel, "multichannel" },
209 { Opt_nomultichannel, "nomultichannel" },
211 { Opt_backupuid, "backupuid=%s" },
212 { Opt_backupgid, "backupgid=%s" },
213 { Opt_uid, "uid=%s" },
214 { Opt_cruid, "cruid=%s" },
215 { Opt_gid, "gid=%s" },
216 { Opt_file_mode, "file_mode=%s" },
217 { Opt_dirmode, "dirmode=%s" },
218 { Opt_dirmode, "dir_mode=%s" },
219 { Opt_port, "port=%s" },
220 { Opt_min_enc_offload, "esize=%s" },
221 { Opt_blocksize, "bsize=%s" },
222 { Opt_rsize, "rsize=%s" },
223 { Opt_wsize, "wsize=%s" },
224 { Opt_actimeo, "actimeo=%s" },
225 { Opt_handletimeout, "handletimeout=%s" },
226 { Opt_echo_interval, "echo_interval=%s" },
227 { Opt_max_credits, "max_credits=%s" },
228 { Opt_snapshot, "snapshot=%s" },
229 { Opt_max_channels, "max_channels=%s" },
230 { Opt_compress, "compress=%s" },
232 { Opt_blank_user, "user=" },
233 { Opt_blank_user, "username=" },
234 { Opt_user, "user=%s" },
235 { Opt_user, "username=%s" },
236 { Opt_blank_pass, "pass=" },
237 { Opt_blank_pass, "password=" },
238 { Opt_pass, "pass=%s" },
239 { Opt_pass, "password=%s" },
240 { Opt_blank_ip, "ip=" },
241 { Opt_blank_ip, "addr=" },
243 { Opt_ip, "addr=%s" },
244 { Opt_ignore, "unc=%s" },
245 { Opt_ignore, "target=%s" },
246 { Opt_ignore, "path=%s" },
247 { Opt_domain, "dom=%s" },
248 { Opt_domain, "domain=%s" },
249 { Opt_domain, "workgroup=%s" },
250 { Opt_srcaddr, "srcaddr=%s" },
251 { Opt_ignore, "prefixpath=%s" },
252 { Opt_iocharset, "iocharset=%s" },
253 { Opt_netbiosname, "netbiosname=%s" },
254 { Opt_servern, "servern=%s" },
255 { Opt_ver, "ver=%s" },
256 { Opt_vers, "vers=%s" },
257 { Opt_sec, "sec=%s" },
258 { Opt_cache, "cache=%s" },
260 { Opt_ignore, "cred" },
261 { Opt_ignore, "credentials" },
262 { Opt_ignore, "cred=%s" },
263 { Opt_ignore, "credentials=%s" },
264 { Opt_ignore, "guest" },
265 { Opt_ignore, "rw" },
266 { Opt_ignore, "ro" },
267 { Opt_ignore, "suid" },
268 { Opt_ignore, "nosuid" },
269 { Opt_ignore, "exec" },
270 { Opt_ignore, "noexec" },
271 { Opt_ignore, "nodev" },
272 { Opt_ignore, "noauto" },
273 { Opt_ignore, "dev" },
274 { Opt_ignore, "mand" },
275 { Opt_ignore, "nomand" },
276 { Opt_ignore, "relatime" },
277 { Opt_ignore, "_netdev" },
278 { Opt_rootfs, "rootfs" },
283 static int ip_connect(struct TCP_Server_Info *server);
284 static int generic_ip_connect(struct TCP_Server_Info *server);
285 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
286 static void cifs_prune_tlinks(struct work_struct *work);
287 static char *extract_hostname(const char *unc);
290 * Resolve hostname and set ip addr in tcp ses. Useful for hostnames that may
291 * get their ip addresses changed at some point.
293 * This should be called with server->srv_mutex held.
295 #ifdef CONFIG_CIFS_DFS_UPCALL
296 static int reconn_set_ipaddr(struct TCP_Server_Info *server)
300 char *unc, *ipaddr = NULL;
302 if (!server->hostname)
305 len = strlen(server->hostname) + 3;
307 unc = kmalloc(len, GFP_KERNEL);
309 cifs_dbg(FYI, "%s: failed to create UNC path\n", __func__);
312 scnprintf(unc, len, "\\\\%s", server->hostname);
314 rc = dns_resolve_server_name_to_ip(unc, &ipaddr);
318 cifs_dbg(FYI, "%s: failed to resolve server part of %s to IP: %d\n",
319 __func__, server->hostname, rc);
323 spin_lock(&cifs_tcp_ses_lock);
324 rc = cifs_convert_address((struct sockaddr *)&server->dstaddr, ipaddr,
326 spin_unlock(&cifs_tcp_ses_lock);
332 static inline int reconn_set_ipaddr(struct TCP_Server_Info *server)
338 #ifdef CONFIG_CIFS_DFS_UPCALL
339 /* These functions must be called with server->srv_mutex held */
340 static void reconn_set_next_dfs_target(struct TCP_Server_Info *server,
341 struct cifs_sb_info *cifs_sb,
342 struct dfs_cache_tgt_list *tgt_list,
343 struct dfs_cache_tgt_iterator **tgt_it)
347 if (!cifs_sb || !cifs_sb->origin_fullpath)
351 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
353 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
355 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
358 cifs_dbg(FYI, "%s: UNC: %s\n", __func__, cifs_sb->origin_fullpath);
360 name = dfs_cache_get_tgt_name(*tgt_it);
362 kfree(server->hostname);
364 server->hostname = extract_hostname(name);
365 if (IS_ERR(server->hostname)) {
367 "%s: failed to extract hostname from target: %ld\n",
368 __func__, PTR_ERR(server->hostname));
372 static inline int reconn_setup_dfs_targets(struct cifs_sb_info *cifs_sb,
373 struct dfs_cache_tgt_list *tl)
375 if (!cifs_sb->origin_fullpath)
377 return dfs_cache_noreq_find(cifs_sb->origin_fullpath + 1, NULL, tl);
382 * cifs tcp session reconnection
384 * mark tcp session as reconnecting so temporarily locked
385 * mark all smb sessions as reconnecting for tcp session
386 * reconnect tcp session
387 * wake up waiters on reconnection? - (not needed currently)
390 cifs_reconnect(struct TCP_Server_Info *server)
393 struct list_head *tmp, *tmp2;
394 struct cifs_ses *ses;
395 struct cifs_tcon *tcon;
396 struct mid_q_entry *mid_entry;
397 struct list_head retry_list;
398 #ifdef CONFIG_CIFS_DFS_UPCALL
399 struct super_block *sb = NULL;
400 struct cifs_sb_info *cifs_sb = NULL;
401 struct dfs_cache_tgt_list tgt_list = {0};
402 struct dfs_cache_tgt_iterator *tgt_it = NULL;
405 spin_lock(&GlobalMid_Lock);
406 server->nr_targets = 1;
407 #ifdef CONFIG_CIFS_DFS_UPCALL
408 spin_unlock(&GlobalMid_Lock);
409 sb = cifs_get_tcp_super(server);
412 cifs_dbg(FYI, "%s: will not do DFS failover: rc = %d\n",
416 cifs_sb = CIFS_SB(sb);
417 rc = reconn_setup_dfs_targets(cifs_sb, &tgt_list);
420 if (rc != -EOPNOTSUPP) {
421 cifs_server_dbg(VFS, "%s: no target servers for DFS failover\n",
425 server->nr_targets = dfs_cache_get_nr_tgts(&tgt_list);
428 cifs_dbg(FYI, "%s: will retry %d target(s)\n", __func__,
430 spin_lock(&GlobalMid_Lock);
432 if (server->tcpStatus == CifsExiting) {
433 /* the demux thread will exit normally
434 next time through the loop */
435 spin_unlock(&GlobalMid_Lock);
436 #ifdef CONFIG_CIFS_DFS_UPCALL
437 dfs_cache_free_tgts(&tgt_list);
438 cifs_put_tcp_super(sb);
440 wake_up(&server->response_q);
443 server->tcpStatus = CifsNeedReconnect;
444 spin_unlock(&GlobalMid_Lock);
446 server->max_read = 0;
448 cifs_dbg(FYI, "Mark tcp session as need reconnect\n");
449 trace_smb3_reconnect(server->CurrentMid, server->hostname);
451 /* before reconnecting the tcp session, mark the smb session (uid)
452 and the tid bad so they are not used until reconnected */
453 cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
455 spin_lock(&cifs_tcp_ses_lock);
456 list_for_each(tmp, &server->smb_ses_list) {
457 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
458 ses->need_reconnect = true;
459 list_for_each(tmp2, &ses->tcon_list) {
460 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
461 tcon->need_reconnect = true;
464 ses->tcon_ipc->need_reconnect = true;
466 spin_unlock(&cifs_tcp_ses_lock);
468 /* do not want to be sending data on a socket we are freeing */
469 cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
470 mutex_lock(&server->srv_mutex);
471 if (server->ssocket) {
472 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
473 server->ssocket->state, server->ssocket->flags);
474 kernel_sock_shutdown(server->ssocket, SHUT_WR);
475 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
476 server->ssocket->state, server->ssocket->flags);
477 sock_release(server->ssocket);
478 server->ssocket = NULL;
480 server->sequence_number = 0;
481 server->session_estab = false;
482 kfree(server->session_key.response);
483 server->session_key.response = NULL;
484 server->session_key.len = 0;
485 server->lstrp = jiffies;
487 /* mark submitted MIDs for retry and issue callback */
488 INIT_LIST_HEAD(&retry_list);
489 cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
490 spin_lock(&GlobalMid_Lock);
491 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
492 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
493 kref_get(&mid_entry->refcount);
494 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
495 mid_entry->mid_state = MID_RETRY_NEEDED;
496 list_move(&mid_entry->qhead, &retry_list);
497 mid_entry->mid_flags |= MID_DELETED;
499 spin_unlock(&GlobalMid_Lock);
500 mutex_unlock(&server->srv_mutex);
502 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
503 list_for_each_safe(tmp, tmp2, &retry_list) {
504 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
505 list_del_init(&mid_entry->qhead);
506 mid_entry->callback(mid_entry);
507 cifs_mid_q_entry_release(mid_entry);
510 if (cifs_rdma_enabled(server)) {
511 mutex_lock(&server->srv_mutex);
512 smbd_destroy(server);
513 mutex_unlock(&server->srv_mutex);
519 mutex_lock(&server->srv_mutex);
520 #ifdef CONFIG_CIFS_DFS_UPCALL
522 * Set up next DFS target server (if any) for reconnect. If DFS
523 * feature is disabled, then we will retry last server we
524 * connected to before.
526 reconn_set_next_dfs_target(server, cifs_sb, &tgt_list, &tgt_it);
528 rc = reconn_set_ipaddr(server);
530 cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
534 if (cifs_rdma_enabled(server))
535 rc = smbd_reconnect(server);
537 rc = generic_ip_connect(server);
539 cifs_dbg(FYI, "reconnect error %d\n", rc);
540 mutex_unlock(&server->srv_mutex);
543 atomic_inc(&tcpSesReconnectCount);
544 set_credits(server, 1);
545 spin_lock(&GlobalMid_Lock);
546 if (server->tcpStatus != CifsExiting)
547 server->tcpStatus = CifsNeedNegotiate;
548 spin_unlock(&GlobalMid_Lock);
549 mutex_unlock(&server->srv_mutex);
551 } while (server->tcpStatus == CifsNeedReconnect);
553 #ifdef CONFIG_CIFS_DFS_UPCALL
555 rc = dfs_cache_noreq_update_tgthint(cifs_sb->origin_fullpath + 1,
558 cifs_server_dbg(VFS, "%s: failed to update DFS target hint: rc = %d\n",
561 rc = dfs_cache_update_vol(cifs_sb->origin_fullpath, server);
563 cifs_server_dbg(VFS, "%s: failed to update vol info in DFS cache: rc = %d\n",
566 dfs_cache_free_tgts(&tgt_list);
570 cifs_put_tcp_super(sb);
572 if (server->tcpStatus == CifsNeedNegotiate)
573 mod_delayed_work(cifsiod_wq, &server->echo, 0);
575 wake_up(&server->response_q);
580 cifs_echo_request(struct work_struct *work)
583 struct TCP_Server_Info *server = container_of(work,
584 struct TCP_Server_Info, echo.work);
585 unsigned long echo_interval;
588 * If we need to renegotiate, set echo interval to zero to
589 * immediately call echo service where we can renegotiate.
591 if (server->tcpStatus == CifsNeedNegotiate)
594 echo_interval = server->echo_interval;
597 * We cannot send an echo if it is disabled.
598 * Also, no need to ping if we got a response recently.
601 if (server->tcpStatus == CifsNeedReconnect ||
602 server->tcpStatus == CifsExiting ||
603 server->tcpStatus == CifsNew ||
604 (server->ops->can_echo && !server->ops->can_echo(server)) ||
605 time_before(jiffies, server->lstrp + echo_interval - HZ))
608 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
610 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
614 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
618 allocate_buffers(struct TCP_Server_Info *server)
620 if (!server->bigbuf) {
621 server->bigbuf = (char *)cifs_buf_get();
622 if (!server->bigbuf) {
623 cifs_server_dbg(VFS, "No memory for large SMB response\n");
625 /* retry will check if exiting */
628 } else if (server->large_buf) {
629 /* we are reusing a dirty large buf, clear its start */
630 memset(server->bigbuf, 0, HEADER_SIZE(server));
633 if (!server->smallbuf) {
634 server->smallbuf = (char *)cifs_small_buf_get();
635 if (!server->smallbuf) {
636 cifs_server_dbg(VFS, "No memory for SMB response\n");
638 /* retry will check if exiting */
641 /* beginning of smb buffer is cleared in our buf_get */
643 /* if existing small buf clear beginning */
644 memset(server->smallbuf, 0, HEADER_SIZE(server));
651 server_unresponsive(struct TCP_Server_Info *server)
654 * We need to wait 3 echo intervals to make sure we handle such
656 * 1s client sends a normal SMB request
657 * 2s client gets a response
658 * 30s echo workqueue job pops, and decides we got a response recently
659 * and don't need to send another
661 * 65s kernel_recvmsg times out, and we see that we haven't gotten
662 * a response in >60s.
664 if ((server->tcpStatus == CifsGood ||
665 server->tcpStatus == CifsNeedNegotiate) &&
666 (!server->ops->can_echo || server->ops->can_echo(server)) &&
667 time_after(jiffies, server->lstrp + 3 * server->echo_interval)) {
668 cifs_server_dbg(VFS, "has not responded in %lu seconds. Reconnecting...\n",
669 (3 * server->echo_interval) / HZ);
670 cifs_reconnect(server);
678 zero_credits(struct TCP_Server_Info *server)
682 spin_lock(&server->req_lock);
683 val = server->credits + server->echo_credits + server->oplock_credits;
684 if (server->in_flight == 0 && val == 0) {
685 spin_unlock(&server->req_lock);
688 spin_unlock(&server->req_lock);
693 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
698 for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
701 /* reconnect if no credits and no requests in flight */
702 if (zero_credits(server)) {
703 cifs_reconnect(server);
704 return -ECONNABORTED;
707 if (server_unresponsive(server))
708 return -ECONNABORTED;
709 if (cifs_rdma_enabled(server) && server->smbd_conn)
710 length = smbd_recv(server->smbd_conn, smb_msg);
712 length = sock_recvmsg(server->ssocket, smb_msg, 0);
714 if (server->tcpStatus == CifsExiting)
717 if (server->tcpStatus == CifsNeedReconnect) {
718 cifs_reconnect(server);
719 return -ECONNABORTED;
722 if (length == -ERESTARTSYS ||
726 * Minimum sleep to prevent looping, allowing socket
727 * to clear and app threads to set tcpStatus
728 * CifsNeedReconnect if server hung.
730 usleep_range(1000, 2000);
736 cifs_dbg(FYI, "Received no data or error: %d\n", length);
737 cifs_reconnect(server);
738 return -ECONNABORTED;
745 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
746 unsigned int to_read)
748 struct msghdr smb_msg = {};
749 struct kvec iov = {.iov_base = buf, .iov_len = to_read};
750 iov_iter_kvec(&smb_msg.msg_iter, READ, &iov, 1, to_read);
752 return cifs_readv_from_socket(server, &smb_msg);
756 cifs_discard_from_socket(struct TCP_Server_Info *server, size_t to_read)
758 struct msghdr smb_msg = {};
761 * iov_iter_discard already sets smb_msg.type and count and iov_offset
762 * and cifs_readv_from_socket sets msg_control and msg_controllen
763 * so little to initialize in struct msghdr
765 iov_iter_discard(&smb_msg.msg_iter, READ, to_read);
767 return cifs_readv_from_socket(server, &smb_msg);
771 cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
772 unsigned int page_offset, unsigned int to_read)
774 struct msghdr smb_msg = {};
775 struct bio_vec bv = {
776 .bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
777 iov_iter_bvec(&smb_msg.msg_iter, READ, &bv, 1, to_read);
778 return cifs_readv_from_socket(server, &smb_msg);
782 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
785 * The first byte big endian of the length field,
786 * is actually not part of the length but the type
787 * with the most common, zero, as regular data.
790 case RFC1002_SESSION_MESSAGE:
791 /* Regular SMB response */
793 case RFC1002_SESSION_KEEP_ALIVE:
794 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
796 case RFC1002_POSITIVE_SESSION_RESPONSE:
797 cifs_dbg(FYI, "RFC 1002 positive session response\n");
799 case RFC1002_NEGATIVE_SESSION_RESPONSE:
801 * We get this from Windows 98 instead of an error on
802 * SMB negprot response.
804 cifs_dbg(FYI, "RFC 1002 negative session response\n");
805 /* give server a second to clean up */
808 * Always try 445 first on reconnect since we get NACK
809 * on some if we ever connected to port 139 (the NACK
810 * is since we do not begin with RFC1001 session
813 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
814 cifs_reconnect(server);
817 cifs_server_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
818 cifs_reconnect(server);
825 dequeue_mid(struct mid_q_entry *mid, bool malformed)
827 #ifdef CONFIG_CIFS_STATS2
828 mid->when_received = jiffies;
830 spin_lock(&GlobalMid_Lock);
832 mid->mid_state = MID_RESPONSE_RECEIVED;
834 mid->mid_state = MID_RESPONSE_MALFORMED;
836 * Trying to handle/dequeue a mid after the send_recv()
837 * function has finished processing it is a bug.
839 if (mid->mid_flags & MID_DELETED)
840 pr_warn_once("trying to dequeue a deleted mid\n");
842 list_del_init(&mid->qhead);
843 mid->mid_flags |= MID_DELETED;
845 spin_unlock(&GlobalMid_Lock);
849 smb2_get_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
851 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
854 * SMB1 does not use credits.
856 if (server->vals->header_preamble_size)
859 return le16_to_cpu(shdr->CreditRequest);
863 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
864 char *buf, int malformed)
866 if (server->ops->check_trans2 &&
867 server->ops->check_trans2(mid, server, buf, malformed))
869 mid->credits_received = smb2_get_credits_from_hdr(buf, server);
871 mid->large_buf = server->large_buf;
872 /* Was previous buf put in mpx struct for multi-rsp? */
873 if (!mid->multiRsp) {
874 /* smb buffer will be freed by user thread */
875 if (server->large_buf)
876 server->bigbuf = NULL;
878 server->smallbuf = NULL;
880 dequeue_mid(mid, malformed);
883 static void clean_demultiplex_info(struct TCP_Server_Info *server)
887 /* take it off the list, if it's not already */
888 spin_lock(&cifs_tcp_ses_lock);
889 list_del_init(&server->tcp_ses_list);
890 spin_unlock(&cifs_tcp_ses_lock);
892 cancel_delayed_work_sync(&server->echo);
894 spin_lock(&GlobalMid_Lock);
895 server->tcpStatus = CifsExiting;
896 spin_unlock(&GlobalMid_Lock);
897 wake_up_all(&server->response_q);
899 /* check if we have blocked requests that need to free */
900 spin_lock(&server->req_lock);
901 if (server->credits <= 0)
903 spin_unlock(&server->req_lock);
905 * Although there should not be any requests blocked on this queue it
906 * can not hurt to be paranoid and try to wake up requests that may
907 * haven been blocked when more than 50 at time were on the wire to the
908 * same server - they now will see the session is in exit state and get
909 * out of SendReceive.
911 wake_up_all(&server->request_q);
912 /* give those requests time to exit */
914 if (cifs_rdma_enabled(server))
915 smbd_destroy(server);
916 if (server->ssocket) {
917 sock_release(server->ssocket);
918 server->ssocket = NULL;
921 if (!list_empty(&server->pending_mid_q)) {
922 struct list_head dispose_list;
923 struct mid_q_entry *mid_entry;
924 struct list_head *tmp, *tmp2;
926 INIT_LIST_HEAD(&dispose_list);
927 spin_lock(&GlobalMid_Lock);
928 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
929 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
930 cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
931 kref_get(&mid_entry->refcount);
932 mid_entry->mid_state = MID_SHUTDOWN;
933 list_move(&mid_entry->qhead, &dispose_list);
934 mid_entry->mid_flags |= MID_DELETED;
936 spin_unlock(&GlobalMid_Lock);
938 /* now walk dispose list and issue callbacks */
939 list_for_each_safe(tmp, tmp2, &dispose_list) {
940 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
941 cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
942 list_del_init(&mid_entry->qhead);
943 mid_entry->callback(mid_entry);
944 cifs_mid_q_entry_release(mid_entry);
946 /* 1/8th of sec is more than enough time for them to exit */
950 if (!list_empty(&server->pending_mid_q)) {
952 * mpx threads have not exited yet give them at least the smb
953 * send timeout time for long ops.
955 * Due to delays on oplock break requests, we need to wait at
956 * least 45 seconds before giving up on a request getting a
957 * response and going ahead and killing cifsd.
959 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
962 * If threads still have not exited they are probably never
963 * coming home not much else we can do but free the memory.
967 kfree(server->hostname);
970 length = atomic_dec_return(&tcpSesAllocCount);
972 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
976 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
979 char *buf = server->smallbuf;
980 unsigned int pdu_length = server->pdu_size;
982 /* make sure this will fit in a large buffer */
983 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
984 server->vals->header_preamble_size) {
985 cifs_server_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
986 cifs_reconnect(server);
987 return -ECONNABORTED;
990 /* switch to large buffer if too big for a small one */
991 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
992 server->large_buf = true;
993 memcpy(server->bigbuf, buf, server->total_read);
994 buf = server->bigbuf;
997 /* now read the rest */
998 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
999 pdu_length - HEADER_SIZE(server) + 1
1000 + server->vals->header_preamble_size);
1004 server->total_read += length;
1006 dump_smb(buf, server->total_read);
1008 return cifs_handle_standard(server, mid);
1012 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1014 char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
1018 * We know that we received enough to get to the MID as we
1019 * checked the pdu_length earlier. Now check to see
1020 * if the rest of the header is OK. We borrow the length
1021 * var for the rest of the loop to avoid a new stack var.
1023 * 48 bytes is enough to display the header and a little bit
1024 * into the payload for debugging purposes.
1026 length = server->ops->check_message(buf, server->total_read, server);
1028 cifs_dump_mem("Bad SMB: ", buf,
1029 min_t(unsigned int, server->total_read, 48));
1031 if (server->ops->is_session_expired &&
1032 server->ops->is_session_expired(buf)) {
1033 cifs_reconnect(server);
1037 if (server->ops->is_status_pending &&
1038 server->ops->is_status_pending(buf, server))
1044 handle_mid(mid, server, buf, length);
1049 smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
1051 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
1054 * SMB1 does not use credits.
1056 if (server->vals->header_preamble_size)
1059 if (shdr->CreditRequest) {
1060 spin_lock(&server->req_lock);
1061 server->credits += le16_to_cpu(shdr->CreditRequest);
1062 spin_unlock(&server->req_lock);
1063 wake_up(&server->request_q);
1069 cifs_demultiplex_thread(void *p)
1071 int i, num_mids, length;
1072 struct TCP_Server_Info *server = p;
1073 unsigned int pdu_length;
1074 unsigned int next_offset;
1076 struct task_struct *task_to_wake = NULL;
1077 struct mid_q_entry *mids[MAX_COMPOUND];
1078 char *bufs[MAX_COMPOUND];
1079 unsigned int noreclaim_flag, num_io_timeout = 0;
1081 noreclaim_flag = memalloc_noreclaim_save();
1082 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
1084 length = atomic_inc_return(&tcpSesAllocCount);
1086 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
1089 allow_kernel_signal(SIGKILL);
1090 while (server->tcpStatus != CifsExiting) {
1091 if (try_to_freeze())
1094 if (!allocate_buffers(server))
1097 server->large_buf = false;
1098 buf = server->smallbuf;
1099 pdu_length = 4; /* enough to get RFC1001 header */
1101 length = cifs_read_from_socket(server, buf, pdu_length);
1105 if (server->vals->header_preamble_size == 0)
1106 server->total_read = 0;
1108 server->total_read = length;
1111 * The right amount was read from socket - 4 bytes,
1112 * so we can now interpret the length field.
1114 pdu_length = get_rfc1002_length(buf);
1116 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
1117 if (!is_smb_response(server, buf[0]))
1120 server->pdu_size = pdu_length;
1122 /* make sure we have enough to get to the MID */
1123 if (server->pdu_size < HEADER_SIZE(server) - 1 -
1124 server->vals->header_preamble_size) {
1125 cifs_server_dbg(VFS, "SMB response too short (%u bytes)\n",
1127 cifs_reconnect(server);
1131 /* read down to the MID */
1132 length = cifs_read_from_socket(server,
1133 buf + server->vals->header_preamble_size,
1134 HEADER_SIZE(server) - 1
1135 - server->vals->header_preamble_size);
1138 server->total_read += length;
1140 if (server->ops->next_header) {
1141 next_offset = server->ops->next_header(buf);
1143 server->pdu_size = next_offset;
1146 memset(mids, 0, sizeof(mids));
1147 memset(bufs, 0, sizeof(bufs));
1150 if (server->ops->is_transform_hdr &&
1151 server->ops->receive_transform &&
1152 server->ops->is_transform_hdr(buf)) {
1153 length = server->ops->receive_transform(server,
1158 mids[0] = server->ops->find_mid(server, buf);
1162 if (!mids[0] || !mids[0]->receive)
1163 length = standard_receive3(server, mids[0]);
1165 length = mids[0]->receive(server, mids[0]);
1169 for (i = 0; i < num_mids; i++)
1171 cifs_mid_q_entry_release(mids[i]);
1175 if (server->ops->is_status_io_timeout &&
1176 server->ops->is_status_io_timeout(buf)) {
1178 if (num_io_timeout > NUM_STATUS_IO_TIMEOUT) {
1179 cifs_reconnect(server);
1185 server->lstrp = jiffies;
1187 for (i = 0; i < num_mids; i++) {
1188 if (mids[i] != NULL) {
1189 mids[i]->resp_buf_size = server->pdu_size;
1191 if (!mids[i]->multiRsp || mids[i]->multiEnd)
1192 mids[i]->callback(mids[i]);
1194 cifs_mid_q_entry_release(mids[i]);
1195 } else if (server->ops->is_oplock_break &&
1196 server->ops->is_oplock_break(bufs[i],
1198 smb2_add_credits_from_hdr(bufs[i], server);
1199 cifs_dbg(FYI, "Received oplock break\n");
1201 cifs_server_dbg(VFS, "No task to wake, unknown frame received! NumMids %d\n",
1202 atomic_read(&midCount));
1203 cifs_dump_mem("Received Data is: ", bufs[i],
1204 HEADER_SIZE(server));
1205 smb2_add_credits_from_hdr(bufs[i], server);
1206 #ifdef CONFIG_CIFS_DEBUG2
1207 if (server->ops->dump_detail)
1208 server->ops->dump_detail(bufs[i],
1210 cifs_dump_mids(server);
1211 #endif /* CIFS_DEBUG2 */
1215 if (pdu_length > server->pdu_size) {
1216 if (!allocate_buffers(server))
1218 pdu_length -= server->pdu_size;
1219 server->total_read = 0;
1220 server->large_buf = false;
1221 buf = server->smallbuf;
1224 } /* end while !EXITING */
1226 /* buffer usually freed in free_mid - need to free it here on exit */
1227 cifs_buf_release(server->bigbuf);
1228 if (server->smallbuf) /* no sense logging a debug message if NULL */
1229 cifs_small_buf_release(server->smallbuf);
1231 task_to_wake = xchg(&server->tsk, NULL);
1232 clean_demultiplex_info(server);
1234 /* if server->tsk was NULL then wait for a signal before exiting */
1235 if (!task_to_wake) {
1236 set_current_state(TASK_INTERRUPTIBLE);
1237 while (!signal_pending(current)) {
1239 set_current_state(TASK_INTERRUPTIBLE);
1241 set_current_state(TASK_RUNNING);
1244 memalloc_noreclaim_restore(noreclaim_flag);
1245 module_put_and_exit(0);
1248 /* extract the host portion of the UNC string */
1250 extract_hostname(const char *unc)
1256 /* skip double chars at beginning of string */
1257 /* BB: check validity of these bytes? */
1258 if (strlen(unc) < 3)
1259 return ERR_PTR(-EINVAL);
1260 for (src = unc; *src && *src == '\\'; src++)
1263 return ERR_PTR(-EINVAL);
1265 /* delimiter between hostname and sharename is always '\\' now */
1266 delim = strchr(src, '\\');
1268 return ERR_PTR(-EINVAL);
1271 dst = kmalloc((len + 1), GFP_KERNEL);
1273 return ERR_PTR(-ENOMEM);
1275 memcpy(dst, src, len);
1281 static int get_option_ul(substring_t args[], unsigned long *option)
1286 string = match_strdup(args);
1289 rc = kstrtoul(string, 0, option);
1295 static int get_option_uid(substring_t args[], kuid_t *result)
1297 unsigned long value;
1301 rc = get_option_ul(args, &value);
1305 uid = make_kuid(current_user_ns(), value);
1306 if (!uid_valid(uid))
1313 static int get_option_gid(substring_t args[], kgid_t *result)
1315 unsigned long value;
1319 rc = get_option_ul(args, &value);
1323 gid = make_kgid(current_user_ns(), value);
1324 if (!gid_valid(gid))
1332 * Parse a devname into substrings and populate the vol->UNC and vol->prepath
1333 * fields with the result. Returns 0 on success and an error otherwise.
1336 cifs_parse_devname(const char *devname, struct smb_vol *vol)
1339 const char *delims = "/\\";
1342 if (unlikely(!devname || !*devname)) {
1343 cifs_dbg(VFS, "Device name not specified\n");
1347 /* make sure we have a valid UNC double delimiter prefix */
1348 len = strspn(devname, delims);
1352 /* find delimiter between host and sharename */
1353 pos = strpbrk(devname + 2, delims);
1357 /* skip past delimiter */
1360 /* now go until next delimiter or end of string */
1361 len = strcspn(pos, delims);
1363 /* move "pos" up to delimiter or NULL */
1365 vol->UNC = kstrndup(devname, pos - devname, GFP_KERNEL);
1369 convert_delimiter(vol->UNC, '\\');
1371 /* skip any delimiter */
1372 if (*pos == '/' || *pos == '\\')
1375 /* If pos is NULL then no prepath */
1379 vol->prepath = kstrdup(pos, GFP_KERNEL);
1387 cifs_parse_mount_options(const char *mountdata, const char *devname,
1388 struct smb_vol *vol, bool is_smb3)
1391 char *mountdata_copy = NULL, *options;
1392 unsigned int temp_len, i, j;
1394 short int override_uid = -1;
1395 short int override_gid = -1;
1396 bool uid_specified = false;
1397 bool gid_specified = false;
1398 bool sloppy = false;
1399 char *invalid = NULL;
1400 char *nodename = utsname()->nodename;
1401 char *string = NULL;
1402 char *tmp_end, *value;
1404 bool got_ip = false;
1405 bool got_version = false;
1406 unsigned short port = 0;
1407 struct sockaddr *dstaddr = (struct sockaddr *)&vol->dstaddr;
1411 delim = separator[0];
1413 /* ensure we always start with zeroed-out smb_vol */
1414 memset(vol, 0, sizeof(*vol));
1417 * does not have to be perfect mapping since field is
1418 * informational, only used for servers that do not support
1419 * port 445 and it can be overridden at mount time
1421 memset(vol->source_rfc1001_name, 0x20, RFC1001_NAME_LEN);
1422 for (i = 0; i < strnlen(nodename, RFC1001_NAME_LEN); i++)
1423 vol->source_rfc1001_name[i] = toupper(nodename[i]);
1425 vol->source_rfc1001_name[RFC1001_NAME_LEN] = 0;
1426 /* null target name indicates to use *SMBSERVR default called name
1427 if we end up sending RFC1001 session initialize */
1428 vol->target_rfc1001_name[0] = 0;
1429 vol->cred_uid = current_uid();
1430 vol->linux_uid = current_uid();
1431 vol->linux_gid = current_gid();
1432 vol->bsize = 1024 * 1024; /* can improve cp performance significantly */
1434 * default to SFM style remapping of seven reserved characters
1435 * unless user overrides it or we negotiate CIFS POSIX where
1436 * it is unnecessary. Can not simultaneously use more than one mapping
1437 * since then readdir could list files that open could not open
1441 /* default to only allowing write access to owner of the mount */
1442 vol->dir_mode = vol->file_mode = S_IRUGO | S_IXUGO | S_IWUSR;
1444 /* vol->retry default is 0 (i.e. "soft" limited retry not hard retry) */
1445 /* default is always to request posix paths. */
1446 vol->posix_paths = 1;
1447 /* default to using server inode numbers where available */
1448 vol->server_ino = 1;
1450 /* default is to use strict cifs caching semantics */
1451 vol->strict_io = true;
1453 vol->actimeo = CIFS_DEF_ACTIMEO;
1455 /* Most clients set timeout to 0, allows server to use its default */
1456 vol->handle_timeout = 0; /* See MS-SMB2 spec section 2.2.14.2.12 */
1458 /* offer SMB2.1 and later (SMB3 etc). Secure and widely accepted */
1459 vol->ops = &smb30_operations;
1460 vol->vals = &smbdefault_values;
1462 vol->echo_interval = SMB_ECHO_INTERVAL_DEFAULT;
1464 /* default to no multichannel (single server connection) */
1465 vol->multichannel = false;
1466 vol->max_channels = 1;
1469 goto cifs_parse_mount_err;
1471 mountdata_copy = kstrndup(mountdata, PAGE_SIZE, GFP_KERNEL);
1472 if (!mountdata_copy)
1473 goto cifs_parse_mount_err;
1475 options = mountdata_copy;
1476 end = options + strlen(options);
1478 if (strncmp(options, "sep=", 4) == 0) {
1479 if (options[4] != 0) {
1480 separator[0] = options[4];
1483 cifs_dbg(FYI, "Null separator not allowed\n");
1486 vol->backupuid_specified = false; /* no backup intent for a user */
1487 vol->backupgid_specified = false; /* no backup intent for a group */
1489 switch (cifs_parse_devname(devname, vol)) {
1493 cifs_dbg(VFS, "Unable to allocate memory for devname\n");
1494 goto cifs_parse_mount_err;
1496 cifs_dbg(VFS, "Malformed UNC in devname\n");
1497 goto cifs_parse_mount_err;
1499 cifs_dbg(VFS, "Unknown error parsing devname\n");
1500 goto cifs_parse_mount_err;
1503 while ((data = strsep(&options, separator)) != NULL) {
1504 substring_t args[MAX_OPT_ARGS];
1505 unsigned long option;
1511 token = match_token(data, cifs_mount_option_tokens, args);
1515 /* Ingnore the following */
1519 /* Boolean values */
1520 case Opt_user_xattr:
1523 case Opt_nouser_xattr:
1529 case Opt_noforceuid:
1535 case Opt_noforcegid:
1538 case Opt_noblocksend:
1539 vol->noblocksnd = 1;
1541 case Opt_noautotune:
1542 vol->noautotune = 1;
1563 vol->sfu_remap = true;
1564 vol->remap = false; /* disable SFM mapping */
1566 case Opt_nomapchars:
1567 vol->sfu_remap = false;
1571 vol->sfu_remap = false; /* disable SFU mapping */
1573 case Opt_nomapposix:
1586 #ifdef CONFIG_CIFS_ROOT
1590 case Opt_posixpaths:
1591 vol->posix_paths = 1;
1593 case Opt_noposixpaths:
1594 vol->posix_paths = 0;
1599 "conflicting unix mount options\n");
1600 vol->no_linux_ext = 1;
1603 if (vol->no_linux_ext)
1605 "conflicting unix mount options\n");
1617 * turn off mandatory locking in mode
1618 * if remote locking is turned off since the
1619 * local vfs will do advisory
1621 if (vol->file_mode ==
1622 (S_IALLUGO & ~(S_ISUID | S_IXGRP)))
1623 vol->file_mode = S_IALLUGO;
1625 case Opt_nohandlecache:
1626 vol->nohandlecache = 1;
1628 case Opt_handlecache:
1629 vol->nohandlecache = 0;
1631 case Opt_forcemandatorylock:
1640 case Opt_setuidfromacl:
1641 vol->setuidfromacl = 1;
1644 vol->dynperm = true;
1647 vol->dynperm = false;
1661 case Opt_nostrictsync:
1662 vol->nostrictsync = 1;
1664 case Opt_strictsync:
1665 vol->nostrictsync = 0;
1668 vol->server_ino = 1;
1670 case Opt_noserverino:
1671 vol->server_ino = 0;
1673 case Opt_rwpidforward:
1674 vol->rwpidforward = 1;
1686 vol->no_psx_acl = 0;
1689 vol->no_psx_acl = 1;
1691 case Opt_locallease:
1692 vol->local_lease = 1;
1697 case Opt_ignore_signature:
1699 vol->ignore_signature = true;
1702 /* we do not do the following in secFlags because seal
1703 * is a per tree connection (mount) not a per socket
1704 * or per-smb connection option in the protocol
1705 * vol->secFlg |= CIFSSEC_MUST_SEAL;
1710 pr_warn("Mount option noac not supported. Instead set /proc/fs/cifs/LookupCacheEnabled to 0\n");
1713 #ifndef CONFIG_CIFS_FSCACHE
1714 cifs_dbg(VFS, "FS-Cache support needs CONFIG_CIFS_FSCACHE kernel config option set\n");
1715 goto cifs_parse_mount_err;
1719 case Opt_mfsymlinks:
1720 vol->mfsymlinks = true;
1723 vol->multiuser = true;
1728 case Opt_nosharesock:
1729 vol->nosharesock = true;
1731 case Opt_nopersistent:
1732 vol->nopersistent = true;
1733 if (vol->persistent) {
1735 "persistenthandles mount options conflict\n");
1736 goto cifs_parse_mount_err;
1739 case Opt_persistent:
1740 vol->persistent = true;
1741 if ((vol->nopersistent) || (vol->resilient)) {
1743 "persistenthandles mount options conflict\n");
1744 goto cifs_parse_mount_err;
1748 vol->resilient = true;
1749 if (vol->persistent) {
1751 "persistenthandles mount options conflict\n");
1752 goto cifs_parse_mount_err;
1755 case Opt_noresilient:
1756 vol->resilient = false; /* already the default */
1758 case Opt_domainauto:
1759 vol->domainauto = true;
1764 case Opt_multichannel:
1765 vol->multichannel = true;
1766 /* if number of channels not specified, default to 2 */
1767 if (vol->max_channels < 2)
1768 vol->max_channels = 2;
1770 case Opt_nomultichannel:
1771 vol->multichannel = false;
1772 vol->max_channels = 1;
1775 vol->compression = UNKNOWN_TYPE;
1777 "SMB3 compression support is experimental\n");
1780 /* Numeric Values */
1782 if (get_option_uid(args, &vol->backupuid)) {
1783 cifs_dbg(VFS, "%s: Invalid backupuid value\n",
1785 goto cifs_parse_mount_err;
1787 vol->backupuid_specified = true;
1790 if (get_option_gid(args, &vol->backupgid)) {
1791 cifs_dbg(VFS, "%s: Invalid backupgid value\n",
1793 goto cifs_parse_mount_err;
1795 vol->backupgid_specified = true;
1798 if (get_option_uid(args, &vol->linux_uid)) {
1799 cifs_dbg(VFS, "%s: Invalid uid value\n",
1801 goto cifs_parse_mount_err;
1803 uid_specified = true;
1806 if (get_option_uid(args, &vol->cred_uid)) {
1807 cifs_dbg(VFS, "%s: Invalid cruid value\n",
1809 goto cifs_parse_mount_err;
1813 if (get_option_gid(args, &vol->linux_gid)) {
1814 cifs_dbg(VFS, "%s: Invalid gid value\n",
1816 goto cifs_parse_mount_err;
1818 gid_specified = true;
1821 if (get_option_ul(args, &option)) {
1822 cifs_dbg(VFS, "%s: Invalid file_mode value\n",
1824 goto cifs_parse_mount_err;
1826 vol->file_mode = option;
1829 if (get_option_ul(args, &option)) {
1830 cifs_dbg(VFS, "%s: Invalid dir_mode value\n",
1832 goto cifs_parse_mount_err;
1834 vol->dir_mode = option;
1837 if (get_option_ul(args, &option) ||
1838 option > USHRT_MAX) {
1839 cifs_dbg(VFS, "%s: Invalid port value\n",
1841 goto cifs_parse_mount_err;
1843 port = (unsigned short)option;
1845 case Opt_min_enc_offload:
1846 if (get_option_ul(args, &option)) {
1847 cifs_dbg(VFS, "Invalid minimum encrypted read offload size (esize)\n");
1848 goto cifs_parse_mount_err;
1850 vol->min_offload = option;
1853 if (get_option_ul(args, &option)) {
1854 cifs_dbg(VFS, "%s: Invalid blocksize value\n",
1856 goto cifs_parse_mount_err;
1859 * inode blocksize realistically should never need to be
1860 * less than 16K or greater than 16M and default is 1MB.
1861 * Note that small inode block sizes (e.g. 64K) can lead
1862 * to very poor performance of common tools like cp and scp
1864 if ((option < CIFS_MAX_MSGSIZE) ||
1865 (option > (4 * SMB3_DEFAULT_IOSIZE))) {
1866 cifs_dbg(VFS, "%s: Invalid blocksize\n",
1868 goto cifs_parse_mount_err;
1870 vol->bsize = option;
1873 if (get_option_ul(args, &option)) {
1874 cifs_dbg(VFS, "%s: Invalid rsize value\n",
1876 goto cifs_parse_mount_err;
1878 vol->rsize = option;
1881 if (get_option_ul(args, &option)) {
1882 cifs_dbg(VFS, "%s: Invalid wsize value\n",
1884 goto cifs_parse_mount_err;
1886 vol->wsize = option;
1889 if (get_option_ul(args, &option)) {
1890 cifs_dbg(VFS, "%s: Invalid actimeo value\n",
1892 goto cifs_parse_mount_err;
1894 vol->actimeo = HZ * option;
1895 if (vol->actimeo > CIFS_MAX_ACTIMEO) {
1896 cifs_dbg(VFS, "attribute cache timeout too large\n");
1897 goto cifs_parse_mount_err;
1900 case Opt_handletimeout:
1901 if (get_option_ul(args, &option)) {
1902 cifs_dbg(VFS, "%s: Invalid handletimeout value\n",
1904 goto cifs_parse_mount_err;
1906 vol->handle_timeout = option;
1907 if (vol->handle_timeout > SMB3_MAX_HANDLE_TIMEOUT) {
1908 cifs_dbg(VFS, "Invalid handle cache timeout, longer than 16 minutes\n");
1909 goto cifs_parse_mount_err;
1912 case Opt_echo_interval:
1913 if (get_option_ul(args, &option)) {
1914 cifs_dbg(VFS, "%s: Invalid echo interval value\n",
1916 goto cifs_parse_mount_err;
1918 vol->echo_interval = option;
1921 if (get_option_ul(args, &option)) {
1922 cifs_dbg(VFS, "%s: Invalid snapshot time\n",
1924 goto cifs_parse_mount_err;
1926 vol->snapshot_time = option;
1928 case Opt_max_credits:
1929 if (get_option_ul(args, &option) || (option < 20) ||
1931 cifs_dbg(VFS, "%s: Invalid max_credits value\n",
1933 goto cifs_parse_mount_err;
1935 vol->max_credits = option;
1937 case Opt_max_channels:
1938 if (get_option_ul(args, &option) || option < 1 ||
1939 option > CIFS_MAX_CHANNELS) {
1940 cifs_dbg(VFS, "%s: Invalid max_channels value, needs to be 1-%d\n",
1941 __func__, CIFS_MAX_CHANNELS);
1942 goto cifs_parse_mount_err;
1944 vol->max_channels = option;
1947 /* String Arguments */
1949 case Opt_blank_user:
1950 /* null user, ie. anonymous authentication */
1952 vol->username = NULL;
1955 string = match_strdup(args);
1959 if (strnlen(string, CIFS_MAX_USERNAME_LEN) >
1960 CIFS_MAX_USERNAME_LEN) {
1961 pr_warn("username too long\n");
1962 goto cifs_parse_mount_err;
1965 kfree(vol->username);
1966 vol->username = kstrdup(string, GFP_KERNEL);
1968 goto cifs_parse_mount_err;
1970 case Opt_blank_pass:
1971 /* passwords have to be handled differently
1972 * to allow the character used for deliminator
1973 * to be passed within them
1977 * Check if this is a case where the password
1978 * starts with a delimiter
1980 tmp_end = strchr(data, '=');
1982 if (!(tmp_end < end && tmp_end[1] == delim)) {
1983 /* No it is not. Set the password to NULL */
1984 kfree_sensitive(vol->password);
1985 vol->password = NULL;
1988 fallthrough; /* to Opt_pass below */
1990 /* Obtain the value string */
1991 value = strchr(data, '=');
1994 /* Set tmp_end to end of the string */
1995 tmp_end = (char *) value + strlen(value);
1997 /* Check if following character is the deliminator
1998 * If yes, we have encountered a double deliminator
1999 * reset the NULL character to the deliminator
2001 if (tmp_end < end && tmp_end[1] == delim) {
2004 /* Keep iterating until we get to a single
2005 * deliminator OR the end
2007 while ((tmp_end = strchr(tmp_end, delim))
2008 != NULL && (tmp_end[1] == delim)) {
2009 tmp_end = (char *) &tmp_end[2];
2012 /* Reset var options to point to next element */
2015 options = (char *) &tmp_end[1];
2017 /* Reached the end of the mount option
2022 kfree_sensitive(vol->password);
2023 /* Now build new password string */
2024 temp_len = strlen(value);
2025 vol->password = kzalloc(temp_len+1, GFP_KERNEL);
2026 if (vol->password == NULL) {
2027 pr_warn("no memory for password\n");
2028 goto cifs_parse_mount_err;
2031 for (i = 0, j = 0; i < temp_len; i++, j++) {
2032 vol->password[j] = value[i];
2033 if ((value[i] == delim) &&
2034 value[i+1] == delim)
2035 /* skip the second deliminator */
2038 vol->password[j] = '\0';
2041 /* FIXME: should this be an error instead? */
2045 string = match_strdup(args);
2049 if (!cifs_convert_address(dstaddr, string,
2051 pr_err("bad ip= option (%s)\n", string);
2052 goto cifs_parse_mount_err;
2057 string = match_strdup(args);
2061 if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
2062 == CIFS_MAX_DOMAINNAME_LEN) {
2063 pr_warn("domain name too long\n");
2064 goto cifs_parse_mount_err;
2067 kfree(vol->domainname);
2068 vol->domainname = kstrdup(string, GFP_KERNEL);
2069 if (!vol->domainname) {
2070 pr_warn("no memory for domainname\n");
2071 goto cifs_parse_mount_err;
2073 cifs_dbg(FYI, "Domain name set\n");
2076 string = match_strdup(args);
2080 if (!cifs_convert_address(
2081 (struct sockaddr *)&vol->srcaddr,
2082 string, strlen(string))) {
2083 pr_warn("Could not parse srcaddr: %s\n",
2085 goto cifs_parse_mount_err;
2089 string = match_strdup(args);
2093 if (strnlen(string, 1024) >= 65) {
2094 pr_warn("iocharset name too long\n");
2095 goto cifs_parse_mount_err;
2098 if (strncasecmp(string, "default", 7) != 0) {
2099 kfree(vol->iocharset);
2100 vol->iocharset = kstrdup(string,
2102 if (!vol->iocharset) {
2103 pr_warn("no memory for charset\n");
2104 goto cifs_parse_mount_err;
2107 /* if iocharset not set then load_nls_default
2110 cifs_dbg(FYI, "iocharset set to %s\n", string);
2112 case Opt_netbiosname:
2113 string = match_strdup(args);
2117 memset(vol->source_rfc1001_name, 0x20,
2120 * FIXME: are there cases in which a comma can
2121 * be valid in workstation netbios name (and
2122 * need special handling)?
2124 for (i = 0; i < RFC1001_NAME_LEN; i++) {
2125 /* don't ucase netbiosname for user */
2128 vol->source_rfc1001_name[i] = string[i];
2130 /* The string has 16th byte zero still from
2131 * set at top of the function
2133 if (i == RFC1001_NAME_LEN && string[i] != 0)
2134 pr_warn("netbiosname longer than 15 truncated\n");
2137 /* servernetbiosname specified override *SMBSERVER */
2138 string = match_strdup(args);
2142 /* last byte, type, is 0x20 for servr type */
2143 memset(vol->target_rfc1001_name, 0x20,
2144 RFC1001_NAME_LEN_WITH_NULL);
2146 /* BB are there cases in which a comma can be
2147 valid in this workstation netbios name
2148 (and need special handling)? */
2150 /* user or mount helper must uppercase the
2152 for (i = 0; i < 15; i++) {
2155 vol->target_rfc1001_name[i] = string[i];
2157 /* The string has 16th byte zero still from
2158 set at top of the function */
2159 if (i == RFC1001_NAME_LEN && string[i] != 0)
2160 pr_warn("server netbiosname longer than 15 truncated\n");
2163 /* version of mount userspace tools, not dialect */
2164 string = match_strdup(args);
2168 /* If interface changes in mount.cifs bump to new ver */
2169 if (strncasecmp(string, "1", 1) == 0) {
2170 if (strlen(string) > 1) {
2171 pr_warn("Bad mount helper ver=%s. Did you want SMB1 (CIFS) dialect and mean to type vers=1.0 instead?\n",
2173 goto cifs_parse_mount_err;
2175 /* This is the default */
2178 /* For all other value, error */
2179 pr_warn("Invalid mount helper version specified\n");
2180 goto cifs_parse_mount_err;
2182 /* protocol version (dialect) */
2183 string = match_strdup(args);
2187 if (cifs_parse_smb_version(string, vol, is_smb3) != 0)
2188 goto cifs_parse_mount_err;
2192 string = match_strdup(args);
2196 if (cifs_parse_security_flavors(string, vol) != 0)
2197 goto cifs_parse_mount_err;
2200 string = match_strdup(args);
2204 if (cifs_parse_cache_flavor(string, vol) != 0)
2205 goto cifs_parse_mount_err;
2209 * An option we don't recognize. Save it off for later
2210 * if we haven't already found one
2216 /* Free up any allocated string */
2221 if (!sloppy && invalid) {
2222 pr_err("Unknown mount option \"%s\"\n", invalid);
2223 goto cifs_parse_mount_err;
2226 if (vol->rdma && vol->vals->protocol_id < SMB30_PROT_ID) {
2227 cifs_dbg(VFS, "SMB Direct requires Version >=3.0\n");
2228 goto cifs_parse_mount_err;
2232 /* Muliuser mounts require CONFIG_KEYS support */
2233 if (vol->multiuser) {
2234 cifs_dbg(VFS, "Multiuser mounts require kernels with CONFIG_KEYS enabled\n");
2235 goto cifs_parse_mount_err;
2239 cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");
2240 goto cifs_parse_mount_err;
2243 /* make sure UNC has a share name */
2244 if (!strchr(vol->UNC + 3, '\\')) {
2245 cifs_dbg(VFS, "Malformed UNC. Unable to find share name.\n");
2246 goto cifs_parse_mount_err;
2253 /* No ip= option specified? Try to get it from UNC */
2254 /* Use the address part of the UNC. */
2255 slash = strchr(&vol->UNC[2], '\\');
2256 len = slash - &vol->UNC[2];
2257 if (!cifs_convert_address(dstaddr, &vol->UNC[2], len)) {
2258 pr_err("Unable to determine destination address\n");
2259 goto cifs_parse_mount_err;
2263 /* set the port that we got earlier */
2264 cifs_set_port(dstaddr, port);
2267 vol->override_uid = override_uid;
2268 else if (override_uid == 1)
2269 pr_notice("ignoring forceuid mount option specified with no uid= option\n");
2272 vol->override_gid = override_gid;
2273 else if (override_gid == 1)
2274 pr_notice("ignoring forcegid mount option specified with no gid= option\n");
2276 if (got_version == false)
2277 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");
2279 kfree(mountdata_copy);
2283 pr_warn("Could not allocate temporary buffer\n");
2284 cifs_parse_mount_err:
2286 kfree(mountdata_copy);
2290 /** Returns true if srcaddr isn't specified and rhs isn't
2291 * specified, or if srcaddr is specified and
2292 * matches the IP address of the rhs argument.
2295 cifs_match_ipaddr(struct sockaddr *srcaddr, struct sockaddr *rhs)
2297 switch (srcaddr->sa_family) {
2299 return (rhs->sa_family == AF_UNSPEC);
2301 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
2302 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
2303 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
2306 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
2307 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
2308 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
2312 return false; /* don't expect to be here */
2317 * If no port is specified in addr structure, we try to match with 445 port
2318 * and if it fails - with 139 ports. It should be called only if address
2319 * families of server and addr are equal.
2322 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
2324 __be16 port, *sport;
2326 /* SMBDirect manages its own ports, don't match it here */
2330 switch (addr->sa_family) {
2332 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
2333 port = ((struct sockaddr_in *) addr)->sin_port;
2336 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
2337 port = ((struct sockaddr_in6 *) addr)->sin6_port;
2345 port = htons(CIFS_PORT);
2349 port = htons(RFC1001_PORT);
2352 return port == *sport;
2356 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
2357 struct sockaddr *srcaddr)
2359 switch (addr->sa_family) {
2361 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
2362 struct sockaddr_in *srv_addr4 =
2363 (struct sockaddr_in *)&server->dstaddr;
2365 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
2370 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
2371 struct sockaddr_in6 *srv_addr6 =
2372 (struct sockaddr_in6 *)&server->dstaddr;
2374 if (!ipv6_addr_equal(&addr6->sin6_addr,
2375 &srv_addr6->sin6_addr))
2377 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
2383 return false; /* don't expect to be here */
2386 if (!cifs_match_ipaddr(srcaddr, (struct sockaddr *)&server->srcaddr))
2393 match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
2396 * The select_sectype function should either return the vol->sectype
2397 * that was specified, or "Unspecified" if that sectype was not
2398 * compatible with the given NEGOTIATE request.
2400 if (server->ops->select_sectype(server, vol->sectype)
2405 * Now check if signing mode is acceptable. No need to check
2406 * global_secflags at this point since if MUST_SIGN is set then
2407 * the server->sign had better be too.
2409 if (vol->sign && !server->sign)
2415 static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
2417 struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
2419 if (vol->nosharesock)
2422 /* If multidialect negotiation see if existing sessions match one */
2423 if (strcmp(vol->vals->version_string, SMB3ANY_VERSION_STRING) == 0) {
2424 if (server->vals->protocol_id < SMB30_PROT_ID)
2426 } else if (strcmp(vol->vals->version_string,
2427 SMBDEFAULT_VERSION_STRING) == 0) {
2428 if (server->vals->protocol_id < SMB21_PROT_ID)
2430 } else if ((server->vals != vol->vals) || (server->ops != vol->ops))
2433 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
2436 if (!match_address(server, addr,
2437 (struct sockaddr *)&vol->srcaddr))
2440 if (!match_port(server, addr))
2443 if (!match_security(server, vol))
2446 if (server->echo_interval != vol->echo_interval * HZ)
2449 if (server->rdma != vol->rdma)
2452 if (server->ignore_signature != vol->ignore_signature)
2455 if (server->min_offload != vol->min_offload)
2461 struct TCP_Server_Info *
2462 cifs_find_tcp_session(struct smb_vol *vol)
2464 struct TCP_Server_Info *server;
2466 spin_lock(&cifs_tcp_ses_lock);
2467 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
2469 * Skip ses channels since they're only handled in lower layers
2470 * (e.g. cifs_send_recv).
2472 if (server->is_channel || !match_server(server, vol))
2475 ++server->srv_count;
2476 spin_unlock(&cifs_tcp_ses_lock);
2477 cifs_dbg(FYI, "Existing tcp session with server found\n");
2480 spin_unlock(&cifs_tcp_ses_lock);
2485 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
2487 struct task_struct *task;
2489 spin_lock(&cifs_tcp_ses_lock);
2490 if (--server->srv_count > 0) {
2491 spin_unlock(&cifs_tcp_ses_lock);
2495 put_net(cifs_net_ns(server));
2497 list_del_init(&server->tcp_ses_list);
2498 spin_unlock(&cifs_tcp_ses_lock);
2500 cancel_delayed_work_sync(&server->echo);
2504 * Avoid deadlock here: reconnect work calls
2505 * cifs_put_tcp_session() at its end. Need to be sure
2506 * that reconnect work does nothing with server pointer after
2509 cancel_delayed_work(&server->reconnect);
2511 cancel_delayed_work_sync(&server->reconnect);
2513 spin_lock(&GlobalMid_Lock);
2514 server->tcpStatus = CifsExiting;
2515 spin_unlock(&GlobalMid_Lock);
2517 cifs_crypto_secmech_release(server);
2518 cifs_fscache_release_client_cookie(server);
2520 kfree(server->session_key.response);
2521 server->session_key.response = NULL;
2522 server->session_key.len = 0;
2524 task = xchg(&server->tsk, NULL);
2526 send_sig(SIGKILL, task, 1);
2529 struct TCP_Server_Info *
2530 cifs_get_tcp_session(struct smb_vol *volume_info)
2532 struct TCP_Server_Info *tcp_ses = NULL;
2535 cifs_dbg(FYI, "UNC: %s\n", volume_info->UNC);
2537 /* see if we already have a matching tcp_ses */
2538 tcp_ses = cifs_find_tcp_session(volume_info);
2542 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
2548 tcp_ses->ops = volume_info->ops;
2549 tcp_ses->vals = volume_info->vals;
2550 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
2551 tcp_ses->hostname = extract_hostname(volume_info->UNC);
2552 if (IS_ERR(tcp_ses->hostname)) {
2553 rc = PTR_ERR(tcp_ses->hostname);
2554 goto out_err_crypto_release;
2557 tcp_ses->noblockcnt = volume_info->rootfs;
2558 tcp_ses->noblocksnd = volume_info->noblocksnd || volume_info->rootfs;
2559 tcp_ses->noautotune = volume_info->noautotune;
2560 tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
2561 tcp_ses->rdma = volume_info->rdma;
2562 tcp_ses->in_flight = 0;
2563 tcp_ses->max_in_flight = 0;
2564 tcp_ses->credits = 1;
2565 init_waitqueue_head(&tcp_ses->response_q);
2566 init_waitqueue_head(&tcp_ses->request_q);
2567 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
2568 mutex_init(&tcp_ses->srv_mutex);
2569 memcpy(tcp_ses->workstation_RFC1001_name,
2570 volume_info->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2571 memcpy(tcp_ses->server_RFC1001_name,
2572 volume_info->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
2573 tcp_ses->session_estab = false;
2574 tcp_ses->sequence_number = 0;
2575 tcp_ses->reconnect_instance = 1;
2576 tcp_ses->lstrp = jiffies;
2577 tcp_ses->compress_algorithm = cpu_to_le16(volume_info->compression);
2578 spin_lock_init(&tcp_ses->req_lock);
2579 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
2580 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
2581 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
2582 INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
2583 mutex_init(&tcp_ses->reconnect_mutex);
2584 memcpy(&tcp_ses->srcaddr, &volume_info->srcaddr,
2585 sizeof(tcp_ses->srcaddr));
2586 memcpy(&tcp_ses->dstaddr, &volume_info->dstaddr,
2587 sizeof(tcp_ses->dstaddr));
2588 if (volume_info->use_client_guid)
2589 memcpy(tcp_ses->client_guid, volume_info->client_guid,
2590 SMB2_CLIENT_GUID_SIZE);
2592 generate_random_uuid(tcp_ses->client_guid);
2594 * at this point we are the only ones with the pointer
2595 * to the struct since the kernel thread not created yet
2596 * no need to spinlock this init of tcpStatus or srv_count
2598 tcp_ses->tcpStatus = CifsNew;
2599 ++tcp_ses->srv_count;
2601 if (volume_info->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
2602 volume_info->echo_interval <= SMB_ECHO_INTERVAL_MAX)
2603 tcp_ses->echo_interval = volume_info->echo_interval * HZ;
2605 tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
2606 if (tcp_ses->rdma) {
2607 #ifndef CONFIG_CIFS_SMB_DIRECT
2608 cifs_dbg(VFS, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
2610 goto out_err_crypto_release;
2612 tcp_ses->smbd_conn = smbd_get_connection(
2613 tcp_ses, (struct sockaddr *)&volume_info->dstaddr);
2614 if (tcp_ses->smbd_conn) {
2615 cifs_dbg(VFS, "RDMA transport established\n");
2617 goto smbd_connected;
2620 goto out_err_crypto_release;
2623 rc = ip_connect(tcp_ses);
2625 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
2626 goto out_err_crypto_release;
2630 * since we're in a cifs function already, we know that
2631 * this will succeed. No need for try_module_get().
2633 __module_get(THIS_MODULE);
2634 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
2636 if (IS_ERR(tcp_ses->tsk)) {
2637 rc = PTR_ERR(tcp_ses->tsk);
2638 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
2639 module_put(THIS_MODULE);
2640 goto out_err_crypto_release;
2642 tcp_ses->min_offload = volume_info->min_offload;
2643 tcp_ses->tcpStatus = CifsNeedNegotiate;
2645 if ((volume_info->max_credits < 20) || (volume_info->max_credits > 60000))
2646 tcp_ses->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
2648 tcp_ses->max_credits = volume_info->max_credits;
2650 tcp_ses->nr_targets = 1;
2651 tcp_ses->ignore_signature = volume_info->ignore_signature;
2652 /* thread spawned, put it on the list */
2653 spin_lock(&cifs_tcp_ses_lock);
2654 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
2655 spin_unlock(&cifs_tcp_ses_lock);
2657 cifs_fscache_get_client_cookie(tcp_ses);
2659 /* queue echo request delayed work */
2660 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
2664 out_err_crypto_release:
2665 cifs_crypto_secmech_release(tcp_ses);
2667 put_net(cifs_net_ns(tcp_ses));
2671 if (!IS_ERR(tcp_ses->hostname))
2672 kfree(tcp_ses->hostname);
2673 if (tcp_ses->ssocket)
2674 sock_release(tcp_ses->ssocket);
2680 static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
2682 if (vol->sectype != Unspecified &&
2683 vol->sectype != ses->sectype)
2687 * If an existing session is limited to less channels than
2688 * requested, it should not be reused
2690 if (ses->chan_max < vol->max_channels)
2693 switch (ses->sectype) {
2695 if (!uid_eq(vol->cred_uid, ses->cred_uid))
2699 /* NULL username means anonymous session */
2700 if (ses->user_name == NULL) {
2706 /* anything else takes username/password */
2707 if (strncmp(ses->user_name,
2708 vol->username ? vol->username : "",
2709 CIFS_MAX_USERNAME_LEN))
2711 if ((vol->username && strlen(vol->username) != 0) &&
2712 ses->password != NULL &&
2713 strncmp(ses->password,
2714 vol->password ? vol->password : "",
2715 CIFS_MAX_PASSWORD_LEN))
2722 * cifs_setup_ipc - helper to setup the IPC tcon for the session
2724 * A new IPC connection is made and stored in the session
2725 * tcon_ipc. The IPC tcon has the same lifetime as the session.
2728 cifs_setup_ipc(struct cifs_ses *ses, struct smb_vol *volume_info)
2731 struct cifs_tcon *tcon;
2732 struct nls_table *nls_codepage;
2733 char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0};
2735 struct TCP_Server_Info *server = ses->server;
2738 * If the mount request that resulted in the creation of the
2739 * session requires encryption, force IPC to be encrypted too.
2741 if (volume_info->seal) {
2742 if (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
2745 cifs_server_dbg(VFS,
2746 "IPC: server doesn't support encryption\n");
2751 tcon = tconInfoAlloc();
2755 scnprintf(unc, sizeof(unc), "\\\\%s\\IPC$", server->hostname);
2758 nls_codepage = load_nls_default();
2764 rc = server->ops->tree_connect(xid, ses, unc, tcon, nls_codepage);
2768 cifs_server_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
2773 cifs_dbg(FYI, "IPC tcon rc = %d ipc tid = %d\n", rc, tcon->tid);
2775 ses->tcon_ipc = tcon;
2777 unload_nls(nls_codepage);
2782 * cifs_free_ipc - helper to release the session IPC tcon
2784 * Needs to be called everytime a session is destroyed
2787 cifs_free_ipc(struct cifs_ses *ses)
2790 struct cifs_tcon *tcon = ses->tcon_ipc;
2795 if (ses->server->ops->tree_disconnect) {
2797 rc = ses->server->ops->tree_disconnect(xid, tcon);
2802 cifs_dbg(FYI, "failed to disconnect IPC tcon (rc=%d)\n", rc);
2805 ses->tcon_ipc = NULL;
2809 static struct cifs_ses *
2810 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
2812 struct cifs_ses *ses;
2814 spin_lock(&cifs_tcp_ses_lock);
2815 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
2816 if (ses->status == CifsExiting)
2818 if (!match_session(ses, vol))
2821 spin_unlock(&cifs_tcp_ses_lock);
2824 spin_unlock(&cifs_tcp_ses_lock);
2828 void cifs_put_smb_ses(struct cifs_ses *ses)
2830 unsigned int rc, xid;
2831 struct TCP_Server_Info *server = ses->server;
2833 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
2835 spin_lock(&cifs_tcp_ses_lock);
2836 if (ses->status == CifsExiting) {
2837 spin_unlock(&cifs_tcp_ses_lock);
2840 if (--ses->ses_count > 0) {
2841 spin_unlock(&cifs_tcp_ses_lock);
2844 spin_unlock(&cifs_tcp_ses_lock);
2846 spin_lock(&GlobalMid_Lock);
2847 if (ses->status == CifsGood)
2848 ses->status = CifsExiting;
2849 spin_unlock(&GlobalMid_Lock);
2853 if (ses->status == CifsExiting && server->ops->logoff) {
2855 rc = server->ops->logoff(xid, ses);
2857 cifs_server_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
2862 spin_lock(&cifs_tcp_ses_lock);
2863 list_del_init(&ses->smb_ses_list);
2864 spin_unlock(&cifs_tcp_ses_lock);
2866 /* close any extra channels */
2867 if (ses->chan_count > 1) {
2870 for (i = 1; i < ses->chan_count; i++)
2871 cifs_put_tcp_session(ses->chans[i].server, 0);
2875 cifs_put_tcp_session(server, 0);
2880 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
2881 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
2883 /* Populate username and pw fields from keyring if possible */
2885 cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
2889 const char *delim, *payload;
2893 struct TCP_Server_Info *server = ses->server;
2894 struct sockaddr_in *sa;
2895 struct sockaddr_in6 *sa6;
2896 const struct user_key_payload *upayload;
2898 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
2902 /* try to find an address key first */
2903 switch (server->dstaddr.ss_family) {
2905 sa = (struct sockaddr_in *)&server->dstaddr;
2906 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
2909 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
2910 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
2913 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
2914 server->dstaddr.ss_family);
2919 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2920 key = request_key(&key_type_logon, desc, "");
2922 if (!ses->domainName) {
2923 cifs_dbg(FYI, "domainName is NULL\n");
2928 /* didn't work, try to find a domain key */
2929 sprintf(desc, "cifs:d:%s", ses->domainName);
2930 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
2931 key = request_key(&key_type_logon, desc, "");
2939 down_read(&key->sem);
2940 upayload = user_key_payload_locked(key);
2941 if (IS_ERR_OR_NULL(upayload)) {
2942 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
2946 /* find first : in payload */
2947 payload = upayload->data;
2948 delim = strnchr(payload, upayload->datalen, ':');
2949 cifs_dbg(FYI, "payload=%s\n", payload);
2951 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
2957 len = delim - payload;
2958 if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
2959 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
2965 vol->username = kstrndup(payload, len, GFP_KERNEL);
2966 if (!vol->username) {
2967 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
2972 cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
2974 len = key->datalen - (len + 1);
2975 if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
2976 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
2978 kfree(vol->username);
2979 vol->username = NULL;
2984 vol->password = kstrndup(delim, len, GFP_KERNEL);
2985 if (!vol->password) {
2986 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
2989 kfree(vol->username);
2990 vol->username = NULL;
2995 * If we have a domain key then we must set the domainName in the
2998 if (is_domain && ses->domainName) {
2999 vol->domainname = kstrndup(ses->domainName,
3000 strlen(ses->domainName),
3002 if (!vol->domainname) {
3003 cifs_dbg(FYI, "Unable to allocate %zd bytes for domain\n",
3006 kfree(vol->username);
3007 vol->username = NULL;
3008 kfree_sensitive(vol->password);
3009 vol->password = NULL;
3019 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
3022 #else /* ! CONFIG_KEYS */
3024 cifs_set_cifscreds(struct smb_vol *vol __attribute__((unused)),
3025 struct cifs_ses *ses __attribute__((unused)))
3029 #endif /* CONFIG_KEYS */
3032 * cifs_get_smb_ses - get a session matching @volume_info data from @server
3034 * This function assumes it is being called from cifs_mount() where we
3035 * already got a server reference (server refcount +1). See
3036 * cifs_get_tcon() for refcount explanations.
3039 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
3043 struct cifs_ses *ses;
3044 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3045 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3049 ses = cifs_find_smb_ses(server, volume_info);
3051 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
3054 mutex_lock(&ses->session_mutex);
3055 rc = cifs_negotiate_protocol(xid, ses);
3057 mutex_unlock(&ses->session_mutex);
3058 /* problem -- put our ses reference */
3059 cifs_put_smb_ses(ses);
3063 if (ses->need_reconnect) {
3064 cifs_dbg(FYI, "Session needs reconnect\n");
3065 rc = cifs_setup_session(xid, ses,
3066 volume_info->local_nls);
3068 mutex_unlock(&ses->session_mutex);
3069 /* problem -- put our reference */
3070 cifs_put_smb_ses(ses);
3075 mutex_unlock(&ses->session_mutex);
3077 /* existing SMB ses has a server reference already */
3078 cifs_put_tcp_session(server, 0);
3085 cifs_dbg(FYI, "Existing smb sess not found\n");
3086 ses = sesInfoAlloc();
3090 /* new SMB session uses our server ref */
3091 ses->server = server;
3092 if (server->dstaddr.ss_family == AF_INET6)
3093 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
3095 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
3097 if (volume_info->username) {
3098 ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
3099 if (!ses->user_name)
3103 /* volume_info->password freed at unmount */
3104 if (volume_info->password) {
3105 ses->password = kstrdup(volume_info->password, GFP_KERNEL);
3109 if (volume_info->domainname) {
3110 ses->domainName = kstrdup(volume_info->domainname, GFP_KERNEL);
3111 if (!ses->domainName)
3114 if (volume_info->domainauto)
3115 ses->domainAuto = volume_info->domainauto;
3116 ses->cred_uid = volume_info->cred_uid;
3117 ses->linux_uid = volume_info->linux_uid;
3119 ses->sectype = volume_info->sectype;
3120 ses->sign = volume_info->sign;
3121 mutex_lock(&ses->session_mutex);
3123 /* add server as first channel */
3124 ses->chans[0].server = server;
3125 ses->chan_count = 1;
3126 ses->chan_max = volume_info->multichannel ? volume_info->max_channels:1;
3128 rc = cifs_negotiate_protocol(xid, ses);
3130 rc = cifs_setup_session(xid, ses, volume_info->local_nls);
3132 /* each channel uses a different signing key */
3133 memcpy(ses->chans[0].signkey, ses->smb3signingkey,
3134 sizeof(ses->smb3signingkey));
3136 mutex_unlock(&ses->session_mutex);
3140 /* success, put it on the list and add it as first channel */
3141 spin_lock(&cifs_tcp_ses_lock);
3142 list_add(&ses->smb_ses_list, &server->smb_ses_list);
3143 spin_unlock(&cifs_tcp_ses_lock);
3147 cifs_setup_ipc(ses, volume_info);
3157 static int match_tcon(struct cifs_tcon *tcon, struct smb_vol *volume_info)
3159 if (tcon->tidStatus == CifsExiting)
3161 if (strncmp(tcon->treeName, volume_info->UNC, MAX_TREE_SIZE))
3163 if (tcon->seal != volume_info->seal)
3165 if (tcon->snapshot_time != volume_info->snapshot_time)
3167 if (tcon->handle_timeout != volume_info->handle_timeout)
3169 if (tcon->no_lease != volume_info->no_lease)
3171 if (tcon->nodelete != volume_info->nodelete)
3176 static struct cifs_tcon *
3177 cifs_find_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3179 struct list_head *tmp;
3180 struct cifs_tcon *tcon;
3182 spin_lock(&cifs_tcp_ses_lock);
3183 list_for_each(tmp, &ses->tcon_list) {
3184 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
3185 #ifdef CONFIG_CIFS_DFS_UPCALL
3189 if (!match_tcon(tcon, volume_info))
3192 spin_unlock(&cifs_tcp_ses_lock);
3195 spin_unlock(&cifs_tcp_ses_lock);
3200 cifs_put_tcon(struct cifs_tcon *tcon)
3203 struct cifs_ses *ses;
3206 * IPC tcon share the lifetime of their session and are
3207 * destroyed in the session put function
3209 if (tcon == NULL || tcon->ipc)
3213 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
3214 spin_lock(&cifs_tcp_ses_lock);
3215 if (--tcon->tc_count > 0) {
3216 spin_unlock(&cifs_tcp_ses_lock);
3220 list_del_init(&tcon->tcon_list);
3221 spin_unlock(&cifs_tcp_ses_lock);
3224 if (ses->server->ops->tree_disconnect)
3225 ses->server->ops->tree_disconnect(xid, tcon);
3228 cifs_fscache_release_super_cookie(tcon);
3230 cifs_put_smb_ses(ses);
3234 * cifs_get_tcon - get a tcon matching @volume_info data from @ses
3236 * - tcon refcount is the number of mount points using the tcon.
3237 * - ses refcount is the number of tcon using the session.
3239 * 1. This function assumes it is being called from cifs_mount() where
3240 * we already got a session reference (ses refcount +1).
3242 * 2. Since we're in the context of adding a mount point, the end
3243 * result should be either:
3245 * a) a new tcon already allocated with refcount=1 (1 mount point) and
3246 * its session refcount incremented (1 new tcon). This +1 was
3247 * already done in (1).
3249 * b) an existing tcon with refcount+1 (add a mount point to it) and
3250 * identical ses refcount (no new tcon). Because of (1) we need to
3251 * decrement the ses refcount.
3253 static struct cifs_tcon *
3254 cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
3257 struct cifs_tcon *tcon;
3259 tcon = cifs_find_tcon(ses, volume_info);
3262 * tcon has refcount already incremented but we need to
3263 * decrement extra ses reference gotten by caller (case b)
3265 cifs_dbg(FYI, "Found match on UNC path\n");
3266 cifs_put_smb_ses(ses);
3270 if (!ses->server->ops->tree_connect) {
3275 tcon = tconInfoAlloc();
3281 if (volume_info->snapshot_time) {
3282 if (ses->server->vals->protocol_id == 0) {
3284 "Use SMB2 or later for snapshot mount option\n");
3288 tcon->snapshot_time = volume_info->snapshot_time;
3291 if (volume_info->handle_timeout) {
3292 if (ses->server->vals->protocol_id == 0) {
3294 "Use SMB2.1 or later for handle timeout option\n");
3298 tcon->handle_timeout = volume_info->handle_timeout;
3302 if (volume_info->password) {
3303 tcon->password = kstrdup(volume_info->password, GFP_KERNEL);
3304 if (!tcon->password) {
3310 if (volume_info->seal) {
3311 if (ses->server->vals->protocol_id == 0) {
3313 "SMB3 or later required for encryption\n");
3316 } else if (tcon->ses->server->capabilities &
3317 SMB2_GLOBAL_CAP_ENCRYPTION)
3320 cifs_dbg(VFS, "Encryption is not supported on share\n");
3326 if (volume_info->linux_ext) {
3327 if (ses->server->posix_ext_supported) {
3328 tcon->posix_extensions = true;
3329 pr_warn_once("SMB3.11 POSIX Extensions are experimental\n");
3331 cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions\n");
3338 * BB Do we need to wrap session_mutex around this TCon call and Unix
3339 * SetFS as we do on SessSetup and reconnect?
3342 rc = ses->server->ops->tree_connect(xid, ses, volume_info->UNC, tcon,
3343 volume_info->local_nls);
3345 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
3349 tcon->use_persistent = false;
3350 /* check if SMB2 or later, CIFS does not support persistent handles */
3351 if (volume_info->persistent) {
3352 if (ses->server->vals->protocol_id == 0) {
3354 "SMB3 or later required for persistent handles\n");
3357 } else if (ses->server->capabilities &
3358 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3359 tcon->use_persistent = true;
3360 else /* persistent handles requested but not supported */ {
3362 "Persistent handles not supported on share\n");
3366 } else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
3367 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
3368 && (volume_info->nopersistent == false)) {
3369 cifs_dbg(FYI, "enabling persistent handles\n");
3370 tcon->use_persistent = true;
3371 } else if (volume_info->resilient) {
3372 if (ses->server->vals->protocol_id == 0) {
3374 "SMB2.1 or later required for resilient handles\n");
3378 tcon->use_resilient = true;
3381 /* If the user really knows what they are doing they can override */
3382 if (tcon->share_flags & SMB2_SHAREFLAG_NO_CACHING) {
3383 if (volume_info->cache_ro)
3384 cifs_dbg(VFS, "cache=ro requested on mount but NO_CACHING flag set on share\n");
3385 else if (volume_info->cache_rw)
3386 cifs_dbg(VFS, "cache=singleclient requested on mount but NO_CACHING flag set on share\n");
3389 if (volume_info->no_lease) {
3390 if (ses->server->vals->protocol_id == 0) {
3392 "SMB2 or later required for nolease option\n");
3396 tcon->no_lease = volume_info->no_lease;
3400 * We can have only one retry value for a connection to a share so for
3401 * resources mounted more than once to the same server share the last
3402 * value passed in for the retry flag is used.
3404 tcon->retry = volume_info->retry;
3405 tcon->nocase = volume_info->nocase;
3406 if (ses->server->capabilities & SMB2_GLOBAL_CAP_DIRECTORY_LEASING)
3407 tcon->nohandlecache = volume_info->nohandlecache;
3409 tcon->nohandlecache = 1;
3410 tcon->nodelete = volume_info->nodelete;
3411 tcon->local_lease = volume_info->local_lease;
3412 INIT_LIST_HEAD(&tcon->pending_opens);
3414 spin_lock(&cifs_tcp_ses_lock);
3415 list_add(&tcon->tcon_list, &ses->tcon_list);
3416 spin_unlock(&cifs_tcp_ses_lock);
3418 cifs_fscache_get_super_cookie(tcon);
3428 cifs_put_tlink(struct tcon_link *tlink)
3430 if (!tlink || IS_ERR(tlink))
3433 if (!atomic_dec_and_test(&tlink->tl_count) ||
3434 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
3435 tlink->tl_time = jiffies;
3439 if (!IS_ERR(tlink_tcon(tlink)))
3440 cifs_put_tcon(tlink_tcon(tlink));
3446 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3448 struct cifs_sb_info *old = CIFS_SB(sb);
3449 struct cifs_sb_info *new = mnt_data->cifs_sb;
3450 unsigned int oldflags = old->mnt_cifs_flags & CIFS_MOUNT_MASK;
3451 unsigned int newflags = new->mnt_cifs_flags & CIFS_MOUNT_MASK;
3453 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
3456 if (old->mnt_cifs_serverino_autodisabled)
3457 newflags &= ~CIFS_MOUNT_SERVER_INUM;
3459 if (oldflags != newflags)
3463 * We want to share sb only if we don't specify an r/wsize or
3464 * specified r/wsize is greater than or equal to existing one.
3466 if (new->wsize && new->wsize < old->wsize)
3469 if (new->rsize && new->rsize < old->rsize)
3472 if (!uid_eq(old->mnt_uid, new->mnt_uid) || !gid_eq(old->mnt_gid, new->mnt_gid))
3475 if (old->mnt_file_mode != new->mnt_file_mode ||
3476 old->mnt_dir_mode != new->mnt_dir_mode)
3479 if (strcmp(old->local_nls->charset, new->local_nls->charset))
3482 if (old->actimeo != new->actimeo)
3489 match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
3491 struct cifs_sb_info *old = CIFS_SB(sb);
3492 struct cifs_sb_info *new = mnt_data->cifs_sb;
3493 bool old_set = (old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
3495 bool new_set = (new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
3498 if (old_set && new_set && !strcmp(new->prepath, old->prepath))
3500 else if (!old_set && !new_set)
3507 cifs_match_super(struct super_block *sb, void *data)
3509 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
3510 struct smb_vol *volume_info;
3511 struct cifs_sb_info *cifs_sb;
3512 struct TCP_Server_Info *tcp_srv;
3513 struct cifs_ses *ses;
3514 struct cifs_tcon *tcon;
3515 struct tcon_link *tlink;
3518 spin_lock(&cifs_tcp_ses_lock);
3519 cifs_sb = CIFS_SB(sb);
3520 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3521 if (tlink == NULL) {
3522 /* can not match superblock if tlink were ever null */
3523 spin_unlock(&cifs_tcp_ses_lock);
3526 tcon = tlink_tcon(tlink);
3528 tcp_srv = ses->server;
3530 volume_info = mnt_data->vol;
3532 if (!match_server(tcp_srv, volume_info) ||
3533 !match_session(ses, volume_info) ||
3534 !match_tcon(tcon, volume_info) ||
3535 !match_prepath(sb, mnt_data)) {
3540 rc = compare_mount_options(sb, mnt_data);
3542 spin_unlock(&cifs_tcp_ses_lock);
3543 cifs_put_tlink(tlink);
3547 #ifdef CONFIG_DEBUG_LOCK_ALLOC
3548 static struct lock_class_key cifs_key[2];
3549 static struct lock_class_key cifs_slock_key[2];
3552 cifs_reclassify_socket4(struct socket *sock)
3554 struct sock *sk = sock->sk;
3555 BUG_ON(!sock_allow_reclassification(sk));
3556 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
3557 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
3561 cifs_reclassify_socket6(struct socket *sock)
3563 struct sock *sk = sock->sk;
3564 BUG_ON(!sock_allow_reclassification(sk));
3565 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
3566 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
3570 cifs_reclassify_socket4(struct socket *sock)
3575 cifs_reclassify_socket6(struct socket *sock)
3580 /* See RFC1001 section 14 on representation of Netbios names */
3581 static void rfc1002mangle(char *target, char *source, unsigned int length)
3585 for (i = 0, j = 0; i < (length); i++) {
3586 /* mask a nibble at a time and encode */
3587 target[j] = 'A' + (0x0F & (source[i] >> 4));
3588 target[j+1] = 'A' + (0x0F & source[i]);
3595 bind_socket(struct TCP_Server_Info *server)
3598 if (server->srcaddr.ss_family != AF_UNSPEC) {
3599 /* Bind to the specified local IP address */
3600 struct socket *socket = server->ssocket;
3601 rc = socket->ops->bind(socket,
3602 (struct sockaddr *) &server->srcaddr,
3603 sizeof(server->srcaddr));
3605 struct sockaddr_in *saddr4;
3606 struct sockaddr_in6 *saddr6;
3607 saddr4 = (struct sockaddr_in *)&server->srcaddr;
3608 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
3609 if (saddr6->sin6_family == AF_INET6)
3610 cifs_server_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
3611 &saddr6->sin6_addr, rc);
3613 cifs_server_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
3614 &saddr4->sin_addr.s_addr, rc);
3621 ip_rfc1001_connect(struct TCP_Server_Info *server)
3625 * some servers require RFC1001 sessinit before sending
3626 * negprot - BB check reconnection in case where second
3627 * sessinit is sent but no second negprot
3629 struct rfc1002_session_packet *ses_init_buf;
3630 struct smb_hdr *smb_buf;
3631 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
3634 ses_init_buf->trailer.session_req.called_len = 32;
3636 if (server->server_RFC1001_name[0] != 0)
3637 rfc1002mangle(ses_init_buf->trailer.
3638 session_req.called_name,
3639 server->server_RFC1001_name,
3640 RFC1001_NAME_LEN_WITH_NULL);
3642 rfc1002mangle(ses_init_buf->trailer.
3643 session_req.called_name,
3644 DEFAULT_CIFS_CALLED_NAME,
3645 RFC1001_NAME_LEN_WITH_NULL);
3647 ses_init_buf->trailer.session_req.calling_len = 32;
3650 * calling name ends in null (byte 16) from old smb
3653 if (server->workstation_RFC1001_name[0] != 0)
3654 rfc1002mangle(ses_init_buf->trailer.
3655 session_req.calling_name,
3656 server->workstation_RFC1001_name,
3657 RFC1001_NAME_LEN_WITH_NULL);
3659 rfc1002mangle(ses_init_buf->trailer.
3660 session_req.calling_name,
3662 RFC1001_NAME_LEN_WITH_NULL);
3664 ses_init_buf->trailer.session_req.scope1 = 0;
3665 ses_init_buf->trailer.session_req.scope2 = 0;
3666 smb_buf = (struct smb_hdr *)ses_init_buf;
3668 /* sizeof RFC1002_SESSION_REQUEST with no scope */
3669 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
3670 rc = smb_send(server, smb_buf, 0x44);
3671 kfree(ses_init_buf);
3673 * RFC1001 layer in at least one server
3674 * requires very short break before negprot
3675 * presumably because not expecting negprot
3676 * to follow so fast. This is a simple
3677 * solution that works without
3678 * complicating the code and causes no
3679 * significant slowing down on mount
3682 usleep_range(1000, 2000);
3685 * else the negprot may still work without this
3686 * even though malloc failed
3693 generic_ip_connect(struct TCP_Server_Info *server)
3698 struct socket *socket = server->ssocket;
3699 struct sockaddr *saddr;
3701 saddr = (struct sockaddr *) &server->dstaddr;
3703 if (server->dstaddr.ss_family == AF_INET6) {
3704 struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)&server->dstaddr;
3706 sport = ipv6->sin6_port;
3707 slen = sizeof(struct sockaddr_in6);
3709 cifs_dbg(FYI, "%s: connecting to [%pI6]:%d\n", __func__, &ipv6->sin6_addr,
3712 struct sockaddr_in *ipv4 = (struct sockaddr_in *)&server->dstaddr;
3714 sport = ipv4->sin_port;
3715 slen = sizeof(struct sockaddr_in);
3717 cifs_dbg(FYI, "%s: connecting to %pI4:%d\n", __func__, &ipv4->sin_addr,
3721 if (socket == NULL) {
3722 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3723 IPPROTO_TCP, &socket, 1);
3725 cifs_server_dbg(VFS, "Error %d creating socket\n", rc);
3726 server->ssocket = NULL;
3730 /* BB other socket options to set KEEPALIVE, NODELAY? */
3731 cifs_dbg(FYI, "Socket created\n");
3732 server->ssocket = socket;
3733 socket->sk->sk_allocation = GFP_NOFS;
3734 if (sfamily == AF_INET6)
3735 cifs_reclassify_socket6(socket);
3737 cifs_reclassify_socket4(socket);
3740 rc = bind_socket(server);
3745 * Eventually check for other socket options to change from
3746 * the default. sock_setsockopt not used because it expects
3749 socket->sk->sk_rcvtimeo = 7 * HZ;
3750 socket->sk->sk_sndtimeo = 5 * HZ;
3752 /* make the bufsizes depend on wsize/rsize and max requests */
3753 if (server->noautotune) {
3754 if (socket->sk->sk_sndbuf < (200 * 1024))
3755 socket->sk->sk_sndbuf = 200 * 1024;
3756 if (socket->sk->sk_rcvbuf < (140 * 1024))
3757 socket->sk->sk_rcvbuf = 140 * 1024;
3760 if (server->tcp_nodelay)
3761 tcp_sock_set_nodelay(socket->sk);
3763 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
3764 socket->sk->sk_sndbuf,
3765 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
3767 rc = socket->ops->connect(socket, saddr, slen,
3768 server->noblockcnt ? O_NONBLOCK : 0);
3770 * When mounting SMB root file systems, we do not want to block in
3771 * connect. Otherwise bail out and then let cifs_reconnect() perform
3772 * reconnect failover - if possible.
3774 if (server->noblockcnt && rc == -EINPROGRESS)
3777 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3778 sock_release(socket);
3779 server->ssocket = NULL;
3783 if (sport == htons(RFC1001_PORT))
3784 rc = ip_rfc1001_connect(server);
3790 ip_connect(struct TCP_Server_Info *server)
3793 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3794 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3796 if (server->dstaddr.ss_family == AF_INET6)
3797 sport = &addr6->sin6_port;
3799 sport = &addr->sin_port;
3804 /* try with 445 port at first */
3805 *sport = htons(CIFS_PORT);
3807 rc = generic_ip_connect(server);
3811 /* if it failed, try with 139 port */
3812 *sport = htons(RFC1001_PORT);
3815 return generic_ip_connect(server);
3818 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
3819 struct cifs_sb_info *cifs_sb, struct smb_vol *vol_info)
3821 /* if we are reconnecting then should we check to see if
3822 * any requested capabilities changed locally e.g. via
3823 * remount but we can not do much about it here
3824 * if they have (even if we could detect it by the following)
3825 * Perhaps we could add a backpointer to array of sb from tcon
3826 * or if we change to make all sb to same share the same
3827 * sb as NFS - then we only have one backpointer to sb.
3828 * What if we wanted to mount the server share twice once with
3829 * and once without posixacls or posix paths? */
3830 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3832 if (vol_info && vol_info->no_linux_ext) {
3833 tcon->fsUnixInfo.Capability = 0;
3834 tcon->unix_ext = 0; /* Unix Extensions disabled */
3835 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
3837 } else if (vol_info)
3838 tcon->unix_ext = 1; /* Unix Extensions supported */
3840 if (tcon->unix_ext == 0) {
3841 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
3845 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
3846 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
3847 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
3848 /* check for reconnect case in which we do not
3849 want to change the mount behavior if we can avoid it */
3850 if (vol_info == NULL) {
3851 /* turn off POSIX ACL and PATHNAMES if not set
3852 originally at mount time */
3853 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
3854 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3855 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3856 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3857 cifs_dbg(VFS, "POSIXPATH support change\n");
3858 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3859 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
3860 cifs_dbg(VFS, "possible reconnect error\n");
3861 cifs_dbg(VFS, "server disabled POSIX path support\n");
3865 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3866 cifs_dbg(VFS, "per-share encryption not supported yet\n");
3868 cap &= CIFS_UNIX_CAP_MASK;
3869 if (vol_info && vol_info->no_psx_acl)
3870 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
3871 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
3872 cifs_dbg(FYI, "negotiated posix acl support\n");
3874 cifs_sb->mnt_cifs_flags |=
3875 CIFS_MOUNT_POSIXACL;
3878 if (vol_info && vol_info->posix_paths == 0)
3879 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
3880 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
3881 cifs_dbg(FYI, "negotiate posix pathnames\n");
3883 cifs_sb->mnt_cifs_flags |=
3884 CIFS_MOUNT_POSIX_PATHS;
3887 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
3888 #ifdef CONFIG_CIFS_DEBUG2
3889 if (cap & CIFS_UNIX_FCNTL_CAP)
3890 cifs_dbg(FYI, "FCNTL cap\n");
3891 if (cap & CIFS_UNIX_EXTATTR_CAP)
3892 cifs_dbg(FYI, "EXTATTR cap\n");
3893 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
3894 cifs_dbg(FYI, "POSIX path cap\n");
3895 if (cap & CIFS_UNIX_XATTR_CAP)
3896 cifs_dbg(FYI, "XATTR cap\n");
3897 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
3898 cifs_dbg(FYI, "POSIX ACL cap\n");
3899 if (cap & CIFS_UNIX_LARGE_READ_CAP)
3900 cifs_dbg(FYI, "very large read cap\n");
3901 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
3902 cifs_dbg(FYI, "very large write cap\n");
3903 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
3904 cifs_dbg(FYI, "transport encryption cap\n");
3905 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
3906 cifs_dbg(FYI, "mandatory transport encryption cap\n");
3907 #endif /* CIFS_DEBUG2 */
3908 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
3909 if (vol_info == NULL) {
3910 cifs_dbg(FYI, "resetting capabilities failed\n");
3912 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");
3918 int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
3919 struct cifs_sb_info *cifs_sb)
3921 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
3923 spin_lock_init(&cifs_sb->tlink_tree_lock);
3924 cifs_sb->tlink_tree = RB_ROOT;
3926 cifs_sb->bsize = pvolume_info->bsize;
3928 * Temporarily set r/wsize for matching superblock. If we end up using
3929 * new sb then client will later negotiate it downward if needed.
3931 cifs_sb->rsize = pvolume_info->rsize;
3932 cifs_sb->wsize = pvolume_info->wsize;
3934 cifs_sb->mnt_uid = pvolume_info->linux_uid;
3935 cifs_sb->mnt_gid = pvolume_info->linux_gid;
3936 cifs_sb->mnt_file_mode = pvolume_info->file_mode;
3937 cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
3938 cifs_dbg(FYI, "file mode: %04ho dir mode: %04ho\n",
3939 cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode);
3941 cifs_sb->actimeo = pvolume_info->actimeo;
3942 cifs_sb->local_nls = pvolume_info->local_nls;
3944 if (pvolume_info->nodfs)
3945 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_DFS;
3946 if (pvolume_info->noperm)
3947 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
3948 if (pvolume_info->setuids)
3949 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
3950 if (pvolume_info->setuidfromacl)
3951 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UID_FROM_ACL;
3952 if (pvolume_info->server_ino)
3953 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
3954 if (pvolume_info->remap)
3955 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SFM_CHR;
3956 if (pvolume_info->sfu_remap)
3957 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
3958 if (pvolume_info->no_xattr)
3959 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
3960 if (pvolume_info->sfu_emul)
3961 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
3962 if (pvolume_info->nobrl)
3963 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
3964 if (pvolume_info->nohandlecache)
3965 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_HANDLE_CACHE;
3966 if (pvolume_info->nostrictsync)
3967 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOSSYNC;
3968 if (pvolume_info->mand_lock)
3969 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NOPOSIXBRL;
3970 if (pvolume_info->rwpidforward)
3971 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RWPIDFORWARD;
3972 if (pvolume_info->mode_ace)
3973 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MODE_FROM_SID;
3974 if (pvolume_info->cifs_acl)
3975 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
3976 if (pvolume_info->backupuid_specified) {
3977 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPUID;
3978 cifs_sb->mnt_backupuid = pvolume_info->backupuid;
3980 if (pvolume_info->backupgid_specified) {
3981 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_BACKUPGID;
3982 cifs_sb->mnt_backupgid = pvolume_info->backupgid;
3984 if (pvolume_info->override_uid)
3985 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
3986 if (pvolume_info->override_gid)
3987 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
3988 if (pvolume_info->dynperm)
3989 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
3990 if (pvolume_info->fsc)
3991 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_FSCACHE;
3992 if (pvolume_info->multiuser)
3993 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_MULTIUSER |
3994 CIFS_MOUNT_NO_PERM);
3995 if (pvolume_info->strict_io)
3996 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_STRICT_IO;
3997 if (pvolume_info->direct_io) {
3998 cifs_dbg(FYI, "mounting share using direct i/o\n");
3999 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
4001 if (pvolume_info->cache_ro) {
4002 cifs_dbg(VFS, "mounting share with read only caching. Ensure that the share will not be modified while in use.\n");
4003 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RO_CACHE;
4004 } else if (pvolume_info->cache_rw) {
4005 cifs_dbg(VFS, "mounting share in single client RW caching mode. Ensure that no other systems will be accessing the share.\n");
4006 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_RO_CACHE |
4007 CIFS_MOUNT_RW_CACHE);
4009 if (pvolume_info->mfsymlinks) {
4010 if (pvolume_info->sfu_emul) {
4012 * Our SFU ("Services for Unix" emulation does not allow
4013 * creating symlinks but does allow reading existing SFU
4014 * symlinks (it does allow both creating and reading SFU
4015 * style mknod and FIFOs though). When "mfsymlinks" and
4016 * "sfu" are both enabled at the same time, it allows
4017 * reading both types of symlinks, but will only create
4018 * them with mfsymlinks format. This allows better
4019 * Apple compatibility (probably better for Samba too)
4020 * while still recognizing old Windows style symlinks.
4022 cifs_dbg(VFS, "mount options mfsymlinks and sfu both enabled\n");
4024 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MF_SYMLINKS;
4027 if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
4028 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
4030 if (pvolume_info->prepath) {
4031 cifs_sb->prepath = kstrdup(pvolume_info->prepath, GFP_KERNEL);
4032 if (cifs_sb->prepath == NULL)
4034 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
4041 cifs_cleanup_volume_info_contents(struct smb_vol *volume_info)
4043 kfree(volume_info->username);
4044 kfree_sensitive(volume_info->password);
4045 kfree(volume_info->UNC);
4046 kfree(volume_info->domainname);
4047 kfree(volume_info->iocharset);
4048 kfree(volume_info->prepath);
4052 cifs_cleanup_volume_info(struct smb_vol *volume_info)
4056 cifs_cleanup_volume_info_contents(volume_info);
4060 /* Release all succeed connections */
4061 static inline void mount_put_conns(struct cifs_sb_info *cifs_sb,
4063 struct TCP_Server_Info *server,
4064 struct cifs_ses *ses, struct cifs_tcon *tcon)
4069 cifs_put_tcon(tcon);
4071 cifs_put_smb_ses(ses);
4073 cifs_put_tcp_session(server, 0);
4074 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
4078 /* Get connections for tcp, ses and tcon */
4079 static int mount_get_conns(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
4081 struct TCP_Server_Info **nserver,
4082 struct cifs_ses **nses, struct cifs_tcon **ntcon)
4085 struct TCP_Server_Info *server;
4086 struct cifs_ses *ses;
4087 struct cifs_tcon *tcon;
4095 /* get a reference to a tcp session */
4096 server = cifs_get_tcp_session(vol);
4097 if (IS_ERR(server)) {
4098 rc = PTR_ERR(server);
4104 /* get a reference to a SMB session */
4105 ses = cifs_get_smb_ses(server, vol);
4113 if ((vol->persistent == true) && (!(ses->server->capabilities &
4114 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES))) {
4115 cifs_server_dbg(VFS, "persistent handles not supported by server\n");
4119 /* search for existing tcon to this server share */
4120 tcon = cifs_get_tcon(ses, vol);
4128 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
4129 if (tcon->posix_extensions)
4130 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
4132 /* tell server which Unix caps we support */
4133 if (cap_unix(tcon->ses)) {
4135 * reset of caps checks mount to see if unix extensions disabled
4136 * for just this mount.
4138 reset_cifs_unix_caps(*xid, tcon, cifs_sb, vol);
4139 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
4140 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
4141 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP))
4144 tcon->unix_ext = 0; /* server does not support them */
4146 /* do not care if a following call succeed - informational */
4147 if (!tcon->pipe && server->ops->qfs_tcon) {
4148 server->ops->qfs_tcon(*xid, tcon, cifs_sb);
4149 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE) {
4150 if (tcon->fsDevInfo.DeviceCharacteristics &
4151 cpu_to_le32(FILE_READ_ONLY_DEVICE))
4152 cifs_dbg(VFS, "mounted to read only share\n");
4153 else if ((cifs_sb->mnt_cifs_flags &
4154 CIFS_MOUNT_RW_CACHE) == 0)
4155 cifs_dbg(VFS, "read only mount of RW share\n");
4156 /* no need to log a RW mount of a typical RW share */
4160 cifs_sb->wsize = server->ops->negotiate_wsize(tcon, vol);
4161 cifs_sb->rsize = server->ops->negotiate_rsize(tcon, vol);
4166 static int mount_setup_tlink(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
4167 struct cifs_tcon *tcon)
4169 struct tcon_link *tlink;
4171 /* hang the tcon off of the superblock */
4172 tlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4176 tlink->tl_uid = ses->linux_uid;
4177 tlink->tl_tcon = tcon;
4178 tlink->tl_time = jiffies;
4179 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
4180 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4182 cifs_sb->master_tlink = tlink;
4183 spin_lock(&cifs_sb->tlink_tree_lock);
4184 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4185 spin_unlock(&cifs_sb->tlink_tree_lock);
4187 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4192 #ifdef CONFIG_CIFS_DFS_UPCALL
4194 * cifs_build_path_to_root returns full path to root when we do not have an
4195 * exiting connection (tcon)
4198 build_unc_path_to_root(const struct smb_vol *vol,
4199 const struct cifs_sb_info *cifs_sb, bool useppath)
4201 char *full_path, *pos;
4202 unsigned int pplen = useppath && vol->prepath ?
4203 strlen(vol->prepath) + 1 : 0;
4204 unsigned int unc_len = strnlen(vol->UNC, MAX_TREE_SIZE + 1);
4206 if (unc_len > MAX_TREE_SIZE)
4207 return ERR_PTR(-EINVAL);
4209 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
4210 if (full_path == NULL)
4211 return ERR_PTR(-ENOMEM);
4213 memcpy(full_path, vol->UNC, unc_len);
4214 pos = full_path + unc_len;
4217 *pos = CIFS_DIR_SEP(cifs_sb);
4218 memcpy(pos + 1, vol->prepath, pplen);
4222 *pos = '\0'; /* add trailing null */
4223 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
4224 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
4229 * expand_dfs_referral - Perform a dfs referral query and update the cifs_sb
4232 * If a referral is found, cifs_sb->mountdata will be (re-)allocated
4233 * to a string containing updated options for the submount. Otherwise it
4234 * will be left untouched.
4236 * Returns the rc from get_dfs_path to the caller, which can be used to
4237 * determine whether there were referrals.
4240 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
4241 struct smb_vol *volume_info, struct cifs_sb_info *cifs_sb,
4245 struct dfs_info3_param referral = {0};
4246 char *full_path = NULL, *mdata = NULL;
4248 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4251 full_path = build_unc_path_to_root(volume_info, cifs_sb, true);
4252 if (IS_ERR(full_path))
4253 return PTR_ERR(full_path);
4255 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
4256 ref_path, &referral, NULL);
4258 char *fake_devname = NULL;
4260 mdata = cifs_compose_mount_options(cifs_sb->mountdata,
4261 full_path + 1, &referral,
4263 free_dfs_info_param(&referral);
4265 if (IS_ERR(mdata)) {
4266 rc = PTR_ERR(mdata);
4269 cifs_cleanup_volume_info_contents(volume_info);
4270 rc = cifs_setup_volume_info(volume_info, mdata,
4271 fake_devname, false);
4273 kfree(fake_devname);
4274 kfree(cifs_sb->mountdata);
4275 cifs_sb->mountdata = mdata;
4281 static inline int get_next_dfs_tgt(const char *path,
4282 struct dfs_cache_tgt_list *tgt_list,
4283 struct dfs_cache_tgt_iterator **tgt_it)
4286 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
4288 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
4289 return !*tgt_it ? -EHOSTDOWN : 0;
4292 static int update_vol_info(const struct dfs_cache_tgt_iterator *tgt_it,
4293 struct smb_vol *fake_vol, struct smb_vol *vol)
4295 const char *tgt = dfs_cache_get_tgt_name(tgt_it);
4296 int len = strlen(tgt) + 2;
4299 new_unc = kmalloc(len, GFP_KERNEL);
4302 scnprintf(new_unc, len, "\\%s", tgt);
4307 if (fake_vol->prepath) {
4308 kfree(vol->prepath);
4309 vol->prepath = fake_vol->prepath;
4310 fake_vol->prepath = NULL;
4312 memcpy(&vol->dstaddr, &fake_vol->dstaddr, sizeof(vol->dstaddr));
4317 static int setup_dfs_tgt_conn(const char *path, const char *full_path,
4318 const struct dfs_cache_tgt_iterator *tgt_it,
4319 struct cifs_sb_info *cifs_sb, struct smb_vol *vol, unsigned int *xid,
4320 struct TCP_Server_Info **server, struct cifs_ses **ses,
4321 struct cifs_tcon **tcon)
4324 struct dfs_info3_param ref = {0};
4325 char *mdata = NULL, *fake_devname = NULL;
4326 struct smb_vol fake_vol = {NULL};
4328 cifs_dbg(FYI, "%s: dfs path: %s\n", __func__, path);
4330 rc = dfs_cache_get_tgt_referral(path, tgt_it, &ref);
4334 mdata = cifs_compose_mount_options(cifs_sb->mountdata, full_path + 1, &ref, &fake_devname);
4335 free_dfs_info_param(&ref);
4337 if (IS_ERR(mdata)) {
4338 rc = PTR_ERR(mdata);
4341 cifs_dbg(FYI, "%s: fake_devname: %s\n", __func__, fake_devname);
4342 rc = cifs_setup_volume_info(&fake_vol, mdata, fake_devname,
4346 kfree(fake_devname);
4350 * We use a 'fake_vol' here because we need pass it down to the
4351 * mount_{get,put} functions to test connection against new DFS
4354 mount_put_conns(cifs_sb, *xid, *server, *ses, *tcon);
4355 rc = mount_get_conns(&fake_vol, cifs_sb, xid, server, ses,
4357 if (!rc || (*server && *ses)) {
4359 * We were able to connect to new target server.
4360 * Update current volume info with new target server.
4362 rc = update_vol_info(tgt_it, &fake_vol, vol);
4365 cifs_cleanup_volume_info_contents(&fake_vol);
4369 static int do_dfs_failover(const char *path, const char *full_path, struct cifs_sb_info *cifs_sb,
4370 struct smb_vol *vol, struct cifs_ses *root_ses, unsigned int *xid,
4371 struct TCP_Server_Info **server, struct cifs_ses **ses,
4372 struct cifs_tcon **tcon)
4375 struct dfs_cache_tgt_list tgt_list;
4376 struct dfs_cache_tgt_iterator *tgt_it = NULL;
4378 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
4381 rc = dfs_cache_noreq_find(path, NULL, &tgt_list);
4386 /* Get next DFS target server - if any */
4387 rc = get_next_dfs_tgt(path, &tgt_list, &tgt_it);
4390 /* Connect to next DFS target */
4391 rc = setup_dfs_tgt_conn(path, full_path, tgt_it, cifs_sb, vol, xid, server, ses,
4393 if (!rc || (*server && *ses))
4398 * Update DFS target hint in DFS referral cache with the target
4399 * server we successfully reconnected to.
4401 rc = dfs_cache_update_tgthint(*xid, root_ses ? root_ses : *ses,
4403 cifs_remap(cifs_sb), path,
4406 dfs_cache_free_tgts(&tgt_list);
4412 cifs_setup_volume_info(struct smb_vol *volume_info, char *mount_data,
4413 const char *devname, bool is_smb3)
4417 if (cifs_parse_mount_options(mount_data, devname, volume_info, is_smb3))
4420 if (volume_info->nullauth) {
4421 cifs_dbg(FYI, "Anonymous login\n");
4422 kfree(volume_info->username);
4423 volume_info->username = NULL;
4424 } else if (volume_info->username) {
4425 /* BB fixme parse for domain name here */
4426 cifs_dbg(FYI, "Username: %s\n", volume_info->username);
4428 cifs_dbg(VFS, "No username specified\n");
4429 /* In userspace mount helper we can get user name from alternate
4430 locations such as env variables and files on disk */
4434 /* this is needed for ASCII cp to Unicode converts */
4435 if (volume_info->iocharset == NULL) {
4436 /* load_nls_default cannot return null */
4437 volume_info->local_nls = load_nls_default();
4439 volume_info->local_nls = load_nls(volume_info->iocharset);
4440 if (volume_info->local_nls == NULL) {
4441 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
4442 volume_info->iocharset);
4451 cifs_get_volume_info(char *mount_data, const char *devname, bool is_smb3)
4454 struct smb_vol *volume_info;
4456 volume_info = kmalloc(sizeof(struct smb_vol), GFP_KERNEL);
4458 return ERR_PTR(-ENOMEM);
4460 rc = cifs_setup_volume_info(volume_info, mount_data, devname, is_smb3);
4462 cifs_cleanup_volume_info(volume_info);
4463 volume_info = ERR_PTR(rc);
4470 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
4472 struct cifs_tcon *tcon,
4473 struct cifs_sb_info *cifs_sb,
4480 int skip = added_treename ? 1 : 0;
4482 sep = CIFS_DIR_SEP(cifs_sb);
4485 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
4487 /* skip separators */
4492 /* next separator */
4493 while (*s && *s != sep)
4496 * if the treename is added, we then have to skip the first
4497 * part within the separators
4504 * temporarily null-terminate the path at the end of
4505 * the current component
4509 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4517 * Check if path is remote (e.g. a DFS share). Return -EREMOTE if it is,
4520 static int is_path_remote(struct cifs_sb_info *cifs_sb, struct smb_vol *vol,
4521 const unsigned int xid,
4522 struct TCP_Server_Info *server,
4523 struct cifs_tcon *tcon)
4528 if (!server->ops->is_path_accessible)
4532 * cifs_build_path_to_root works only when we have a valid tcon
4534 full_path = cifs_build_path_to_root(vol, cifs_sb, tcon,
4535 tcon->Flags & SMB_SHARE_IS_IN_DFS);
4536 if (full_path == NULL)
4539 cifs_dbg(FYI, "%s: full_path: %s\n", __func__, full_path);
4541 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
4543 if (rc != 0 && rc != -EREMOTE) {
4548 if (rc != -EREMOTE) {
4549 rc = cifs_are_all_path_components_accessible(server, xid, tcon,
4550 cifs_sb, full_path, tcon->Flags & SMB_SHARE_IS_IN_DFS);
4552 cifs_server_dbg(VFS, "cannot query dirs between root and final path, enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
4553 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
4562 #ifdef CONFIG_CIFS_DFS_UPCALL
4563 static void set_root_ses(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
4564 struct cifs_ses **root_ses)
4567 spin_lock(&cifs_tcp_ses_lock);
4570 ses->tcon_ipc->remap = cifs_remap(cifs_sb);
4571 spin_unlock(&cifs_tcp_ses_lock);
4576 static void put_root_ses(struct cifs_ses *ses)
4579 cifs_put_smb_ses(ses);
4582 /* Check if a path component is remote and then update @dfs_path accordingly */
4583 static int check_dfs_prepath(struct cifs_sb_info *cifs_sb, struct smb_vol *vol,
4584 const unsigned int xid, struct TCP_Server_Info *server,
4585 struct cifs_tcon *tcon, char **dfs_path)
4588 char sep = CIFS_DIR_SEP(cifs_sb), tmp;
4591 int added_treename = tcon->Flags & SMB_SHARE_IS_IN_DFS;
4592 int skip = added_treename;
4594 path = cifs_build_path_to_root(vol, cifs_sb, tcon, added_treename);
4599 * Walk through the path components in @path and check if they're accessible. In case any of
4600 * the components is -EREMOTE, then update @dfs_path with the next DFS referral request path
4601 * (NOT including the remaining components).
4605 /* skip separators */
4606 while (*s && *s == sep)
4610 /* next separator */
4611 while (*s && *s != sep)
4614 * if the treename is added, we then have to skip the first
4615 * part within the separators
4623 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, path);
4624 if (rc && rc == -EREMOTE) {
4625 struct smb_vol v = {NULL};
4626 /* if @path contains a tree name, skip it in the prefix path */
4627 if (added_treename) {
4628 rc = cifs_parse_devname(path, &v);
4632 npath = build_unc_path_to_root(&v, cifs_sb, true);
4633 cifs_cleanup_volume_info_contents(&v);
4636 v.prepath = path + 1;
4637 npath = build_unc_path_to_root(&v, cifs_sb, true);
4639 if (IS_ERR(npath)) {
4640 rc = PTR_ERR(npath);
4653 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4657 struct TCP_Server_Info *server = NULL;
4658 struct cifs_ses *ses = NULL, *root_ses = NULL;
4659 struct cifs_tcon *tcon = NULL;
4661 char *ref_path = NULL, *full_path = NULL;
4662 char *oldmnt = NULL;
4663 char *mntdata = NULL;
4665 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4667 * Unconditionally try to get an DFS referral (even cached) to determine whether it is an
4670 * Skip prefix path to provide support for DFS referrals from w2k8 servers which don't seem
4671 * to respond with PATH_NOT_COVERED to requests that include the prefix.
4673 if (dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb), vol->UNC + 1, NULL,
4675 /* No DFS referral was returned. Looks like a regular share. */
4678 /* Check if it is fully accessible and then mount it */
4679 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4685 /* Save mount options */
4686 mntdata = kstrndup(cifs_sb->mountdata, strlen(cifs_sb->mountdata), GFP_KERNEL);
4691 /* Get path of DFS root */
4692 ref_path = build_unc_path_to_root(vol, cifs_sb, false);
4693 if (IS_ERR(ref_path)) {
4694 rc = PTR_ERR(ref_path);
4699 set_root_ses(cifs_sb, ses, &root_ses);
4701 /* Save full path of last DFS path we used to resolve final target server */
4703 full_path = build_unc_path_to_root(vol, cifs_sb, !!count);
4704 if (IS_ERR(full_path)) {
4705 rc = PTR_ERR(full_path);
4709 /* Chase referral */
4710 oldmnt = cifs_sb->mountdata;
4711 rc = expand_dfs_referral(xid, root_ses, vol, cifs_sb, ref_path + 1);
4714 /* Connect to new DFS target only if we were redirected */
4715 if (oldmnt != cifs_sb->mountdata) {
4716 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4717 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4719 if (rc && !server && !ses) {
4720 /* Failed to connect. Try to connect to other targets in the referral. */
4721 rc = do_dfs_failover(ref_path + 1, full_path, cifs_sb, vol, root_ses, &xid,
4722 &server, &ses, &tcon);
4724 if (rc == -EACCES || rc == -EOPNOTSUPP || !server || !ses)
4728 /* Make sure that requests go through new root servers */
4729 if (is_tcon_dfs(tcon)) {
4730 put_root_ses(root_ses);
4731 set_root_ses(cifs_sb, ses, &root_ses);
4733 /* Check for remaining path components and then continue chasing them (-EREMOTE) */
4734 rc = check_dfs_prepath(cifs_sb, vol, xid, server, tcon, &ref_path);
4735 /* Prevent recursion on broken link referrals */
4736 if (rc == -EREMOTE && ++count > MAX_NESTED_LINKS)
4738 } while (rc == -EREMOTE);
4742 put_root_ses(root_ses);
4747 * Store DFS full path in both superblock and tree connect structures.
4749 * For DFS root mounts, the prefix path (cifs_sb->prepath) is preserved during reconnect so
4750 * only the root path is set in cifs_sb->origin_fullpath and tcon->dfs_path. And for DFS
4751 * links, the prefix path is included in both and may be changed during reconnect. See
4752 * cifs_tree_connect().
4754 cifs_sb->origin_fullpath = kstrndup(full_path, strlen(full_path), GFP_KERNEL);
4755 if (!cifs_sb->origin_fullpath) {
4759 spin_lock(&cifs_tcp_ses_lock);
4760 tcon->dfs_path = full_path;
4762 tcon->remap = cifs_remap(cifs_sb);
4763 spin_unlock(&cifs_tcp_ses_lock);
4765 /* Add original volume information for DFS cache to be used when refreshing referrals */
4766 rc = dfs_cache_add_vol(mntdata, vol, cifs_sb->origin_fullpath);
4770 * After reconnecting to a different server, unique ids won't
4771 * match anymore, so we disable serverino. This prevents
4772 * dentry revalidation to think the dentry are stale (ESTALE).
4774 cifs_autodisable_serverino(cifs_sb);
4776 * Force the use of prefix path to support failover on DFS paths that
4777 * resolve to targets that have different prefix paths.
4779 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
4780 kfree(cifs_sb->prepath);
4781 cifs_sb->prepath = vol->prepath;
4782 vol->prepath = NULL;
4786 cifs_try_adding_channels(ses);
4787 return mount_setup_tlink(cifs_sb, ses, tcon);
4793 kfree(cifs_sb->origin_fullpath);
4794 put_root_ses(root_ses);
4795 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4799 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *vol)
4803 struct cifs_ses *ses;
4804 struct cifs_tcon *tcon;
4805 struct TCP_Server_Info *server;
4807 rc = mount_get_conns(vol, cifs_sb, &xid, &server, &ses, &tcon);
4812 rc = is_path_remote(cifs_sb, vol, xid, server, tcon);
4821 return mount_setup_tlink(cifs_sb, ses, tcon);
4824 mount_put_conns(cifs_sb, xid, server, ses, tcon);
4830 * Issue a TREE_CONNECT request.
4833 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
4834 const char *tree, struct cifs_tcon *tcon,
4835 const struct nls_table *nls_codepage)
4837 struct smb_hdr *smb_buffer;
4838 struct smb_hdr *smb_buffer_response;
4841 unsigned char *bcc_ptr;
4844 __u16 bytes_left, count;
4849 smb_buffer = cifs_buf_get();
4850 if (smb_buffer == NULL)
4853 smb_buffer_response = smb_buffer;
4855 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
4856 NULL /*no tid */ , 4 /*wct */ );
4858 smb_buffer->Mid = get_next_mid(ses->server);
4859 smb_buffer->Uid = ses->Suid;
4860 pSMB = (TCONX_REQ *) smb_buffer;
4861 pSMBr = (TCONX_RSP *) smb_buffer_response;
4863 pSMB->AndXCommand = 0xFF;
4864 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
4865 bcc_ptr = &pSMB->Password[0];
4866 if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
4867 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
4868 *bcc_ptr = 0; /* password is null byte */
4869 bcc_ptr++; /* skip password */
4870 /* already aligned so no need to do it below */
4872 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
4873 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
4874 specified as required (when that support is added to
4875 the vfs in the future) as only NTLM or the much
4876 weaker LANMAN (which we do not send by default) is accepted
4877 by Samba (not sure whether other servers allow
4878 NTLMv2 password here) */
4879 #ifdef CONFIG_CIFS_WEAK_PW_HASH
4880 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
4881 (ses->sectype == LANMAN))
4882 calc_lanman_hash(tcon->password, ses->server->cryptkey,
4883 ses->server->sec_mode &
4884 SECMODE_PW_ENCRYPT ? true : false,
4887 #endif /* CIFS_WEAK_PW_HASH */
4888 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
4889 bcc_ptr, nls_codepage);
4891 cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
4893 cifs_buf_release(smb_buffer);
4897 bcc_ptr += CIFS_AUTH_RESP_SIZE;
4898 if (ses->capabilities & CAP_UNICODE) {
4899 /* must align unicode strings */
4900 *bcc_ptr = 0; /* null byte password */
4905 if (ses->server->sign)
4906 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
4908 if (ses->capabilities & CAP_STATUS32) {
4909 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
4911 if (ses->capabilities & CAP_DFS) {
4912 smb_buffer->Flags2 |= SMBFLG2_DFS;
4914 if (ses->capabilities & CAP_UNICODE) {
4915 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
4917 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
4918 6 /* max utf8 char length in bytes */ *
4919 (/* server len*/ + 256 /* share len */), nls_codepage);
4920 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
4921 bcc_ptr += 2; /* skip trailing null */
4922 } else { /* ASCII */
4923 strcpy(bcc_ptr, tree);
4924 bcc_ptr += strlen(tree) + 1;
4926 strcpy(bcc_ptr, "?????");
4927 bcc_ptr += strlen("?????");
4929 count = bcc_ptr - &pSMB->Password[0];
4930 be32_add_cpu(&pSMB->hdr.smb_buf_length, count);
4931 pSMB->ByteCount = cpu_to_le16(count);
4933 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
4936 /* above now done in SendReceive */
4940 tcon->tidStatus = CifsGood;
4941 tcon->need_reconnect = false;
4942 tcon->tid = smb_buffer_response->Tid;
4943 bcc_ptr = pByteArea(smb_buffer_response);
4944 bytes_left = get_bcc(smb_buffer_response);
4945 length = strnlen(bcc_ptr, bytes_left - 2);
4946 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
4952 /* skip service field (NB: this field is always ASCII) */
4954 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
4955 (bcc_ptr[2] == 'C')) {
4956 cifs_dbg(FYI, "IPC connection\n");
4960 } else if (length == 2) {
4961 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
4962 /* the most common case */
4963 cifs_dbg(FYI, "disk share connection\n");
4966 bcc_ptr += length + 1;
4967 bytes_left -= (length + 1);
4968 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
4970 /* mostly informational -- no need to fail on error here */
4971 kfree(tcon->nativeFileSystem);
4972 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
4973 bytes_left, is_unicode,
4976 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
4978 if ((smb_buffer_response->WordCount == 3) ||
4979 (smb_buffer_response->WordCount == 7))
4980 /* field is in same location */
4981 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
4984 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
4987 cifs_buf_release(smb_buffer);
4991 static void delayed_free(struct rcu_head *p)
4993 struct cifs_sb_info *sbi = container_of(p, struct cifs_sb_info, rcu);
4994 unload_nls(sbi->local_nls);
4999 cifs_umount(struct cifs_sb_info *cifs_sb)
5001 struct rb_root *root = &cifs_sb->tlink_tree;
5002 struct rb_node *node;
5003 struct tcon_link *tlink;
5005 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
5007 spin_lock(&cifs_sb->tlink_tree_lock);
5008 while ((node = rb_first(root))) {
5009 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
5010 cifs_get_tlink(tlink);
5011 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
5012 rb_erase(node, root);
5014 spin_unlock(&cifs_sb->tlink_tree_lock);
5015 cifs_put_tlink(tlink);
5016 spin_lock(&cifs_sb->tlink_tree_lock);
5018 spin_unlock(&cifs_sb->tlink_tree_lock);
5020 kfree(cifs_sb->mountdata);
5021 kfree(cifs_sb->prepath);
5022 #ifdef CONFIG_CIFS_DFS_UPCALL
5023 dfs_cache_del_vol(cifs_sb->origin_fullpath);
5024 kfree(cifs_sb->origin_fullpath);
5026 call_rcu(&cifs_sb->rcu, delayed_free);
5030 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
5033 struct TCP_Server_Info *server = cifs_ses_server(ses);
5035 if (!server->ops->need_neg || !server->ops->negotiate)
5038 /* only send once per connect */
5039 if (!server->ops->need_neg(server))
5042 rc = server->ops->negotiate(xid, ses);
5044 spin_lock(&GlobalMid_Lock);
5045 if (server->tcpStatus == CifsNeedNegotiate)
5046 server->tcpStatus = CifsGood;
5049 spin_unlock(&GlobalMid_Lock);
5056 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
5057 struct nls_table *nls_info)
5060 struct TCP_Server_Info *server = cifs_ses_server(ses);
5062 if (!ses->binding) {
5063 ses->capabilities = server->capabilities;
5064 if (linuxExtEnabled == 0)
5065 ses->capabilities &= (~server->vals->cap_unix);
5067 if (ses->auth_key.response) {
5068 cifs_dbg(FYI, "Free previous auth_key.response = %p\n",
5069 ses->auth_key.response);
5070 kfree(ses->auth_key.response);
5071 ses->auth_key.response = NULL;
5072 ses->auth_key.len = 0;
5076 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
5077 server->sec_mode, server->capabilities, server->timeAdj);
5079 if (server->ops->sess_setup)
5080 rc = server->ops->sess_setup(xid, ses, nls_info);
5083 cifs_server_dbg(VFS, "Send error in SessSetup = %d\n", rc);
5089 cifs_set_vol_auth(struct smb_vol *vol, struct cifs_ses *ses)
5091 vol->sectype = ses->sectype;
5093 /* krb5 is special, since we don't need username or pw */
5094 if (vol->sectype == Kerberos)
5097 return cifs_set_cifscreds(vol, ses);
5100 static struct cifs_tcon *
5101 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
5104 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
5105 struct cifs_ses *ses;
5106 struct cifs_tcon *tcon = NULL;
5107 struct smb_vol *vol_info;
5109 vol_info = kzalloc(sizeof(*vol_info), GFP_KERNEL);
5110 if (vol_info == NULL)
5111 return ERR_PTR(-ENOMEM);
5113 vol_info->local_nls = cifs_sb->local_nls;
5114 vol_info->linux_uid = fsuid;
5115 vol_info->cred_uid = fsuid;
5116 vol_info->UNC = master_tcon->treeName;
5117 vol_info->retry = master_tcon->retry;
5118 vol_info->nocase = master_tcon->nocase;
5119 vol_info->nohandlecache = master_tcon->nohandlecache;
5120 vol_info->local_lease = master_tcon->local_lease;
5121 vol_info->no_lease = master_tcon->no_lease;
5122 vol_info->resilient = master_tcon->use_resilient;
5123 vol_info->persistent = master_tcon->use_persistent;
5124 vol_info->handle_timeout = master_tcon->handle_timeout;
5125 vol_info->no_linux_ext = !master_tcon->unix_ext;
5126 vol_info->linux_ext = master_tcon->posix_extensions;
5127 vol_info->sectype = master_tcon->ses->sectype;
5128 vol_info->sign = master_tcon->ses->sign;
5129 vol_info->seal = master_tcon->seal;
5131 rc = cifs_set_vol_auth(vol_info, master_tcon->ses);
5137 /* get a reference for the same TCP session */
5138 spin_lock(&cifs_tcp_ses_lock);
5139 ++master_tcon->ses->server->srv_count;
5140 spin_unlock(&cifs_tcp_ses_lock);
5142 ses = cifs_get_smb_ses(master_tcon->ses->server, vol_info);
5144 tcon = (struct cifs_tcon *)ses;
5145 cifs_put_tcp_session(master_tcon->ses->server, 0);
5149 tcon = cifs_get_tcon(ses, vol_info);
5151 cifs_put_smb_ses(ses);
5156 reset_cifs_unix_caps(0, tcon, NULL, vol_info);
5159 kfree(vol_info->username);
5160 kfree_sensitive(vol_info->password);
5167 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
5169 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
5172 /* find and return a tlink with given uid */
5173 static struct tcon_link *
5174 tlink_rb_search(struct rb_root *root, kuid_t uid)
5176 struct rb_node *node = root->rb_node;
5177 struct tcon_link *tlink;
5180 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
5182 if (uid_gt(tlink->tl_uid, uid))
5183 node = node->rb_left;
5184 else if (uid_lt(tlink->tl_uid, uid))
5185 node = node->rb_right;
5192 /* insert a tcon_link into the tree */
5194 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
5196 struct rb_node **new = &(root->rb_node), *parent = NULL;
5197 struct tcon_link *tlink;
5200 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
5203 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
5204 new = &((*new)->rb_left);
5206 new = &((*new)->rb_right);
5209 rb_link_node(&new_tlink->tl_rbnode, parent, new);
5210 rb_insert_color(&new_tlink->tl_rbnode, root);
5214 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
5217 * If the superblock doesn't refer to a multiuser mount, then just return
5218 * the master tcon for the mount.
5220 * First, search the rbtree for an existing tcon for this fsuid. If one
5221 * exists, then check to see if it's pending construction. If it is then wait
5222 * for construction to complete. Once it's no longer pending, check to see if
5223 * it failed and either return an error or retry construction, depending on
5226 * If one doesn't exist then insert a new tcon_link struct into the tree and
5227 * try to construct a new one.
5230 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
5233 kuid_t fsuid = current_fsuid();
5234 struct tcon_link *tlink, *newtlink;
5236 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
5237 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
5239 spin_lock(&cifs_sb->tlink_tree_lock);
5240 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5242 cifs_get_tlink(tlink);
5243 spin_unlock(&cifs_sb->tlink_tree_lock);
5245 if (tlink == NULL) {
5246 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
5247 if (newtlink == NULL)
5248 return ERR_PTR(-ENOMEM);
5249 newtlink->tl_uid = fsuid;
5250 newtlink->tl_tcon = ERR_PTR(-EACCES);
5251 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
5252 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
5253 cifs_get_tlink(newtlink);
5255 spin_lock(&cifs_sb->tlink_tree_lock);
5256 /* was one inserted after previous search? */
5257 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
5259 cifs_get_tlink(tlink);
5260 spin_unlock(&cifs_sb->tlink_tree_lock);
5262 goto wait_for_construction;
5265 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
5266 spin_unlock(&cifs_sb->tlink_tree_lock);
5268 wait_for_construction:
5269 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
5270 TASK_INTERRUPTIBLE);
5272 cifs_put_tlink(tlink);
5273 return ERR_PTR(-ERESTARTSYS);
5276 /* if it's good, return it */
5277 if (!IS_ERR(tlink->tl_tcon))
5280 /* return error if we tried this already recently */
5281 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
5282 cifs_put_tlink(tlink);
5283 return ERR_PTR(-EACCES);
5286 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
5287 goto wait_for_construction;
5290 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
5291 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
5292 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
5294 if (IS_ERR(tlink->tl_tcon)) {
5295 cifs_put_tlink(tlink);
5296 return ERR_PTR(-EACCES);
5303 * periodic workqueue job that scans tcon_tree for a superblock and closes
5307 cifs_prune_tlinks(struct work_struct *work)
5309 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
5311 struct rb_root *root = &cifs_sb->tlink_tree;
5312 struct rb_node *node;
5313 struct rb_node *tmp;
5314 struct tcon_link *tlink;
5317 * Because we drop the spinlock in the loop in order to put the tlink
5318 * it's not guarded against removal of links from the tree. The only
5319 * places that remove entries from the tree are this function and
5320 * umounts. Because this function is non-reentrant and is canceled
5321 * before umount can proceed, this is safe.
5323 spin_lock(&cifs_sb->tlink_tree_lock);
5324 node = rb_first(root);
5325 while (node != NULL) {
5327 node = rb_next(tmp);
5328 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
5330 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
5331 atomic_read(&tlink->tl_count) != 0 ||
5332 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
5335 cifs_get_tlink(tlink);
5336 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
5337 rb_erase(tmp, root);
5339 spin_unlock(&cifs_sb->tlink_tree_lock);
5340 cifs_put_tlink(tlink);
5341 spin_lock(&cifs_sb->tlink_tree_lock);
5343 spin_unlock(&cifs_sb->tlink_tree_lock);
5345 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
5349 #ifdef CONFIG_CIFS_DFS_UPCALL
5350 int cifs_tree_connect(const unsigned int xid, struct cifs_tcon *tcon, const struct nls_table *nlsc)
5353 struct TCP_Server_Info *server = tcon->ses->server;
5354 const struct smb_version_operations *ops = server->ops;
5355 struct dfs_cache_tgt_list tl;
5356 struct dfs_cache_tgt_iterator *it = NULL;
5358 const char *tcp_host;
5359 size_t tcp_host_len;
5360 const char *dfs_host;
5361 size_t dfs_host_len;
5362 char *share = NULL, *prefix = NULL;
5363 struct dfs_info3_param ref = {0};
5366 tree = kzalloc(MAX_TREE_SIZE, GFP_KERNEL);
5370 /* If it is not dfs or there was no cached dfs referral, then reconnect to same share */
5371 if (!tcon->dfs_path || dfs_cache_noreq_find(tcon->dfs_path + 1, &ref, &tl)) {
5373 scnprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$", server->hostname);
5374 rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
5376 rc = ops->tree_connect(xid, tcon->ses, tcon->treeName, tcon, nlsc);
5381 isroot = ref.server_type == DFS_TYPE_ROOT;
5382 free_dfs_info_param(&ref);
5384 extract_unc_hostname(server->hostname, &tcp_host, &tcp_host_len);
5386 for (it = dfs_cache_get_tgt_iterator(&tl); it; it = dfs_cache_get_next_tgt(&tl, it)) {
5394 rc = dfs_cache_get_tgt_share(tcon->dfs_path + 1, it, &share, &prefix);
5396 cifs_dbg(VFS, "%s: failed to parse target share %d\n",
5401 extract_unc_hostname(share, &dfs_host, &dfs_host_len);
5403 if (dfs_host_len != tcp_host_len
5404 || strncasecmp(dfs_host, tcp_host, dfs_host_len) != 0) {
5405 cifs_dbg(FYI, "%s: %.*s doesn't match %.*s\n", __func__, (int)dfs_host_len,
5406 dfs_host, (int)tcp_host_len, tcp_host);
5408 rc = match_target_ip(server, dfs_host, dfs_host_len, &target_match);
5410 cifs_dbg(VFS, "%s: failed to match target ip: %d\n", __func__, rc);
5414 if (!target_match) {
5415 cifs_dbg(FYI, "%s: skipping target\n", __func__);
5421 scnprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$", share);
5422 rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
5424 scnprintf(tree, MAX_TREE_SIZE, "\\%s", share);
5425 rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
5426 /* Only handle prefix paths of DFS link targets */
5427 if (!rc && !isroot) {
5428 rc = update_super_prepath(tcon, prefix);
5441 rc = dfs_cache_noreq_update_tgthint(tcon->dfs_path + 1, it);
5445 dfs_cache_free_tgts(&tl);
5451 int cifs_tree_connect(const unsigned int xid, struct cifs_tcon *tcon, const struct nls_table *nlsc)
5453 const struct smb_version_operations *ops = tcon->ses->server->ops;
5455 return ops->tree_connect(xid, tcon->ses, tcon->treeName, tcon, nlsc);