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));
160 rc = reconn_set_ipaddr_from_hostname(server);
162 cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
167 static inline int reconn_setup_dfs_targets(struct cifs_sb_info *cifs_sb,
168 struct dfs_cache_tgt_list *tl)
170 if (!cifs_sb->origin_fullpath)
172 return dfs_cache_noreq_find(cifs_sb->origin_fullpath + 1, NULL, tl);
177 * cifs tcp session reconnection
179 * mark tcp session as reconnecting so temporarily locked
180 * mark all smb sessions as reconnecting for tcp session
181 * reconnect tcp session
182 * wake up waiters on reconnection? - (not needed currently)
185 cifs_reconnect(struct TCP_Server_Info *server)
188 struct list_head *tmp, *tmp2;
189 struct cifs_ses *ses;
190 struct cifs_tcon *tcon;
191 struct mid_q_entry *mid_entry;
192 struct list_head retry_list;
193 #ifdef CONFIG_CIFS_DFS_UPCALL
194 struct super_block *sb = NULL;
195 struct cifs_sb_info *cifs_sb = NULL;
196 struct dfs_cache_tgt_list tgt_list = {0};
197 struct dfs_cache_tgt_iterator *tgt_it = NULL;
200 spin_lock(&GlobalMid_Lock);
201 server->nr_targets = 1;
202 #ifdef CONFIG_CIFS_DFS_UPCALL
203 spin_unlock(&GlobalMid_Lock);
204 sb = cifs_get_tcp_super(server);
207 cifs_dbg(FYI, "%s: will not do DFS failover: rc = %d\n",
211 cifs_sb = CIFS_SB(sb);
212 rc = reconn_setup_dfs_targets(cifs_sb, &tgt_list);
215 if (rc != -EOPNOTSUPP) {
216 cifs_server_dbg(VFS, "%s: no target servers for DFS failover\n",
220 server->nr_targets = dfs_cache_get_nr_tgts(&tgt_list);
223 cifs_dbg(FYI, "%s: will retry %d target(s)\n", __func__,
225 spin_lock(&GlobalMid_Lock);
227 if (server->tcpStatus == CifsExiting) {
228 /* the demux thread will exit normally
229 next time through the loop */
230 spin_unlock(&GlobalMid_Lock);
231 #ifdef CONFIG_CIFS_DFS_UPCALL
232 dfs_cache_free_tgts(&tgt_list);
233 cifs_put_tcp_super(sb);
235 wake_up(&server->response_q);
238 server->tcpStatus = CifsNeedReconnect;
239 spin_unlock(&GlobalMid_Lock);
241 server->max_read = 0;
243 cifs_dbg(FYI, "Mark tcp session as need reconnect\n");
244 trace_smb3_reconnect(server->CurrentMid, server->hostname);
246 /* before reconnecting the tcp session, mark the smb session (uid)
247 and the tid bad so they are not used until reconnected */
248 cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
250 spin_lock(&cifs_tcp_ses_lock);
251 list_for_each(tmp, &server->smb_ses_list) {
252 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
253 ses->need_reconnect = true;
254 list_for_each(tmp2, &ses->tcon_list) {
255 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
256 tcon->need_reconnect = true;
259 ses->tcon_ipc->need_reconnect = true;
261 spin_unlock(&cifs_tcp_ses_lock);
263 /* do not want to be sending data on a socket we are freeing */
264 cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
265 mutex_lock(&server->srv_mutex);
266 if (server->ssocket) {
267 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
268 server->ssocket->state, server->ssocket->flags);
269 kernel_sock_shutdown(server->ssocket, SHUT_WR);
270 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
271 server->ssocket->state, server->ssocket->flags);
272 sock_release(server->ssocket);
273 server->ssocket = NULL;
275 server->sequence_number = 0;
276 server->session_estab = false;
277 kfree(server->session_key.response);
278 server->session_key.response = NULL;
279 server->session_key.len = 0;
280 server->lstrp = jiffies;
282 /* mark submitted MIDs for retry and issue callback */
283 INIT_LIST_HEAD(&retry_list);
284 cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
285 spin_lock(&GlobalMid_Lock);
286 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
287 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
288 kref_get(&mid_entry->refcount);
289 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
290 mid_entry->mid_state = MID_RETRY_NEEDED;
291 list_move(&mid_entry->qhead, &retry_list);
292 mid_entry->mid_flags |= MID_DELETED;
294 spin_unlock(&GlobalMid_Lock);
295 mutex_unlock(&server->srv_mutex);
297 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
298 list_for_each_safe(tmp, tmp2, &retry_list) {
299 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
300 list_del_init(&mid_entry->qhead);
301 mid_entry->callback(mid_entry);
302 cifs_mid_q_entry_release(mid_entry);
305 if (cifs_rdma_enabled(server)) {
306 mutex_lock(&server->srv_mutex);
307 smbd_destroy(server);
308 mutex_unlock(&server->srv_mutex);
314 mutex_lock(&server->srv_mutex);
316 #ifdef CONFIG_CIFS_SWN_UPCALL
317 if (server->use_swn_dstaddr) {
318 server->dstaddr = server->swn_dstaddr;
322 #ifdef CONFIG_CIFS_DFS_UPCALL
324 * Set up next DFS target server (if any) for reconnect. If DFS
325 * feature is disabled, then we will retry last server we
326 * connected to before.
328 reconn_set_next_dfs_target(server, cifs_sb, &tgt_list, &tgt_it);
331 #ifdef CONFIG_CIFS_SWN_UPCALL
335 if (cifs_rdma_enabled(server))
336 rc = smbd_reconnect(server);
338 rc = generic_ip_connect(server);
340 cifs_dbg(FYI, "reconnect error %d\n", rc);
341 mutex_unlock(&server->srv_mutex);
344 atomic_inc(&tcpSesReconnectCount);
345 set_credits(server, 1);
346 spin_lock(&GlobalMid_Lock);
347 if (server->tcpStatus != CifsExiting)
348 server->tcpStatus = CifsNeedNegotiate;
349 spin_unlock(&GlobalMid_Lock);
350 #ifdef CONFIG_CIFS_SWN_UPCALL
351 server->use_swn_dstaddr = false;
353 mutex_unlock(&server->srv_mutex);
355 } while (server->tcpStatus == CifsNeedReconnect);
357 #ifdef CONFIG_CIFS_DFS_UPCALL
359 rc = dfs_cache_noreq_update_tgthint(cifs_sb->origin_fullpath + 1,
362 cifs_server_dbg(VFS, "%s: failed to update DFS target hint: rc = %d\n",
365 rc = dfs_cache_update_vol(cifs_sb->origin_fullpath, server);
367 cifs_server_dbg(VFS, "%s: failed to update vol info in DFS cache: rc = %d\n",
370 dfs_cache_free_tgts(&tgt_list);
374 cifs_put_tcp_super(sb);
376 if (server->tcpStatus == CifsNeedNegotiate)
377 mod_delayed_work(cifsiod_wq, &server->echo, 0);
379 wake_up(&server->response_q);
384 cifs_echo_request(struct work_struct *work)
387 struct TCP_Server_Info *server = container_of(work,
388 struct TCP_Server_Info, echo.work);
389 unsigned long echo_interval;
392 * If we need to renegotiate, set echo interval to zero to
393 * immediately call echo service where we can renegotiate.
395 if (server->tcpStatus == CifsNeedNegotiate)
398 echo_interval = server->echo_interval;
401 * We cannot send an echo if it is disabled.
402 * Also, no need to ping if we got a response recently.
405 if (server->tcpStatus == CifsNeedReconnect ||
406 server->tcpStatus == CifsExiting ||
407 server->tcpStatus == CifsNew ||
408 (server->ops->can_echo && !server->ops->can_echo(server)) ||
409 time_before(jiffies, server->lstrp + echo_interval - HZ))
412 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
414 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
417 #ifdef CONFIG_CIFS_SWN_UPCALL
418 /* Check witness registrations */
423 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
427 allocate_buffers(struct TCP_Server_Info *server)
429 if (!server->bigbuf) {
430 server->bigbuf = (char *)cifs_buf_get();
431 if (!server->bigbuf) {
432 cifs_server_dbg(VFS, "No memory for large SMB response\n");
434 /* retry will check if exiting */
437 } else if (server->large_buf) {
438 /* we are reusing a dirty large buf, clear its start */
439 memset(server->bigbuf, 0, HEADER_SIZE(server));
442 if (!server->smallbuf) {
443 server->smallbuf = (char *)cifs_small_buf_get();
444 if (!server->smallbuf) {
445 cifs_server_dbg(VFS, "No memory for SMB response\n");
447 /* retry will check if exiting */
450 /* beginning of smb buffer is cleared in our buf_get */
452 /* if existing small buf clear beginning */
453 memset(server->smallbuf, 0, HEADER_SIZE(server));
460 server_unresponsive(struct TCP_Server_Info *server)
463 * We need to wait 3 echo intervals to make sure we handle such
465 * 1s client sends a normal SMB request
466 * 2s client gets a response
467 * 30s echo workqueue job pops, and decides we got a response recently
468 * and don't need to send another
470 * 65s kernel_recvmsg times out, and we see that we haven't gotten
471 * a response in >60s.
473 if ((server->tcpStatus == CifsGood ||
474 server->tcpStatus == CifsNeedNegotiate) &&
475 time_after(jiffies, server->lstrp + 3 * server->echo_interval)) {
476 cifs_server_dbg(VFS, "has not responded in %lu seconds. Reconnecting...\n",
477 (3 * server->echo_interval) / HZ);
478 cifs_reconnect(server);
486 zero_credits(struct TCP_Server_Info *server)
490 spin_lock(&server->req_lock);
491 val = server->credits + server->echo_credits + server->oplock_credits;
492 if (server->in_flight == 0 && val == 0) {
493 spin_unlock(&server->req_lock);
496 spin_unlock(&server->req_lock);
501 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
506 smb_msg->msg_control = NULL;
507 smb_msg->msg_controllen = 0;
509 for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
512 /* reconnect if no credits and no requests in flight */
513 if (zero_credits(server)) {
514 cifs_reconnect(server);
515 return -ECONNABORTED;
518 if (server_unresponsive(server))
519 return -ECONNABORTED;
520 if (cifs_rdma_enabled(server) && server->smbd_conn)
521 length = smbd_recv(server->smbd_conn, smb_msg);
523 length = sock_recvmsg(server->ssocket, smb_msg, 0);
525 if (server->tcpStatus == CifsExiting)
528 if (server->tcpStatus == CifsNeedReconnect) {
529 cifs_reconnect(server);
530 return -ECONNABORTED;
533 if (length == -ERESTARTSYS ||
537 * Minimum sleep to prevent looping, allowing socket
538 * to clear and app threads to set tcpStatus
539 * CifsNeedReconnect if server hung.
541 usleep_range(1000, 2000);
547 cifs_dbg(FYI, "Received no data or error: %d\n", length);
548 cifs_reconnect(server);
549 return -ECONNABORTED;
556 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
557 unsigned int to_read)
559 struct msghdr smb_msg;
560 struct kvec iov = {.iov_base = buf, .iov_len = to_read};
561 iov_iter_kvec(&smb_msg.msg_iter, READ, &iov, 1, to_read);
563 return cifs_readv_from_socket(server, &smb_msg);
567 cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
568 unsigned int page_offset, unsigned int to_read)
570 struct msghdr smb_msg;
571 struct bio_vec bv = {
572 .bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
573 iov_iter_bvec(&smb_msg.msg_iter, READ, &bv, 1, to_read);
574 return cifs_readv_from_socket(server, &smb_msg);
578 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
581 * The first byte big endian of the length field,
582 * is actually not part of the length but the type
583 * with the most common, zero, as regular data.
586 case RFC1002_SESSION_MESSAGE:
587 /* Regular SMB response */
589 case RFC1002_SESSION_KEEP_ALIVE:
590 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
592 case RFC1002_POSITIVE_SESSION_RESPONSE:
593 cifs_dbg(FYI, "RFC 1002 positive session response\n");
595 case RFC1002_NEGATIVE_SESSION_RESPONSE:
597 * We get this from Windows 98 instead of an error on
598 * SMB negprot response.
600 cifs_dbg(FYI, "RFC 1002 negative session response\n");
601 /* give server a second to clean up */
604 * Always try 445 first on reconnect since we get NACK
605 * on some if we ever connected to port 139 (the NACK
606 * is since we do not begin with RFC1001 session
609 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
610 cifs_reconnect(server);
613 cifs_server_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
614 cifs_reconnect(server);
621 dequeue_mid(struct mid_q_entry *mid, bool malformed)
623 #ifdef CONFIG_CIFS_STATS2
624 mid->when_received = jiffies;
626 spin_lock(&GlobalMid_Lock);
628 mid->mid_state = MID_RESPONSE_RECEIVED;
630 mid->mid_state = MID_RESPONSE_MALFORMED;
632 * Trying to handle/dequeue a mid after the send_recv()
633 * function has finished processing it is a bug.
635 if (mid->mid_flags & MID_DELETED)
636 pr_warn_once("trying to dequeue a deleted mid\n");
638 list_del_init(&mid->qhead);
639 mid->mid_flags |= MID_DELETED;
641 spin_unlock(&GlobalMid_Lock);
645 smb2_get_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
647 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
650 * SMB1 does not use credits.
652 if (server->vals->header_preamble_size)
655 return le16_to_cpu(shdr->CreditRequest);
659 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
660 char *buf, int malformed)
662 if (server->ops->check_trans2 &&
663 server->ops->check_trans2(mid, server, buf, malformed))
665 mid->credits_received = smb2_get_credits_from_hdr(buf, server);
667 mid->large_buf = server->large_buf;
668 /* Was previous buf put in mpx struct for multi-rsp? */
669 if (!mid->multiRsp) {
670 /* smb buffer will be freed by user thread */
671 if (server->large_buf)
672 server->bigbuf = NULL;
674 server->smallbuf = NULL;
676 dequeue_mid(mid, malformed);
679 static void clean_demultiplex_info(struct TCP_Server_Info *server)
683 /* take it off the list, if it's not already */
684 spin_lock(&cifs_tcp_ses_lock);
685 list_del_init(&server->tcp_ses_list);
686 spin_unlock(&cifs_tcp_ses_lock);
688 cancel_delayed_work_sync(&server->echo);
690 spin_lock(&GlobalMid_Lock);
691 server->tcpStatus = CifsExiting;
692 spin_unlock(&GlobalMid_Lock);
693 wake_up_all(&server->response_q);
695 /* check if we have blocked requests that need to free */
696 spin_lock(&server->req_lock);
697 if (server->credits <= 0)
699 spin_unlock(&server->req_lock);
701 * Although there should not be any requests blocked on this queue it
702 * can not hurt to be paranoid and try to wake up requests that may
703 * haven been blocked when more than 50 at time were on the wire to the
704 * same server - they now will see the session is in exit state and get
705 * out of SendReceive.
707 wake_up_all(&server->request_q);
708 /* give those requests time to exit */
710 if (cifs_rdma_enabled(server))
711 smbd_destroy(server);
712 if (server->ssocket) {
713 sock_release(server->ssocket);
714 server->ssocket = NULL;
717 if (!list_empty(&server->pending_mid_q)) {
718 struct list_head dispose_list;
719 struct mid_q_entry *mid_entry;
720 struct list_head *tmp, *tmp2;
722 INIT_LIST_HEAD(&dispose_list);
723 spin_lock(&GlobalMid_Lock);
724 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
725 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
726 cifs_dbg(FYI, "Clearing mid 0x%llx\n", mid_entry->mid);
727 kref_get(&mid_entry->refcount);
728 mid_entry->mid_state = MID_SHUTDOWN;
729 list_move(&mid_entry->qhead, &dispose_list);
730 mid_entry->mid_flags |= MID_DELETED;
732 spin_unlock(&GlobalMid_Lock);
734 /* now walk dispose list and issue callbacks */
735 list_for_each_safe(tmp, tmp2, &dispose_list) {
736 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
737 cifs_dbg(FYI, "Callback mid 0x%llx\n", mid_entry->mid);
738 list_del_init(&mid_entry->qhead);
739 mid_entry->callback(mid_entry);
740 cifs_mid_q_entry_release(mid_entry);
742 /* 1/8th of sec is more than enough time for them to exit */
746 if (!list_empty(&server->pending_mid_q)) {
748 * mpx threads have not exited yet give them at least the smb
749 * send timeout time for long ops.
751 * Due to delays on oplock break requests, we need to wait at
752 * least 45 seconds before giving up on a request getting a
753 * response and going ahead and killing cifsd.
755 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
758 * If threads still have not exited they are probably never
759 * coming home not much else we can do but free the memory.
763 kfree(server->hostname);
766 length = atomic_dec_return(&tcpSesAllocCount);
768 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
772 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
775 char *buf = server->smallbuf;
776 unsigned int pdu_length = server->pdu_size;
778 /* make sure this will fit in a large buffer */
779 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
780 server->vals->header_preamble_size) {
781 cifs_server_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
782 cifs_reconnect(server);
783 return -ECONNABORTED;
786 /* switch to large buffer if too big for a small one */
787 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
788 server->large_buf = true;
789 memcpy(server->bigbuf, buf, server->total_read);
790 buf = server->bigbuf;
793 /* now read the rest */
794 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
795 pdu_length - HEADER_SIZE(server) + 1
796 + server->vals->header_preamble_size);
800 server->total_read += length;
802 dump_smb(buf, server->total_read);
804 return cifs_handle_standard(server, mid);
808 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
810 char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
814 * We know that we received enough to get to the MID as we
815 * checked the pdu_length earlier. Now check to see
816 * if the rest of the header is OK. We borrow the length
817 * var for the rest of the loop to avoid a new stack var.
819 * 48 bytes is enough to display the header and a little bit
820 * into the payload for debugging purposes.
822 length = server->ops->check_message(buf, server->total_read, server);
824 cifs_dump_mem("Bad SMB: ", buf,
825 min_t(unsigned int, server->total_read, 48));
827 if (server->ops->is_session_expired &&
828 server->ops->is_session_expired(buf)) {
829 cifs_reconnect(server);
833 if (server->ops->is_status_pending &&
834 server->ops->is_status_pending(buf, server))
840 handle_mid(mid, server, buf, length);
845 smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
847 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
848 int scredits = server->credits;
851 * SMB1 does not use credits.
853 if (server->vals->header_preamble_size)
856 if (shdr->CreditRequest) {
857 spin_lock(&server->req_lock);
858 server->credits += le16_to_cpu(shdr->CreditRequest);
859 spin_unlock(&server->req_lock);
860 wake_up(&server->request_q);
862 trace_smb3_add_credits(server->CurrentMid,
863 server->hostname, scredits,
864 le16_to_cpu(shdr->CreditRequest));
865 cifs_server_dbg(FYI, "%s: added %u credits total=%d\n",
866 __func__, le16_to_cpu(shdr->CreditRequest),
873 cifs_demultiplex_thread(void *p)
875 int i, num_mids, length;
876 struct TCP_Server_Info *server = p;
877 unsigned int pdu_length;
878 unsigned int next_offset;
880 struct task_struct *task_to_wake = NULL;
881 struct mid_q_entry *mids[MAX_COMPOUND];
882 char *bufs[MAX_COMPOUND];
883 unsigned int noreclaim_flag, num_io_timeout = 0;
885 noreclaim_flag = memalloc_noreclaim_save();
886 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
888 length = atomic_inc_return(&tcpSesAllocCount);
890 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
893 allow_kernel_signal(SIGKILL);
894 while (server->tcpStatus != CifsExiting) {
898 if (!allocate_buffers(server))
901 server->large_buf = false;
902 buf = server->smallbuf;
903 pdu_length = 4; /* enough to get RFC1001 header */
905 length = cifs_read_from_socket(server, buf, pdu_length);
909 if (server->vals->header_preamble_size == 0)
910 server->total_read = 0;
912 server->total_read = length;
915 * The right amount was read from socket - 4 bytes,
916 * so we can now interpret the length field.
918 pdu_length = get_rfc1002_length(buf);
920 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
921 if (!is_smb_response(server, buf[0]))
924 server->pdu_size = pdu_length;
926 /* make sure we have enough to get to the MID */
927 if (server->pdu_size < HEADER_SIZE(server) - 1 -
928 server->vals->header_preamble_size) {
929 cifs_server_dbg(VFS, "SMB response too short (%u bytes)\n",
931 cifs_reconnect(server);
935 /* read down to the MID */
936 length = cifs_read_from_socket(server,
937 buf + server->vals->header_preamble_size,
938 HEADER_SIZE(server) - 1
939 - server->vals->header_preamble_size);
942 server->total_read += length;
944 if (server->ops->next_header) {
945 next_offset = server->ops->next_header(buf);
947 server->pdu_size = next_offset;
950 memset(mids, 0, sizeof(mids));
951 memset(bufs, 0, sizeof(bufs));
954 if (server->ops->is_transform_hdr &&
955 server->ops->receive_transform &&
956 server->ops->is_transform_hdr(buf)) {
957 length = server->ops->receive_transform(server,
962 mids[0] = server->ops->find_mid(server, buf);
966 if (!mids[0] || !mids[0]->receive)
967 length = standard_receive3(server, mids[0]);
969 length = mids[0]->receive(server, mids[0]);
973 for (i = 0; i < num_mids; i++)
975 cifs_mid_q_entry_release(mids[i]);
979 if (server->ops->is_status_io_timeout &&
980 server->ops->is_status_io_timeout(buf)) {
982 if (num_io_timeout > NUM_STATUS_IO_TIMEOUT) {
983 cifs_reconnect(server);
989 server->lstrp = jiffies;
991 for (i = 0; i < num_mids; i++) {
992 if (mids[i] != NULL) {
993 mids[i]->resp_buf_size = server->pdu_size;
995 if (!mids[i]->multiRsp || mids[i]->multiEnd)
996 mids[i]->callback(mids[i]);
998 cifs_mid_q_entry_release(mids[i]);
999 } else if (server->ops->is_oplock_break &&
1000 server->ops->is_oplock_break(bufs[i],
1002 smb2_add_credits_from_hdr(bufs[i], server);
1003 cifs_dbg(FYI, "Received oplock break\n");
1005 cifs_server_dbg(VFS, "No task to wake, unknown frame received! NumMids %d\n",
1006 atomic_read(&midCount));
1007 cifs_dump_mem("Received Data is: ", bufs[i],
1008 HEADER_SIZE(server));
1009 smb2_add_credits_from_hdr(bufs[i], server);
1010 #ifdef CONFIG_CIFS_DEBUG2
1011 if (server->ops->dump_detail)
1012 server->ops->dump_detail(bufs[i],
1014 cifs_dump_mids(server);
1015 #endif /* CIFS_DEBUG2 */
1019 if (pdu_length > server->pdu_size) {
1020 if (!allocate_buffers(server))
1022 pdu_length -= server->pdu_size;
1023 server->total_read = 0;
1024 server->large_buf = false;
1025 buf = server->smallbuf;
1028 } /* end while !EXITING */
1030 /* buffer usually freed in free_mid - need to free it here on exit */
1031 cifs_buf_release(server->bigbuf);
1032 if (server->smallbuf) /* no sense logging a debug message if NULL */
1033 cifs_small_buf_release(server->smallbuf);
1035 task_to_wake = xchg(&server->tsk, NULL);
1036 clean_demultiplex_info(server);
1038 /* if server->tsk was NULL then wait for a signal before exiting */
1039 if (!task_to_wake) {
1040 set_current_state(TASK_INTERRUPTIBLE);
1041 while (!signal_pending(current)) {
1043 set_current_state(TASK_INTERRUPTIBLE);
1045 set_current_state(TASK_RUNNING);
1048 memalloc_noreclaim_restore(noreclaim_flag);
1049 module_put_and_exit(0);
1053 * Returns true if srcaddr isn't specified and rhs isn't specified, or
1054 * if srcaddr is specified and matches the IP address of the rhs argument
1057 cifs_match_ipaddr(struct sockaddr *srcaddr, struct sockaddr *rhs)
1059 switch (srcaddr->sa_family) {
1061 return (rhs->sa_family == AF_UNSPEC);
1063 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
1064 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
1065 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
1068 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
1069 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
1070 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
1074 return false; /* don't expect to be here */
1079 * If no port is specified in addr structure, we try to match with 445 port
1080 * and if it fails - with 139 ports. It should be called only if address
1081 * families of server and addr are equal.
1084 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
1086 __be16 port, *sport;
1088 /* SMBDirect manages its own ports, don't match it here */
1092 switch (addr->sa_family) {
1094 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
1095 port = ((struct sockaddr_in *) addr)->sin_port;
1098 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
1099 port = ((struct sockaddr_in6 *) addr)->sin6_port;
1107 port = htons(CIFS_PORT);
1111 port = htons(RFC1001_PORT);
1114 return port == *sport;
1118 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
1119 struct sockaddr *srcaddr)
1121 switch (addr->sa_family) {
1123 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
1124 struct sockaddr_in *srv_addr4 =
1125 (struct sockaddr_in *)&server->dstaddr;
1127 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
1132 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
1133 struct sockaddr_in6 *srv_addr6 =
1134 (struct sockaddr_in6 *)&server->dstaddr;
1136 if (!ipv6_addr_equal(&addr6->sin6_addr,
1137 &srv_addr6->sin6_addr))
1139 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
1145 return false; /* don't expect to be here */
1148 if (!cifs_match_ipaddr(srcaddr, (struct sockaddr *)&server->srcaddr))
1155 match_security(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1158 * The select_sectype function should either return the ctx->sectype
1159 * that was specified, or "Unspecified" if that sectype was not
1160 * compatible with the given NEGOTIATE request.
1162 if (server->ops->select_sectype(server, ctx->sectype)
1167 * Now check if signing mode is acceptable. No need to check
1168 * global_secflags at this point since if MUST_SIGN is set then
1169 * the server->sign had better be too.
1171 if (ctx->sign && !server->sign)
1177 static int match_server(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1179 struct sockaddr *addr = (struct sockaddr *)&ctx->dstaddr;
1181 if (ctx->nosharesock)
1184 /* If multidialect negotiation see if existing sessions match one */
1185 if (strcmp(ctx->vals->version_string, SMB3ANY_VERSION_STRING) == 0) {
1186 if (server->vals->protocol_id < SMB30_PROT_ID)
1188 } else if (strcmp(ctx->vals->version_string,
1189 SMBDEFAULT_VERSION_STRING) == 0) {
1190 if (server->vals->protocol_id < SMB21_PROT_ID)
1192 } else if ((server->vals != ctx->vals) || (server->ops != ctx->ops))
1195 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
1198 if (!match_address(server, addr,
1199 (struct sockaddr *)&ctx->srcaddr))
1202 if (!match_port(server, addr))
1205 if (!match_security(server, ctx))
1208 if (server->echo_interval != ctx->echo_interval * HZ)
1211 if (server->rdma != ctx->rdma)
1214 if (server->ignore_signature != ctx->ignore_signature)
1217 if (server->min_offload != ctx->min_offload)
1223 struct TCP_Server_Info *
1224 cifs_find_tcp_session(struct smb3_fs_context *ctx)
1226 struct TCP_Server_Info *server;
1228 spin_lock(&cifs_tcp_ses_lock);
1229 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
1231 * Skip ses channels since they're only handled in lower layers
1232 * (e.g. cifs_send_recv).
1234 if (server->is_channel || !match_server(server, ctx))
1237 ++server->srv_count;
1238 spin_unlock(&cifs_tcp_ses_lock);
1239 cifs_dbg(FYI, "Existing tcp session with server found\n");
1242 spin_unlock(&cifs_tcp_ses_lock);
1247 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
1249 struct task_struct *task;
1251 spin_lock(&cifs_tcp_ses_lock);
1252 if (--server->srv_count > 0) {
1253 spin_unlock(&cifs_tcp_ses_lock);
1257 put_net(cifs_net_ns(server));
1259 list_del_init(&server->tcp_ses_list);
1260 spin_unlock(&cifs_tcp_ses_lock);
1262 cancel_delayed_work_sync(&server->echo);
1266 * Avoid deadlock here: reconnect work calls
1267 * cifs_put_tcp_session() at its end. Need to be sure
1268 * that reconnect work does nothing with server pointer after
1271 cancel_delayed_work(&server->reconnect);
1273 cancel_delayed_work_sync(&server->reconnect);
1275 spin_lock(&GlobalMid_Lock);
1276 server->tcpStatus = CifsExiting;
1277 spin_unlock(&GlobalMid_Lock);
1279 cifs_crypto_secmech_release(server);
1280 cifs_fscache_release_client_cookie(server);
1282 kfree(server->session_key.response);
1283 server->session_key.response = NULL;
1284 server->session_key.len = 0;
1286 task = xchg(&server->tsk, NULL);
1288 send_sig(SIGKILL, task, 1);
1291 struct TCP_Server_Info *
1292 cifs_get_tcp_session(struct smb3_fs_context *ctx)
1294 struct TCP_Server_Info *tcp_ses = NULL;
1297 cifs_dbg(FYI, "UNC: %s\n", ctx->UNC);
1299 /* see if we already have a matching tcp_ses */
1300 tcp_ses = cifs_find_tcp_session(ctx);
1304 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
1310 tcp_ses->ops = ctx->ops;
1311 tcp_ses->vals = ctx->vals;
1312 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
1313 tcp_ses->hostname = extract_hostname(ctx->UNC);
1314 if (IS_ERR(tcp_ses->hostname)) {
1315 rc = PTR_ERR(tcp_ses->hostname);
1316 goto out_err_crypto_release;
1319 tcp_ses->noblockcnt = ctx->rootfs;
1320 tcp_ses->noblocksnd = ctx->noblocksnd || ctx->rootfs;
1321 tcp_ses->noautotune = ctx->noautotune;
1322 tcp_ses->tcp_nodelay = ctx->sockopt_tcp_nodelay;
1323 tcp_ses->rdma = ctx->rdma;
1324 tcp_ses->in_flight = 0;
1325 tcp_ses->max_in_flight = 0;
1326 tcp_ses->credits = 1;
1327 init_waitqueue_head(&tcp_ses->response_q);
1328 init_waitqueue_head(&tcp_ses->request_q);
1329 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
1330 mutex_init(&tcp_ses->srv_mutex);
1331 memcpy(tcp_ses->workstation_RFC1001_name,
1332 ctx->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
1333 memcpy(tcp_ses->server_RFC1001_name,
1334 ctx->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
1335 tcp_ses->session_estab = false;
1336 tcp_ses->sequence_number = 0;
1337 tcp_ses->reconnect_instance = 1;
1338 tcp_ses->lstrp = jiffies;
1339 tcp_ses->compress_algorithm = cpu_to_le16(ctx->compression);
1340 spin_lock_init(&tcp_ses->req_lock);
1341 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
1342 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
1343 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
1344 INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
1345 mutex_init(&tcp_ses->reconnect_mutex);
1346 memcpy(&tcp_ses->srcaddr, &ctx->srcaddr,
1347 sizeof(tcp_ses->srcaddr));
1348 memcpy(&tcp_ses->dstaddr, &ctx->dstaddr,
1349 sizeof(tcp_ses->dstaddr));
1350 if (ctx->use_client_guid)
1351 memcpy(tcp_ses->client_guid, ctx->client_guid,
1352 SMB2_CLIENT_GUID_SIZE);
1354 generate_random_uuid(tcp_ses->client_guid);
1356 * at this point we are the only ones with the pointer
1357 * to the struct since the kernel thread not created yet
1358 * no need to spinlock this init of tcpStatus or srv_count
1360 tcp_ses->tcpStatus = CifsNew;
1361 ++tcp_ses->srv_count;
1363 if (ctx->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
1364 ctx->echo_interval <= SMB_ECHO_INTERVAL_MAX)
1365 tcp_ses->echo_interval = ctx->echo_interval * HZ;
1367 tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
1368 if (tcp_ses->rdma) {
1369 #ifndef CONFIG_CIFS_SMB_DIRECT
1370 cifs_dbg(VFS, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
1372 goto out_err_crypto_release;
1374 tcp_ses->smbd_conn = smbd_get_connection(
1375 tcp_ses, (struct sockaddr *)&ctx->dstaddr);
1376 if (tcp_ses->smbd_conn) {
1377 cifs_dbg(VFS, "RDMA transport established\n");
1379 goto smbd_connected;
1382 goto out_err_crypto_release;
1385 rc = ip_connect(tcp_ses);
1387 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
1388 goto out_err_crypto_release;
1392 * since we're in a cifs function already, we know that
1393 * this will succeed. No need for try_module_get().
1395 __module_get(THIS_MODULE);
1396 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
1398 if (IS_ERR(tcp_ses->tsk)) {
1399 rc = PTR_ERR(tcp_ses->tsk);
1400 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
1401 module_put(THIS_MODULE);
1402 goto out_err_crypto_release;
1404 tcp_ses->min_offload = ctx->min_offload;
1405 tcp_ses->tcpStatus = CifsNeedNegotiate;
1407 tcp_ses->nr_targets = 1;
1408 tcp_ses->ignore_signature = ctx->ignore_signature;
1409 /* thread spawned, put it on the list */
1410 spin_lock(&cifs_tcp_ses_lock);
1411 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
1412 spin_unlock(&cifs_tcp_ses_lock);
1414 cifs_fscache_get_client_cookie(tcp_ses);
1416 /* queue echo request delayed work */
1417 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
1421 out_err_crypto_release:
1422 cifs_crypto_secmech_release(tcp_ses);
1424 put_net(cifs_net_ns(tcp_ses));
1428 if (!IS_ERR(tcp_ses->hostname))
1429 kfree(tcp_ses->hostname);
1430 if (tcp_ses->ssocket)
1431 sock_release(tcp_ses->ssocket);
1437 static int match_session(struct cifs_ses *ses, struct smb3_fs_context *ctx)
1439 if (ctx->sectype != Unspecified &&
1440 ctx->sectype != ses->sectype)
1444 * If an existing session is limited to less channels than
1445 * requested, it should not be reused
1447 if (ses->chan_max < ctx->max_channels)
1450 switch (ses->sectype) {
1452 if (!uid_eq(ctx->cred_uid, ses->cred_uid))
1456 /* NULL username means anonymous session */
1457 if (ses->user_name == NULL) {
1463 /* anything else takes username/password */
1464 if (strncmp(ses->user_name,
1465 ctx->username ? ctx->username : "",
1466 CIFS_MAX_USERNAME_LEN))
1468 if ((ctx->username && strlen(ctx->username) != 0) &&
1469 ses->password != NULL &&
1470 strncmp(ses->password,
1471 ctx->password ? ctx->password : "",
1472 CIFS_MAX_PASSWORD_LEN))
1479 * cifs_setup_ipc - helper to setup the IPC tcon for the session
1481 * A new IPC connection is made and stored in the session
1482 * tcon_ipc. The IPC tcon has the same lifetime as the session.
1485 cifs_setup_ipc(struct cifs_ses *ses, struct smb3_fs_context *ctx)
1488 struct cifs_tcon *tcon;
1489 char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0};
1491 struct TCP_Server_Info *server = ses->server;
1494 * If the mount request that resulted in the creation of the
1495 * session requires encryption, force IPC to be encrypted too.
1498 if (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
1501 cifs_server_dbg(VFS,
1502 "IPC: server doesn't support encryption\n");
1507 tcon = tconInfoAlloc();
1511 scnprintf(unc, sizeof(unc), "\\\\%s\\IPC$", server->hostname);
1517 rc = server->ops->tree_connect(xid, ses, unc, tcon, ctx->local_nls);
1521 cifs_server_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
1526 cifs_dbg(FYI, "IPC tcon rc = %d ipc tid = %d\n", rc, tcon->tid);
1528 ses->tcon_ipc = tcon;
1534 * cifs_free_ipc - helper to release the session IPC tcon
1536 * Needs to be called everytime a session is destroyed
1539 cifs_free_ipc(struct cifs_ses *ses)
1542 struct cifs_tcon *tcon = ses->tcon_ipc;
1547 if (ses->server->ops->tree_disconnect) {
1549 rc = ses->server->ops->tree_disconnect(xid, tcon);
1554 cifs_dbg(FYI, "failed to disconnect IPC tcon (rc=%d)\n", rc);
1557 ses->tcon_ipc = NULL;
1561 static struct cifs_ses *
1562 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1564 struct cifs_ses *ses;
1566 spin_lock(&cifs_tcp_ses_lock);
1567 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
1568 if (ses->status == CifsExiting)
1570 if (!match_session(ses, ctx))
1573 spin_unlock(&cifs_tcp_ses_lock);
1576 spin_unlock(&cifs_tcp_ses_lock);
1580 void cifs_put_smb_ses(struct cifs_ses *ses)
1582 unsigned int rc, xid;
1583 struct TCP_Server_Info *server = ses->server;
1585 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
1587 spin_lock(&cifs_tcp_ses_lock);
1588 if (ses->status == CifsExiting) {
1589 spin_unlock(&cifs_tcp_ses_lock);
1592 if (--ses->ses_count > 0) {
1593 spin_unlock(&cifs_tcp_ses_lock);
1596 if (ses->status == CifsGood)
1597 ses->status = CifsExiting;
1598 spin_unlock(&cifs_tcp_ses_lock);
1602 if (ses->status == CifsExiting && server->ops->logoff) {
1604 rc = server->ops->logoff(xid, ses);
1606 cifs_server_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
1611 spin_lock(&cifs_tcp_ses_lock);
1612 list_del_init(&ses->smb_ses_list);
1613 spin_unlock(&cifs_tcp_ses_lock);
1615 /* close any extra channels */
1616 if (ses->chan_count > 1) {
1619 for (i = 1; i < ses->chan_count; i++)
1620 cifs_put_tcp_session(ses->chans[i].server, 0);
1624 cifs_put_tcp_session(server, 0);
1629 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
1630 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
1632 /* Populate username and pw fields from keyring if possible */
1634 cifs_set_cifscreds(struct smb3_fs_context *ctx, struct cifs_ses *ses)
1638 const char *delim, *payload;
1642 struct TCP_Server_Info *server = ses->server;
1643 struct sockaddr_in *sa;
1644 struct sockaddr_in6 *sa6;
1645 const struct user_key_payload *upayload;
1647 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
1651 /* try to find an address key first */
1652 switch (server->dstaddr.ss_family) {
1654 sa = (struct sockaddr_in *)&server->dstaddr;
1655 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
1658 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
1659 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
1662 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
1663 server->dstaddr.ss_family);
1668 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
1669 key = request_key(&key_type_logon, desc, "");
1671 if (!ses->domainName) {
1672 cifs_dbg(FYI, "domainName is NULL\n");
1677 /* didn't work, try to find a domain key */
1678 sprintf(desc, "cifs:d:%s", ses->domainName);
1679 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
1680 key = request_key(&key_type_logon, desc, "");
1688 down_read(&key->sem);
1689 upayload = user_key_payload_locked(key);
1690 if (IS_ERR_OR_NULL(upayload)) {
1691 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
1695 /* find first : in payload */
1696 payload = upayload->data;
1697 delim = strnchr(payload, upayload->datalen, ':');
1698 cifs_dbg(FYI, "payload=%s\n", payload);
1700 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
1706 len = delim - payload;
1707 if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
1708 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
1714 ctx->username = kstrndup(payload, len, GFP_KERNEL);
1715 if (!ctx->username) {
1716 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
1721 cifs_dbg(FYI, "%s: username=%s\n", __func__, ctx->username);
1723 len = key->datalen - (len + 1);
1724 if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
1725 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
1727 kfree(ctx->username);
1728 ctx->username = NULL;
1733 ctx->password = kstrndup(delim, len, GFP_KERNEL);
1734 if (!ctx->password) {
1735 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
1738 kfree(ctx->username);
1739 ctx->username = NULL;
1744 * If we have a domain key then we must set the domainName in the
1747 if (is_domain && ses->domainName) {
1748 ctx->domainname = kstrndup(ses->domainName,
1749 strlen(ses->domainName),
1751 if (!ctx->domainname) {
1752 cifs_dbg(FYI, "Unable to allocate %zd bytes for domain\n",
1755 kfree(ctx->username);
1756 ctx->username = NULL;
1757 kfree_sensitive(ctx->password);
1758 ctx->password = NULL;
1768 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
1771 #else /* ! CONFIG_KEYS */
1773 cifs_set_cifscreds(struct smb3_fs_context *ctx __attribute__((unused)),
1774 struct cifs_ses *ses __attribute__((unused)))
1778 #endif /* CONFIG_KEYS */
1781 * cifs_get_smb_ses - get a session matching @ctx data from @server
1783 * This function assumes it is being called from cifs_mount() where we
1784 * already got a server reference (server refcount +1). See
1785 * cifs_get_tcon() for refcount explanations.
1788 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1792 struct cifs_ses *ses;
1793 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
1794 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
1798 ses = cifs_find_smb_ses(server, ctx);
1800 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
1803 mutex_lock(&ses->session_mutex);
1804 rc = cifs_negotiate_protocol(xid, ses);
1806 mutex_unlock(&ses->session_mutex);
1807 /* problem -- put our ses reference */
1808 cifs_put_smb_ses(ses);
1812 if (ses->need_reconnect) {
1813 cifs_dbg(FYI, "Session needs reconnect\n");
1814 rc = cifs_setup_session(xid, ses,
1817 mutex_unlock(&ses->session_mutex);
1818 /* problem -- put our reference */
1819 cifs_put_smb_ses(ses);
1824 mutex_unlock(&ses->session_mutex);
1826 /* existing SMB ses has a server reference already */
1827 cifs_put_tcp_session(server, 0);
1832 cifs_dbg(FYI, "Existing smb sess not found\n");
1833 ses = sesInfoAlloc();
1837 /* new SMB session uses our server ref */
1838 ses->server = server;
1839 if (server->dstaddr.ss_family == AF_INET6)
1840 sprintf(ses->serverName, "%pI6", &addr6->sin6_addr);
1842 sprintf(ses->serverName, "%pI4", &addr->sin_addr);
1844 if (ctx->username) {
1845 ses->user_name = kstrdup(ctx->username, GFP_KERNEL);
1846 if (!ses->user_name)
1850 /* ctx->password freed at unmount */
1851 if (ctx->password) {
1852 ses->password = kstrdup(ctx->password, GFP_KERNEL);
1856 if (ctx->domainname) {
1857 ses->domainName = kstrdup(ctx->domainname, GFP_KERNEL);
1858 if (!ses->domainName)
1861 if (ctx->domainauto)
1862 ses->domainAuto = ctx->domainauto;
1863 ses->cred_uid = ctx->cred_uid;
1864 ses->linux_uid = ctx->linux_uid;
1866 ses->sectype = ctx->sectype;
1867 ses->sign = ctx->sign;
1868 mutex_lock(&ses->session_mutex);
1870 /* add server as first channel */
1871 ses->chans[0].server = server;
1872 ses->chan_count = 1;
1873 ses->chan_max = ctx->multichannel ? ctx->max_channels:1;
1875 rc = cifs_negotiate_protocol(xid, ses);
1877 rc = cifs_setup_session(xid, ses, ctx->local_nls);
1879 /* each channel uses a different signing key */
1880 memcpy(ses->chans[0].signkey, ses->smb3signingkey,
1881 sizeof(ses->smb3signingkey));
1883 mutex_unlock(&ses->session_mutex);
1887 /* success, put it on the list and add it as first channel */
1888 spin_lock(&cifs_tcp_ses_lock);
1889 list_add(&ses->smb_ses_list, &server->smb_ses_list);
1890 spin_unlock(&cifs_tcp_ses_lock);
1894 cifs_setup_ipc(ses, ctx);
1904 static int match_tcon(struct cifs_tcon *tcon, struct smb3_fs_context *ctx)
1906 if (tcon->tidStatus == CifsExiting)
1908 if (strncmp(tcon->treeName, ctx->UNC, MAX_TREE_SIZE))
1910 if (tcon->seal != ctx->seal)
1912 if (tcon->snapshot_time != ctx->snapshot_time)
1914 if (tcon->handle_timeout != ctx->handle_timeout)
1916 if (tcon->no_lease != ctx->no_lease)
1918 if (tcon->nodelete != ctx->nodelete)
1923 static struct cifs_tcon *
1924 cifs_find_tcon(struct cifs_ses *ses, struct smb3_fs_context *ctx)
1926 struct list_head *tmp;
1927 struct cifs_tcon *tcon;
1929 spin_lock(&cifs_tcp_ses_lock);
1930 list_for_each(tmp, &ses->tcon_list) {
1931 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
1932 #ifdef CONFIG_CIFS_DFS_UPCALL
1936 if (!match_tcon(tcon, ctx))
1939 spin_unlock(&cifs_tcp_ses_lock);
1942 spin_unlock(&cifs_tcp_ses_lock);
1947 cifs_put_tcon(struct cifs_tcon *tcon)
1950 struct cifs_ses *ses;
1953 * IPC tcon share the lifetime of their session and are
1954 * destroyed in the session put function
1956 if (tcon == NULL || tcon->ipc)
1960 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
1961 spin_lock(&cifs_tcp_ses_lock);
1962 if (--tcon->tc_count > 0) {
1963 spin_unlock(&cifs_tcp_ses_lock);
1967 #ifdef CONFIG_CIFS_SWN_UPCALL
1968 if (tcon->use_witness) {
1971 rc = cifs_swn_unregister(tcon);
1973 cifs_dbg(VFS, "%s: Failed to unregister for witness notifications: %d\n",
1979 list_del_init(&tcon->tcon_list);
1980 spin_unlock(&cifs_tcp_ses_lock);
1983 if (ses->server->ops->tree_disconnect)
1984 ses->server->ops->tree_disconnect(xid, tcon);
1987 cifs_fscache_release_super_cookie(tcon);
1989 cifs_put_smb_ses(ses);
1993 * cifs_get_tcon - get a tcon matching @ctx data from @ses
1995 * - tcon refcount is the number of mount points using the tcon.
1996 * - ses refcount is the number of tcon using the session.
1998 * 1. This function assumes it is being called from cifs_mount() where
1999 * we already got a session reference (ses refcount +1).
2001 * 2. Since we're in the context of adding a mount point, the end
2002 * result should be either:
2004 * a) a new tcon already allocated with refcount=1 (1 mount point) and
2005 * its session refcount incremented (1 new tcon). This +1 was
2006 * already done in (1).
2008 * b) an existing tcon with refcount+1 (add a mount point to it) and
2009 * identical ses refcount (no new tcon). Because of (1) we need to
2010 * decrement the ses refcount.
2012 static struct cifs_tcon *
2013 cifs_get_tcon(struct cifs_ses *ses, struct smb3_fs_context *ctx)
2016 struct cifs_tcon *tcon;
2018 tcon = cifs_find_tcon(ses, ctx);
2021 * tcon has refcount already incremented but we need to
2022 * decrement extra ses reference gotten by caller (case b)
2024 cifs_dbg(FYI, "Found match on UNC path\n");
2025 cifs_put_smb_ses(ses);
2029 if (!ses->server->ops->tree_connect) {
2034 tcon = tconInfoAlloc();
2040 if (ctx->snapshot_time) {
2041 if (ses->server->vals->protocol_id == 0) {
2043 "Use SMB2 or later for snapshot mount option\n");
2047 tcon->snapshot_time = ctx->snapshot_time;
2050 if (ctx->handle_timeout) {
2051 if (ses->server->vals->protocol_id == 0) {
2053 "Use SMB2.1 or later for handle timeout option\n");
2057 tcon->handle_timeout = ctx->handle_timeout;
2061 if (ctx->password) {
2062 tcon->password = kstrdup(ctx->password, GFP_KERNEL);
2063 if (!tcon->password) {
2070 if (ses->server->vals->protocol_id == 0) {
2072 "SMB3 or later required for encryption\n");
2075 } else if (tcon->ses->server->capabilities &
2076 SMB2_GLOBAL_CAP_ENCRYPTION)
2079 cifs_dbg(VFS, "Encryption is not supported on share\n");
2085 if (ctx->linux_ext) {
2086 if (ses->server->posix_ext_supported) {
2087 tcon->posix_extensions = true;
2088 pr_warn_once("SMB3.11 POSIX Extensions are experimental\n");
2090 cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions\n");
2097 * BB Do we need to wrap session_mutex around this TCon call and Unix
2098 * SetFS as we do on SessSetup and reconnect?
2101 rc = ses->server->ops->tree_connect(xid, ses, ctx->UNC, tcon,
2104 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
2108 tcon->use_persistent = false;
2109 /* check if SMB2 or later, CIFS does not support persistent handles */
2110 if (ctx->persistent) {
2111 if (ses->server->vals->protocol_id == 0) {
2113 "SMB3 or later required for persistent handles\n");
2116 } else if (ses->server->capabilities &
2117 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
2118 tcon->use_persistent = true;
2119 else /* persistent handles requested but not supported */ {
2121 "Persistent handles not supported on share\n");
2125 } else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
2126 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
2127 && (ctx->nopersistent == false)) {
2128 cifs_dbg(FYI, "enabling persistent handles\n");
2129 tcon->use_persistent = true;
2130 } else if (ctx->resilient) {
2131 if (ses->server->vals->protocol_id == 0) {
2133 "SMB2.1 or later required for resilient handles\n");
2137 tcon->use_resilient = true;
2139 #ifdef CONFIG_CIFS_SWN_UPCALL
2140 tcon->use_witness = false;
2142 if (ses->server->vals->protocol_id >= SMB30_PROT_ID) {
2143 if (tcon->capabilities & SMB2_SHARE_CAP_CLUSTER) {
2145 * Set witness in use flag in first place
2146 * to retry registration in the echo task
2148 tcon->use_witness = true;
2149 /* And try to register immediately */
2150 rc = cifs_swn_register(tcon);
2152 cifs_dbg(VFS, "Failed to register for witness notifications: %d\n", rc);
2156 /* TODO: try to extend for non-cluster uses (eg multichannel) */
2157 cifs_dbg(VFS, "witness requested on mount but no CLUSTER capability on share\n");
2162 cifs_dbg(VFS, "SMB3 or later required for witness option\n");
2169 /* If the user really knows what they are doing they can override */
2170 if (tcon->share_flags & SMB2_SHAREFLAG_NO_CACHING) {
2172 cifs_dbg(VFS, "cache=ro requested on mount but NO_CACHING flag set on share\n");
2173 else if (ctx->cache_rw)
2174 cifs_dbg(VFS, "cache=singleclient requested on mount but NO_CACHING flag set on share\n");
2177 if (ctx->no_lease) {
2178 if (ses->server->vals->protocol_id == 0) {
2180 "SMB2 or later required for nolease option\n");
2184 tcon->no_lease = ctx->no_lease;
2188 * We can have only one retry value for a connection to a share so for
2189 * resources mounted more than once to the same server share the last
2190 * value passed in for the retry flag is used.
2192 tcon->retry = ctx->retry;
2193 tcon->nocase = ctx->nocase;
2194 if (ses->server->capabilities & SMB2_GLOBAL_CAP_DIRECTORY_LEASING)
2195 tcon->nohandlecache = ctx->nohandlecache;
2197 tcon->nohandlecache = 1;
2198 tcon->nodelete = ctx->nodelete;
2199 tcon->local_lease = ctx->local_lease;
2200 INIT_LIST_HEAD(&tcon->pending_opens);
2202 spin_lock(&cifs_tcp_ses_lock);
2203 list_add(&tcon->tcon_list, &ses->tcon_list);
2204 spin_unlock(&cifs_tcp_ses_lock);
2206 cifs_fscache_get_super_cookie(tcon);
2216 cifs_put_tlink(struct tcon_link *tlink)
2218 if (!tlink || IS_ERR(tlink))
2221 if (!atomic_dec_and_test(&tlink->tl_count) ||
2222 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
2223 tlink->tl_time = jiffies;
2227 if (!IS_ERR(tlink_tcon(tlink)))
2228 cifs_put_tcon(tlink_tcon(tlink));
2234 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2236 struct cifs_sb_info *old = CIFS_SB(sb);
2237 struct cifs_sb_info *new = mnt_data->cifs_sb;
2238 unsigned int oldflags = old->mnt_cifs_flags & CIFS_MOUNT_MASK;
2239 unsigned int newflags = new->mnt_cifs_flags & CIFS_MOUNT_MASK;
2241 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
2244 if (old->mnt_cifs_serverino_autodisabled)
2245 newflags &= ~CIFS_MOUNT_SERVER_INUM;
2247 if (oldflags != newflags)
2251 * We want to share sb only if we don't specify an r/wsize or
2252 * specified r/wsize is greater than or equal to existing one.
2254 if (new->ctx->wsize && new->ctx->wsize < old->ctx->wsize)
2257 if (new->ctx->rsize && new->ctx->rsize < old->ctx->rsize)
2260 if (!uid_eq(old->ctx->linux_uid, new->ctx->linux_uid) ||
2261 !gid_eq(old->ctx->linux_gid, new->ctx->linux_gid))
2264 if (old->ctx->file_mode != new->ctx->file_mode ||
2265 old->ctx->dir_mode != new->ctx->dir_mode)
2268 if (strcmp(old->local_nls->charset, new->local_nls->charset))
2271 if (old->ctx->actimeo != new->ctx->actimeo)
2278 match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2280 struct cifs_sb_info *old = CIFS_SB(sb);
2281 struct cifs_sb_info *new = mnt_data->cifs_sb;
2282 bool old_set = (old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
2284 bool new_set = (new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
2287 if (old_set && new_set && !strcmp(new->prepath, old->prepath))
2289 else if (!old_set && !new_set)
2296 cifs_match_super(struct super_block *sb, void *data)
2298 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
2299 struct smb3_fs_context *ctx;
2300 struct cifs_sb_info *cifs_sb;
2301 struct TCP_Server_Info *tcp_srv;
2302 struct cifs_ses *ses;
2303 struct cifs_tcon *tcon;
2304 struct tcon_link *tlink;
2307 spin_lock(&cifs_tcp_ses_lock);
2308 cifs_sb = CIFS_SB(sb);
2309 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
2310 if (IS_ERR(tlink)) {
2311 spin_unlock(&cifs_tcp_ses_lock);
2314 tcon = tlink_tcon(tlink);
2316 tcp_srv = ses->server;
2318 ctx = mnt_data->ctx;
2320 if (!match_server(tcp_srv, ctx) ||
2321 !match_session(ses, ctx) ||
2322 !match_tcon(tcon, ctx) ||
2323 !match_prepath(sb, mnt_data)) {
2328 rc = compare_mount_options(sb, mnt_data);
2330 spin_unlock(&cifs_tcp_ses_lock);
2331 cifs_put_tlink(tlink);
2335 #ifdef CONFIG_DEBUG_LOCK_ALLOC
2336 static struct lock_class_key cifs_key[2];
2337 static struct lock_class_key cifs_slock_key[2];
2340 cifs_reclassify_socket4(struct socket *sock)
2342 struct sock *sk = sock->sk;
2343 BUG_ON(!sock_allow_reclassification(sk));
2344 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
2345 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
2349 cifs_reclassify_socket6(struct socket *sock)
2351 struct sock *sk = sock->sk;
2352 BUG_ON(!sock_allow_reclassification(sk));
2353 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
2354 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
2358 cifs_reclassify_socket4(struct socket *sock)
2363 cifs_reclassify_socket6(struct socket *sock)
2368 /* See RFC1001 section 14 on representation of Netbios names */
2369 static void rfc1002mangle(char *target, char *source, unsigned int length)
2373 for (i = 0, j = 0; i < (length); i++) {
2374 /* mask a nibble at a time and encode */
2375 target[j] = 'A' + (0x0F & (source[i] >> 4));
2376 target[j+1] = 'A' + (0x0F & source[i]);
2383 bind_socket(struct TCP_Server_Info *server)
2386 if (server->srcaddr.ss_family != AF_UNSPEC) {
2387 /* Bind to the specified local IP address */
2388 struct socket *socket = server->ssocket;
2389 rc = socket->ops->bind(socket,
2390 (struct sockaddr *) &server->srcaddr,
2391 sizeof(server->srcaddr));
2393 struct sockaddr_in *saddr4;
2394 struct sockaddr_in6 *saddr6;
2395 saddr4 = (struct sockaddr_in *)&server->srcaddr;
2396 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
2397 if (saddr6->sin6_family == AF_INET6)
2398 cifs_server_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
2399 &saddr6->sin6_addr, rc);
2401 cifs_server_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
2402 &saddr4->sin_addr.s_addr, rc);
2409 ip_rfc1001_connect(struct TCP_Server_Info *server)
2413 * some servers require RFC1001 sessinit before sending
2414 * negprot - BB check reconnection in case where second
2415 * sessinit is sent but no second negprot
2417 struct rfc1002_session_packet *ses_init_buf;
2418 struct smb_hdr *smb_buf;
2419 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
2422 ses_init_buf->trailer.session_req.called_len = 32;
2424 if (server->server_RFC1001_name[0] != 0)
2425 rfc1002mangle(ses_init_buf->trailer.
2426 session_req.called_name,
2427 server->server_RFC1001_name,
2428 RFC1001_NAME_LEN_WITH_NULL);
2430 rfc1002mangle(ses_init_buf->trailer.
2431 session_req.called_name,
2432 DEFAULT_CIFS_CALLED_NAME,
2433 RFC1001_NAME_LEN_WITH_NULL);
2435 ses_init_buf->trailer.session_req.calling_len = 32;
2438 * calling name ends in null (byte 16) from old smb
2441 if (server->workstation_RFC1001_name[0] != 0)
2442 rfc1002mangle(ses_init_buf->trailer.
2443 session_req.calling_name,
2444 server->workstation_RFC1001_name,
2445 RFC1001_NAME_LEN_WITH_NULL);
2447 rfc1002mangle(ses_init_buf->trailer.
2448 session_req.calling_name,
2450 RFC1001_NAME_LEN_WITH_NULL);
2452 ses_init_buf->trailer.session_req.scope1 = 0;
2453 ses_init_buf->trailer.session_req.scope2 = 0;
2454 smb_buf = (struct smb_hdr *)ses_init_buf;
2456 /* sizeof RFC1002_SESSION_REQUEST with no scope */
2457 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
2458 rc = smb_send(server, smb_buf, 0x44);
2459 kfree(ses_init_buf);
2461 * RFC1001 layer in at least one server
2462 * requires very short break before negprot
2463 * presumably because not expecting negprot
2464 * to follow so fast. This is a simple
2465 * solution that works without
2466 * complicating the code and causes no
2467 * significant slowing down on mount
2470 usleep_range(1000, 2000);
2473 * else the negprot may still work without this
2474 * even though malloc failed
2481 generic_ip_connect(struct TCP_Server_Info *server)
2486 struct socket *socket = server->ssocket;
2487 struct sockaddr *saddr;
2489 saddr = (struct sockaddr *) &server->dstaddr;
2491 if (server->dstaddr.ss_family == AF_INET6) {
2492 struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)&server->dstaddr;
2494 sport = ipv6->sin6_port;
2495 slen = sizeof(struct sockaddr_in6);
2497 cifs_dbg(FYI, "%s: connecting to [%pI6]:%d\n", __func__, &ipv6->sin6_addr,
2500 struct sockaddr_in *ipv4 = (struct sockaddr_in *)&server->dstaddr;
2502 sport = ipv4->sin_port;
2503 slen = sizeof(struct sockaddr_in);
2505 cifs_dbg(FYI, "%s: connecting to %pI4:%d\n", __func__, &ipv4->sin_addr,
2509 if (socket == NULL) {
2510 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
2511 IPPROTO_TCP, &socket, 1);
2513 cifs_server_dbg(VFS, "Error %d creating socket\n", rc);
2514 server->ssocket = NULL;
2518 /* BB other socket options to set KEEPALIVE, NODELAY? */
2519 cifs_dbg(FYI, "Socket created\n");
2520 server->ssocket = socket;
2521 socket->sk->sk_allocation = GFP_NOFS;
2522 if (sfamily == AF_INET6)
2523 cifs_reclassify_socket6(socket);
2525 cifs_reclassify_socket4(socket);
2528 rc = bind_socket(server);
2533 * Eventually check for other socket options to change from
2534 * the default. sock_setsockopt not used because it expects
2537 socket->sk->sk_rcvtimeo = 7 * HZ;
2538 socket->sk->sk_sndtimeo = 5 * HZ;
2540 /* make the bufsizes depend on wsize/rsize and max requests */
2541 if (server->noautotune) {
2542 if (socket->sk->sk_sndbuf < (200 * 1024))
2543 socket->sk->sk_sndbuf = 200 * 1024;
2544 if (socket->sk->sk_rcvbuf < (140 * 1024))
2545 socket->sk->sk_rcvbuf = 140 * 1024;
2548 if (server->tcp_nodelay)
2549 tcp_sock_set_nodelay(socket->sk);
2551 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
2552 socket->sk->sk_sndbuf,
2553 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
2555 rc = socket->ops->connect(socket, saddr, slen,
2556 server->noblockcnt ? O_NONBLOCK : 0);
2558 * When mounting SMB root file systems, we do not want to block in
2559 * connect. Otherwise bail out and then let cifs_reconnect() perform
2560 * reconnect failover - if possible.
2562 if (server->noblockcnt && rc == -EINPROGRESS)
2565 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
2566 sock_release(socket);
2567 server->ssocket = NULL;
2571 if (sport == htons(RFC1001_PORT))
2572 rc = ip_rfc1001_connect(server);
2578 ip_connect(struct TCP_Server_Info *server)
2581 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2582 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2584 if (server->dstaddr.ss_family == AF_INET6)
2585 sport = &addr6->sin6_port;
2587 sport = &addr->sin_port;
2592 /* try with 445 port at first */
2593 *sport = htons(CIFS_PORT);
2595 rc = generic_ip_connect(server);
2599 /* if it failed, try with 139 port */
2600 *sport = htons(RFC1001_PORT);
2603 return generic_ip_connect(server);
2606 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
2607 struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
2610 * If we are reconnecting then should we check to see if
2611 * any requested capabilities changed locally e.g. via
2612 * remount but we can not do much about it here
2613 * if they have (even if we could detect it by the following)
2614 * Perhaps we could add a backpointer to array of sb from tcon
2615 * or if we change to make all sb to same share the same
2616 * sb as NFS - then we only have one backpointer to sb.
2617 * What if we wanted to mount the server share twice once with
2618 * and once without posixacls or posix paths?
2620 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
2622 if (ctx && ctx->no_linux_ext) {
2623 tcon->fsUnixInfo.Capability = 0;
2624 tcon->unix_ext = 0; /* Unix Extensions disabled */
2625 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
2628 tcon->unix_ext = 1; /* Unix Extensions supported */
2630 if (tcon->unix_ext == 0) {
2631 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
2635 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
2636 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
2637 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
2639 * check for reconnect case in which we do not
2640 * want to change the mount behavior if we can avoid it
2644 * turn off POSIX ACL and PATHNAMES if not set
2645 * originally at mount time
2647 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
2648 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
2649 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
2650 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
2651 cifs_dbg(VFS, "POSIXPATH support change\n");
2652 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
2653 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
2654 cifs_dbg(VFS, "possible reconnect error\n");
2655 cifs_dbg(VFS, "server disabled POSIX path support\n");
2659 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
2660 cifs_dbg(VFS, "per-share encryption not supported yet\n");
2662 cap &= CIFS_UNIX_CAP_MASK;
2663 if (ctx && ctx->no_psx_acl)
2664 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
2665 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
2666 cifs_dbg(FYI, "negotiated posix acl support\n");
2668 cifs_sb->mnt_cifs_flags |=
2669 CIFS_MOUNT_POSIXACL;
2672 if (ctx && ctx->posix_paths == 0)
2673 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
2674 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
2675 cifs_dbg(FYI, "negotiate posix pathnames\n");
2677 cifs_sb->mnt_cifs_flags |=
2678 CIFS_MOUNT_POSIX_PATHS;
2681 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
2682 #ifdef CONFIG_CIFS_DEBUG2
2683 if (cap & CIFS_UNIX_FCNTL_CAP)
2684 cifs_dbg(FYI, "FCNTL cap\n");
2685 if (cap & CIFS_UNIX_EXTATTR_CAP)
2686 cifs_dbg(FYI, "EXTATTR cap\n");
2687 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
2688 cifs_dbg(FYI, "POSIX path cap\n");
2689 if (cap & CIFS_UNIX_XATTR_CAP)
2690 cifs_dbg(FYI, "XATTR cap\n");
2691 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
2692 cifs_dbg(FYI, "POSIX ACL cap\n");
2693 if (cap & CIFS_UNIX_LARGE_READ_CAP)
2694 cifs_dbg(FYI, "very large read cap\n");
2695 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
2696 cifs_dbg(FYI, "very large write cap\n");
2697 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
2698 cifs_dbg(FYI, "transport encryption cap\n");
2699 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
2700 cifs_dbg(FYI, "mandatory transport encryption cap\n");
2701 #endif /* CIFS_DEBUG2 */
2702 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
2704 cifs_dbg(FYI, "resetting capabilities failed\n");
2706 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");
2712 int cifs_setup_cifs_sb(struct cifs_sb_info *cifs_sb)
2714 struct smb3_fs_context *ctx = cifs_sb->ctx;
2716 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
2718 spin_lock_init(&cifs_sb->tlink_tree_lock);
2719 cifs_sb->tlink_tree = RB_ROOT;
2721 cifs_dbg(FYI, "file mode: %04ho dir mode: %04ho\n",
2722 ctx->file_mode, ctx->dir_mode);
2724 /* this is needed for ASCII cp to Unicode converts */
2725 if (ctx->iocharset == NULL) {
2726 /* load_nls_default cannot return null */
2727 cifs_sb->local_nls = load_nls_default();
2729 cifs_sb->local_nls = load_nls(ctx->iocharset);
2730 if (cifs_sb->local_nls == NULL) {
2731 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
2736 ctx->local_nls = cifs_sb->local_nls;
2738 smb3_update_mnt_flags(cifs_sb);
2741 cifs_dbg(FYI, "mounting share using direct i/o\n");
2742 if (ctx->cache_ro) {
2743 cifs_dbg(VFS, "mounting share with read only caching. Ensure that the share will not be modified while in use.\n");
2744 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RO_CACHE;
2745 } else if (ctx->cache_rw) {
2746 cifs_dbg(VFS, "mounting share in single client RW caching mode. Ensure that no other systems will be accessing the share.\n");
2747 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_RO_CACHE |
2748 CIFS_MOUNT_RW_CACHE);
2751 if ((ctx->cifs_acl) && (ctx->dynperm))
2752 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
2755 cifs_sb->prepath = kstrdup(ctx->prepath, GFP_KERNEL);
2756 if (cifs_sb->prepath == NULL)
2763 /* Release all succeed connections */
2764 static inline void mount_put_conns(struct cifs_sb_info *cifs_sb,
2766 struct TCP_Server_Info *server,
2767 struct cifs_ses *ses, struct cifs_tcon *tcon)
2772 cifs_put_tcon(tcon);
2774 cifs_put_smb_ses(ses);
2776 cifs_put_tcp_session(server, 0);
2777 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
2781 /* Get connections for tcp, ses and tcon */
2782 static int mount_get_conns(struct smb3_fs_context *ctx, struct cifs_sb_info *cifs_sb,
2784 struct TCP_Server_Info **nserver,
2785 struct cifs_ses **nses, struct cifs_tcon **ntcon)
2788 struct TCP_Server_Info *server;
2789 struct cifs_ses *ses;
2790 struct cifs_tcon *tcon;
2798 /* get a reference to a tcp session */
2799 server = cifs_get_tcp_session(ctx);
2800 if (IS_ERR(server)) {
2801 rc = PTR_ERR(server);
2807 if ((ctx->max_credits < 20) || (ctx->max_credits > 60000))
2808 server->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
2810 server->max_credits = ctx->max_credits;
2812 /* get a reference to a SMB session */
2813 ses = cifs_get_smb_ses(server, ctx);
2821 if ((ctx->persistent == true) && (!(ses->server->capabilities &
2822 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES))) {
2823 cifs_server_dbg(VFS, "persistent handles not supported by server\n");
2827 /* search for existing tcon to this server share */
2828 tcon = cifs_get_tcon(ses, ctx);
2836 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
2837 if (tcon->posix_extensions)
2838 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
2840 /* tell server which Unix caps we support */
2841 if (cap_unix(tcon->ses)) {
2843 * reset of caps checks mount to see if unix extensions disabled
2844 * for just this mount.
2846 reset_cifs_unix_caps(*xid, tcon, cifs_sb, ctx);
2847 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
2848 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
2849 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP))
2852 tcon->unix_ext = 0; /* server does not support them */
2854 /* do not care if a following call succeed - informational */
2855 if (!tcon->pipe && server->ops->qfs_tcon) {
2856 server->ops->qfs_tcon(*xid, tcon, cifs_sb);
2857 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE) {
2858 if (tcon->fsDevInfo.DeviceCharacteristics &
2859 cpu_to_le32(FILE_READ_ONLY_DEVICE))
2860 cifs_dbg(VFS, "mounted to read only share\n");
2861 else if ((cifs_sb->mnt_cifs_flags &
2862 CIFS_MOUNT_RW_CACHE) == 0)
2863 cifs_dbg(VFS, "read only mount of RW share\n");
2864 /* no need to log a RW mount of a typical RW share */
2869 * Clamp the rsize/wsize mount arguments if they are too big for the server
2870 * and set the rsize/wsize to the negotiated values if not passed in by
2873 if ((cifs_sb->ctx->wsize == 0) ||
2874 (cifs_sb->ctx->wsize > server->ops->negotiate_wsize(tcon, ctx)))
2875 cifs_sb->ctx->wsize = server->ops->negotiate_wsize(tcon, ctx);
2876 if ((cifs_sb->ctx->rsize == 0) ||
2877 (cifs_sb->ctx->rsize > server->ops->negotiate_rsize(tcon, ctx)))
2878 cifs_sb->ctx->rsize = server->ops->negotiate_rsize(tcon, ctx);
2883 static int mount_setup_tlink(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
2884 struct cifs_tcon *tcon)
2886 struct tcon_link *tlink;
2888 /* hang the tcon off of the superblock */
2889 tlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
2893 tlink->tl_uid = ses->linux_uid;
2894 tlink->tl_tcon = tcon;
2895 tlink->tl_time = jiffies;
2896 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
2897 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
2899 cifs_sb->master_tlink = tlink;
2900 spin_lock(&cifs_sb->tlink_tree_lock);
2901 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
2902 spin_unlock(&cifs_sb->tlink_tree_lock);
2904 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
2909 #ifdef CONFIG_CIFS_DFS_UPCALL
2911 * cifs_build_path_to_root returns full path to root when we do not have an
2912 * exiting connection (tcon)
2915 build_unc_path_to_root(const struct smb3_fs_context *ctx,
2916 const struct cifs_sb_info *cifs_sb, bool useppath)
2918 char *full_path, *pos;
2919 unsigned int pplen = useppath && ctx->prepath ?
2920 strlen(ctx->prepath) + 1 : 0;
2921 unsigned int unc_len = strnlen(ctx->UNC, MAX_TREE_SIZE + 1);
2923 if (unc_len > MAX_TREE_SIZE)
2924 return ERR_PTR(-EINVAL);
2926 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
2927 if (full_path == NULL)
2928 return ERR_PTR(-ENOMEM);
2930 memcpy(full_path, ctx->UNC, unc_len);
2931 pos = full_path + unc_len;
2934 *pos = CIFS_DIR_SEP(cifs_sb);
2935 memcpy(pos + 1, ctx->prepath, pplen);
2939 *pos = '\0'; /* add trailing null */
2940 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
2941 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
2946 * expand_dfs_referral - Perform a dfs referral query and update the cifs_sb
2948 * If a referral is found, cifs_sb->ctx->mount_options will be (re-)allocated
2949 * to a string containing updated options for the submount. Otherwise it
2950 * will be left untouched.
2952 * Returns the rc from get_dfs_path to the caller, which can be used to
2953 * determine whether there were referrals.
2956 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
2957 struct smb3_fs_context *ctx, struct cifs_sb_info *cifs_sb,
2961 struct dfs_info3_param referral = {0};
2962 char *full_path = NULL, *mdata = NULL;
2964 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
2967 full_path = build_unc_path_to_root(ctx, cifs_sb, true);
2968 if (IS_ERR(full_path))
2969 return PTR_ERR(full_path);
2971 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
2972 ref_path, &referral, NULL);
2974 mdata = cifs_compose_mount_options(cifs_sb->ctx->mount_options,
2975 full_path + 1, &referral);
2976 free_dfs_info_param(&referral);
2978 if (IS_ERR(mdata)) {
2979 rc = PTR_ERR(mdata);
2982 smb3_cleanup_fs_context_contents(ctx);
2983 rc = cifs_setup_volume_info(ctx);
2985 kfree(cifs_sb->ctx->mount_options);
2986 cifs_sb->ctx->mount_options = mdata;
2992 static inline int get_next_dfs_tgt(const char *path,
2993 struct dfs_cache_tgt_list *tgt_list,
2994 struct dfs_cache_tgt_iterator **tgt_it)
2997 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
2999 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
3000 return !*tgt_it ? -EHOSTDOWN : 0;
3003 static int update_vol_info(const struct dfs_cache_tgt_iterator *tgt_it,
3004 struct smb3_fs_context *fake_ctx, struct smb3_fs_context *ctx)
3006 const char *tgt = dfs_cache_get_tgt_name(tgt_it);
3007 int len = strlen(tgt) + 2;
3010 new_unc = kmalloc(len, GFP_KERNEL);
3013 scnprintf(new_unc, len, "\\%s", tgt);
3018 if (fake_ctx->prepath) {
3019 kfree(ctx->prepath);
3020 ctx->prepath = fake_ctx->prepath;
3021 fake_ctx->prepath = NULL;
3023 memcpy(&ctx->dstaddr, &fake_ctx->dstaddr, sizeof(ctx->dstaddr));
3028 static int setup_dfs_tgt_conn(const char *path, const char *full_path,
3029 const struct dfs_cache_tgt_iterator *tgt_it,
3030 struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx,
3031 unsigned int *xid, struct TCP_Server_Info **server,
3032 struct cifs_ses **ses, struct cifs_tcon **tcon)
3035 struct dfs_info3_param ref = {0};
3037 struct smb3_fs_context fake_ctx = {NULL};
3039 cifs_dbg(FYI, "%s: dfs path: %s\n", __func__, path);
3041 rc = dfs_cache_get_tgt_referral(path, tgt_it, &ref);
3045 mdata = cifs_compose_mount_options(cifs_sb->ctx->mount_options,
3046 full_path + 1, &ref);
3047 free_dfs_info_param(&ref);
3049 if (IS_ERR(mdata)) {
3050 rc = PTR_ERR(mdata);
3053 rc = cifs_setup_volume_info(&fake_ctx);
3059 * We use a 'fake_ctx' here because we need pass it down to the
3060 * mount_{get,put} functions to test connection against new DFS
3063 mount_put_conns(cifs_sb, *xid, *server, *ses, *tcon);
3064 rc = mount_get_conns(&fake_ctx, cifs_sb, xid, server, ses,
3066 if (!rc || (*server && *ses)) {
3068 * We were able to connect to new target server.
3069 * Update current context with new target server.
3071 rc = update_vol_info(tgt_it, &fake_ctx, ctx);
3074 smb3_cleanup_fs_context_contents(&fake_ctx);
3078 static int do_dfs_failover(const char *path, const char *full_path, struct cifs_sb_info *cifs_sb,
3079 struct smb3_fs_context *ctx, struct cifs_ses *root_ses,
3080 unsigned int *xid, struct TCP_Server_Info **server,
3081 struct cifs_ses **ses, struct cifs_tcon **tcon)
3084 struct dfs_cache_tgt_list tgt_list;
3085 struct dfs_cache_tgt_iterator *tgt_it = NULL;
3087 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
3090 rc = dfs_cache_noreq_find(path, NULL, &tgt_list);
3095 /* Get next DFS target server - if any */
3096 rc = get_next_dfs_tgt(path, &tgt_list, &tgt_it);
3099 /* Connect to next DFS target */
3100 rc = setup_dfs_tgt_conn(path, full_path, tgt_it, cifs_sb, ctx, xid, server, ses,
3102 if (!rc || (*server && *ses))
3107 * Update DFS target hint in DFS referral cache with the target
3108 * server we successfully reconnected to.
3110 rc = dfs_cache_update_tgthint(*xid, root_ses ? root_ses : *ses,
3112 cifs_remap(cifs_sb), path,
3115 dfs_cache_free_tgts(&tgt_list);
3120 /* TODO: all callers to this are broken. We are not parsing mount_options here
3121 * we should pass a clone of the original context?
3124 cifs_setup_volume_info(struct smb3_fs_context *ctx)
3128 if (ctx->nullauth) {
3129 cifs_dbg(FYI, "Anonymous login\n");
3130 kfree(ctx->username);
3131 ctx->username = NULL;
3132 } else if (ctx->username) {
3133 /* BB fixme parse for domain name here */
3134 cifs_dbg(FYI, "Username: %s\n", ctx->username);
3136 cifs_dbg(VFS, "No username specified\n");
3137 /* In userspace mount helper we can get user name from alternate
3138 locations such as env variables and files on disk */
3146 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
3148 struct cifs_tcon *tcon,
3149 struct cifs_sb_info *cifs_sb,
3156 int skip = added_treename ? 1 : 0;
3158 sep = CIFS_DIR_SEP(cifs_sb);
3161 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
3163 /* skip separators */
3168 /* next separator */
3169 while (*s && *s != sep)
3172 * if the treename is added, we then have to skip the first
3173 * part within the separators
3180 * temporarily null-terminate the path at the end of
3181 * the current component
3185 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3193 * Check if path is remote (e.g. a DFS share). Return -EREMOTE if it is,
3196 static int is_path_remote(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx,
3197 const unsigned int xid,
3198 struct TCP_Server_Info *server,
3199 struct cifs_tcon *tcon)
3204 if (!server->ops->is_path_accessible)
3208 * cifs_build_path_to_root works only when we have a valid tcon
3210 full_path = cifs_build_path_to_root(ctx, cifs_sb, tcon,
3211 tcon->Flags & SMB_SHARE_IS_IN_DFS);
3212 if (full_path == NULL)
3215 cifs_dbg(FYI, "%s: full_path: %s\n", __func__, full_path);
3217 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3219 if (rc != 0 && rc != -EREMOTE) {
3224 if (rc != -EREMOTE) {
3225 rc = cifs_are_all_path_components_accessible(server, xid, tcon,
3226 cifs_sb, full_path, tcon->Flags & SMB_SHARE_IS_IN_DFS);
3228 cifs_server_dbg(VFS, "cannot query dirs between root and final path, enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
3229 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
3238 #ifdef CONFIG_CIFS_DFS_UPCALL
3239 static void set_root_ses(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
3240 struct cifs_ses **root_ses)
3243 spin_lock(&cifs_tcp_ses_lock);
3246 ses->tcon_ipc->remap = cifs_remap(cifs_sb);
3247 spin_unlock(&cifs_tcp_ses_lock);
3252 static void put_root_ses(struct cifs_ses *ses)
3255 cifs_put_smb_ses(ses);
3258 /* Check if a path component is remote and then update @dfs_path accordingly */
3259 static int check_dfs_prepath(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx,
3260 const unsigned int xid, struct TCP_Server_Info *server,
3261 struct cifs_tcon *tcon, char **dfs_path)
3264 char sep = CIFS_DIR_SEP(cifs_sb), tmp;
3267 int added_treename = tcon->Flags & SMB_SHARE_IS_IN_DFS;
3268 int skip = added_treename;
3270 path = cifs_build_path_to_root(ctx, cifs_sb, tcon, added_treename);
3275 * Walk through the path components in @path and check if they're accessible. In case any of
3276 * the components is -EREMOTE, then update @dfs_path with the next DFS referral request path
3277 * (NOT including the remaining components).
3281 /* skip separators */
3282 while (*s && *s == sep)
3286 /* next separator */
3287 while (*s && *s != sep)
3290 * if the treename is added, we then have to skip the first
3291 * part within the separators
3299 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, path);
3300 if (rc && rc == -EREMOTE) {
3301 struct smb3_fs_context v = {NULL};
3302 /* if @path contains a tree name, skip it in the prefix path */
3303 if (added_treename) {
3304 rc = smb3_parse_devname(path, &v);
3308 npath = build_unc_path_to_root(&v, cifs_sb, true);
3309 smb3_cleanup_fs_context_contents(&v);
3312 v.prepath = path + 1;
3313 npath = build_unc_path_to_root(&v, cifs_sb, true);
3315 if (IS_ERR(npath)) {
3316 rc = PTR_ERR(npath);
3329 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
3333 struct TCP_Server_Info *server = NULL;
3334 struct cifs_ses *ses = NULL, *root_ses = NULL;
3335 struct cifs_tcon *tcon = NULL;
3337 char *ref_path = NULL, *full_path = NULL;
3338 char *oldmnt = NULL;
3339 char *mntdata = NULL;
3341 rc = mount_get_conns(ctx, cifs_sb, &xid, &server, &ses, &tcon);
3343 * Unconditionally try to get an DFS referral (even cached) to determine whether it is an
3346 * Skip prefix path to provide support for DFS referrals from w2k8 servers which don't seem
3347 * to respond with PATH_NOT_COVERED to requests that include the prefix.
3349 if (dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb), ctx->UNC + 1, NULL,
3351 /* No DFS referral was returned. Looks like a regular share. */
3354 /* Check if it is fully accessible and then mount it */
3355 rc = is_path_remote(cifs_sb, ctx, xid, server, tcon);
3361 /* Save mount options */
3362 mntdata = kstrndup(cifs_sb->ctx->mount_options,
3363 strlen(cifs_sb->ctx->mount_options), GFP_KERNEL);
3368 /* Get path of DFS root */
3369 ref_path = build_unc_path_to_root(ctx, cifs_sb, false);
3370 if (IS_ERR(ref_path)) {
3371 rc = PTR_ERR(ref_path);
3376 set_root_ses(cifs_sb, ses, &root_ses);
3378 /* Save full path of last DFS path we used to resolve final target server */
3380 full_path = build_unc_path_to_root(ctx, cifs_sb, !!count);
3381 if (IS_ERR(full_path)) {
3382 rc = PTR_ERR(full_path);
3386 /* Chase referral */
3387 oldmnt = cifs_sb->ctx->mount_options;
3388 rc = expand_dfs_referral(xid, root_ses, ctx, cifs_sb, ref_path + 1);
3391 /* Connect to new DFS target only if we were redirected */
3392 if (oldmnt != cifs_sb->ctx->mount_options) {
3393 mount_put_conns(cifs_sb, xid, server, ses, tcon);
3394 rc = mount_get_conns(ctx, cifs_sb, &xid, &server, &ses, &tcon);
3396 if (rc && !server && !ses) {
3397 /* Failed to connect. Try to connect to other targets in the referral. */
3398 rc = do_dfs_failover(ref_path + 1, full_path, cifs_sb, ctx, root_ses, &xid,
3399 &server, &ses, &tcon);
3401 if (rc == -EACCES || rc == -EOPNOTSUPP || !server || !ses)
3405 /* Make sure that requests go through new root servers */
3406 if (is_tcon_dfs(tcon)) {
3407 put_root_ses(root_ses);
3408 set_root_ses(cifs_sb, ses, &root_ses);
3410 /* Check for remaining path components and then continue chasing them (-EREMOTE) */
3411 rc = check_dfs_prepath(cifs_sb, ctx, xid, server, tcon, &ref_path);
3412 /* Prevent recursion on broken link referrals */
3413 if (rc == -EREMOTE && ++count > MAX_NESTED_LINKS)
3415 } while (rc == -EREMOTE);
3419 put_root_ses(root_ses);
3424 * Store DFS full path in both superblock and tree connect structures.
3426 * For DFS root mounts, the prefix path (cifs_sb->prepath) is preserved during reconnect so
3427 * only the root path is set in cifs_sb->origin_fullpath and tcon->dfs_path. And for DFS
3428 * links, the prefix path is included in both and may be changed during reconnect. See
3429 * cifs_tree_connect().
3431 cifs_sb->origin_fullpath = kstrndup(full_path, strlen(full_path), GFP_KERNEL);
3432 if (!cifs_sb->origin_fullpath) {
3436 spin_lock(&cifs_tcp_ses_lock);
3437 tcon->dfs_path = full_path;
3439 tcon->remap = cifs_remap(cifs_sb);
3440 spin_unlock(&cifs_tcp_ses_lock);
3442 /* Add original context for DFS cache to be used when refreshing referrals */
3443 rc = dfs_cache_add_vol(mntdata, ctx, cifs_sb->origin_fullpath);
3447 * After reconnecting to a different server, unique ids won't
3448 * match anymore, so we disable serverino. This prevents
3449 * dentry revalidation to think the dentry are stale (ESTALE).
3451 cifs_autodisable_serverino(cifs_sb);
3453 * Force the use of prefix path to support failover on DFS paths that
3454 * resolve to targets that have different prefix paths.
3456 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
3457 kfree(cifs_sb->prepath);
3458 cifs_sb->prepath = ctx->prepath;
3459 ctx->prepath = NULL;
3463 cifs_try_adding_channels(cifs_sb, ses);
3464 return mount_setup_tlink(cifs_sb, ses, tcon);
3470 kfree(cifs_sb->origin_fullpath);
3471 put_root_ses(root_ses);
3472 mount_put_conns(cifs_sb, xid, server, ses, tcon);
3476 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
3480 struct cifs_ses *ses;
3481 struct cifs_tcon *tcon;
3482 struct TCP_Server_Info *server;
3484 rc = mount_get_conns(ctx, cifs_sb, &xid, &server, &ses, &tcon);
3489 rc = is_path_remote(cifs_sb, ctx, xid, server, tcon);
3498 return mount_setup_tlink(cifs_sb, ses, tcon);
3501 mount_put_conns(cifs_sb, xid, server, ses, tcon);
3507 * Issue a TREE_CONNECT request.
3510 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
3511 const char *tree, struct cifs_tcon *tcon,
3512 const struct nls_table *nls_codepage)
3514 struct smb_hdr *smb_buffer;
3515 struct smb_hdr *smb_buffer_response;
3518 unsigned char *bcc_ptr;
3521 __u16 bytes_left, count;
3526 smb_buffer = cifs_buf_get();
3527 if (smb_buffer == NULL)
3530 smb_buffer_response = smb_buffer;
3532 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
3533 NULL /*no tid */ , 4 /*wct */ );
3535 smb_buffer->Mid = get_next_mid(ses->server);
3536 smb_buffer->Uid = ses->Suid;
3537 pSMB = (TCONX_REQ *) smb_buffer;
3538 pSMBr = (TCONX_RSP *) smb_buffer_response;
3540 pSMB->AndXCommand = 0xFF;
3541 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
3542 bcc_ptr = &pSMB->Password[0];
3543 if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
3544 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
3545 *bcc_ptr = 0; /* password is null byte */
3546 bcc_ptr++; /* skip password */
3547 /* already aligned so no need to do it below */
3549 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
3550 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3551 specified as required (when that support is added to
3552 the vfs in the future) as only NTLM or the much
3553 weaker LANMAN (which we do not send by default) is accepted
3554 by Samba (not sure whether other servers allow
3555 NTLMv2 password here) */
3556 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3557 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
3558 (ses->sectype == LANMAN))
3559 calc_lanman_hash(tcon->password, ses->server->cryptkey,
3560 ses->server->sec_mode &
3561 SECMODE_PW_ENCRYPT ? true : false,
3564 #endif /* CIFS_WEAK_PW_HASH */
3565 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
3566 bcc_ptr, nls_codepage);
3568 cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
3570 cifs_buf_release(smb_buffer);
3574 bcc_ptr += CIFS_AUTH_RESP_SIZE;
3575 if (ses->capabilities & CAP_UNICODE) {
3576 /* must align unicode strings */
3577 *bcc_ptr = 0; /* null byte password */
3582 if (ses->server->sign)
3583 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
3585 if (ses->capabilities & CAP_STATUS32) {
3586 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
3588 if (ses->capabilities & CAP_DFS) {
3589 smb_buffer->Flags2 |= SMBFLG2_DFS;
3591 if (ses->capabilities & CAP_UNICODE) {
3592 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
3594 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
3595 6 /* max utf8 char length in bytes */ *
3596 (/* server len*/ + 256 /* share len */), nls_codepage);
3597 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
3598 bcc_ptr += 2; /* skip trailing null */
3599 } else { /* ASCII */
3600 strcpy(bcc_ptr, tree);
3601 bcc_ptr += strlen(tree) + 1;
3603 strcpy(bcc_ptr, "?????");
3604 bcc_ptr += strlen("?????");
3606 count = bcc_ptr - &pSMB->Password[0];
3607 be32_add_cpu(&pSMB->hdr.smb_buf_length, count);
3608 pSMB->ByteCount = cpu_to_le16(count);
3610 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
3613 /* above now done in SendReceive */
3617 tcon->tidStatus = CifsGood;
3618 tcon->need_reconnect = false;
3619 tcon->tid = smb_buffer_response->Tid;
3620 bcc_ptr = pByteArea(smb_buffer_response);
3621 bytes_left = get_bcc(smb_buffer_response);
3622 length = strnlen(bcc_ptr, bytes_left - 2);
3623 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
3629 /* skip service field (NB: this field is always ASCII) */
3631 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
3632 (bcc_ptr[2] == 'C')) {
3633 cifs_dbg(FYI, "IPC connection\n");
3637 } else if (length == 2) {
3638 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
3639 /* the most common case */
3640 cifs_dbg(FYI, "disk share connection\n");
3643 bcc_ptr += length + 1;
3644 bytes_left -= (length + 1);
3645 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
3647 /* mostly informational -- no need to fail on error here */
3648 kfree(tcon->nativeFileSystem);
3649 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
3650 bytes_left, is_unicode,
3653 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
3655 if ((smb_buffer_response->WordCount == 3) ||
3656 (smb_buffer_response->WordCount == 7))
3657 /* field is in same location */
3658 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
3661 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
3664 cifs_buf_release(smb_buffer);
3668 static void delayed_free(struct rcu_head *p)
3670 struct cifs_sb_info *cifs_sb = container_of(p, struct cifs_sb_info, rcu);
3672 unload_nls(cifs_sb->local_nls);
3673 smb3_cleanup_fs_context(cifs_sb->ctx);
3678 cifs_umount(struct cifs_sb_info *cifs_sb)
3680 struct rb_root *root = &cifs_sb->tlink_tree;
3681 struct rb_node *node;
3682 struct tcon_link *tlink;
3684 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
3686 spin_lock(&cifs_sb->tlink_tree_lock);
3687 while ((node = rb_first(root))) {
3688 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3689 cifs_get_tlink(tlink);
3690 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3691 rb_erase(node, root);
3693 spin_unlock(&cifs_sb->tlink_tree_lock);
3694 cifs_put_tlink(tlink);
3695 spin_lock(&cifs_sb->tlink_tree_lock);
3697 spin_unlock(&cifs_sb->tlink_tree_lock);
3699 kfree(cifs_sb->prepath);
3700 #ifdef CONFIG_CIFS_DFS_UPCALL
3701 dfs_cache_del_vol(cifs_sb->origin_fullpath);
3702 kfree(cifs_sb->origin_fullpath);
3704 call_rcu(&cifs_sb->rcu, delayed_free);
3708 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
3711 struct TCP_Server_Info *server = cifs_ses_server(ses);
3713 if (!server->ops->need_neg || !server->ops->negotiate)
3716 /* only send once per connect */
3717 if (!server->ops->need_neg(server))
3720 rc = server->ops->negotiate(xid, ses);
3722 spin_lock(&GlobalMid_Lock);
3723 if (server->tcpStatus == CifsNeedNegotiate)
3724 server->tcpStatus = CifsGood;
3727 spin_unlock(&GlobalMid_Lock);
3734 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
3735 struct nls_table *nls_info)
3738 struct TCP_Server_Info *server = cifs_ses_server(ses);
3740 if (!ses->binding) {
3741 ses->capabilities = server->capabilities;
3742 if (linuxExtEnabled == 0)
3743 ses->capabilities &= (~server->vals->cap_unix);
3745 if (ses->auth_key.response) {
3746 cifs_dbg(FYI, "Free previous auth_key.response = %p\n",
3747 ses->auth_key.response);
3748 kfree(ses->auth_key.response);
3749 ses->auth_key.response = NULL;
3750 ses->auth_key.len = 0;
3754 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
3755 server->sec_mode, server->capabilities, server->timeAdj);
3757 if (server->ops->sess_setup)
3758 rc = server->ops->sess_setup(xid, ses, nls_info);
3761 cifs_server_dbg(VFS, "Send error in SessSetup = %d\n", rc);
3767 cifs_set_vol_auth(struct smb3_fs_context *ctx, struct cifs_ses *ses)
3769 ctx->sectype = ses->sectype;
3771 /* krb5 is special, since we don't need username or pw */
3772 if (ctx->sectype == Kerberos)
3775 return cifs_set_cifscreds(ctx, ses);
3778 static struct cifs_tcon *
3779 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
3782 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
3783 struct cifs_ses *ses;
3784 struct cifs_tcon *tcon = NULL;
3785 struct smb3_fs_context *ctx;
3787 ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
3789 return ERR_PTR(-ENOMEM);
3791 ctx->local_nls = cifs_sb->local_nls;
3792 ctx->linux_uid = fsuid;
3793 ctx->cred_uid = fsuid;
3794 ctx->UNC = master_tcon->treeName;
3795 ctx->retry = master_tcon->retry;
3796 ctx->nocase = master_tcon->nocase;
3797 ctx->nohandlecache = master_tcon->nohandlecache;
3798 ctx->local_lease = master_tcon->local_lease;
3799 ctx->no_lease = master_tcon->no_lease;
3800 ctx->resilient = master_tcon->use_resilient;
3801 ctx->persistent = master_tcon->use_persistent;
3802 ctx->handle_timeout = master_tcon->handle_timeout;
3803 ctx->no_linux_ext = !master_tcon->unix_ext;
3804 ctx->linux_ext = master_tcon->posix_extensions;
3805 ctx->sectype = master_tcon->ses->sectype;
3806 ctx->sign = master_tcon->ses->sign;
3807 ctx->seal = master_tcon->seal;
3808 #ifdef CONFIG_CIFS_SWN_UPCALL
3809 ctx->witness = master_tcon->use_witness;
3812 rc = cifs_set_vol_auth(ctx, master_tcon->ses);
3818 /* get a reference for the same TCP session */
3819 spin_lock(&cifs_tcp_ses_lock);
3820 ++master_tcon->ses->server->srv_count;
3821 spin_unlock(&cifs_tcp_ses_lock);
3823 ses = cifs_get_smb_ses(master_tcon->ses->server, ctx);
3825 tcon = (struct cifs_tcon *)ses;
3826 cifs_put_tcp_session(master_tcon->ses->server, 0);
3830 tcon = cifs_get_tcon(ses, ctx);
3832 cifs_put_smb_ses(ses);
3837 reset_cifs_unix_caps(0, tcon, NULL, ctx);
3840 kfree(ctx->username);
3841 kfree_sensitive(ctx->password);
3848 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
3850 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
3853 /* find and return a tlink with given uid */
3854 static struct tcon_link *
3855 tlink_rb_search(struct rb_root *root, kuid_t uid)
3857 struct rb_node *node = root->rb_node;
3858 struct tcon_link *tlink;
3861 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3863 if (uid_gt(tlink->tl_uid, uid))
3864 node = node->rb_left;
3865 else if (uid_lt(tlink->tl_uid, uid))
3866 node = node->rb_right;
3873 /* insert a tcon_link into the tree */
3875 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
3877 struct rb_node **new = &(root->rb_node), *parent = NULL;
3878 struct tcon_link *tlink;
3881 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
3884 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
3885 new = &((*new)->rb_left);
3887 new = &((*new)->rb_right);
3890 rb_link_node(&new_tlink->tl_rbnode, parent, new);
3891 rb_insert_color(&new_tlink->tl_rbnode, root);
3895 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
3898 * If the superblock doesn't refer to a multiuser mount, then just return
3899 * the master tcon for the mount.
3901 * First, search the rbtree for an existing tcon for this fsuid. If one
3902 * exists, then check to see if it's pending construction. If it is then wait
3903 * for construction to complete. Once it's no longer pending, check to see if
3904 * it failed and either return an error or retry construction, depending on
3907 * If one doesn't exist then insert a new tcon_link struct into the tree and
3908 * try to construct a new one.
3911 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
3914 kuid_t fsuid = current_fsuid();
3915 struct tcon_link *tlink, *newtlink;
3917 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
3918 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3920 spin_lock(&cifs_sb->tlink_tree_lock);
3921 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
3923 cifs_get_tlink(tlink);
3924 spin_unlock(&cifs_sb->tlink_tree_lock);
3926 if (tlink == NULL) {
3927 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
3928 if (newtlink == NULL)
3929 return ERR_PTR(-ENOMEM);
3930 newtlink->tl_uid = fsuid;
3931 newtlink->tl_tcon = ERR_PTR(-EACCES);
3932 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
3933 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
3934 cifs_get_tlink(newtlink);
3936 spin_lock(&cifs_sb->tlink_tree_lock);
3937 /* was one inserted after previous search? */
3938 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
3940 cifs_get_tlink(tlink);
3941 spin_unlock(&cifs_sb->tlink_tree_lock);
3943 goto wait_for_construction;
3946 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
3947 spin_unlock(&cifs_sb->tlink_tree_lock);
3949 wait_for_construction:
3950 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
3951 TASK_INTERRUPTIBLE);
3953 cifs_put_tlink(tlink);
3954 return ERR_PTR(-ERESTARTSYS);
3957 /* if it's good, return it */
3958 if (!IS_ERR(tlink->tl_tcon))
3961 /* return error if we tried this already recently */
3962 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
3963 cifs_put_tlink(tlink);
3964 return ERR_PTR(-EACCES);
3967 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
3968 goto wait_for_construction;
3971 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
3972 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
3973 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
3975 if (IS_ERR(tlink->tl_tcon)) {
3976 cifs_put_tlink(tlink);
3977 return ERR_PTR(-EACCES);
3984 * periodic workqueue job that scans tcon_tree for a superblock and closes
3988 cifs_prune_tlinks(struct work_struct *work)
3990 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
3992 struct rb_root *root = &cifs_sb->tlink_tree;
3993 struct rb_node *node;
3994 struct rb_node *tmp;
3995 struct tcon_link *tlink;
3998 * Because we drop the spinlock in the loop in order to put the tlink
3999 * it's not guarded against removal of links from the tree. The only
4000 * places that remove entries from the tree are this function and
4001 * umounts. Because this function is non-reentrant and is canceled
4002 * before umount can proceed, this is safe.
4004 spin_lock(&cifs_sb->tlink_tree_lock);
4005 node = rb_first(root);
4006 while (node != NULL) {
4008 node = rb_next(tmp);
4009 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
4011 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
4012 atomic_read(&tlink->tl_count) != 0 ||
4013 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
4016 cifs_get_tlink(tlink);
4017 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4018 rb_erase(tmp, root);
4020 spin_unlock(&cifs_sb->tlink_tree_lock);
4021 cifs_put_tlink(tlink);
4022 spin_lock(&cifs_sb->tlink_tree_lock);
4024 spin_unlock(&cifs_sb->tlink_tree_lock);
4026 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4030 #ifdef CONFIG_CIFS_DFS_UPCALL
4031 int cifs_tree_connect(const unsigned int xid, struct cifs_tcon *tcon, const struct nls_table *nlsc)
4034 struct TCP_Server_Info *server = tcon->ses->server;
4035 const struct smb_version_operations *ops = server->ops;
4036 struct dfs_cache_tgt_list tl;
4037 struct dfs_cache_tgt_iterator *it = NULL;
4039 const char *tcp_host;
4040 size_t tcp_host_len;
4041 const char *dfs_host;
4042 size_t dfs_host_len;
4043 char *share = NULL, *prefix = NULL;
4044 struct dfs_info3_param ref = {0};
4047 tree = kzalloc(MAX_TREE_SIZE, GFP_KERNEL);
4051 if (!tcon->dfs_path) {
4053 scnprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$", server->hostname);
4054 rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
4056 rc = ops->tree_connect(xid, tcon->ses, tcon->treeName, tcon, nlsc);
4061 rc = dfs_cache_noreq_find(tcon->dfs_path + 1, &ref, &tl);
4064 isroot = ref.server_type == DFS_TYPE_ROOT;
4065 free_dfs_info_param(&ref);
4067 extract_unc_hostname(server->hostname, &tcp_host, &tcp_host_len);
4069 for (it = dfs_cache_get_tgt_iterator(&tl); it; it = dfs_cache_get_next_tgt(&tl, it)) {
4077 rc = dfs_cache_get_tgt_share(tcon->dfs_path + 1, it, &share, &prefix);
4079 cifs_dbg(VFS, "%s: failed to parse target share %d\n",
4084 extract_unc_hostname(share, &dfs_host, &dfs_host_len);
4086 if (dfs_host_len != tcp_host_len
4087 || strncasecmp(dfs_host, tcp_host, dfs_host_len) != 0) {
4088 cifs_dbg(FYI, "%s: %.*s doesn't match %.*s\n", __func__, (int)dfs_host_len,
4089 dfs_host, (int)tcp_host_len, tcp_host);
4091 rc = match_target_ip(server, dfs_host, dfs_host_len, &target_match);
4093 cifs_dbg(VFS, "%s: failed to match target ip: %d\n", __func__, rc);
4097 if (!target_match) {
4098 cifs_dbg(FYI, "%s: skipping target\n", __func__);
4104 scnprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$", share);
4105 rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
4107 scnprintf(tree, MAX_TREE_SIZE, "\\%s", share);
4108 rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
4109 /* Only handle prefix paths of DFS link targets */
4110 if (!rc && !isroot) {
4111 rc = update_super_prepath(tcon, prefix);
4124 rc = dfs_cache_noreq_update_tgthint(tcon->dfs_path + 1, it);
4128 dfs_cache_free_tgts(&tl);
4134 int cifs_tree_connect(const unsigned int xid, struct cifs_tcon *tcon, const struct nls_table *nlsc)
4136 const struct smb_version_operations *ops = tcon->ses->server->ops;
4138 return ops->tree_connect(xid, tcon->ses, tcon->treeName, tcon, nlsc);