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"
65 #ifdef CONFIG_CIFS_SWN_UPCALL
69 extern mempool_t *cifs_req_poolp;
70 extern bool disable_legacy_dialects;
72 /* FIXME: should these be tunable? */
73 #define TLINK_ERROR_EXPIRE (1 * HZ)
74 #define TLINK_IDLE_EXPIRE (600 * HZ)
76 /* Drop the connection to not overload the server */
77 #define NUM_STATUS_IO_TIMEOUT 5
79 static int ip_connect(struct TCP_Server_Info *server);
80 static int generic_ip_connect(struct TCP_Server_Info *server);
81 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
82 static void cifs_prune_tlinks(struct work_struct *work);
85 * Resolve hostname and set ip addr in tcp ses. Useful for hostnames that may
86 * get their ip addresses changed at some point.
88 * This should be called with server->srv_mutex held.
90 #ifdef CONFIG_CIFS_DFS_UPCALL
91 static int reconn_set_ipaddr_from_hostname(struct TCP_Server_Info *server)
95 char *unc, *ipaddr = NULL;
97 if (!server->hostname)
100 len = strlen(server->hostname) + 3;
102 unc = kmalloc(len, GFP_KERNEL);
104 cifs_dbg(FYI, "%s: failed to create UNC path\n", __func__);
107 scnprintf(unc, len, "\\\\%s", server->hostname);
109 rc = dns_resolve_server_name_to_ip(unc, &ipaddr);
113 cifs_dbg(FYI, "%s: failed to resolve server part of %s to IP: %d\n",
114 __func__, server->hostname, rc);
118 spin_lock(&cifs_tcp_ses_lock);
119 rc = cifs_convert_address((struct sockaddr *)&server->dstaddr, ipaddr,
121 spin_unlock(&cifs_tcp_ses_lock);
127 /* These functions must be called with server->srv_mutex held */
128 static void reconn_set_next_dfs_target(struct TCP_Server_Info *server,
129 struct cifs_sb_info *cifs_sb,
130 struct dfs_cache_tgt_list *tgt_list,
131 struct dfs_cache_tgt_iterator **tgt_it)
136 if (!cifs_sb || !cifs_sb->origin_fullpath)
140 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
142 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
144 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
147 cifs_dbg(FYI, "%s: UNC: %s\n", __func__, cifs_sb->origin_fullpath);
149 name = dfs_cache_get_tgt_name(*tgt_it);
151 kfree(server->hostname);
153 server->hostname = extract_hostname(name);
154 if (IS_ERR(server->hostname)) {
156 "%s: failed to extract hostname from target: %ld\n",
157 __func__, PTR_ERR(server->hostname));
161 rc = reconn_set_ipaddr_from_hostname(server);
163 cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
168 static inline int reconn_setup_dfs_targets(struct cifs_sb_info *cifs_sb,
169 struct dfs_cache_tgt_list *tl)
171 if (!cifs_sb->origin_fullpath)
173 return dfs_cache_noreq_find(cifs_sb->origin_fullpath + 1, NULL, tl);
178 * cifs tcp session reconnection
180 * mark tcp session as reconnecting so temporarily locked
181 * mark all smb sessions as reconnecting for tcp session
182 * reconnect tcp session
183 * wake up waiters on reconnection? - (not needed currently)
186 cifs_reconnect(struct TCP_Server_Info *server)
189 struct list_head *tmp, *tmp2;
190 struct cifs_ses *ses;
191 struct cifs_tcon *tcon;
192 struct mid_q_entry *mid_entry;
193 struct list_head retry_list;
194 #ifdef CONFIG_CIFS_DFS_UPCALL
195 struct super_block *sb = NULL;
196 struct cifs_sb_info *cifs_sb = NULL;
197 struct dfs_cache_tgt_list tgt_list = {0};
198 struct dfs_cache_tgt_iterator *tgt_it = NULL;
201 spin_lock(&GlobalMid_Lock);
202 server->nr_targets = 1;
203 #ifdef CONFIG_CIFS_DFS_UPCALL
204 spin_unlock(&GlobalMid_Lock);
205 sb = cifs_get_tcp_super(server);
208 cifs_dbg(FYI, "%s: will not do DFS failover: rc = %d\n",
212 cifs_sb = CIFS_SB(sb);
213 rc = reconn_setup_dfs_targets(cifs_sb, &tgt_list);
216 if (rc != -EOPNOTSUPP) {
217 cifs_server_dbg(VFS, "%s: no target servers for DFS failover\n",
221 server->nr_targets = dfs_cache_get_nr_tgts(&tgt_list);
224 cifs_dbg(FYI, "%s: will retry %d target(s)\n", __func__,
226 spin_lock(&GlobalMid_Lock);
228 if (server->tcpStatus == CifsExiting) {
229 /* the demux thread will exit normally
230 next time through the loop */
231 spin_unlock(&GlobalMid_Lock);
232 #ifdef CONFIG_CIFS_DFS_UPCALL
233 dfs_cache_free_tgts(&tgt_list);
234 cifs_put_tcp_super(sb);
236 wake_up(&server->response_q);
239 server->tcpStatus = CifsNeedReconnect;
240 spin_unlock(&GlobalMid_Lock);
242 server->max_read = 0;
244 cifs_dbg(FYI, "Mark tcp session as need reconnect\n");
245 trace_smb3_reconnect(server->CurrentMid, server->conn_id, server->hostname);
247 /* before reconnecting the tcp session, mark the smb session (uid)
248 and the tid bad so they are not used until reconnected */
249 cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
251 spin_lock(&cifs_tcp_ses_lock);
252 list_for_each(tmp, &server->smb_ses_list) {
253 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
254 ses->need_reconnect = true;
255 list_for_each(tmp2, &ses->tcon_list) {
256 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
257 tcon->need_reconnect = true;
260 ses->tcon_ipc->need_reconnect = true;
262 spin_unlock(&cifs_tcp_ses_lock);
264 /* do not want to be sending data on a socket we are freeing */
265 cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
266 mutex_lock(&server->srv_mutex);
267 if (server->ssocket) {
268 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
269 server->ssocket->state, server->ssocket->flags);
270 kernel_sock_shutdown(server->ssocket, SHUT_WR);
271 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
272 server->ssocket->state, server->ssocket->flags);
273 sock_release(server->ssocket);
274 server->ssocket = NULL;
276 server->sequence_number = 0;
277 server->session_estab = false;
278 kfree(server->session_key.response);
279 server->session_key.response = NULL;
280 server->session_key.len = 0;
281 server->lstrp = jiffies;
283 /* mark submitted MIDs for retry and issue callback */
284 INIT_LIST_HEAD(&retry_list);
285 cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
286 spin_lock(&GlobalMid_Lock);
287 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
288 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
289 kref_get(&mid_entry->refcount);
290 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
291 mid_entry->mid_state = MID_RETRY_NEEDED;
292 list_move(&mid_entry->qhead, &retry_list);
293 mid_entry->mid_flags |= MID_DELETED;
295 spin_unlock(&GlobalMid_Lock);
296 mutex_unlock(&server->srv_mutex);
298 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
299 list_for_each_safe(tmp, tmp2, &retry_list) {
300 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
301 list_del_init(&mid_entry->qhead);
302 mid_entry->callback(mid_entry);
303 cifs_mid_q_entry_release(mid_entry);
306 if (cifs_rdma_enabled(server)) {
307 mutex_lock(&server->srv_mutex);
308 smbd_destroy(server);
309 mutex_unlock(&server->srv_mutex);
315 mutex_lock(&server->srv_mutex);
317 #ifdef CONFIG_CIFS_SWN_UPCALL
318 if (server->use_swn_dstaddr) {
319 server->dstaddr = server->swn_dstaddr;
323 #ifdef CONFIG_CIFS_DFS_UPCALL
325 * Set up next DFS target server (if any) for reconnect. If DFS
326 * feature is disabled, then we will retry last server we
327 * connected to before.
329 reconn_set_next_dfs_target(server, cifs_sb, &tgt_list, &tgt_it);
332 #ifdef CONFIG_CIFS_SWN_UPCALL
336 if (cifs_rdma_enabled(server))
337 rc = smbd_reconnect(server);
339 rc = generic_ip_connect(server);
341 cifs_dbg(FYI, "reconnect error %d\n", rc);
342 mutex_unlock(&server->srv_mutex);
345 atomic_inc(&tcpSesReconnectCount);
346 set_credits(server, 1);
347 spin_lock(&GlobalMid_Lock);
348 if (server->tcpStatus != CifsExiting)
349 server->tcpStatus = CifsNeedNegotiate;
350 spin_unlock(&GlobalMid_Lock);
351 #ifdef CONFIG_CIFS_SWN_UPCALL
352 server->use_swn_dstaddr = false;
354 mutex_unlock(&server->srv_mutex);
356 } while (server->tcpStatus == CifsNeedReconnect);
358 #ifdef CONFIG_CIFS_DFS_UPCALL
360 rc = dfs_cache_noreq_update_tgthint(cifs_sb->origin_fullpath + 1,
363 cifs_server_dbg(VFS, "%s: failed to update DFS target hint: rc = %d\n",
366 rc = dfs_cache_update_vol(cifs_sb->origin_fullpath, server);
368 cifs_server_dbg(VFS, "%s: failed to update vol info in DFS cache: rc = %d\n",
371 dfs_cache_free_tgts(&tgt_list);
375 cifs_put_tcp_super(sb);
377 if (server->tcpStatus == CifsNeedNegotiate)
378 mod_delayed_work(cifsiod_wq, &server->echo, 0);
380 wake_up(&server->response_q);
385 cifs_echo_request(struct work_struct *work)
388 struct TCP_Server_Info *server = container_of(work,
389 struct TCP_Server_Info, echo.work);
390 unsigned long echo_interval;
393 * If we need to renegotiate, set echo interval to zero to
394 * immediately call echo service where we can renegotiate.
396 if (server->tcpStatus == CifsNeedNegotiate)
399 echo_interval = server->echo_interval;
402 * We cannot send an echo if it is disabled.
403 * Also, no need to ping if we got a response recently.
406 if (server->tcpStatus == CifsNeedReconnect ||
407 server->tcpStatus == CifsExiting ||
408 server->tcpStatus == CifsNew ||
409 (server->ops->can_echo && !server->ops->can_echo(server)) ||
410 time_before(jiffies, server->lstrp + echo_interval - HZ))
413 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
415 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
418 #ifdef CONFIG_CIFS_SWN_UPCALL
419 /* Check witness registrations */
424 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
428 allocate_buffers(struct TCP_Server_Info *server)
430 if (!server->bigbuf) {
431 server->bigbuf = (char *)cifs_buf_get();
432 if (!server->bigbuf) {
433 cifs_server_dbg(VFS, "No memory for large SMB response\n");
435 /* retry will check if exiting */
438 } else if (server->large_buf) {
439 /* we are reusing a dirty large buf, clear its start */
440 memset(server->bigbuf, 0, HEADER_SIZE(server));
443 if (!server->smallbuf) {
444 server->smallbuf = (char *)cifs_small_buf_get();
445 if (!server->smallbuf) {
446 cifs_server_dbg(VFS, "No memory for SMB response\n");
448 /* retry will check if exiting */
451 /* beginning of smb buffer is cleared in our buf_get */
453 /* if existing small buf clear beginning */
454 memset(server->smallbuf, 0, HEADER_SIZE(server));
461 server_unresponsive(struct TCP_Server_Info *server)
464 * We need to wait 3 echo intervals to make sure we handle such
466 * 1s client sends a normal SMB request
467 * 2s client gets a response
468 * 30s echo workqueue job pops, and decides we got a response recently
469 * and don't need to send another
471 * 65s kernel_recvmsg times out, and we see that we haven't gotten
472 * a response in >60s.
474 if ((server->tcpStatus == CifsGood ||
475 server->tcpStatus == CifsNeedNegotiate) &&
476 time_after(jiffies, server->lstrp + 3 * server->echo_interval)) {
477 cifs_server_dbg(VFS, "has not responded in %lu seconds. Reconnecting...\n",
478 (3 * server->echo_interval) / HZ);
479 cifs_reconnect(server);
487 zero_credits(struct TCP_Server_Info *server)
491 spin_lock(&server->req_lock);
492 val = server->credits + server->echo_credits + server->oplock_credits;
493 if (server->in_flight == 0 && val == 0) {
494 spin_unlock(&server->req_lock);
497 spin_unlock(&server->req_lock);
502 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
507 smb_msg->msg_control = NULL;
508 smb_msg->msg_controllen = 0;
510 for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
513 /* reconnect if no credits and no requests in flight */
514 if (zero_credits(server)) {
515 cifs_reconnect(server);
516 return -ECONNABORTED;
519 if (server_unresponsive(server))
520 return -ECONNABORTED;
521 if (cifs_rdma_enabled(server) && server->smbd_conn)
522 length = smbd_recv(server->smbd_conn, smb_msg);
524 length = sock_recvmsg(server->ssocket, smb_msg, 0);
526 if (server->tcpStatus == CifsExiting)
529 if (server->tcpStatus == CifsNeedReconnect) {
530 cifs_reconnect(server);
531 return -ECONNABORTED;
534 if (length == -ERESTARTSYS ||
538 * Minimum sleep to prevent looping, allowing socket
539 * to clear and app threads to set tcpStatus
540 * CifsNeedReconnect if server hung.
542 usleep_range(1000, 2000);
548 cifs_dbg(FYI, "Received no data or error: %d\n", length);
549 cifs_reconnect(server);
550 return -ECONNABORTED;
557 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
558 unsigned int to_read)
560 struct msghdr smb_msg;
561 struct kvec iov = {.iov_base = buf, .iov_len = to_read};
562 iov_iter_kvec(&smb_msg.msg_iter, READ, &iov, 1, to_read);
564 return cifs_readv_from_socket(server, &smb_msg);
568 cifs_discard_from_socket(struct TCP_Server_Info *server, size_t to_read)
570 struct msghdr smb_msg;
573 * iov_iter_discard already sets smb_msg.type and count and iov_offset
574 * and cifs_readv_from_socket sets msg_control and msg_controllen
575 * so little to initialize in struct msghdr
577 smb_msg.msg_name = NULL;
578 smb_msg.msg_namelen = 0;
579 iov_iter_discard(&smb_msg.msg_iter, READ, to_read);
581 return cifs_readv_from_socket(server, &smb_msg);
585 cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
586 unsigned int page_offset, unsigned int to_read)
588 struct msghdr smb_msg;
589 struct bio_vec bv = {
590 .bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
591 iov_iter_bvec(&smb_msg.msg_iter, READ, &bv, 1, to_read);
592 return cifs_readv_from_socket(server, &smb_msg);
596 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
599 * The first byte big endian of the length field,
600 * is actually not part of the length but the type
601 * with the most common, zero, as regular data.
604 case RFC1002_SESSION_MESSAGE:
605 /* Regular SMB response */
607 case RFC1002_SESSION_KEEP_ALIVE:
608 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
610 case RFC1002_POSITIVE_SESSION_RESPONSE:
611 cifs_dbg(FYI, "RFC 1002 positive session response\n");
613 case RFC1002_NEGATIVE_SESSION_RESPONSE:
615 * We get this from Windows 98 instead of an error on
616 * SMB negprot response.
618 cifs_dbg(FYI, "RFC 1002 negative session response\n");
619 /* give server a second to clean up */
622 * Always try 445 first on reconnect since we get NACK
623 * on some if we ever connected to port 139 (the NACK
624 * is since we do not begin with RFC1001 session
627 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
628 cifs_reconnect(server);
631 cifs_server_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
632 cifs_reconnect(server);
639 dequeue_mid(struct mid_q_entry *mid, bool malformed)
641 #ifdef CONFIG_CIFS_STATS2
642 mid->when_received = jiffies;
644 spin_lock(&GlobalMid_Lock);
646 mid->mid_state = MID_RESPONSE_RECEIVED;
648 mid->mid_state = MID_RESPONSE_MALFORMED;
650 * Trying to handle/dequeue a mid after the send_recv()
651 * function has finished processing it is a bug.
653 if (mid->mid_flags & MID_DELETED)
654 pr_warn_once("trying to dequeue a deleted mid\n");
656 list_del_init(&mid->qhead);
657 mid->mid_flags |= MID_DELETED;
659 spin_unlock(&GlobalMid_Lock);
663 smb2_get_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
665 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
668 * SMB1 does not use credits.
670 if (server->vals->header_preamble_size)
673 return le16_to_cpu(shdr->CreditRequest);
677 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
678 char *buf, int malformed)
680 if (server->ops->check_trans2 &&
681 server->ops->check_trans2(mid, server, buf, malformed))
683 mid->credits_received = smb2_get_credits_from_hdr(buf, server);
685 mid->large_buf = server->large_buf;
686 /* Was previous buf put in mpx struct for multi-rsp? */
687 if (!mid->multiRsp) {
688 /* smb buffer will be freed by user thread */
689 if (server->large_buf)
690 server->bigbuf = NULL;
692 server->smallbuf = NULL;
694 dequeue_mid(mid, malformed);
697 static void clean_demultiplex_info(struct TCP_Server_Info *server)
701 /* take it off the list, if it's not already */
702 spin_lock(&cifs_tcp_ses_lock);
703 list_del_init(&server->tcp_ses_list);
704 spin_unlock(&cifs_tcp_ses_lock);
706 cancel_delayed_work_sync(&server->echo);
708 spin_lock(&GlobalMid_Lock);
709 server->tcpStatus = CifsExiting;
710 spin_unlock(&GlobalMid_Lock);
711 wake_up_all(&server->response_q);
713 /* check if we have blocked requests that need to free */
714 spin_lock(&server->req_lock);
715 if (server->credits <= 0)
717 spin_unlock(&server->req_lock);
719 * Although there should not be any requests blocked on this queue it
720 * can not hurt to be paranoid and try to wake up requests that may
721 * haven been blocked when more than 50 at time were on the wire to the
722 * same server - they now will see the session is in exit state and get
723 * out of SendReceive.
725 wake_up_all(&server->request_q);
726 /* give those requests time to exit */
728 if (cifs_rdma_enabled(server))
729 smbd_destroy(server);
730 if (server->ssocket) {
731 sock_release(server->ssocket);
732 server->ssocket = NULL;
735 if (!list_empty(&server->pending_mid_q)) {
736 struct list_head dispose_list;
737 struct mid_q_entry *mid_entry;
738 struct list_head *tmp, *tmp2;
740 INIT_LIST_HEAD(&dispose_list);
741 spin_lock(&GlobalMid_Lock);
742 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
743 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
744 cifs_dbg(FYI, "Clearing mid %llu\n", mid_entry->mid);
745 kref_get(&mid_entry->refcount);
746 mid_entry->mid_state = MID_SHUTDOWN;
747 list_move(&mid_entry->qhead, &dispose_list);
748 mid_entry->mid_flags |= MID_DELETED;
750 spin_unlock(&GlobalMid_Lock);
752 /* now walk dispose list and issue callbacks */
753 list_for_each_safe(tmp, tmp2, &dispose_list) {
754 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
755 cifs_dbg(FYI, "Callback mid %llu\n", mid_entry->mid);
756 list_del_init(&mid_entry->qhead);
757 mid_entry->callback(mid_entry);
758 cifs_mid_q_entry_release(mid_entry);
760 /* 1/8th of sec is more than enough time for them to exit */
764 if (!list_empty(&server->pending_mid_q)) {
766 * mpx threads have not exited yet give them at least the smb
767 * send timeout time for long ops.
769 * Due to delays on oplock break requests, we need to wait at
770 * least 45 seconds before giving up on a request getting a
771 * response and going ahead and killing cifsd.
773 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
776 * If threads still have not exited they are probably never
777 * coming home not much else we can do but free the memory.
781 kfree(server->hostname);
784 length = atomic_dec_return(&tcpSesAllocCount);
786 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
790 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
793 char *buf = server->smallbuf;
794 unsigned int pdu_length = server->pdu_size;
796 /* make sure this will fit in a large buffer */
797 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
798 server->vals->header_preamble_size) {
799 cifs_server_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
800 cifs_reconnect(server);
801 return -ECONNABORTED;
804 /* switch to large buffer if too big for a small one */
805 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
806 server->large_buf = true;
807 memcpy(server->bigbuf, buf, server->total_read);
808 buf = server->bigbuf;
811 /* now read the rest */
812 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
813 pdu_length - HEADER_SIZE(server) + 1
814 + server->vals->header_preamble_size);
818 server->total_read += length;
820 dump_smb(buf, server->total_read);
822 return cifs_handle_standard(server, mid);
826 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
828 char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
832 * We know that we received enough to get to the MID as we
833 * checked the pdu_length earlier. Now check to see
834 * if the rest of the header is OK. We borrow the length
835 * var for the rest of the loop to avoid a new stack var.
837 * 48 bytes is enough to display the header and a little bit
838 * into the payload for debugging purposes.
840 length = server->ops->check_message(buf, server->total_read, server);
842 cifs_dump_mem("Bad SMB: ", buf,
843 min_t(unsigned int, server->total_read, 48));
845 if (server->ops->is_session_expired &&
846 server->ops->is_session_expired(buf)) {
847 cifs_reconnect(server);
851 if (server->ops->is_status_pending &&
852 server->ops->is_status_pending(buf, server))
858 handle_mid(mid, server, buf, length);
863 smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
865 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
866 int scredits, in_flight;
869 * SMB1 does not use credits.
871 if (server->vals->header_preamble_size)
874 if (shdr->CreditRequest) {
875 spin_lock(&server->req_lock);
876 server->credits += le16_to_cpu(shdr->CreditRequest);
877 scredits = server->credits;
878 in_flight = server->in_flight;
879 spin_unlock(&server->req_lock);
880 wake_up(&server->request_q);
882 trace_smb3_add_credits(server->CurrentMid,
883 server->conn_id, server->hostname, scredits,
884 le16_to_cpu(shdr->CreditRequest), in_flight);
885 cifs_server_dbg(FYI, "%s: added %u credits total=%d\n",
886 __func__, le16_to_cpu(shdr->CreditRequest),
893 cifs_demultiplex_thread(void *p)
895 int i, num_mids, length;
896 struct TCP_Server_Info *server = p;
897 unsigned int pdu_length;
898 unsigned int next_offset;
900 struct task_struct *task_to_wake = NULL;
901 struct mid_q_entry *mids[MAX_COMPOUND];
902 char *bufs[MAX_COMPOUND];
903 unsigned int noreclaim_flag, num_io_timeout = 0;
905 noreclaim_flag = memalloc_noreclaim_save();
906 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
908 length = atomic_inc_return(&tcpSesAllocCount);
910 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
913 allow_kernel_signal(SIGKILL);
914 while (server->tcpStatus != CifsExiting) {
918 if (!allocate_buffers(server))
921 server->large_buf = false;
922 buf = server->smallbuf;
923 pdu_length = 4; /* enough to get RFC1001 header */
925 length = cifs_read_from_socket(server, buf, pdu_length);
929 if (server->vals->header_preamble_size == 0)
930 server->total_read = 0;
932 server->total_read = length;
935 * The right amount was read from socket - 4 bytes,
936 * so we can now interpret the length field.
938 pdu_length = get_rfc1002_length(buf);
940 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
941 if (!is_smb_response(server, buf[0]))
944 server->pdu_size = pdu_length;
946 /* make sure we have enough to get to the MID */
947 if (server->pdu_size < HEADER_SIZE(server) - 1 -
948 server->vals->header_preamble_size) {
949 cifs_server_dbg(VFS, "SMB response too short (%u bytes)\n",
951 cifs_reconnect(server);
955 /* read down to the MID */
956 length = cifs_read_from_socket(server,
957 buf + server->vals->header_preamble_size,
958 HEADER_SIZE(server) - 1
959 - server->vals->header_preamble_size);
962 server->total_read += length;
964 if (server->ops->next_header) {
965 next_offset = server->ops->next_header(buf);
967 server->pdu_size = next_offset;
970 memset(mids, 0, sizeof(mids));
971 memset(bufs, 0, sizeof(bufs));
974 if (server->ops->is_transform_hdr &&
975 server->ops->receive_transform &&
976 server->ops->is_transform_hdr(buf)) {
977 length = server->ops->receive_transform(server,
982 mids[0] = server->ops->find_mid(server, buf);
986 if (!mids[0] || !mids[0]->receive)
987 length = standard_receive3(server, mids[0]);
989 length = mids[0]->receive(server, mids[0]);
993 for (i = 0; i < num_mids; i++)
995 cifs_mid_q_entry_release(mids[i]);
999 if (server->ops->is_status_io_timeout &&
1000 server->ops->is_status_io_timeout(buf)) {
1002 if (num_io_timeout > NUM_STATUS_IO_TIMEOUT) {
1003 cifs_reconnect(server);
1009 server->lstrp = jiffies;
1011 for (i = 0; i < num_mids; i++) {
1012 if (mids[i] != NULL) {
1013 mids[i]->resp_buf_size = server->pdu_size;
1015 if (bufs[i] && server->ops->is_network_name_deleted)
1016 server->ops->is_network_name_deleted(bufs[i],
1019 if (!mids[i]->multiRsp || mids[i]->multiEnd)
1020 mids[i]->callback(mids[i]);
1022 cifs_mid_q_entry_release(mids[i]);
1023 } else if (server->ops->is_oplock_break &&
1024 server->ops->is_oplock_break(bufs[i],
1026 smb2_add_credits_from_hdr(bufs[i], server);
1027 cifs_dbg(FYI, "Received oplock break\n");
1029 cifs_server_dbg(VFS, "No task to wake, unknown frame received! NumMids %d\n",
1030 atomic_read(&midCount));
1031 cifs_dump_mem("Received Data is: ", bufs[i],
1032 HEADER_SIZE(server));
1033 smb2_add_credits_from_hdr(bufs[i], server);
1034 #ifdef CONFIG_CIFS_DEBUG2
1035 if (server->ops->dump_detail)
1036 server->ops->dump_detail(bufs[i],
1038 cifs_dump_mids(server);
1039 #endif /* CIFS_DEBUG2 */
1043 if (pdu_length > server->pdu_size) {
1044 if (!allocate_buffers(server))
1046 pdu_length -= server->pdu_size;
1047 server->total_read = 0;
1048 server->large_buf = false;
1049 buf = server->smallbuf;
1052 } /* end while !EXITING */
1054 /* buffer usually freed in free_mid - need to free it here on exit */
1055 cifs_buf_release(server->bigbuf);
1056 if (server->smallbuf) /* no sense logging a debug message if NULL */
1057 cifs_small_buf_release(server->smallbuf);
1059 task_to_wake = xchg(&server->tsk, NULL);
1060 clean_demultiplex_info(server);
1062 /* if server->tsk was NULL then wait for a signal before exiting */
1063 if (!task_to_wake) {
1064 set_current_state(TASK_INTERRUPTIBLE);
1065 while (!signal_pending(current)) {
1067 set_current_state(TASK_INTERRUPTIBLE);
1069 set_current_state(TASK_RUNNING);
1072 memalloc_noreclaim_restore(noreclaim_flag);
1073 module_put_and_exit(0);
1077 * Returns true if srcaddr isn't specified and rhs isn't specified, or
1078 * if srcaddr is specified and matches the IP address of the rhs argument
1081 cifs_match_ipaddr(struct sockaddr *srcaddr, struct sockaddr *rhs)
1083 switch (srcaddr->sa_family) {
1085 return (rhs->sa_family == AF_UNSPEC);
1087 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
1088 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
1089 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
1092 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
1093 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
1094 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
1098 return false; /* don't expect to be here */
1103 * If no port is specified in addr structure, we try to match with 445 port
1104 * and if it fails - with 139 ports. It should be called only if address
1105 * families of server and addr are equal.
1108 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
1110 __be16 port, *sport;
1112 /* SMBDirect manages its own ports, don't match it here */
1116 switch (addr->sa_family) {
1118 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
1119 port = ((struct sockaddr_in *) addr)->sin_port;
1122 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
1123 port = ((struct sockaddr_in6 *) addr)->sin6_port;
1131 port = htons(CIFS_PORT);
1135 port = htons(RFC1001_PORT);
1138 return port == *sport;
1142 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
1143 struct sockaddr *srcaddr)
1145 switch (addr->sa_family) {
1147 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
1148 struct sockaddr_in *srv_addr4 =
1149 (struct sockaddr_in *)&server->dstaddr;
1151 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
1156 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
1157 struct sockaddr_in6 *srv_addr6 =
1158 (struct sockaddr_in6 *)&server->dstaddr;
1160 if (!ipv6_addr_equal(&addr6->sin6_addr,
1161 &srv_addr6->sin6_addr))
1163 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
1169 return false; /* don't expect to be here */
1172 if (!cifs_match_ipaddr(srcaddr, (struct sockaddr *)&server->srcaddr))
1179 match_security(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1182 * The select_sectype function should either return the ctx->sectype
1183 * that was specified, or "Unspecified" if that sectype was not
1184 * compatible with the given NEGOTIATE request.
1186 if (server->ops->select_sectype(server, ctx->sectype)
1191 * Now check if signing mode is acceptable. No need to check
1192 * global_secflags at this point since if MUST_SIGN is set then
1193 * the server->sign had better be too.
1195 if (ctx->sign && !server->sign)
1201 static int match_server(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1203 struct sockaddr *addr = (struct sockaddr *)&ctx->dstaddr;
1205 if (ctx->nosharesock)
1208 /* If multidialect negotiation see if existing sessions match one */
1209 if (strcmp(ctx->vals->version_string, SMB3ANY_VERSION_STRING) == 0) {
1210 if (server->vals->protocol_id < SMB30_PROT_ID)
1212 } else if (strcmp(ctx->vals->version_string,
1213 SMBDEFAULT_VERSION_STRING) == 0) {
1214 if (server->vals->protocol_id < SMB21_PROT_ID)
1216 } else if ((server->vals != ctx->vals) || (server->ops != ctx->ops))
1219 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
1222 if (!match_address(server, addr,
1223 (struct sockaddr *)&ctx->srcaddr))
1226 if (!match_port(server, addr))
1229 if (!match_security(server, ctx))
1232 if (server->echo_interval != ctx->echo_interval * HZ)
1235 if (server->rdma != ctx->rdma)
1238 if (server->ignore_signature != ctx->ignore_signature)
1241 if (server->min_offload != ctx->min_offload)
1247 struct TCP_Server_Info *
1248 cifs_find_tcp_session(struct smb3_fs_context *ctx)
1250 struct TCP_Server_Info *server;
1252 spin_lock(&cifs_tcp_ses_lock);
1253 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
1255 * Skip ses channels since they're only handled in lower layers
1256 * (e.g. cifs_send_recv).
1258 if (server->is_channel || !match_server(server, ctx))
1261 ++server->srv_count;
1262 spin_unlock(&cifs_tcp_ses_lock);
1263 cifs_dbg(FYI, "Existing tcp session with server found\n");
1266 spin_unlock(&cifs_tcp_ses_lock);
1271 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
1273 struct task_struct *task;
1275 spin_lock(&cifs_tcp_ses_lock);
1276 if (--server->srv_count > 0) {
1277 spin_unlock(&cifs_tcp_ses_lock);
1281 put_net(cifs_net_ns(server));
1283 list_del_init(&server->tcp_ses_list);
1284 spin_unlock(&cifs_tcp_ses_lock);
1286 cancel_delayed_work_sync(&server->echo);
1290 * Avoid deadlock here: reconnect work calls
1291 * cifs_put_tcp_session() at its end. Need to be sure
1292 * that reconnect work does nothing with server pointer after
1295 cancel_delayed_work(&server->reconnect);
1297 cancel_delayed_work_sync(&server->reconnect);
1299 spin_lock(&GlobalMid_Lock);
1300 server->tcpStatus = CifsExiting;
1301 spin_unlock(&GlobalMid_Lock);
1303 cifs_crypto_secmech_release(server);
1304 cifs_fscache_release_client_cookie(server);
1306 kfree(server->session_key.response);
1307 server->session_key.response = NULL;
1308 server->session_key.len = 0;
1310 task = xchg(&server->tsk, NULL);
1312 send_sig(SIGKILL, task, 1);
1315 struct TCP_Server_Info *
1316 cifs_get_tcp_session(struct smb3_fs_context *ctx)
1318 struct TCP_Server_Info *tcp_ses = NULL;
1321 cifs_dbg(FYI, "UNC: %s\n", ctx->UNC);
1323 /* see if we already have a matching tcp_ses */
1324 tcp_ses = cifs_find_tcp_session(ctx);
1328 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
1334 tcp_ses->ops = ctx->ops;
1335 tcp_ses->vals = ctx->vals;
1336 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
1337 tcp_ses->hostname = extract_hostname(ctx->UNC);
1338 if (IS_ERR(tcp_ses->hostname)) {
1339 rc = PTR_ERR(tcp_ses->hostname);
1340 goto out_err_crypto_release;
1343 tcp_ses->conn_id = atomic_inc_return(&tcpSesNextId);
1344 tcp_ses->noblockcnt = ctx->rootfs;
1345 tcp_ses->noblocksnd = ctx->noblocksnd || ctx->rootfs;
1346 tcp_ses->noautotune = ctx->noautotune;
1347 tcp_ses->tcp_nodelay = ctx->sockopt_tcp_nodelay;
1348 tcp_ses->rdma = ctx->rdma;
1349 tcp_ses->in_flight = 0;
1350 tcp_ses->max_in_flight = 0;
1351 tcp_ses->credits = 1;
1352 init_waitqueue_head(&tcp_ses->response_q);
1353 init_waitqueue_head(&tcp_ses->request_q);
1354 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
1355 mutex_init(&tcp_ses->srv_mutex);
1356 memcpy(tcp_ses->workstation_RFC1001_name,
1357 ctx->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
1358 memcpy(tcp_ses->server_RFC1001_name,
1359 ctx->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
1360 tcp_ses->session_estab = false;
1361 tcp_ses->sequence_number = 0;
1362 tcp_ses->reconnect_instance = 1;
1363 tcp_ses->lstrp = jiffies;
1364 tcp_ses->compress_algorithm = cpu_to_le16(ctx->compression);
1365 spin_lock_init(&tcp_ses->req_lock);
1366 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
1367 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
1368 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
1369 INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
1370 mutex_init(&tcp_ses->reconnect_mutex);
1371 memcpy(&tcp_ses->srcaddr, &ctx->srcaddr,
1372 sizeof(tcp_ses->srcaddr));
1373 memcpy(&tcp_ses->dstaddr, &ctx->dstaddr,
1374 sizeof(tcp_ses->dstaddr));
1375 if (ctx->use_client_guid)
1376 memcpy(tcp_ses->client_guid, ctx->client_guid,
1377 SMB2_CLIENT_GUID_SIZE);
1379 generate_random_uuid(tcp_ses->client_guid);
1381 * at this point we are the only ones with the pointer
1382 * to the struct since the kernel thread not created yet
1383 * no need to spinlock this init of tcpStatus or srv_count
1385 tcp_ses->tcpStatus = CifsNew;
1386 ++tcp_ses->srv_count;
1388 if (ctx->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
1389 ctx->echo_interval <= SMB_ECHO_INTERVAL_MAX)
1390 tcp_ses->echo_interval = ctx->echo_interval * HZ;
1392 tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
1393 if (tcp_ses->rdma) {
1394 #ifndef CONFIG_CIFS_SMB_DIRECT
1395 cifs_dbg(VFS, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
1397 goto out_err_crypto_release;
1399 tcp_ses->smbd_conn = smbd_get_connection(
1400 tcp_ses, (struct sockaddr *)&ctx->dstaddr);
1401 if (tcp_ses->smbd_conn) {
1402 cifs_dbg(VFS, "RDMA transport established\n");
1404 goto smbd_connected;
1407 goto out_err_crypto_release;
1410 rc = ip_connect(tcp_ses);
1412 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
1413 goto out_err_crypto_release;
1417 * since we're in a cifs function already, we know that
1418 * this will succeed. No need for try_module_get().
1420 __module_get(THIS_MODULE);
1421 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
1423 if (IS_ERR(tcp_ses->tsk)) {
1424 rc = PTR_ERR(tcp_ses->tsk);
1425 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
1426 module_put(THIS_MODULE);
1427 goto out_err_crypto_release;
1429 tcp_ses->min_offload = ctx->min_offload;
1430 tcp_ses->tcpStatus = CifsNeedNegotiate;
1432 if ((ctx->max_credits < 20) || (ctx->max_credits > 60000))
1433 tcp_ses->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
1435 tcp_ses->max_credits = ctx->max_credits;
1437 tcp_ses->nr_targets = 1;
1438 tcp_ses->ignore_signature = ctx->ignore_signature;
1439 /* thread spawned, put it on the list */
1440 spin_lock(&cifs_tcp_ses_lock);
1441 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
1442 spin_unlock(&cifs_tcp_ses_lock);
1444 cifs_fscache_get_client_cookie(tcp_ses);
1446 /* queue echo request delayed work */
1447 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
1451 out_err_crypto_release:
1452 cifs_crypto_secmech_release(tcp_ses);
1454 put_net(cifs_net_ns(tcp_ses));
1458 if (!IS_ERR(tcp_ses->hostname))
1459 kfree(tcp_ses->hostname);
1460 if (tcp_ses->ssocket)
1461 sock_release(tcp_ses->ssocket);
1467 static int match_session(struct cifs_ses *ses, struct smb3_fs_context *ctx)
1469 if (ctx->sectype != Unspecified &&
1470 ctx->sectype != ses->sectype)
1474 * If an existing session is limited to less channels than
1475 * requested, it should not be reused
1477 if (ses->chan_max < ctx->max_channels)
1480 switch (ses->sectype) {
1482 if (!uid_eq(ctx->cred_uid, ses->cred_uid))
1486 /* NULL username means anonymous session */
1487 if (ses->user_name == NULL) {
1493 /* anything else takes username/password */
1494 if (strncmp(ses->user_name,
1495 ctx->username ? ctx->username : "",
1496 CIFS_MAX_USERNAME_LEN))
1498 if ((ctx->username && strlen(ctx->username) != 0) &&
1499 ses->password != NULL &&
1500 strncmp(ses->password,
1501 ctx->password ? ctx->password : "",
1502 CIFS_MAX_PASSWORD_LEN))
1509 * cifs_setup_ipc - helper to setup the IPC tcon for the session
1511 * A new IPC connection is made and stored in the session
1512 * tcon_ipc. The IPC tcon has the same lifetime as the session.
1515 cifs_setup_ipc(struct cifs_ses *ses, struct smb3_fs_context *ctx)
1518 struct cifs_tcon *tcon;
1519 char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0};
1521 struct TCP_Server_Info *server = ses->server;
1524 * If the mount request that resulted in the creation of the
1525 * session requires encryption, force IPC to be encrypted too.
1528 if (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
1531 cifs_server_dbg(VFS,
1532 "IPC: server doesn't support encryption\n");
1537 tcon = tconInfoAlloc();
1541 scnprintf(unc, sizeof(unc), "\\\\%s\\IPC$", server->hostname);
1547 rc = server->ops->tree_connect(xid, ses, unc, tcon, ctx->local_nls);
1551 cifs_server_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
1556 cifs_dbg(FYI, "IPC tcon rc = %d ipc tid = %d\n", rc, tcon->tid);
1558 ses->tcon_ipc = tcon;
1564 * cifs_free_ipc - helper to release the session IPC tcon
1566 * Needs to be called everytime a session is destroyed
1569 cifs_free_ipc(struct cifs_ses *ses)
1572 struct cifs_tcon *tcon = ses->tcon_ipc;
1577 if (ses->server->ops->tree_disconnect) {
1579 rc = ses->server->ops->tree_disconnect(xid, tcon);
1584 cifs_dbg(FYI, "failed to disconnect IPC tcon (rc=%d)\n", rc);
1587 ses->tcon_ipc = NULL;
1591 static struct cifs_ses *
1592 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1594 struct cifs_ses *ses;
1596 spin_lock(&cifs_tcp_ses_lock);
1597 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
1598 if (ses->status == CifsExiting)
1600 if (!match_session(ses, ctx))
1603 spin_unlock(&cifs_tcp_ses_lock);
1606 spin_unlock(&cifs_tcp_ses_lock);
1610 void cifs_put_smb_ses(struct cifs_ses *ses)
1612 unsigned int rc, xid;
1613 struct TCP_Server_Info *server = ses->server;
1615 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
1617 spin_lock(&cifs_tcp_ses_lock);
1618 if (ses->status == CifsExiting) {
1619 spin_unlock(&cifs_tcp_ses_lock);
1622 if (--ses->ses_count > 0) {
1623 spin_unlock(&cifs_tcp_ses_lock);
1626 if (ses->status == CifsGood)
1627 ses->status = CifsExiting;
1628 spin_unlock(&cifs_tcp_ses_lock);
1632 if (ses->status == CifsExiting && server->ops->logoff) {
1634 rc = server->ops->logoff(xid, ses);
1636 cifs_server_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
1641 spin_lock(&cifs_tcp_ses_lock);
1642 list_del_init(&ses->smb_ses_list);
1643 spin_unlock(&cifs_tcp_ses_lock);
1645 /* close any extra channels */
1646 if (ses->chan_count > 1) {
1649 for (i = 1; i < ses->chan_count; i++)
1650 cifs_put_tcp_session(ses->chans[i].server, 0);
1654 cifs_put_tcp_session(server, 0);
1659 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
1660 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
1662 /* Populate username and pw fields from keyring if possible */
1664 cifs_set_cifscreds(struct smb3_fs_context *ctx, struct cifs_ses *ses)
1668 const char *delim, *payload;
1672 struct TCP_Server_Info *server = ses->server;
1673 struct sockaddr_in *sa;
1674 struct sockaddr_in6 *sa6;
1675 const struct user_key_payload *upayload;
1677 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
1681 /* try to find an address key first */
1682 switch (server->dstaddr.ss_family) {
1684 sa = (struct sockaddr_in *)&server->dstaddr;
1685 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
1688 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
1689 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
1692 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
1693 server->dstaddr.ss_family);
1698 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
1699 key = request_key(&key_type_logon, desc, "");
1701 if (!ses->domainName) {
1702 cifs_dbg(FYI, "domainName is NULL\n");
1707 /* didn't work, try to find a domain key */
1708 sprintf(desc, "cifs:d:%s", ses->domainName);
1709 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
1710 key = request_key(&key_type_logon, desc, "");
1718 down_read(&key->sem);
1719 upayload = user_key_payload_locked(key);
1720 if (IS_ERR_OR_NULL(upayload)) {
1721 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
1725 /* find first : in payload */
1726 payload = upayload->data;
1727 delim = strnchr(payload, upayload->datalen, ':');
1728 cifs_dbg(FYI, "payload=%s\n", payload);
1730 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
1736 len = delim - payload;
1737 if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
1738 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
1744 ctx->username = kstrndup(payload, len, GFP_KERNEL);
1745 if (!ctx->username) {
1746 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
1751 cifs_dbg(FYI, "%s: username=%s\n", __func__, ctx->username);
1753 len = key->datalen - (len + 1);
1754 if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
1755 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
1757 kfree(ctx->username);
1758 ctx->username = NULL;
1763 ctx->password = kstrndup(delim, len, GFP_KERNEL);
1764 if (!ctx->password) {
1765 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
1768 kfree(ctx->username);
1769 ctx->username = NULL;
1774 * If we have a domain key then we must set the domainName in the
1777 if (is_domain && ses->domainName) {
1778 ctx->domainname = kstrndup(ses->domainName,
1779 strlen(ses->domainName),
1781 if (!ctx->domainname) {
1782 cifs_dbg(FYI, "Unable to allocate %zd bytes for domain\n",
1785 kfree(ctx->username);
1786 ctx->username = NULL;
1787 kfree_sensitive(ctx->password);
1788 ctx->password = NULL;
1798 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
1801 #else /* ! CONFIG_KEYS */
1803 cifs_set_cifscreds(struct smb3_fs_context *ctx __attribute__((unused)),
1804 struct cifs_ses *ses __attribute__((unused)))
1808 #endif /* CONFIG_KEYS */
1811 * cifs_get_smb_ses - get a session matching @ctx data from @server
1813 * This function assumes it is being called from cifs_mount() where we
1814 * already got a server reference (server refcount +1). See
1815 * cifs_get_tcon() for refcount explanations.
1818 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1822 struct cifs_ses *ses;
1823 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
1824 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
1828 ses = cifs_find_smb_ses(server, ctx);
1830 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
1833 mutex_lock(&ses->session_mutex);
1834 rc = cifs_negotiate_protocol(xid, ses);
1836 mutex_unlock(&ses->session_mutex);
1837 /* problem -- put our ses reference */
1838 cifs_put_smb_ses(ses);
1842 if (ses->need_reconnect) {
1843 cifs_dbg(FYI, "Session needs reconnect\n");
1844 rc = cifs_setup_session(xid, ses,
1847 mutex_unlock(&ses->session_mutex);
1848 /* problem -- put our reference */
1849 cifs_put_smb_ses(ses);
1854 mutex_unlock(&ses->session_mutex);
1856 /* existing SMB ses has a server reference already */
1857 cifs_put_tcp_session(server, 0);
1862 cifs_dbg(FYI, "Existing smb sess not found\n");
1863 ses = sesInfoAlloc();
1867 /* new SMB session uses our server ref */
1868 ses->server = server;
1869 if (server->dstaddr.ss_family == AF_INET6)
1870 sprintf(ses->ip_addr, "%pI6", &addr6->sin6_addr);
1872 sprintf(ses->ip_addr, "%pI4", &addr->sin_addr);
1874 if (ctx->username) {
1875 ses->user_name = kstrdup(ctx->username, GFP_KERNEL);
1876 if (!ses->user_name)
1880 /* ctx->password freed at unmount */
1881 if (ctx->password) {
1882 ses->password = kstrdup(ctx->password, GFP_KERNEL);
1886 if (ctx->domainname) {
1887 ses->domainName = kstrdup(ctx->domainname, GFP_KERNEL);
1888 if (!ses->domainName)
1891 if (ctx->domainauto)
1892 ses->domainAuto = ctx->domainauto;
1893 ses->cred_uid = ctx->cred_uid;
1894 ses->linux_uid = ctx->linux_uid;
1896 ses->sectype = ctx->sectype;
1897 ses->sign = ctx->sign;
1898 mutex_lock(&ses->session_mutex);
1900 /* add server as first channel */
1901 ses->chans[0].server = server;
1902 ses->chan_count = 1;
1903 ses->chan_max = ctx->multichannel ? ctx->max_channels:1;
1905 rc = cifs_negotiate_protocol(xid, ses);
1907 rc = cifs_setup_session(xid, ses, ctx->local_nls);
1909 /* each channel uses a different signing key */
1910 memcpy(ses->chans[0].signkey, ses->smb3signingkey,
1911 sizeof(ses->smb3signingkey));
1913 mutex_unlock(&ses->session_mutex);
1917 /* success, put it on the list and add it as first channel */
1918 spin_lock(&cifs_tcp_ses_lock);
1919 list_add(&ses->smb_ses_list, &server->smb_ses_list);
1920 spin_unlock(&cifs_tcp_ses_lock);
1924 cifs_setup_ipc(ses, ctx);
1934 static int match_tcon(struct cifs_tcon *tcon, struct smb3_fs_context *ctx)
1936 if (tcon->tidStatus == CifsExiting)
1938 if (strncmp(tcon->treeName, ctx->UNC, MAX_TREE_SIZE))
1940 if (tcon->seal != ctx->seal)
1942 if (tcon->snapshot_time != ctx->snapshot_time)
1944 if (tcon->handle_timeout != ctx->handle_timeout)
1946 if (tcon->no_lease != ctx->no_lease)
1948 if (tcon->nodelete != ctx->nodelete)
1953 static struct cifs_tcon *
1954 cifs_find_tcon(struct cifs_ses *ses, struct smb3_fs_context *ctx)
1956 struct list_head *tmp;
1957 struct cifs_tcon *tcon;
1959 spin_lock(&cifs_tcp_ses_lock);
1960 list_for_each(tmp, &ses->tcon_list) {
1961 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
1962 #ifdef CONFIG_CIFS_DFS_UPCALL
1966 if (!match_tcon(tcon, ctx))
1969 spin_unlock(&cifs_tcp_ses_lock);
1972 spin_unlock(&cifs_tcp_ses_lock);
1977 cifs_put_tcon(struct cifs_tcon *tcon)
1980 struct cifs_ses *ses;
1983 * IPC tcon share the lifetime of their session and are
1984 * destroyed in the session put function
1986 if (tcon == NULL || tcon->ipc)
1990 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
1991 spin_lock(&cifs_tcp_ses_lock);
1992 if (--tcon->tc_count > 0) {
1993 spin_unlock(&cifs_tcp_ses_lock);
1997 #ifdef CONFIG_CIFS_SWN_UPCALL
1998 if (tcon->use_witness) {
2001 rc = cifs_swn_unregister(tcon);
2003 cifs_dbg(VFS, "%s: Failed to unregister for witness notifications: %d\n",
2009 list_del_init(&tcon->tcon_list);
2010 spin_unlock(&cifs_tcp_ses_lock);
2013 if (ses->server->ops->tree_disconnect)
2014 ses->server->ops->tree_disconnect(xid, tcon);
2017 cifs_fscache_release_super_cookie(tcon);
2019 cifs_put_smb_ses(ses);
2023 * cifs_get_tcon - get a tcon matching @ctx data from @ses
2025 * - tcon refcount is the number of mount points using the tcon.
2026 * - ses refcount is the number of tcon using the session.
2028 * 1. This function assumes it is being called from cifs_mount() where
2029 * we already got a session reference (ses refcount +1).
2031 * 2. Since we're in the context of adding a mount point, the end
2032 * result should be either:
2034 * a) a new tcon already allocated with refcount=1 (1 mount point) and
2035 * its session refcount incremented (1 new tcon). This +1 was
2036 * already done in (1).
2038 * b) an existing tcon with refcount+1 (add a mount point to it) and
2039 * identical ses refcount (no new tcon). Because of (1) we need to
2040 * decrement the ses refcount.
2042 static struct cifs_tcon *
2043 cifs_get_tcon(struct cifs_ses *ses, struct smb3_fs_context *ctx)
2046 struct cifs_tcon *tcon;
2048 tcon = cifs_find_tcon(ses, ctx);
2051 * tcon has refcount already incremented but we need to
2052 * decrement extra ses reference gotten by caller (case b)
2054 cifs_dbg(FYI, "Found match on UNC path\n");
2055 cifs_put_smb_ses(ses);
2059 if (!ses->server->ops->tree_connect) {
2064 tcon = tconInfoAlloc();
2070 if (ctx->snapshot_time) {
2071 if (ses->server->vals->protocol_id == 0) {
2073 "Use SMB2 or later for snapshot mount option\n");
2077 tcon->snapshot_time = ctx->snapshot_time;
2080 if (ctx->handle_timeout) {
2081 if (ses->server->vals->protocol_id == 0) {
2083 "Use SMB2.1 or later for handle timeout option\n");
2087 tcon->handle_timeout = ctx->handle_timeout;
2091 if (ctx->password) {
2092 tcon->password = kstrdup(ctx->password, GFP_KERNEL);
2093 if (!tcon->password) {
2100 if (ses->server->vals->protocol_id == 0) {
2102 "SMB3 or later required for encryption\n");
2105 } else if (tcon->ses->server->capabilities &
2106 SMB2_GLOBAL_CAP_ENCRYPTION)
2109 cifs_dbg(VFS, "Encryption is not supported on share\n");
2115 if (ctx->linux_ext) {
2116 if (ses->server->posix_ext_supported) {
2117 tcon->posix_extensions = true;
2118 pr_warn_once("SMB3.11 POSIX Extensions are experimental\n");
2120 cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions\n");
2127 * BB Do we need to wrap session_mutex around this TCon call and Unix
2128 * SetFS as we do on SessSetup and reconnect?
2131 rc = ses->server->ops->tree_connect(xid, ses, ctx->UNC, tcon,
2134 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
2138 tcon->use_persistent = false;
2139 /* check if SMB2 or later, CIFS does not support persistent handles */
2140 if (ctx->persistent) {
2141 if (ses->server->vals->protocol_id == 0) {
2143 "SMB3 or later required for persistent handles\n");
2146 } else if (ses->server->capabilities &
2147 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
2148 tcon->use_persistent = true;
2149 else /* persistent handles requested but not supported */ {
2151 "Persistent handles not supported on share\n");
2155 } else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
2156 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
2157 && (ctx->nopersistent == false)) {
2158 cifs_dbg(FYI, "enabling persistent handles\n");
2159 tcon->use_persistent = true;
2160 } else if (ctx->resilient) {
2161 if (ses->server->vals->protocol_id == 0) {
2163 "SMB2.1 or later required for resilient handles\n");
2167 tcon->use_resilient = true;
2169 #ifdef CONFIG_CIFS_SWN_UPCALL
2170 tcon->use_witness = false;
2172 if (ses->server->vals->protocol_id >= SMB30_PROT_ID) {
2173 if (tcon->capabilities & SMB2_SHARE_CAP_CLUSTER) {
2175 * Set witness in use flag in first place
2176 * to retry registration in the echo task
2178 tcon->use_witness = true;
2179 /* And try to register immediately */
2180 rc = cifs_swn_register(tcon);
2182 cifs_dbg(VFS, "Failed to register for witness notifications: %d\n", rc);
2186 /* TODO: try to extend for non-cluster uses (eg multichannel) */
2187 cifs_dbg(VFS, "witness requested on mount but no CLUSTER capability on share\n");
2192 cifs_dbg(VFS, "SMB3 or later required for witness option\n");
2199 /* If the user really knows what they are doing they can override */
2200 if (tcon->share_flags & SMB2_SHAREFLAG_NO_CACHING) {
2202 cifs_dbg(VFS, "cache=ro requested on mount but NO_CACHING flag set on share\n");
2203 else if (ctx->cache_rw)
2204 cifs_dbg(VFS, "cache=singleclient requested on mount but NO_CACHING flag set on share\n");
2207 if (ctx->no_lease) {
2208 if (ses->server->vals->protocol_id == 0) {
2210 "SMB2 or later required for nolease option\n");
2214 tcon->no_lease = ctx->no_lease;
2218 * We can have only one retry value for a connection to a share so for
2219 * resources mounted more than once to the same server share the last
2220 * value passed in for the retry flag is used.
2222 tcon->retry = ctx->retry;
2223 tcon->nocase = ctx->nocase;
2224 if (ses->server->capabilities & SMB2_GLOBAL_CAP_DIRECTORY_LEASING)
2225 tcon->nohandlecache = ctx->nohandlecache;
2227 tcon->nohandlecache = true;
2228 tcon->nodelete = ctx->nodelete;
2229 tcon->local_lease = ctx->local_lease;
2230 INIT_LIST_HEAD(&tcon->pending_opens);
2232 spin_lock(&cifs_tcp_ses_lock);
2233 list_add(&tcon->tcon_list, &ses->tcon_list);
2234 spin_unlock(&cifs_tcp_ses_lock);
2236 cifs_fscache_get_super_cookie(tcon);
2246 cifs_put_tlink(struct tcon_link *tlink)
2248 if (!tlink || IS_ERR(tlink))
2251 if (!atomic_dec_and_test(&tlink->tl_count) ||
2252 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
2253 tlink->tl_time = jiffies;
2257 if (!IS_ERR(tlink_tcon(tlink)))
2258 cifs_put_tcon(tlink_tcon(tlink));
2264 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2266 struct cifs_sb_info *old = CIFS_SB(sb);
2267 struct cifs_sb_info *new = mnt_data->cifs_sb;
2268 unsigned int oldflags = old->mnt_cifs_flags & CIFS_MOUNT_MASK;
2269 unsigned int newflags = new->mnt_cifs_flags & CIFS_MOUNT_MASK;
2271 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
2274 if (old->mnt_cifs_serverino_autodisabled)
2275 newflags &= ~CIFS_MOUNT_SERVER_INUM;
2277 if (oldflags != newflags)
2281 * We want to share sb only if we don't specify an r/wsize or
2282 * specified r/wsize is greater than or equal to existing one.
2284 if (new->ctx->wsize && new->ctx->wsize < old->ctx->wsize)
2287 if (new->ctx->rsize && new->ctx->rsize < old->ctx->rsize)
2290 if (!uid_eq(old->ctx->linux_uid, new->ctx->linux_uid) ||
2291 !gid_eq(old->ctx->linux_gid, new->ctx->linux_gid))
2294 if (old->ctx->file_mode != new->ctx->file_mode ||
2295 old->ctx->dir_mode != new->ctx->dir_mode)
2298 if (strcmp(old->local_nls->charset, new->local_nls->charset))
2301 if (old->ctx->acregmax != new->ctx->acregmax)
2303 if (old->ctx->acdirmax != new->ctx->acdirmax)
2310 match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2312 struct cifs_sb_info *old = CIFS_SB(sb);
2313 struct cifs_sb_info *new = mnt_data->cifs_sb;
2314 bool old_set = (old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
2316 bool new_set = (new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
2319 if (old_set && new_set && !strcmp(new->prepath, old->prepath))
2321 else if (!old_set && !new_set)
2328 cifs_match_super(struct super_block *sb, void *data)
2330 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
2331 struct smb3_fs_context *ctx;
2332 struct cifs_sb_info *cifs_sb;
2333 struct TCP_Server_Info *tcp_srv;
2334 struct cifs_ses *ses;
2335 struct cifs_tcon *tcon;
2336 struct tcon_link *tlink;
2339 spin_lock(&cifs_tcp_ses_lock);
2340 cifs_sb = CIFS_SB(sb);
2341 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
2342 if (IS_ERR(tlink)) {
2343 spin_unlock(&cifs_tcp_ses_lock);
2346 tcon = tlink_tcon(tlink);
2348 tcp_srv = ses->server;
2350 ctx = mnt_data->ctx;
2352 if (!match_server(tcp_srv, ctx) ||
2353 !match_session(ses, ctx) ||
2354 !match_tcon(tcon, ctx) ||
2355 !match_prepath(sb, mnt_data)) {
2360 rc = compare_mount_options(sb, mnt_data);
2362 spin_unlock(&cifs_tcp_ses_lock);
2363 cifs_put_tlink(tlink);
2367 #ifdef CONFIG_DEBUG_LOCK_ALLOC
2368 static struct lock_class_key cifs_key[2];
2369 static struct lock_class_key cifs_slock_key[2];
2372 cifs_reclassify_socket4(struct socket *sock)
2374 struct sock *sk = sock->sk;
2375 BUG_ON(!sock_allow_reclassification(sk));
2376 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
2377 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
2381 cifs_reclassify_socket6(struct socket *sock)
2383 struct sock *sk = sock->sk;
2384 BUG_ON(!sock_allow_reclassification(sk));
2385 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
2386 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
2390 cifs_reclassify_socket4(struct socket *sock)
2395 cifs_reclassify_socket6(struct socket *sock)
2400 /* See RFC1001 section 14 on representation of Netbios names */
2401 static void rfc1002mangle(char *target, char *source, unsigned int length)
2405 for (i = 0, j = 0; i < (length); i++) {
2406 /* mask a nibble at a time and encode */
2407 target[j] = 'A' + (0x0F & (source[i] >> 4));
2408 target[j+1] = 'A' + (0x0F & source[i]);
2415 bind_socket(struct TCP_Server_Info *server)
2418 if (server->srcaddr.ss_family != AF_UNSPEC) {
2419 /* Bind to the specified local IP address */
2420 struct socket *socket = server->ssocket;
2421 rc = socket->ops->bind(socket,
2422 (struct sockaddr *) &server->srcaddr,
2423 sizeof(server->srcaddr));
2425 struct sockaddr_in *saddr4;
2426 struct sockaddr_in6 *saddr6;
2427 saddr4 = (struct sockaddr_in *)&server->srcaddr;
2428 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
2429 if (saddr6->sin6_family == AF_INET6)
2430 cifs_server_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
2431 &saddr6->sin6_addr, rc);
2433 cifs_server_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
2434 &saddr4->sin_addr.s_addr, rc);
2441 ip_rfc1001_connect(struct TCP_Server_Info *server)
2445 * some servers require RFC1001 sessinit before sending
2446 * negprot - BB check reconnection in case where second
2447 * sessinit is sent but no second negprot
2449 struct rfc1002_session_packet *ses_init_buf;
2450 struct smb_hdr *smb_buf;
2451 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
2454 ses_init_buf->trailer.session_req.called_len = 32;
2456 if (server->server_RFC1001_name[0] != 0)
2457 rfc1002mangle(ses_init_buf->trailer.
2458 session_req.called_name,
2459 server->server_RFC1001_name,
2460 RFC1001_NAME_LEN_WITH_NULL);
2462 rfc1002mangle(ses_init_buf->trailer.
2463 session_req.called_name,
2464 DEFAULT_CIFS_CALLED_NAME,
2465 RFC1001_NAME_LEN_WITH_NULL);
2467 ses_init_buf->trailer.session_req.calling_len = 32;
2470 * calling name ends in null (byte 16) from old smb
2473 if (server->workstation_RFC1001_name[0] != 0)
2474 rfc1002mangle(ses_init_buf->trailer.
2475 session_req.calling_name,
2476 server->workstation_RFC1001_name,
2477 RFC1001_NAME_LEN_WITH_NULL);
2479 rfc1002mangle(ses_init_buf->trailer.
2480 session_req.calling_name,
2482 RFC1001_NAME_LEN_WITH_NULL);
2484 ses_init_buf->trailer.session_req.scope1 = 0;
2485 ses_init_buf->trailer.session_req.scope2 = 0;
2486 smb_buf = (struct smb_hdr *)ses_init_buf;
2488 /* sizeof RFC1002_SESSION_REQUEST with no scope */
2489 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
2490 rc = smb_send(server, smb_buf, 0x44);
2491 kfree(ses_init_buf);
2493 * RFC1001 layer in at least one server
2494 * requires very short break before negprot
2495 * presumably because not expecting negprot
2496 * to follow so fast. This is a simple
2497 * solution that works without
2498 * complicating the code and causes no
2499 * significant slowing down on mount
2502 usleep_range(1000, 2000);
2505 * else the negprot may still work without this
2506 * even though malloc failed
2513 generic_ip_connect(struct TCP_Server_Info *server)
2518 struct socket *socket = server->ssocket;
2519 struct sockaddr *saddr;
2521 saddr = (struct sockaddr *) &server->dstaddr;
2523 if (server->dstaddr.ss_family == AF_INET6) {
2524 struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)&server->dstaddr;
2526 sport = ipv6->sin6_port;
2527 slen = sizeof(struct sockaddr_in6);
2529 cifs_dbg(FYI, "%s: connecting to [%pI6]:%d\n", __func__, &ipv6->sin6_addr,
2532 struct sockaddr_in *ipv4 = (struct sockaddr_in *)&server->dstaddr;
2534 sport = ipv4->sin_port;
2535 slen = sizeof(struct sockaddr_in);
2537 cifs_dbg(FYI, "%s: connecting to %pI4:%d\n", __func__, &ipv4->sin_addr,
2541 if (socket == NULL) {
2542 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
2543 IPPROTO_TCP, &socket, 1);
2545 cifs_server_dbg(VFS, "Error %d creating socket\n", rc);
2546 server->ssocket = NULL;
2550 /* BB other socket options to set KEEPALIVE, NODELAY? */
2551 cifs_dbg(FYI, "Socket created\n");
2552 server->ssocket = socket;
2553 socket->sk->sk_allocation = GFP_NOFS;
2554 if (sfamily == AF_INET6)
2555 cifs_reclassify_socket6(socket);
2557 cifs_reclassify_socket4(socket);
2560 rc = bind_socket(server);
2565 * Eventually check for other socket options to change from
2566 * the default. sock_setsockopt not used because it expects
2569 socket->sk->sk_rcvtimeo = 7 * HZ;
2570 socket->sk->sk_sndtimeo = 5 * HZ;
2572 /* make the bufsizes depend on wsize/rsize and max requests */
2573 if (server->noautotune) {
2574 if (socket->sk->sk_sndbuf < (200 * 1024))
2575 socket->sk->sk_sndbuf = 200 * 1024;
2576 if (socket->sk->sk_rcvbuf < (140 * 1024))
2577 socket->sk->sk_rcvbuf = 140 * 1024;
2580 if (server->tcp_nodelay)
2581 tcp_sock_set_nodelay(socket->sk);
2583 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
2584 socket->sk->sk_sndbuf,
2585 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
2587 rc = socket->ops->connect(socket, saddr, slen,
2588 server->noblockcnt ? O_NONBLOCK : 0);
2590 * When mounting SMB root file systems, we do not want to block in
2591 * connect. Otherwise bail out and then let cifs_reconnect() perform
2592 * reconnect failover - if possible.
2594 if (server->noblockcnt && rc == -EINPROGRESS)
2597 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
2598 sock_release(socket);
2599 server->ssocket = NULL;
2603 if (sport == htons(RFC1001_PORT))
2604 rc = ip_rfc1001_connect(server);
2610 ip_connect(struct TCP_Server_Info *server)
2613 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2614 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2616 if (server->dstaddr.ss_family == AF_INET6)
2617 sport = &addr6->sin6_port;
2619 sport = &addr->sin_port;
2624 /* try with 445 port at first */
2625 *sport = htons(CIFS_PORT);
2627 rc = generic_ip_connect(server);
2631 /* if it failed, try with 139 port */
2632 *sport = htons(RFC1001_PORT);
2635 return generic_ip_connect(server);
2638 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
2639 struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
2642 * If we are reconnecting then should we check to see if
2643 * any requested capabilities changed locally e.g. via
2644 * remount but we can not do much about it here
2645 * if they have (even if we could detect it by the following)
2646 * Perhaps we could add a backpointer to array of sb from tcon
2647 * or if we change to make all sb to same share the same
2648 * sb as NFS - then we only have one backpointer to sb.
2649 * What if we wanted to mount the server share twice once with
2650 * and once without posixacls or posix paths?
2652 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
2654 if (ctx && ctx->no_linux_ext) {
2655 tcon->fsUnixInfo.Capability = 0;
2656 tcon->unix_ext = 0; /* Unix Extensions disabled */
2657 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
2660 tcon->unix_ext = 1; /* Unix Extensions supported */
2662 if (!tcon->unix_ext) {
2663 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
2667 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
2668 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
2669 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
2671 * check for reconnect case in which we do not
2672 * want to change the mount behavior if we can avoid it
2676 * turn off POSIX ACL and PATHNAMES if not set
2677 * originally at mount time
2679 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
2680 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
2681 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
2682 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
2683 cifs_dbg(VFS, "POSIXPATH support change\n");
2684 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
2685 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
2686 cifs_dbg(VFS, "possible reconnect error\n");
2687 cifs_dbg(VFS, "server disabled POSIX path support\n");
2691 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
2692 cifs_dbg(VFS, "per-share encryption not supported yet\n");
2694 cap &= CIFS_UNIX_CAP_MASK;
2695 if (ctx && ctx->no_psx_acl)
2696 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
2697 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
2698 cifs_dbg(FYI, "negotiated posix acl support\n");
2700 cifs_sb->mnt_cifs_flags |=
2701 CIFS_MOUNT_POSIXACL;
2704 if (ctx && ctx->posix_paths == 0)
2705 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
2706 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
2707 cifs_dbg(FYI, "negotiate posix pathnames\n");
2709 cifs_sb->mnt_cifs_flags |=
2710 CIFS_MOUNT_POSIX_PATHS;
2713 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
2714 #ifdef CONFIG_CIFS_DEBUG2
2715 if (cap & CIFS_UNIX_FCNTL_CAP)
2716 cifs_dbg(FYI, "FCNTL cap\n");
2717 if (cap & CIFS_UNIX_EXTATTR_CAP)
2718 cifs_dbg(FYI, "EXTATTR cap\n");
2719 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
2720 cifs_dbg(FYI, "POSIX path cap\n");
2721 if (cap & CIFS_UNIX_XATTR_CAP)
2722 cifs_dbg(FYI, "XATTR cap\n");
2723 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
2724 cifs_dbg(FYI, "POSIX ACL cap\n");
2725 if (cap & CIFS_UNIX_LARGE_READ_CAP)
2726 cifs_dbg(FYI, "very large read cap\n");
2727 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
2728 cifs_dbg(FYI, "very large write cap\n");
2729 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
2730 cifs_dbg(FYI, "transport encryption cap\n");
2731 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
2732 cifs_dbg(FYI, "mandatory transport encryption cap\n");
2733 #endif /* CIFS_DEBUG2 */
2734 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
2736 cifs_dbg(FYI, "resetting capabilities failed\n");
2738 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");
2744 int cifs_setup_cifs_sb(struct cifs_sb_info *cifs_sb)
2746 struct smb3_fs_context *ctx = cifs_sb->ctx;
2748 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
2750 spin_lock_init(&cifs_sb->tlink_tree_lock);
2751 cifs_sb->tlink_tree = RB_ROOT;
2753 cifs_dbg(FYI, "file mode: %04ho dir mode: %04ho\n",
2754 ctx->file_mode, ctx->dir_mode);
2756 /* this is needed for ASCII cp to Unicode converts */
2757 if (ctx->iocharset == NULL) {
2758 /* load_nls_default cannot return null */
2759 cifs_sb->local_nls = load_nls_default();
2761 cifs_sb->local_nls = load_nls(ctx->iocharset);
2762 if (cifs_sb->local_nls == NULL) {
2763 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
2768 ctx->local_nls = cifs_sb->local_nls;
2770 smb3_update_mnt_flags(cifs_sb);
2773 cifs_dbg(FYI, "mounting share using direct i/o\n");
2774 if (ctx->cache_ro) {
2775 cifs_dbg(VFS, "mounting share with read only caching. Ensure that the share will not be modified while in use.\n");
2776 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RO_CACHE;
2777 } else if (ctx->cache_rw) {
2778 cifs_dbg(VFS, "mounting share in single client RW caching mode. Ensure that no other systems will be accessing the share.\n");
2779 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_RO_CACHE |
2780 CIFS_MOUNT_RW_CACHE);
2783 if ((ctx->cifs_acl) && (ctx->dynperm))
2784 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
2787 cifs_sb->prepath = kstrdup(ctx->prepath, GFP_KERNEL);
2788 if (cifs_sb->prepath == NULL)
2790 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
2796 /* Release all succeed connections */
2797 static inline void mount_put_conns(struct cifs_sb_info *cifs_sb,
2799 struct TCP_Server_Info *server,
2800 struct cifs_ses *ses, struct cifs_tcon *tcon)
2805 cifs_put_tcon(tcon);
2807 cifs_put_smb_ses(ses);
2809 cifs_put_tcp_session(server, 0);
2810 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
2814 /* Get connections for tcp, ses and tcon */
2815 static int mount_get_conns(struct smb3_fs_context *ctx, struct cifs_sb_info *cifs_sb,
2817 struct TCP_Server_Info **nserver,
2818 struct cifs_ses **nses, struct cifs_tcon **ntcon)
2821 struct TCP_Server_Info *server;
2822 struct cifs_ses *ses;
2823 struct cifs_tcon *tcon;
2831 /* get a reference to a tcp session */
2832 server = cifs_get_tcp_session(ctx);
2833 if (IS_ERR(server)) {
2834 rc = PTR_ERR(server);
2840 /* get a reference to a SMB session */
2841 ses = cifs_get_smb_ses(server, ctx);
2849 if ((ctx->persistent == true) && (!(ses->server->capabilities &
2850 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES))) {
2851 cifs_server_dbg(VFS, "persistent handles not supported by server\n");
2855 /* search for existing tcon to this server share */
2856 tcon = cifs_get_tcon(ses, ctx);
2864 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
2865 if (tcon->posix_extensions)
2866 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
2868 /* tell server which Unix caps we support */
2869 if (cap_unix(tcon->ses)) {
2871 * reset of caps checks mount to see if unix extensions disabled
2872 * for just this mount.
2874 reset_cifs_unix_caps(*xid, tcon, cifs_sb, ctx);
2875 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
2876 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
2877 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP))
2880 tcon->unix_ext = 0; /* server does not support them */
2882 /* do not care if a following call succeed - informational */
2883 if (!tcon->pipe && server->ops->qfs_tcon) {
2884 server->ops->qfs_tcon(*xid, tcon, cifs_sb);
2885 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE) {
2886 if (tcon->fsDevInfo.DeviceCharacteristics &
2887 cpu_to_le32(FILE_READ_ONLY_DEVICE))
2888 cifs_dbg(VFS, "mounted to read only share\n");
2889 else if ((cifs_sb->mnt_cifs_flags &
2890 CIFS_MOUNT_RW_CACHE) == 0)
2891 cifs_dbg(VFS, "read only mount of RW share\n");
2892 /* no need to log a RW mount of a typical RW share */
2897 * Clamp the rsize/wsize mount arguments if they are too big for the server
2898 * and set the rsize/wsize to the negotiated values if not passed in by
2901 if ((cifs_sb->ctx->wsize == 0) ||
2902 (cifs_sb->ctx->wsize > server->ops->negotiate_wsize(tcon, ctx)))
2903 cifs_sb->ctx->wsize = server->ops->negotiate_wsize(tcon, ctx);
2904 if ((cifs_sb->ctx->rsize == 0) ||
2905 (cifs_sb->ctx->rsize > server->ops->negotiate_rsize(tcon, ctx)))
2906 cifs_sb->ctx->rsize = server->ops->negotiate_rsize(tcon, ctx);
2911 static int mount_setup_tlink(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
2912 struct cifs_tcon *tcon)
2914 struct tcon_link *tlink;
2916 /* hang the tcon off of the superblock */
2917 tlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
2921 tlink->tl_uid = ses->linux_uid;
2922 tlink->tl_tcon = tcon;
2923 tlink->tl_time = jiffies;
2924 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
2925 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
2927 cifs_sb->master_tlink = tlink;
2928 spin_lock(&cifs_sb->tlink_tree_lock);
2929 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
2930 spin_unlock(&cifs_sb->tlink_tree_lock);
2932 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
2937 #ifdef CONFIG_CIFS_DFS_UPCALL
2939 * cifs_build_path_to_root returns full path to root when we do not have an
2940 * existing connection (tcon)
2943 build_unc_path_to_root(const struct smb3_fs_context *ctx,
2944 const struct cifs_sb_info *cifs_sb, bool useppath)
2946 char *full_path, *pos;
2947 unsigned int pplen = useppath && ctx->prepath ?
2948 strlen(ctx->prepath) + 1 : 0;
2949 unsigned int unc_len = strnlen(ctx->UNC, MAX_TREE_SIZE + 1);
2951 if (unc_len > MAX_TREE_SIZE)
2952 return ERR_PTR(-EINVAL);
2954 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
2955 if (full_path == NULL)
2956 return ERR_PTR(-ENOMEM);
2958 memcpy(full_path, ctx->UNC, unc_len);
2959 pos = full_path + unc_len;
2962 *pos = CIFS_DIR_SEP(cifs_sb);
2963 memcpy(pos + 1, ctx->prepath, pplen);
2967 *pos = '\0'; /* add trailing null */
2968 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
2969 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
2974 * expand_dfs_referral - Perform a dfs referral query and update the cifs_sb
2976 * If a referral is found, cifs_sb->ctx->mount_options will be (re-)allocated
2977 * to a string containing updated options for the submount. Otherwise it
2978 * will be left untouched.
2980 * Returns the rc from get_dfs_path to the caller, which can be used to
2981 * determine whether there were referrals.
2984 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
2985 struct smb3_fs_context *ctx, struct cifs_sb_info *cifs_sb,
2989 struct dfs_info3_param referral = {0};
2990 char *full_path = NULL, *mdata = NULL;
2992 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
2995 full_path = build_unc_path_to_root(ctx, cifs_sb, true);
2996 if (IS_ERR(full_path))
2997 return PTR_ERR(full_path);
2999 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
3000 ref_path, &referral, NULL);
3002 char *fake_devname = NULL;
3004 mdata = cifs_compose_mount_options(cifs_sb->ctx->mount_options,
3005 full_path + 1, &referral,
3007 free_dfs_info_param(&referral);
3009 if (IS_ERR(mdata)) {
3010 rc = PTR_ERR(mdata);
3014 * We can not clear out the whole structure since we
3015 * no longer have an explicit function to parse
3016 * a mount-string. Instead we need to clear out the
3017 * individual fields that are no longer valid.
3019 kfree(ctx->prepath);
3020 ctx->prepath = NULL;
3021 rc = cifs_setup_volume_info(ctx, mdata, fake_devname);
3023 kfree(fake_devname);
3024 kfree(cifs_sb->ctx->mount_options);
3025 cifs_sb->ctx->mount_options = mdata;
3031 static inline int get_next_dfs_tgt(const char *path,
3032 struct dfs_cache_tgt_list *tgt_list,
3033 struct dfs_cache_tgt_iterator **tgt_it)
3036 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
3038 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
3039 return !*tgt_it ? -EHOSTDOWN : 0;
3042 static int update_vol_info(const struct dfs_cache_tgt_iterator *tgt_it,
3043 struct smb3_fs_context *fake_ctx, struct smb3_fs_context *ctx)
3045 const char *tgt = dfs_cache_get_tgt_name(tgt_it);
3046 int len = strlen(tgt) + 2;
3049 new_unc = kmalloc(len, GFP_KERNEL);
3052 scnprintf(new_unc, len, "\\%s", tgt);
3057 if (fake_ctx->prepath) {
3058 kfree(ctx->prepath);
3059 ctx->prepath = fake_ctx->prepath;
3060 fake_ctx->prepath = NULL;
3062 memcpy(&ctx->dstaddr, &fake_ctx->dstaddr, sizeof(ctx->dstaddr));
3067 static int do_dfs_failover(const char *path, const char *full_path, struct cifs_sb_info *cifs_sb,
3068 struct smb3_fs_context *ctx, struct cifs_ses *root_ses,
3069 unsigned int *xid, struct TCP_Server_Info **server,
3070 struct cifs_ses **ses, struct cifs_tcon **tcon)
3073 struct dfs_cache_tgt_list tgt_list = {0};
3074 struct dfs_cache_tgt_iterator *tgt_it = NULL;
3075 struct smb3_fs_context tmp_ctx = {NULL};
3077 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
3080 cifs_dbg(FYI, "%s: path=%s full_path=%s\n", __func__, path, full_path);
3082 rc = dfs_cache_noreq_find(path, NULL, &tgt_list);
3086 * We use a 'tmp_ctx' here because we need pass it down to the mount_{get,put} functions to
3087 * test connection against new DFS targets.
3089 rc = smb3_fs_context_dup(&tmp_ctx, ctx);
3094 struct dfs_info3_param ref = {0};
3095 char *fake_devname = NULL, *mdata = NULL;
3097 /* Get next DFS target server - if any */
3098 rc = get_next_dfs_tgt(path, &tgt_list, &tgt_it);
3102 rc = dfs_cache_get_tgt_referral(path, tgt_it, &ref);
3106 cifs_dbg(FYI, "%s: old ctx: UNC=%s prepath=%s\n", __func__, tmp_ctx.UNC,
3109 mdata = cifs_compose_mount_options(cifs_sb->ctx->mount_options, full_path + 1, &ref,
3111 free_dfs_info_param(&ref);
3113 if (IS_ERR(mdata)) {
3114 rc = PTR_ERR(mdata);
3117 rc = cifs_setup_volume_info(&tmp_ctx, mdata, fake_devname);
3120 kfree(fake_devname);
3125 cifs_dbg(FYI, "%s: new ctx: UNC=%s prepath=%s\n", __func__, tmp_ctx.UNC,
3128 mount_put_conns(cifs_sb, *xid, *server, *ses, *tcon);
3129 rc = mount_get_conns(&tmp_ctx, cifs_sb, xid, server, ses, tcon);
3130 if (!rc || (*server && *ses)) {
3132 * We were able to connect to new target server. Update current context with
3133 * new target server.
3135 rc = update_vol_info(tgt_it, &tmp_ctx, ctx);
3140 cifs_dbg(FYI, "%s: final ctx: UNC=%s prepath=%s\n", __func__, tmp_ctx.UNC,
3143 * Update DFS target hint in DFS referral cache with the target server we
3144 * successfully reconnected to.
3146 rc = dfs_cache_update_tgthint(*xid, root_ses ? root_ses : *ses, cifs_sb->local_nls,
3147 cifs_remap(cifs_sb), path, tgt_it);
3151 smb3_cleanup_fs_context_contents(&tmp_ctx);
3152 dfs_cache_free_tgts(&tgt_list);
3157 /* TODO: all callers to this are broken. We are not parsing mount_options here
3158 * we should pass a clone of the original context?
3161 cifs_setup_volume_info(struct smb3_fs_context *ctx, const char *mntopts, const char *devname)
3165 smb3_parse_devname(devname, ctx);
3170 cifs_dbg(FYI, "%s: mntopts=%s\n", __func__, mntopts);
3171 rc = smb3_parse_opt(mntopts, "ip", &ip);
3172 if (!rc && !cifs_convert_address((struct sockaddr *)&ctx->dstaddr, ip,
3174 cifs_dbg(VFS, "%s: failed to convert ip address\n", __func__);
3179 if (ctx->nullauth) {
3180 cifs_dbg(FYI, "Anonymous login\n");
3181 kfree(ctx->username);
3182 ctx->username = NULL;
3183 } else if (ctx->username) {
3184 /* BB fixme parse for domain name here */
3185 cifs_dbg(FYI, "Username: %s\n", ctx->username);
3187 cifs_dbg(VFS, "No username specified\n");
3188 /* In userspace mount helper we can get user name from alternate
3189 locations such as env variables and files on disk */
3197 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
3199 struct cifs_tcon *tcon,
3200 struct cifs_sb_info *cifs_sb,
3207 int skip = added_treename ? 1 : 0;
3209 sep = CIFS_DIR_SEP(cifs_sb);
3212 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
3214 /* skip separators */
3219 /* next separator */
3220 while (*s && *s != sep)
3223 * if the treename is added, we then have to skip the first
3224 * part within the separators
3231 * temporarily null-terminate the path at the end of
3232 * the current component
3236 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3244 * Check if path is remote (e.g. a DFS share). Return -EREMOTE if it is,
3247 static int is_path_remote(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx,
3248 const unsigned int xid,
3249 struct TCP_Server_Info *server,
3250 struct cifs_tcon *tcon)
3255 if (!server->ops->is_path_accessible)
3259 * cifs_build_path_to_root works only when we have a valid tcon
3261 full_path = cifs_build_path_to_root(ctx, cifs_sb, tcon,
3262 tcon->Flags & SMB_SHARE_IS_IN_DFS);
3263 if (full_path == NULL)
3266 cifs_dbg(FYI, "%s: full_path: %s\n", __func__, full_path);
3268 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3270 if (rc != 0 && rc != -EREMOTE) {
3275 if (rc != -EREMOTE) {
3276 rc = cifs_are_all_path_components_accessible(server, xid, tcon,
3277 cifs_sb, full_path, tcon->Flags & SMB_SHARE_IS_IN_DFS);
3279 cifs_server_dbg(VFS, "cannot query dirs between root and final path, enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
3280 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
3289 #ifdef CONFIG_CIFS_DFS_UPCALL
3290 static void set_root_ses(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
3291 struct cifs_ses **root_ses)
3294 spin_lock(&cifs_tcp_ses_lock);
3297 ses->tcon_ipc->remap = cifs_remap(cifs_sb);
3298 spin_unlock(&cifs_tcp_ses_lock);
3303 static void put_root_ses(struct cifs_ses *ses)
3306 cifs_put_smb_ses(ses);
3309 /* Set up next dfs prefix path in @dfs_path */
3310 static int next_dfs_prepath(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx,
3311 const unsigned int xid, struct TCP_Server_Info *server,
3312 struct cifs_tcon *tcon, char **dfs_path)
3315 int added_treename = is_tcon_dfs(tcon);
3318 path = cifs_build_path_to_root(ctx, cifs_sb, tcon, added_treename);
3322 rc = is_path_remote(cifs_sb, ctx, xid, server, tcon);
3323 if (rc == -EREMOTE) {
3324 struct smb3_fs_context v = {NULL};
3325 /* if @path contains a tree name, skip it in the prefix path */
3326 if (added_treename) {
3327 rc = smb3_parse_devname(path, &v);
3330 npath = build_unc_path_to_root(&v, cifs_sb, true);
3331 smb3_cleanup_fs_context_contents(&v);
3334 v.prepath = path + 1;
3335 npath = build_unc_path_to_root(&v, cifs_sb, true);
3338 if (IS_ERR(npath)) {
3339 rc = PTR_ERR(npath);
3353 /* Check if resolved targets can handle any DFS referrals */
3354 static int is_referral_server(const char *ref_path, struct cifs_tcon *tcon, bool *ref_server)
3357 struct dfs_info3_param ref = {0};
3359 if (is_tcon_dfs(tcon)) {
3362 cifs_dbg(FYI, "%s: ref_path=%s\n", __func__, ref_path);
3364 rc = dfs_cache_noreq_find(ref_path, &ref, NULL);
3366 cifs_dbg(VFS, "%s: dfs_cache_noreq_find: failed (rc=%d)\n", __func__, rc);
3369 cifs_dbg(FYI, "%s: ref.flags=0x%x\n", __func__, ref.flags);
3371 * Check if all targets are capable of handling DFS referrals as per
3372 * MS-DFSC 2.2.4 RESP_GET_DFS_REFERRAL.
3374 *ref_server = !!(ref.flags & DFSREF_REFERRAL_SERVER);
3375 free_dfs_info_param(&ref);
3380 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
3384 struct TCP_Server_Info *server = NULL;
3385 struct cifs_ses *ses = NULL, *root_ses = NULL;
3386 struct cifs_tcon *tcon = NULL;
3388 char *ref_path = NULL, *full_path = NULL;
3389 char *oldmnt = NULL;
3390 char *mntdata = NULL;
3391 bool ref_server = false;
3393 rc = mount_get_conns(ctx, cifs_sb, &xid, &server, &ses, &tcon);
3395 * If called with 'nodfs' mount option, then skip DFS resolving. Otherwise unconditionally
3396 * try to get an DFS referral (even cached) to determine whether it is an DFS mount.
3398 * Skip prefix path to provide support for DFS referrals from w2k8 servers which don't seem
3399 * to respond with PATH_NOT_COVERED to requests that include the prefix.
3401 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS) ||
3402 dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb), ctx->UNC + 1, NULL,
3406 /* Check if it is fully accessible and then mount it */
3407 rc = is_path_remote(cifs_sb, ctx, xid, server, tcon);
3413 /* Save mount options */
3414 mntdata = kstrndup(cifs_sb->ctx->mount_options,
3415 strlen(cifs_sb->ctx->mount_options), GFP_KERNEL);
3420 /* Get path of DFS root */
3421 ref_path = build_unc_path_to_root(ctx, cifs_sb, false);
3422 if (IS_ERR(ref_path)) {
3423 rc = PTR_ERR(ref_path);
3428 set_root_ses(cifs_sb, ses, &root_ses);
3430 /* Save full path of last DFS path we used to resolve final target server */
3432 full_path = build_unc_path_to_root(ctx, cifs_sb, !!count);
3433 if (IS_ERR(full_path)) {
3434 rc = PTR_ERR(full_path);
3438 /* Chase referral */
3439 oldmnt = cifs_sb->ctx->mount_options;
3440 rc = expand_dfs_referral(xid, root_ses, ctx, cifs_sb, ref_path + 1);
3443 /* Connect to new DFS target only if we were redirected */
3444 if (oldmnt != cifs_sb->ctx->mount_options) {
3445 mount_put_conns(cifs_sb, xid, server, ses, tcon);
3446 rc = mount_get_conns(ctx, cifs_sb, &xid, &server, &ses, &tcon);
3448 if (rc && !server && !ses) {
3449 /* Failed to connect. Try to connect to other targets in the referral. */
3450 rc = do_dfs_failover(ref_path + 1, full_path, cifs_sb, ctx, root_ses, &xid,
3451 &server, &ses, &tcon);
3453 if (rc == -EACCES || rc == -EOPNOTSUPP || !server || !ses)
3458 /* Make sure that requests go through new root servers */
3459 rc = is_referral_server(ref_path + 1, tcon, &ref_server);
3463 put_root_ses(root_ses);
3464 set_root_ses(cifs_sb, ses, &root_ses);
3467 /* Get next dfs path and then continue chasing them if -EREMOTE */
3468 rc = next_dfs_prepath(cifs_sb, ctx, xid, server, tcon, &ref_path);
3469 /* Prevent recursion on broken link referrals */
3470 if (rc == -EREMOTE && ++count > MAX_NESTED_LINKS)
3472 } while (rc == -EREMOTE);
3476 put_root_ses(root_ses);
3481 * Store DFS full path in both superblock and tree connect structures.
3483 * For DFS root mounts, the prefix path (cifs_sb->prepath) is preserved during reconnect so
3484 * only the root path is set in cifs_sb->origin_fullpath and tcon->dfs_path. And for DFS
3485 * links, the prefix path is included in both and may be changed during reconnect. See
3486 * cifs_tree_connect().
3488 cifs_sb->origin_fullpath = kstrndup(full_path, strlen(full_path), GFP_KERNEL);
3489 if (!cifs_sb->origin_fullpath) {
3493 spin_lock(&cifs_tcp_ses_lock);
3494 tcon->dfs_path = full_path;
3496 tcon->remap = cifs_remap(cifs_sb);
3497 spin_unlock(&cifs_tcp_ses_lock);
3499 /* Add original context for DFS cache to be used when refreshing referrals */
3500 rc = dfs_cache_add_vol(mntdata, ctx, cifs_sb->origin_fullpath);
3504 * After reconnecting to a different server, unique ids won't
3505 * match anymore, so we disable serverino. This prevents
3506 * dentry revalidation to think the dentry are stale (ESTALE).
3508 cifs_autodisable_serverino(cifs_sb);
3510 * Force the use of prefix path to support failover on DFS paths that
3511 * resolve to targets that have different prefix paths.
3513 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
3514 kfree(cifs_sb->prepath);
3515 cifs_sb->prepath = ctx->prepath;
3516 ctx->prepath = NULL;
3520 cifs_try_adding_channels(cifs_sb, ses);
3521 return mount_setup_tlink(cifs_sb, ses, tcon);
3527 kfree(cifs_sb->origin_fullpath);
3528 put_root_ses(root_ses);
3529 mount_put_conns(cifs_sb, xid, server, ses, tcon);
3533 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
3537 struct cifs_ses *ses;
3538 struct cifs_tcon *tcon;
3539 struct TCP_Server_Info *server;
3541 rc = mount_get_conns(ctx, cifs_sb, &xid, &server, &ses, &tcon);
3546 rc = is_path_remote(cifs_sb, ctx, xid, server, tcon);
3555 return mount_setup_tlink(cifs_sb, ses, tcon);
3558 mount_put_conns(cifs_sb, xid, server, ses, tcon);
3564 * Issue a TREE_CONNECT request.
3567 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
3568 const char *tree, struct cifs_tcon *tcon,
3569 const struct nls_table *nls_codepage)
3571 struct smb_hdr *smb_buffer;
3572 struct smb_hdr *smb_buffer_response;
3575 unsigned char *bcc_ptr;
3578 __u16 bytes_left, count;
3583 smb_buffer = cifs_buf_get();
3584 if (smb_buffer == NULL)
3587 smb_buffer_response = smb_buffer;
3589 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
3590 NULL /*no tid */ , 4 /*wct */ );
3592 smb_buffer->Mid = get_next_mid(ses->server);
3593 smb_buffer->Uid = ses->Suid;
3594 pSMB = (TCONX_REQ *) smb_buffer;
3595 pSMBr = (TCONX_RSP *) smb_buffer_response;
3597 pSMB->AndXCommand = 0xFF;
3598 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
3599 bcc_ptr = &pSMB->Password[0];
3600 if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
3601 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
3602 *bcc_ptr = 0; /* password is null byte */
3603 bcc_ptr++; /* skip password */
3604 /* already aligned so no need to do it below */
3606 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
3607 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3608 specified as required (when that support is added to
3609 the vfs in the future) as only NTLM or the much
3610 weaker LANMAN (which we do not send by default) is accepted
3611 by Samba (not sure whether other servers allow
3612 NTLMv2 password here) */
3613 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3614 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
3615 (ses->sectype == LANMAN))
3616 calc_lanman_hash(tcon->password, ses->server->cryptkey,
3617 ses->server->sec_mode &
3618 SECMODE_PW_ENCRYPT ? true : false,
3621 #endif /* CIFS_WEAK_PW_HASH */
3622 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
3623 bcc_ptr, nls_codepage);
3625 cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
3627 cifs_buf_release(smb_buffer);
3631 bcc_ptr += CIFS_AUTH_RESP_SIZE;
3632 if (ses->capabilities & CAP_UNICODE) {
3633 /* must align unicode strings */
3634 *bcc_ptr = 0; /* null byte password */
3639 if (ses->server->sign)
3640 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
3642 if (ses->capabilities & CAP_STATUS32) {
3643 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
3645 if (ses->capabilities & CAP_DFS) {
3646 smb_buffer->Flags2 |= SMBFLG2_DFS;
3648 if (ses->capabilities & CAP_UNICODE) {
3649 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
3651 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
3652 6 /* max utf8 char length in bytes */ *
3653 (/* server len*/ + 256 /* share len */), nls_codepage);
3654 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
3655 bcc_ptr += 2; /* skip trailing null */
3656 } else { /* ASCII */
3657 strcpy(bcc_ptr, tree);
3658 bcc_ptr += strlen(tree) + 1;
3660 strcpy(bcc_ptr, "?????");
3661 bcc_ptr += strlen("?????");
3663 count = bcc_ptr - &pSMB->Password[0];
3664 be32_add_cpu(&pSMB->hdr.smb_buf_length, count);
3665 pSMB->ByteCount = cpu_to_le16(count);
3667 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
3670 /* above now done in SendReceive */
3674 tcon->tidStatus = CifsGood;
3675 tcon->need_reconnect = false;
3676 tcon->tid = smb_buffer_response->Tid;
3677 bcc_ptr = pByteArea(smb_buffer_response);
3678 bytes_left = get_bcc(smb_buffer_response);
3679 length = strnlen(bcc_ptr, bytes_left - 2);
3680 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
3686 /* skip service field (NB: this field is always ASCII) */
3688 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
3689 (bcc_ptr[2] == 'C')) {
3690 cifs_dbg(FYI, "IPC connection\n");
3694 } else if (length == 2) {
3695 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
3696 /* the most common case */
3697 cifs_dbg(FYI, "disk share connection\n");
3700 bcc_ptr += length + 1;
3701 bytes_left -= (length + 1);
3702 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
3704 /* mostly informational -- no need to fail on error here */
3705 kfree(tcon->nativeFileSystem);
3706 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
3707 bytes_left, is_unicode,
3710 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
3712 if ((smb_buffer_response->WordCount == 3) ||
3713 (smb_buffer_response->WordCount == 7))
3714 /* field is in same location */
3715 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
3718 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
3721 cifs_buf_release(smb_buffer);
3725 static void delayed_free(struct rcu_head *p)
3727 struct cifs_sb_info *cifs_sb = container_of(p, struct cifs_sb_info, rcu);
3729 unload_nls(cifs_sb->local_nls);
3730 smb3_cleanup_fs_context(cifs_sb->ctx);
3735 cifs_umount(struct cifs_sb_info *cifs_sb)
3737 struct rb_root *root = &cifs_sb->tlink_tree;
3738 struct rb_node *node;
3739 struct tcon_link *tlink;
3741 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
3743 spin_lock(&cifs_sb->tlink_tree_lock);
3744 while ((node = rb_first(root))) {
3745 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3746 cifs_get_tlink(tlink);
3747 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3748 rb_erase(node, root);
3750 spin_unlock(&cifs_sb->tlink_tree_lock);
3751 cifs_put_tlink(tlink);
3752 spin_lock(&cifs_sb->tlink_tree_lock);
3754 spin_unlock(&cifs_sb->tlink_tree_lock);
3756 kfree(cifs_sb->prepath);
3757 #ifdef CONFIG_CIFS_DFS_UPCALL
3758 dfs_cache_del_vol(cifs_sb->origin_fullpath);
3759 kfree(cifs_sb->origin_fullpath);
3761 call_rcu(&cifs_sb->rcu, delayed_free);
3765 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
3768 struct TCP_Server_Info *server = cifs_ses_server(ses);
3770 if (!server->ops->need_neg || !server->ops->negotiate)
3773 /* only send once per connect */
3774 if (!server->ops->need_neg(server))
3777 rc = server->ops->negotiate(xid, ses);
3779 spin_lock(&GlobalMid_Lock);
3780 if (server->tcpStatus == CifsNeedNegotiate)
3781 server->tcpStatus = CifsGood;
3784 spin_unlock(&GlobalMid_Lock);
3791 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
3792 struct nls_table *nls_info)
3795 struct TCP_Server_Info *server = cifs_ses_server(ses);
3797 if (!ses->binding) {
3798 ses->capabilities = server->capabilities;
3799 if (!linuxExtEnabled)
3800 ses->capabilities &= (~server->vals->cap_unix);
3802 if (ses->auth_key.response) {
3803 cifs_dbg(FYI, "Free previous auth_key.response = %p\n",
3804 ses->auth_key.response);
3805 kfree(ses->auth_key.response);
3806 ses->auth_key.response = NULL;
3807 ses->auth_key.len = 0;
3811 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
3812 server->sec_mode, server->capabilities, server->timeAdj);
3814 if (server->ops->sess_setup)
3815 rc = server->ops->sess_setup(xid, ses, nls_info);
3818 cifs_server_dbg(VFS, "Send error in SessSetup = %d\n", rc);
3824 cifs_set_vol_auth(struct smb3_fs_context *ctx, struct cifs_ses *ses)
3826 ctx->sectype = ses->sectype;
3828 /* krb5 is special, since we don't need username or pw */
3829 if (ctx->sectype == Kerberos)
3832 return cifs_set_cifscreds(ctx, ses);
3835 static struct cifs_tcon *
3836 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
3839 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
3840 struct cifs_ses *ses;
3841 struct cifs_tcon *tcon = NULL;
3842 struct smb3_fs_context *ctx;
3844 ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
3846 return ERR_PTR(-ENOMEM);
3848 ctx->local_nls = cifs_sb->local_nls;
3849 ctx->linux_uid = fsuid;
3850 ctx->cred_uid = fsuid;
3851 ctx->UNC = master_tcon->treeName;
3852 ctx->retry = master_tcon->retry;
3853 ctx->nocase = master_tcon->nocase;
3854 ctx->nohandlecache = master_tcon->nohandlecache;
3855 ctx->local_lease = master_tcon->local_lease;
3856 ctx->no_lease = master_tcon->no_lease;
3857 ctx->resilient = master_tcon->use_resilient;
3858 ctx->persistent = master_tcon->use_persistent;
3859 ctx->handle_timeout = master_tcon->handle_timeout;
3860 ctx->no_linux_ext = !master_tcon->unix_ext;
3861 ctx->linux_ext = master_tcon->posix_extensions;
3862 ctx->sectype = master_tcon->ses->sectype;
3863 ctx->sign = master_tcon->ses->sign;
3864 ctx->seal = master_tcon->seal;
3865 #ifdef CONFIG_CIFS_SWN_UPCALL
3866 ctx->witness = master_tcon->use_witness;
3869 rc = cifs_set_vol_auth(ctx, master_tcon->ses);
3875 /* get a reference for the same TCP session */
3876 spin_lock(&cifs_tcp_ses_lock);
3877 ++master_tcon->ses->server->srv_count;
3878 spin_unlock(&cifs_tcp_ses_lock);
3880 ses = cifs_get_smb_ses(master_tcon->ses->server, ctx);
3882 tcon = (struct cifs_tcon *)ses;
3883 cifs_put_tcp_session(master_tcon->ses->server, 0);
3887 tcon = cifs_get_tcon(ses, ctx);
3889 cifs_put_smb_ses(ses);
3894 reset_cifs_unix_caps(0, tcon, NULL, ctx);
3897 kfree(ctx->username);
3898 kfree_sensitive(ctx->password);
3905 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
3907 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
3910 /* find and return a tlink with given uid */
3911 static struct tcon_link *
3912 tlink_rb_search(struct rb_root *root, kuid_t uid)
3914 struct rb_node *node = root->rb_node;
3915 struct tcon_link *tlink;
3918 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3920 if (uid_gt(tlink->tl_uid, uid))
3921 node = node->rb_left;
3922 else if (uid_lt(tlink->tl_uid, uid))
3923 node = node->rb_right;
3930 /* insert a tcon_link into the tree */
3932 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
3934 struct rb_node **new = &(root->rb_node), *parent = NULL;
3935 struct tcon_link *tlink;
3938 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
3941 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
3942 new = &((*new)->rb_left);
3944 new = &((*new)->rb_right);
3947 rb_link_node(&new_tlink->tl_rbnode, parent, new);
3948 rb_insert_color(&new_tlink->tl_rbnode, root);
3952 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
3955 * If the superblock doesn't refer to a multiuser mount, then just return
3956 * the master tcon for the mount.
3958 * First, search the rbtree for an existing tcon for this fsuid. If one
3959 * exists, then check to see if it's pending construction. If it is then wait
3960 * for construction to complete. Once it's no longer pending, check to see if
3961 * it failed and either return an error or retry construction, depending on
3964 * If one doesn't exist then insert a new tcon_link struct into the tree and
3965 * try to construct a new one.
3968 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
3971 kuid_t fsuid = current_fsuid();
3972 struct tcon_link *tlink, *newtlink;
3974 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
3975 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3977 spin_lock(&cifs_sb->tlink_tree_lock);
3978 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
3980 cifs_get_tlink(tlink);
3981 spin_unlock(&cifs_sb->tlink_tree_lock);
3983 if (tlink == NULL) {
3984 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
3985 if (newtlink == NULL)
3986 return ERR_PTR(-ENOMEM);
3987 newtlink->tl_uid = fsuid;
3988 newtlink->tl_tcon = ERR_PTR(-EACCES);
3989 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
3990 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
3991 cifs_get_tlink(newtlink);
3993 spin_lock(&cifs_sb->tlink_tree_lock);
3994 /* was one inserted after previous search? */
3995 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
3997 cifs_get_tlink(tlink);
3998 spin_unlock(&cifs_sb->tlink_tree_lock);
4000 goto wait_for_construction;
4003 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4004 spin_unlock(&cifs_sb->tlink_tree_lock);
4006 wait_for_construction:
4007 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
4008 TASK_INTERRUPTIBLE);
4010 cifs_put_tlink(tlink);
4011 return ERR_PTR(-ERESTARTSYS);
4014 /* if it's good, return it */
4015 if (!IS_ERR(tlink->tl_tcon))
4018 /* return error if we tried this already recently */
4019 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
4020 cifs_put_tlink(tlink);
4021 return ERR_PTR(-EACCES);
4024 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
4025 goto wait_for_construction;
4028 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
4029 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
4030 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
4032 if (IS_ERR(tlink->tl_tcon)) {
4033 cifs_put_tlink(tlink);
4034 return ERR_PTR(-EACCES);
4041 * periodic workqueue job that scans tcon_tree for a superblock and closes
4045 cifs_prune_tlinks(struct work_struct *work)
4047 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
4049 struct rb_root *root = &cifs_sb->tlink_tree;
4050 struct rb_node *node;
4051 struct rb_node *tmp;
4052 struct tcon_link *tlink;
4055 * Because we drop the spinlock in the loop in order to put the tlink
4056 * it's not guarded against removal of links from the tree. The only
4057 * places that remove entries from the tree are this function and
4058 * umounts. Because this function is non-reentrant and is canceled
4059 * before umount can proceed, this is safe.
4061 spin_lock(&cifs_sb->tlink_tree_lock);
4062 node = rb_first(root);
4063 while (node != NULL) {
4065 node = rb_next(tmp);
4066 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
4068 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
4069 atomic_read(&tlink->tl_count) != 0 ||
4070 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
4073 cifs_get_tlink(tlink);
4074 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4075 rb_erase(tmp, root);
4077 spin_unlock(&cifs_sb->tlink_tree_lock);
4078 cifs_put_tlink(tlink);
4079 spin_lock(&cifs_sb->tlink_tree_lock);
4081 spin_unlock(&cifs_sb->tlink_tree_lock);
4083 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4087 #ifdef CONFIG_CIFS_DFS_UPCALL
4088 int cifs_tree_connect(const unsigned int xid, struct cifs_tcon *tcon, const struct nls_table *nlsc)
4091 struct TCP_Server_Info *server = tcon->ses->server;
4092 const struct smb_version_operations *ops = server->ops;
4093 struct dfs_cache_tgt_list tl;
4094 struct dfs_cache_tgt_iterator *it = NULL;
4096 const char *tcp_host;
4097 size_t tcp_host_len;
4098 const char *dfs_host;
4099 size_t dfs_host_len;
4100 char *share = NULL, *prefix = NULL;
4101 struct dfs_info3_param ref = {0};
4104 tree = kzalloc(MAX_TREE_SIZE, GFP_KERNEL);
4108 if (!tcon->dfs_path) {
4110 scnprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$", server->hostname);
4111 rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
4113 rc = ops->tree_connect(xid, tcon->ses, tcon->treeName, tcon, nlsc);
4118 rc = dfs_cache_noreq_find(tcon->dfs_path + 1, &ref, &tl);
4121 isroot = ref.server_type == DFS_TYPE_ROOT;
4122 free_dfs_info_param(&ref);
4124 extract_unc_hostname(server->hostname, &tcp_host, &tcp_host_len);
4126 for (it = dfs_cache_get_tgt_iterator(&tl); it; it = dfs_cache_get_next_tgt(&tl, it)) {
4134 rc = dfs_cache_get_tgt_share(tcon->dfs_path + 1, it, &share, &prefix);
4136 cifs_dbg(VFS, "%s: failed to parse target share %d\n",
4141 extract_unc_hostname(share, &dfs_host, &dfs_host_len);
4143 if (dfs_host_len != tcp_host_len
4144 || strncasecmp(dfs_host, tcp_host, dfs_host_len) != 0) {
4145 cifs_dbg(FYI, "%s: %.*s doesn't match %.*s\n", __func__, (int)dfs_host_len,
4146 dfs_host, (int)tcp_host_len, tcp_host);
4148 rc = match_target_ip(server, dfs_host, dfs_host_len, &target_match);
4150 cifs_dbg(VFS, "%s: failed to match target ip: %d\n", __func__, rc);
4154 if (!target_match) {
4155 cifs_dbg(FYI, "%s: skipping target\n", __func__);
4161 scnprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$", share);
4162 rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
4164 scnprintf(tree, MAX_TREE_SIZE, "\\%s", share);
4165 rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
4166 /* Only handle prefix paths of DFS link targets */
4167 if (!rc && !isroot) {
4168 rc = update_super_prepath(tcon, prefix);
4181 rc = dfs_cache_noreq_update_tgthint(tcon->dfs_path + 1, it);
4185 dfs_cache_free_tgts(&tl);
4191 int cifs_tree_connect(const unsigned int xid, struct cifs_tcon *tcon, const struct nls_table *nlsc)
4193 const struct smb_version_operations *ops = tcon->ses->server->ops;
4195 return ops->tree_connect(xid, tcon->ses, tcon->treeName, tcon, nlsc);