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"
67 extern mempool_t *cifs_req_poolp;
68 extern bool disable_legacy_dialects;
70 /* FIXME: should these be tunable? */
71 #define TLINK_ERROR_EXPIRE (1 * HZ)
72 #define TLINK_IDLE_EXPIRE (600 * HZ)
74 /* Drop the connection to not overload the server */
75 #define NUM_STATUS_IO_TIMEOUT 5
77 static int ip_connect(struct TCP_Server_Info *server);
78 static int generic_ip_connect(struct TCP_Server_Info *server);
79 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
80 static void cifs_prune_tlinks(struct work_struct *work);
83 * Resolve hostname and set ip addr in tcp ses. Useful for hostnames that may
84 * get their ip addresses changed at some point.
86 * This should be called with server->srv_mutex held.
88 static int reconn_set_ipaddr_from_hostname(struct TCP_Server_Info *server)
92 char *unc, *ipaddr = NULL;
94 unsigned long ttl = SMB_DNS_RESOLVE_INTERVAL_DEFAULT;
96 if (!server->hostname)
99 len = strlen(server->hostname) + 3;
101 unc = kmalloc(len, GFP_KERNEL);
103 cifs_dbg(FYI, "%s: failed to create UNC path\n", __func__);
106 scnprintf(unc, len, "\\\\%s", server->hostname);
108 rc = dns_resolve_server_name_to_ip(unc, &ipaddr, &expiry);
112 cifs_dbg(FYI, "%s: failed to resolve server part of %s to IP: %d\n",
113 __func__, server->hostname, rc);
114 goto requeue_resolve;
117 spin_lock(&cifs_tcp_ses_lock);
118 rc = cifs_convert_address((struct sockaddr *)&server->dstaddr, ipaddr,
120 spin_unlock(&cifs_tcp_ses_lock);
123 /* rc == 1 means success here */
125 now = ktime_get_real_seconds();
126 if (expiry && expiry > now)
128 * To make sure we don't use the cached entry, retry 1s
131 ttl = (expiry - now + 1);
136 cifs_dbg(FYI, "%s: next dns resolution scheduled for %lu seconds in the future\n",
138 mod_delayed_work(cifsiod_wq, &server->resolve, (ttl * HZ));
144 static void cifs_resolve_server(struct work_struct *work)
147 struct TCP_Server_Info *server = container_of(work,
148 struct TCP_Server_Info, resolve.work);
150 mutex_lock(&server->srv_mutex);
153 * Resolve the hostname again to make sure that IP address is up-to-date.
155 rc = reconn_set_ipaddr_from_hostname(server);
157 cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
161 mutex_unlock(&server->srv_mutex);
164 #ifdef CONFIG_CIFS_DFS_UPCALL
165 /* These functions must be called with server->srv_mutex held */
166 static void reconn_set_next_dfs_target(struct TCP_Server_Info *server,
167 struct cifs_sb_info *cifs_sb,
168 struct dfs_cache_tgt_list *tgt_list,
169 struct dfs_cache_tgt_iterator **tgt_it)
174 if (!cifs_sb || !cifs_sb->origin_fullpath)
178 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
180 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
182 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
185 cifs_dbg(FYI, "%s: UNC: %s\n", __func__, cifs_sb->origin_fullpath);
187 name = dfs_cache_get_tgt_name(*tgt_it);
189 kfree(server->hostname);
191 server->hostname = extract_hostname(name);
192 if (IS_ERR(server->hostname)) {
194 "%s: failed to extract hostname from target: %ld\n",
195 __func__, PTR_ERR(server->hostname));
199 rc = reconn_set_ipaddr_from_hostname(server);
201 cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
206 static inline int reconn_setup_dfs_targets(struct cifs_sb_info *cifs_sb,
207 struct dfs_cache_tgt_list *tl)
209 if (!cifs_sb->origin_fullpath)
211 return dfs_cache_noreq_find(cifs_sb->origin_fullpath + 1, NULL, tl);
216 * cifs tcp session reconnection
218 * mark tcp session as reconnecting so temporarily locked
219 * mark all smb sessions as reconnecting for tcp session
220 * reconnect tcp session
221 * wake up waiters on reconnection? - (not needed currently)
224 cifs_reconnect(struct TCP_Server_Info *server)
227 struct list_head *tmp, *tmp2;
228 struct cifs_ses *ses;
229 struct cifs_tcon *tcon;
230 struct mid_q_entry *mid_entry;
231 struct list_head retry_list;
232 #ifdef CONFIG_CIFS_DFS_UPCALL
233 struct super_block *sb = NULL;
234 struct cifs_sb_info *cifs_sb = NULL;
235 struct dfs_cache_tgt_list tgt_list = {0};
236 struct dfs_cache_tgt_iterator *tgt_it = NULL;
239 spin_lock(&GlobalMid_Lock);
240 server->nr_targets = 1;
241 #ifdef CONFIG_CIFS_DFS_UPCALL
242 spin_unlock(&GlobalMid_Lock);
243 sb = cifs_get_tcp_super(server);
246 cifs_dbg(FYI, "%s: will not do DFS failover: rc = %d\n",
250 cifs_sb = CIFS_SB(sb);
251 rc = reconn_setup_dfs_targets(cifs_sb, &tgt_list);
254 if (rc != -EOPNOTSUPP) {
255 cifs_server_dbg(VFS, "%s: no target servers for DFS failover\n",
259 server->nr_targets = dfs_cache_get_nr_tgts(&tgt_list);
262 cifs_dbg(FYI, "%s: will retry %d target(s)\n", __func__,
264 spin_lock(&GlobalMid_Lock);
266 if (server->tcpStatus == CifsExiting) {
267 /* the demux thread will exit normally
268 next time through the loop */
269 spin_unlock(&GlobalMid_Lock);
270 #ifdef CONFIG_CIFS_DFS_UPCALL
271 dfs_cache_free_tgts(&tgt_list);
272 cifs_put_tcp_super(sb);
274 wake_up(&server->response_q);
277 server->tcpStatus = CifsNeedReconnect;
278 spin_unlock(&GlobalMid_Lock);
280 server->max_read = 0;
282 cifs_dbg(FYI, "Mark tcp session as need reconnect\n");
283 trace_smb3_reconnect(server->CurrentMid, server->conn_id, server->hostname);
285 /* before reconnecting the tcp session, mark the smb session (uid)
286 and the tid bad so they are not used until reconnected */
287 cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
289 spin_lock(&cifs_tcp_ses_lock);
290 list_for_each(tmp, &server->smb_ses_list) {
291 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
292 ses->need_reconnect = true;
293 list_for_each(tmp2, &ses->tcon_list) {
294 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
295 tcon->need_reconnect = true;
298 ses->tcon_ipc->need_reconnect = true;
300 spin_unlock(&cifs_tcp_ses_lock);
302 /* do not want to be sending data on a socket we are freeing */
303 cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
304 mutex_lock(&server->srv_mutex);
305 if (server->ssocket) {
306 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
307 server->ssocket->state, server->ssocket->flags);
308 kernel_sock_shutdown(server->ssocket, SHUT_WR);
309 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
310 server->ssocket->state, server->ssocket->flags);
311 sock_release(server->ssocket);
312 server->ssocket = NULL;
314 server->sequence_number = 0;
315 server->session_estab = false;
316 kfree(server->session_key.response);
317 server->session_key.response = NULL;
318 server->session_key.len = 0;
319 server->lstrp = jiffies;
321 /* mark submitted MIDs for retry and issue callback */
322 INIT_LIST_HEAD(&retry_list);
323 cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
324 spin_lock(&GlobalMid_Lock);
325 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
326 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
327 kref_get(&mid_entry->refcount);
328 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
329 mid_entry->mid_state = MID_RETRY_NEEDED;
330 list_move(&mid_entry->qhead, &retry_list);
331 mid_entry->mid_flags |= MID_DELETED;
333 spin_unlock(&GlobalMid_Lock);
334 mutex_unlock(&server->srv_mutex);
336 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
337 list_for_each_safe(tmp, tmp2, &retry_list) {
338 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
339 list_del_init(&mid_entry->qhead);
340 mid_entry->callback(mid_entry);
341 cifs_mid_q_entry_release(mid_entry);
344 if (cifs_rdma_enabled(server)) {
345 mutex_lock(&server->srv_mutex);
346 smbd_destroy(server);
347 mutex_unlock(&server->srv_mutex);
353 mutex_lock(&server->srv_mutex);
356 if (!cifs_swn_set_server_dstaddr(server)) {
357 #ifdef CONFIG_CIFS_DFS_UPCALL
358 if (cifs_sb && cifs_sb->origin_fullpath)
360 * Set up next DFS target server (if any) for reconnect. If DFS
361 * feature is disabled, then we will retry last server we
362 * connected to before.
364 reconn_set_next_dfs_target(server, cifs_sb, &tgt_list, &tgt_it);
368 * Resolve the hostname again to make sure that IP address is up-to-date.
370 rc = reconn_set_ipaddr_from_hostname(server);
372 cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
376 #ifdef CONFIG_CIFS_DFS_UPCALL
383 if (cifs_rdma_enabled(server))
384 rc = smbd_reconnect(server);
386 rc = generic_ip_connect(server);
388 cifs_dbg(FYI, "reconnect error %d\n", rc);
389 mutex_unlock(&server->srv_mutex);
392 atomic_inc(&tcpSesReconnectCount);
393 set_credits(server, 1);
394 spin_lock(&GlobalMid_Lock);
395 if (server->tcpStatus != CifsExiting)
396 server->tcpStatus = CifsNeedNegotiate;
397 spin_unlock(&GlobalMid_Lock);
398 cifs_swn_reset_server_dstaddr(server);
399 mutex_unlock(&server->srv_mutex);
401 } while (server->tcpStatus == CifsNeedReconnect);
403 #ifdef CONFIG_CIFS_DFS_UPCALL
405 rc = dfs_cache_noreq_update_tgthint(cifs_sb->origin_fullpath + 1,
408 cifs_server_dbg(VFS, "%s: failed to update DFS target hint: rc = %d\n",
411 rc = dfs_cache_update_vol(cifs_sb->origin_fullpath, server);
413 cifs_server_dbg(VFS, "%s: failed to update vol info in DFS cache: rc = %d\n",
416 dfs_cache_free_tgts(&tgt_list);
420 cifs_put_tcp_super(sb);
422 if (server->tcpStatus == CifsNeedNegotiate)
423 mod_delayed_work(cifsiod_wq, &server->echo, 0);
425 wake_up(&server->response_q);
430 cifs_echo_request(struct work_struct *work)
433 struct TCP_Server_Info *server = container_of(work,
434 struct TCP_Server_Info, echo.work);
437 * We cannot send an echo if it is disabled.
438 * Also, no need to ping if we got a response recently.
441 if (server->tcpStatus == CifsNeedReconnect ||
442 server->tcpStatus == CifsExiting ||
443 server->tcpStatus == CifsNew ||
444 (server->ops->can_echo && !server->ops->can_echo(server)) ||
445 time_before(jiffies, server->lstrp + server->echo_interval - HZ))
448 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
450 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
453 /* Check witness registrations */
457 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
461 allocate_buffers(struct TCP_Server_Info *server)
463 if (!server->bigbuf) {
464 server->bigbuf = (char *)cifs_buf_get();
465 if (!server->bigbuf) {
466 cifs_server_dbg(VFS, "No memory for large SMB response\n");
468 /* retry will check if exiting */
471 } else if (server->large_buf) {
472 /* we are reusing a dirty large buf, clear its start */
473 memset(server->bigbuf, 0, HEADER_SIZE(server));
476 if (!server->smallbuf) {
477 server->smallbuf = (char *)cifs_small_buf_get();
478 if (!server->smallbuf) {
479 cifs_server_dbg(VFS, "No memory for SMB response\n");
481 /* retry will check if exiting */
484 /* beginning of smb buffer is cleared in our buf_get */
486 /* if existing small buf clear beginning */
487 memset(server->smallbuf, 0, HEADER_SIZE(server));
494 server_unresponsive(struct TCP_Server_Info *server)
497 * We need to wait 3 echo intervals to make sure we handle such
499 * 1s client sends a normal SMB request
500 * 2s client gets a response
501 * 30s echo workqueue job pops, and decides we got a response recently
502 * and don't need to send another
504 * 65s kernel_recvmsg times out, and we see that we haven't gotten
505 * a response in >60s.
507 if ((server->tcpStatus == CifsGood ||
508 server->tcpStatus == CifsNeedNegotiate) &&
509 (!server->ops->can_echo || server->ops->can_echo(server)) &&
510 time_after(jiffies, server->lstrp + 3 * server->echo_interval)) {
511 cifs_server_dbg(VFS, "has not responded in %lu seconds. Reconnecting...\n",
512 (3 * server->echo_interval) / HZ);
513 cifs_reconnect(server);
521 zero_credits(struct TCP_Server_Info *server)
525 spin_lock(&server->req_lock);
526 val = server->credits + server->echo_credits + server->oplock_credits;
527 if (server->in_flight == 0 && val == 0) {
528 spin_unlock(&server->req_lock);
531 spin_unlock(&server->req_lock);
536 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
541 smb_msg->msg_control = NULL;
542 smb_msg->msg_controllen = 0;
544 for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
547 /* reconnect if no credits and no requests in flight */
548 if (zero_credits(server)) {
549 cifs_reconnect(server);
550 return -ECONNABORTED;
553 if (server_unresponsive(server))
554 return -ECONNABORTED;
555 if (cifs_rdma_enabled(server) && server->smbd_conn)
556 length = smbd_recv(server->smbd_conn, smb_msg);
558 length = sock_recvmsg(server->ssocket, smb_msg, 0);
560 if (server->tcpStatus == CifsExiting)
563 if (server->tcpStatus == CifsNeedReconnect) {
564 cifs_reconnect(server);
565 return -ECONNABORTED;
568 if (length == -ERESTARTSYS ||
572 * Minimum sleep to prevent looping, allowing socket
573 * to clear and app threads to set tcpStatus
574 * CifsNeedReconnect if server hung.
576 usleep_range(1000, 2000);
582 cifs_dbg(FYI, "Received no data or error: %d\n", length);
583 cifs_reconnect(server);
584 return -ECONNABORTED;
591 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
592 unsigned int to_read)
594 struct msghdr smb_msg;
595 struct kvec iov = {.iov_base = buf, .iov_len = to_read};
596 iov_iter_kvec(&smb_msg.msg_iter, READ, &iov, 1, to_read);
598 return cifs_readv_from_socket(server, &smb_msg);
602 cifs_discard_from_socket(struct TCP_Server_Info *server, size_t to_read)
604 struct msghdr smb_msg;
607 * iov_iter_discard already sets smb_msg.type and count and iov_offset
608 * and cifs_readv_from_socket sets msg_control and msg_controllen
609 * so little to initialize in struct msghdr
611 smb_msg.msg_name = NULL;
612 smb_msg.msg_namelen = 0;
613 iov_iter_discard(&smb_msg.msg_iter, READ, to_read);
615 return cifs_readv_from_socket(server, &smb_msg);
619 cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
620 unsigned int page_offset, unsigned int to_read)
622 struct msghdr smb_msg;
623 struct bio_vec bv = {
624 .bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
625 iov_iter_bvec(&smb_msg.msg_iter, READ, &bv, 1, to_read);
626 return cifs_readv_from_socket(server, &smb_msg);
630 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
633 * The first byte big endian of the length field,
634 * is actually not part of the length but the type
635 * with the most common, zero, as regular data.
638 case RFC1002_SESSION_MESSAGE:
639 /* Regular SMB response */
641 case RFC1002_SESSION_KEEP_ALIVE:
642 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
644 case RFC1002_POSITIVE_SESSION_RESPONSE:
645 cifs_dbg(FYI, "RFC 1002 positive session response\n");
647 case RFC1002_NEGATIVE_SESSION_RESPONSE:
649 * We get this from Windows 98 instead of an error on
650 * SMB negprot response.
652 cifs_dbg(FYI, "RFC 1002 negative session response\n");
653 /* give server a second to clean up */
656 * Always try 445 first on reconnect since we get NACK
657 * on some if we ever connected to port 139 (the NACK
658 * is since we do not begin with RFC1001 session
661 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
662 cifs_reconnect(server);
665 cifs_server_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
666 cifs_reconnect(server);
673 dequeue_mid(struct mid_q_entry *mid, bool malformed)
675 #ifdef CONFIG_CIFS_STATS2
676 mid->when_received = jiffies;
678 spin_lock(&GlobalMid_Lock);
680 mid->mid_state = MID_RESPONSE_RECEIVED;
682 mid->mid_state = MID_RESPONSE_MALFORMED;
684 * Trying to handle/dequeue a mid after the send_recv()
685 * function has finished processing it is a bug.
687 if (mid->mid_flags & MID_DELETED)
688 pr_warn_once("trying to dequeue a deleted mid\n");
690 list_del_init(&mid->qhead);
691 mid->mid_flags |= MID_DELETED;
693 spin_unlock(&GlobalMid_Lock);
697 smb2_get_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
699 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
702 * SMB1 does not use credits.
704 if (server->vals->header_preamble_size)
707 return le16_to_cpu(shdr->CreditRequest);
711 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
712 char *buf, int malformed)
714 if (server->ops->check_trans2 &&
715 server->ops->check_trans2(mid, server, buf, malformed))
717 mid->credits_received = smb2_get_credits_from_hdr(buf, server);
719 mid->large_buf = server->large_buf;
720 /* Was previous buf put in mpx struct for multi-rsp? */
721 if (!mid->multiRsp) {
722 /* smb buffer will be freed by user thread */
723 if (server->large_buf)
724 server->bigbuf = NULL;
726 server->smallbuf = NULL;
728 dequeue_mid(mid, malformed);
731 static void clean_demultiplex_info(struct TCP_Server_Info *server)
735 /* take it off the list, if it's not already */
736 spin_lock(&cifs_tcp_ses_lock);
737 list_del_init(&server->tcp_ses_list);
738 spin_unlock(&cifs_tcp_ses_lock);
740 cancel_delayed_work_sync(&server->echo);
741 cancel_delayed_work_sync(&server->resolve);
743 spin_lock(&GlobalMid_Lock);
744 server->tcpStatus = CifsExiting;
745 spin_unlock(&GlobalMid_Lock);
746 wake_up_all(&server->response_q);
748 /* check if we have blocked requests that need to free */
749 spin_lock(&server->req_lock);
750 if (server->credits <= 0)
752 spin_unlock(&server->req_lock);
754 * Although there should not be any requests blocked on this queue it
755 * can not hurt to be paranoid and try to wake up requests that may
756 * haven been blocked when more than 50 at time were on the wire to the
757 * same server - they now will see the session is in exit state and get
758 * out of SendReceive.
760 wake_up_all(&server->request_q);
761 /* give those requests time to exit */
763 if (cifs_rdma_enabled(server))
764 smbd_destroy(server);
765 if (server->ssocket) {
766 sock_release(server->ssocket);
767 server->ssocket = NULL;
770 if (!list_empty(&server->pending_mid_q)) {
771 struct list_head dispose_list;
772 struct mid_q_entry *mid_entry;
773 struct list_head *tmp, *tmp2;
775 INIT_LIST_HEAD(&dispose_list);
776 spin_lock(&GlobalMid_Lock);
777 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
778 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
779 cifs_dbg(FYI, "Clearing mid %llu\n", mid_entry->mid);
780 kref_get(&mid_entry->refcount);
781 mid_entry->mid_state = MID_SHUTDOWN;
782 list_move(&mid_entry->qhead, &dispose_list);
783 mid_entry->mid_flags |= MID_DELETED;
785 spin_unlock(&GlobalMid_Lock);
787 /* now walk dispose list and issue callbacks */
788 list_for_each_safe(tmp, tmp2, &dispose_list) {
789 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
790 cifs_dbg(FYI, "Callback mid %llu\n", mid_entry->mid);
791 list_del_init(&mid_entry->qhead);
792 mid_entry->callback(mid_entry);
793 cifs_mid_q_entry_release(mid_entry);
795 /* 1/8th of sec is more than enough time for them to exit */
799 if (!list_empty(&server->pending_mid_q)) {
801 * mpx threads have not exited yet give them at least the smb
802 * send timeout time for long ops.
804 * Due to delays on oplock break requests, we need to wait at
805 * least 45 seconds before giving up on a request getting a
806 * response and going ahead and killing cifsd.
808 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
811 * If threads still have not exited they are probably never
812 * coming home not much else we can do but free the memory.
816 kfree(server->hostname);
819 length = atomic_dec_return(&tcpSesAllocCount);
821 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
825 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
828 char *buf = server->smallbuf;
829 unsigned int pdu_length = server->pdu_size;
831 /* make sure this will fit in a large buffer */
832 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
833 server->vals->header_preamble_size) {
834 cifs_server_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
835 cifs_reconnect(server);
836 return -ECONNABORTED;
839 /* switch to large buffer if too big for a small one */
840 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
841 server->large_buf = true;
842 memcpy(server->bigbuf, buf, server->total_read);
843 buf = server->bigbuf;
846 /* now read the rest */
847 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
848 pdu_length - HEADER_SIZE(server) + 1
849 + server->vals->header_preamble_size);
853 server->total_read += length;
855 dump_smb(buf, server->total_read);
857 return cifs_handle_standard(server, mid);
861 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
863 char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
867 * We know that we received enough to get to the MID as we
868 * checked the pdu_length earlier. Now check to see
869 * if the rest of the header is OK. We borrow the length
870 * var for the rest of the loop to avoid a new stack var.
872 * 48 bytes is enough to display the header and a little bit
873 * into the payload for debugging purposes.
875 length = server->ops->check_message(buf, server->total_read, server);
877 cifs_dump_mem("Bad SMB: ", buf,
878 min_t(unsigned int, server->total_read, 48));
880 if (server->ops->is_session_expired &&
881 server->ops->is_session_expired(buf)) {
882 cifs_reconnect(server);
886 if (server->ops->is_status_pending &&
887 server->ops->is_status_pending(buf, server))
893 handle_mid(mid, server, buf, length);
898 smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
900 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
901 int scredits, in_flight;
904 * SMB1 does not use credits.
906 if (server->vals->header_preamble_size)
909 if (shdr->CreditRequest) {
910 spin_lock(&server->req_lock);
911 server->credits += le16_to_cpu(shdr->CreditRequest);
912 scredits = server->credits;
913 in_flight = server->in_flight;
914 spin_unlock(&server->req_lock);
915 wake_up(&server->request_q);
917 trace_smb3_add_credits(server->CurrentMid,
918 server->conn_id, server->hostname, scredits,
919 le16_to_cpu(shdr->CreditRequest), in_flight);
920 cifs_server_dbg(FYI, "%s: added %u credits total=%d\n",
921 __func__, le16_to_cpu(shdr->CreditRequest),
928 cifs_demultiplex_thread(void *p)
930 int i, num_mids, length;
931 struct TCP_Server_Info *server = p;
932 unsigned int pdu_length;
933 unsigned int next_offset;
935 struct task_struct *task_to_wake = NULL;
936 struct mid_q_entry *mids[MAX_COMPOUND];
937 char *bufs[MAX_COMPOUND];
938 unsigned int noreclaim_flag, num_io_timeout = 0;
940 noreclaim_flag = memalloc_noreclaim_save();
941 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
943 length = atomic_inc_return(&tcpSesAllocCount);
945 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
948 allow_kernel_signal(SIGKILL);
949 while (server->tcpStatus != CifsExiting) {
953 if (!allocate_buffers(server))
956 server->large_buf = false;
957 buf = server->smallbuf;
958 pdu_length = 4; /* enough to get RFC1001 header */
960 length = cifs_read_from_socket(server, buf, pdu_length);
964 if (server->vals->header_preamble_size == 0)
965 server->total_read = 0;
967 server->total_read = length;
970 * The right amount was read from socket - 4 bytes,
971 * so we can now interpret the length field.
973 pdu_length = get_rfc1002_length(buf);
975 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
976 if (!is_smb_response(server, buf[0]))
979 server->pdu_size = pdu_length;
981 /* make sure we have enough to get to the MID */
982 if (server->pdu_size < HEADER_SIZE(server) - 1 -
983 server->vals->header_preamble_size) {
984 cifs_server_dbg(VFS, "SMB response too short (%u bytes)\n",
986 cifs_reconnect(server);
990 /* read down to the MID */
991 length = cifs_read_from_socket(server,
992 buf + server->vals->header_preamble_size,
993 HEADER_SIZE(server) - 1
994 - server->vals->header_preamble_size);
997 server->total_read += length;
999 if (server->ops->next_header) {
1000 next_offset = server->ops->next_header(buf);
1002 server->pdu_size = next_offset;
1005 memset(mids, 0, sizeof(mids));
1006 memset(bufs, 0, sizeof(bufs));
1009 if (server->ops->is_transform_hdr &&
1010 server->ops->receive_transform &&
1011 server->ops->is_transform_hdr(buf)) {
1012 length = server->ops->receive_transform(server,
1017 mids[0] = server->ops->find_mid(server, buf);
1021 if (!mids[0] || !mids[0]->receive)
1022 length = standard_receive3(server, mids[0]);
1024 length = mids[0]->receive(server, mids[0]);
1028 for (i = 0; i < num_mids; i++)
1030 cifs_mid_q_entry_release(mids[i]);
1034 if (server->ops->is_status_io_timeout &&
1035 server->ops->is_status_io_timeout(buf)) {
1037 if (num_io_timeout > NUM_STATUS_IO_TIMEOUT) {
1038 cifs_reconnect(server);
1044 server->lstrp = jiffies;
1046 for (i = 0; i < num_mids; i++) {
1047 if (mids[i] != NULL) {
1048 mids[i]->resp_buf_size = server->pdu_size;
1050 if (bufs[i] && server->ops->is_network_name_deleted)
1051 server->ops->is_network_name_deleted(bufs[i],
1054 if (!mids[i]->multiRsp || mids[i]->multiEnd)
1055 mids[i]->callback(mids[i]);
1057 cifs_mid_q_entry_release(mids[i]);
1058 } else if (server->ops->is_oplock_break &&
1059 server->ops->is_oplock_break(bufs[i],
1061 smb2_add_credits_from_hdr(bufs[i], server);
1062 cifs_dbg(FYI, "Received oplock break\n");
1064 cifs_server_dbg(VFS, "No task to wake, unknown frame received! NumMids %d\n",
1065 atomic_read(&midCount));
1066 cifs_dump_mem("Received Data is: ", bufs[i],
1067 HEADER_SIZE(server));
1068 smb2_add_credits_from_hdr(bufs[i], server);
1069 #ifdef CONFIG_CIFS_DEBUG2
1070 if (server->ops->dump_detail)
1071 server->ops->dump_detail(bufs[i],
1073 cifs_dump_mids(server);
1074 #endif /* CIFS_DEBUG2 */
1078 if (pdu_length > server->pdu_size) {
1079 if (!allocate_buffers(server))
1081 pdu_length -= server->pdu_size;
1082 server->total_read = 0;
1083 server->large_buf = false;
1084 buf = server->smallbuf;
1087 } /* end while !EXITING */
1089 /* buffer usually freed in free_mid - need to free it here on exit */
1090 cifs_buf_release(server->bigbuf);
1091 if (server->smallbuf) /* no sense logging a debug message if NULL */
1092 cifs_small_buf_release(server->smallbuf);
1094 task_to_wake = xchg(&server->tsk, NULL);
1095 clean_demultiplex_info(server);
1097 /* if server->tsk was NULL then wait for a signal before exiting */
1098 if (!task_to_wake) {
1099 set_current_state(TASK_INTERRUPTIBLE);
1100 while (!signal_pending(current)) {
1102 set_current_state(TASK_INTERRUPTIBLE);
1104 set_current_state(TASK_RUNNING);
1107 memalloc_noreclaim_restore(noreclaim_flag);
1108 module_put_and_exit(0);
1112 * Returns true if srcaddr isn't specified and rhs isn't specified, or
1113 * if srcaddr is specified and matches the IP address of the rhs argument
1116 cifs_match_ipaddr(struct sockaddr *srcaddr, struct sockaddr *rhs)
1118 switch (srcaddr->sa_family) {
1120 return (rhs->sa_family == AF_UNSPEC);
1122 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
1123 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
1124 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
1127 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
1128 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
1129 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
1133 return false; /* don't expect to be here */
1138 * If no port is specified in addr structure, we try to match with 445 port
1139 * and if it fails - with 139 ports. It should be called only if address
1140 * families of server and addr are equal.
1143 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
1145 __be16 port, *sport;
1147 /* SMBDirect manages its own ports, don't match it here */
1151 switch (addr->sa_family) {
1153 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
1154 port = ((struct sockaddr_in *) addr)->sin_port;
1157 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
1158 port = ((struct sockaddr_in6 *) addr)->sin6_port;
1166 port = htons(CIFS_PORT);
1170 port = htons(RFC1001_PORT);
1173 return port == *sport;
1177 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
1178 struct sockaddr *srcaddr)
1180 switch (addr->sa_family) {
1182 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
1183 struct sockaddr_in *srv_addr4 =
1184 (struct sockaddr_in *)&server->dstaddr;
1186 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
1191 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
1192 struct sockaddr_in6 *srv_addr6 =
1193 (struct sockaddr_in6 *)&server->dstaddr;
1195 if (!ipv6_addr_equal(&addr6->sin6_addr,
1196 &srv_addr6->sin6_addr))
1198 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
1204 return false; /* don't expect to be here */
1207 if (!cifs_match_ipaddr(srcaddr, (struct sockaddr *)&server->srcaddr))
1214 match_security(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1217 * The select_sectype function should either return the ctx->sectype
1218 * that was specified, or "Unspecified" if that sectype was not
1219 * compatible with the given NEGOTIATE request.
1221 if (server->ops->select_sectype(server, ctx->sectype)
1226 * Now check if signing mode is acceptable. No need to check
1227 * global_secflags at this point since if MUST_SIGN is set then
1228 * the server->sign had better be too.
1230 if (ctx->sign && !server->sign)
1236 static int match_server(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1238 struct sockaddr *addr = (struct sockaddr *)&ctx->dstaddr;
1240 if (ctx->nosharesock)
1243 /* If multidialect negotiation see if existing sessions match one */
1244 if (strcmp(ctx->vals->version_string, SMB3ANY_VERSION_STRING) == 0) {
1245 if (server->vals->protocol_id < SMB30_PROT_ID)
1247 } else if (strcmp(ctx->vals->version_string,
1248 SMBDEFAULT_VERSION_STRING) == 0) {
1249 if (server->vals->protocol_id < SMB21_PROT_ID)
1251 } else if ((server->vals != ctx->vals) || (server->ops != ctx->ops))
1254 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
1257 if (!match_address(server, addr,
1258 (struct sockaddr *)&ctx->srcaddr))
1261 if (!match_port(server, addr))
1264 if (!match_security(server, ctx))
1267 if (server->echo_interval != ctx->echo_interval * HZ)
1270 if (server->rdma != ctx->rdma)
1273 if (server->ignore_signature != ctx->ignore_signature)
1276 if (server->min_offload != ctx->min_offload)
1282 struct TCP_Server_Info *
1283 cifs_find_tcp_session(struct smb3_fs_context *ctx)
1285 struct TCP_Server_Info *server;
1287 spin_lock(&cifs_tcp_ses_lock);
1288 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
1290 * Skip ses channels since they're only handled in lower layers
1291 * (e.g. cifs_send_recv).
1293 if (server->is_channel || !match_server(server, ctx))
1296 ++server->srv_count;
1297 spin_unlock(&cifs_tcp_ses_lock);
1298 cifs_dbg(FYI, "Existing tcp session with server found\n");
1301 spin_unlock(&cifs_tcp_ses_lock);
1306 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
1308 struct task_struct *task;
1310 spin_lock(&cifs_tcp_ses_lock);
1311 if (--server->srv_count > 0) {
1312 spin_unlock(&cifs_tcp_ses_lock);
1316 put_net(cifs_net_ns(server));
1318 list_del_init(&server->tcp_ses_list);
1319 spin_unlock(&cifs_tcp_ses_lock);
1321 cancel_delayed_work_sync(&server->echo);
1322 cancel_delayed_work_sync(&server->resolve);
1326 * Avoid deadlock here: reconnect work calls
1327 * cifs_put_tcp_session() at its end. Need to be sure
1328 * that reconnect work does nothing with server pointer after
1331 cancel_delayed_work(&server->reconnect);
1333 cancel_delayed_work_sync(&server->reconnect);
1335 spin_lock(&GlobalMid_Lock);
1336 server->tcpStatus = CifsExiting;
1337 spin_unlock(&GlobalMid_Lock);
1339 cifs_crypto_secmech_release(server);
1340 cifs_fscache_release_client_cookie(server);
1342 kfree(server->session_key.response);
1343 server->session_key.response = NULL;
1344 server->session_key.len = 0;
1346 task = xchg(&server->tsk, NULL);
1348 send_sig(SIGKILL, task, 1);
1351 struct TCP_Server_Info *
1352 cifs_get_tcp_session(struct smb3_fs_context *ctx)
1354 struct TCP_Server_Info *tcp_ses = NULL;
1357 cifs_dbg(FYI, "UNC: %s\n", ctx->UNC);
1359 /* see if we already have a matching tcp_ses */
1360 tcp_ses = cifs_find_tcp_session(ctx);
1364 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
1370 tcp_ses->ops = ctx->ops;
1371 tcp_ses->vals = ctx->vals;
1372 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
1373 tcp_ses->hostname = extract_hostname(ctx->UNC);
1374 if (IS_ERR(tcp_ses->hostname)) {
1375 rc = PTR_ERR(tcp_ses->hostname);
1376 goto out_err_crypto_release;
1379 tcp_ses->conn_id = atomic_inc_return(&tcpSesNextId);
1380 tcp_ses->noblockcnt = ctx->rootfs;
1381 tcp_ses->noblocksnd = ctx->noblocksnd || ctx->rootfs;
1382 tcp_ses->noautotune = ctx->noautotune;
1383 tcp_ses->tcp_nodelay = ctx->sockopt_tcp_nodelay;
1384 tcp_ses->rdma = ctx->rdma;
1385 tcp_ses->in_flight = 0;
1386 tcp_ses->max_in_flight = 0;
1387 tcp_ses->credits = 1;
1388 init_waitqueue_head(&tcp_ses->response_q);
1389 init_waitqueue_head(&tcp_ses->request_q);
1390 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
1391 mutex_init(&tcp_ses->srv_mutex);
1392 memcpy(tcp_ses->workstation_RFC1001_name,
1393 ctx->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
1394 memcpy(tcp_ses->server_RFC1001_name,
1395 ctx->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
1396 tcp_ses->session_estab = false;
1397 tcp_ses->sequence_number = 0;
1398 tcp_ses->reconnect_instance = 1;
1399 tcp_ses->lstrp = jiffies;
1400 tcp_ses->compress_algorithm = cpu_to_le16(ctx->compression);
1401 spin_lock_init(&tcp_ses->req_lock);
1402 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
1403 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
1404 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
1405 INIT_DELAYED_WORK(&tcp_ses->resolve, cifs_resolve_server);
1406 INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
1407 mutex_init(&tcp_ses->reconnect_mutex);
1408 memcpy(&tcp_ses->srcaddr, &ctx->srcaddr,
1409 sizeof(tcp_ses->srcaddr));
1410 memcpy(&tcp_ses->dstaddr, &ctx->dstaddr,
1411 sizeof(tcp_ses->dstaddr));
1412 if (ctx->use_client_guid)
1413 memcpy(tcp_ses->client_guid, ctx->client_guid,
1414 SMB2_CLIENT_GUID_SIZE);
1416 generate_random_uuid(tcp_ses->client_guid);
1418 * at this point we are the only ones with the pointer
1419 * to the struct since the kernel thread not created yet
1420 * no need to spinlock this init of tcpStatus or srv_count
1422 tcp_ses->tcpStatus = CifsNew;
1423 ++tcp_ses->srv_count;
1425 if (ctx->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
1426 ctx->echo_interval <= SMB_ECHO_INTERVAL_MAX)
1427 tcp_ses->echo_interval = ctx->echo_interval * HZ;
1429 tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
1430 if (tcp_ses->rdma) {
1431 #ifndef CONFIG_CIFS_SMB_DIRECT
1432 cifs_dbg(VFS, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
1434 goto out_err_crypto_release;
1436 tcp_ses->smbd_conn = smbd_get_connection(
1437 tcp_ses, (struct sockaddr *)&ctx->dstaddr);
1438 if (tcp_ses->smbd_conn) {
1439 cifs_dbg(VFS, "RDMA transport established\n");
1441 goto smbd_connected;
1444 goto out_err_crypto_release;
1447 rc = ip_connect(tcp_ses);
1449 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
1450 goto out_err_crypto_release;
1454 * since we're in a cifs function already, we know that
1455 * this will succeed. No need for try_module_get().
1457 __module_get(THIS_MODULE);
1458 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
1460 if (IS_ERR(tcp_ses->tsk)) {
1461 rc = PTR_ERR(tcp_ses->tsk);
1462 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
1463 module_put(THIS_MODULE);
1464 goto out_err_crypto_release;
1466 tcp_ses->min_offload = ctx->min_offload;
1467 tcp_ses->tcpStatus = CifsNeedNegotiate;
1469 if ((ctx->max_credits < 20) || (ctx->max_credits > 60000))
1470 tcp_ses->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
1472 tcp_ses->max_credits = ctx->max_credits;
1474 tcp_ses->nr_targets = 1;
1475 tcp_ses->ignore_signature = ctx->ignore_signature;
1476 /* thread spawned, put it on the list */
1477 spin_lock(&cifs_tcp_ses_lock);
1478 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
1479 spin_unlock(&cifs_tcp_ses_lock);
1481 cifs_fscache_get_client_cookie(tcp_ses);
1483 /* queue echo request delayed work */
1484 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
1486 /* queue dns resolution delayed work */
1487 cifs_dbg(FYI, "%s: next dns resolution scheduled for %d seconds in the future\n",
1488 __func__, SMB_DNS_RESOLVE_INTERVAL_DEFAULT);
1490 queue_delayed_work(cifsiod_wq, &tcp_ses->resolve, (SMB_DNS_RESOLVE_INTERVAL_DEFAULT * HZ));
1494 out_err_crypto_release:
1495 cifs_crypto_secmech_release(tcp_ses);
1497 put_net(cifs_net_ns(tcp_ses));
1501 if (!IS_ERR(tcp_ses->hostname))
1502 kfree(tcp_ses->hostname);
1503 if (tcp_ses->ssocket)
1504 sock_release(tcp_ses->ssocket);
1510 static int match_session(struct cifs_ses *ses, struct smb3_fs_context *ctx)
1512 if (ctx->sectype != Unspecified &&
1513 ctx->sectype != ses->sectype)
1517 * If an existing session is limited to less channels than
1518 * requested, it should not be reused
1520 if (ses->chan_max < ctx->max_channels)
1523 switch (ses->sectype) {
1525 if (!uid_eq(ctx->cred_uid, ses->cred_uid))
1529 /* NULL username means anonymous session */
1530 if (ses->user_name == NULL) {
1536 /* anything else takes username/password */
1537 if (strncmp(ses->user_name,
1538 ctx->username ? ctx->username : "",
1539 CIFS_MAX_USERNAME_LEN))
1541 if ((ctx->username && strlen(ctx->username) != 0) &&
1542 ses->password != NULL &&
1543 strncmp(ses->password,
1544 ctx->password ? ctx->password : "",
1545 CIFS_MAX_PASSWORD_LEN))
1552 * cifs_setup_ipc - helper to setup the IPC tcon for the session
1554 * A new IPC connection is made and stored in the session
1555 * tcon_ipc. The IPC tcon has the same lifetime as the session.
1558 cifs_setup_ipc(struct cifs_ses *ses, struct smb3_fs_context *ctx)
1561 struct cifs_tcon *tcon;
1562 char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0};
1564 struct TCP_Server_Info *server = ses->server;
1567 * If the mount request that resulted in the creation of the
1568 * session requires encryption, force IPC to be encrypted too.
1571 if (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
1574 cifs_server_dbg(VFS,
1575 "IPC: server doesn't support encryption\n");
1580 tcon = tconInfoAlloc();
1584 scnprintf(unc, sizeof(unc), "\\\\%s\\IPC$", server->hostname);
1590 rc = server->ops->tree_connect(xid, ses, unc, tcon, ctx->local_nls);
1594 cifs_server_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
1599 cifs_dbg(FYI, "IPC tcon rc = %d ipc tid = %d\n", rc, tcon->tid);
1601 ses->tcon_ipc = tcon;
1607 * cifs_free_ipc - helper to release the session IPC tcon
1609 * Needs to be called everytime a session is destroyed
1612 cifs_free_ipc(struct cifs_ses *ses)
1615 struct cifs_tcon *tcon = ses->tcon_ipc;
1620 if (ses->server->ops->tree_disconnect) {
1622 rc = ses->server->ops->tree_disconnect(xid, tcon);
1627 cifs_dbg(FYI, "failed to disconnect IPC tcon (rc=%d)\n", rc);
1630 ses->tcon_ipc = NULL;
1634 static struct cifs_ses *
1635 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1637 struct cifs_ses *ses;
1639 spin_lock(&cifs_tcp_ses_lock);
1640 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
1641 if (ses->status == CifsExiting)
1643 if (!match_session(ses, ctx))
1646 spin_unlock(&cifs_tcp_ses_lock);
1649 spin_unlock(&cifs_tcp_ses_lock);
1653 void cifs_put_smb_ses(struct cifs_ses *ses)
1655 unsigned int rc, xid;
1656 struct TCP_Server_Info *server = ses->server;
1658 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
1660 spin_lock(&cifs_tcp_ses_lock);
1661 if (ses->status == CifsExiting) {
1662 spin_unlock(&cifs_tcp_ses_lock);
1665 if (--ses->ses_count > 0) {
1666 spin_unlock(&cifs_tcp_ses_lock);
1669 spin_unlock(&cifs_tcp_ses_lock);
1671 spin_lock(&GlobalMid_Lock);
1672 if (ses->status == CifsGood)
1673 ses->status = CifsExiting;
1674 spin_unlock(&GlobalMid_Lock);
1678 if (ses->status == CifsExiting && server->ops->logoff) {
1680 rc = server->ops->logoff(xid, ses);
1682 cifs_server_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
1687 spin_lock(&cifs_tcp_ses_lock);
1688 list_del_init(&ses->smb_ses_list);
1689 spin_unlock(&cifs_tcp_ses_lock);
1691 /* close any extra channels */
1692 if (ses->chan_count > 1) {
1695 for (i = 1; i < ses->chan_count; i++)
1696 cifs_put_tcp_session(ses->chans[i].server, 0);
1700 cifs_put_tcp_session(server, 0);
1705 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
1706 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
1708 /* Populate username and pw fields from keyring if possible */
1710 cifs_set_cifscreds(struct smb3_fs_context *ctx, struct cifs_ses *ses)
1714 const char *delim, *payload;
1718 struct TCP_Server_Info *server = ses->server;
1719 struct sockaddr_in *sa;
1720 struct sockaddr_in6 *sa6;
1721 const struct user_key_payload *upayload;
1723 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
1727 /* try to find an address key first */
1728 switch (server->dstaddr.ss_family) {
1730 sa = (struct sockaddr_in *)&server->dstaddr;
1731 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
1734 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
1735 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
1738 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
1739 server->dstaddr.ss_family);
1744 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
1745 key = request_key(&key_type_logon, desc, "");
1747 if (!ses->domainName) {
1748 cifs_dbg(FYI, "domainName is NULL\n");
1753 /* didn't work, try to find a domain key */
1754 sprintf(desc, "cifs:d:%s", ses->domainName);
1755 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
1756 key = request_key(&key_type_logon, desc, "");
1764 down_read(&key->sem);
1765 upayload = user_key_payload_locked(key);
1766 if (IS_ERR_OR_NULL(upayload)) {
1767 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
1771 /* find first : in payload */
1772 payload = upayload->data;
1773 delim = strnchr(payload, upayload->datalen, ':');
1774 cifs_dbg(FYI, "payload=%s\n", payload);
1776 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
1782 len = delim - payload;
1783 if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
1784 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
1790 ctx->username = kstrndup(payload, len, GFP_KERNEL);
1791 if (!ctx->username) {
1792 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
1797 cifs_dbg(FYI, "%s: username=%s\n", __func__, ctx->username);
1799 len = key->datalen - (len + 1);
1800 if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
1801 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
1803 kfree(ctx->username);
1804 ctx->username = NULL;
1809 ctx->password = kstrndup(delim, len, GFP_KERNEL);
1810 if (!ctx->password) {
1811 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
1814 kfree(ctx->username);
1815 ctx->username = NULL;
1820 * If we have a domain key then we must set the domainName in the
1823 if (is_domain && ses->domainName) {
1824 ctx->domainname = kstrdup(ses->domainName, GFP_KERNEL);
1825 if (!ctx->domainname) {
1826 cifs_dbg(FYI, "Unable to allocate %zd bytes for domain\n",
1829 kfree(ctx->username);
1830 ctx->username = NULL;
1831 kfree_sensitive(ctx->password);
1832 ctx->password = NULL;
1842 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
1845 #else /* ! CONFIG_KEYS */
1847 cifs_set_cifscreds(struct smb3_fs_context *ctx __attribute__((unused)),
1848 struct cifs_ses *ses __attribute__((unused)))
1852 #endif /* CONFIG_KEYS */
1855 * cifs_get_smb_ses - get a session matching @ctx data from @server
1857 * This function assumes it is being called from cifs_mount() where we
1858 * already got a server reference (server refcount +1). See
1859 * cifs_get_tcon() for refcount explanations.
1862 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1866 struct cifs_ses *ses;
1867 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
1868 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
1872 ses = cifs_find_smb_ses(server, ctx);
1874 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
1877 mutex_lock(&ses->session_mutex);
1878 rc = cifs_negotiate_protocol(xid, ses);
1880 mutex_unlock(&ses->session_mutex);
1881 /* problem -- put our ses reference */
1882 cifs_put_smb_ses(ses);
1886 if (ses->need_reconnect) {
1887 cifs_dbg(FYI, "Session needs reconnect\n");
1888 rc = cifs_setup_session(xid, ses,
1891 mutex_unlock(&ses->session_mutex);
1892 /* problem -- put our reference */
1893 cifs_put_smb_ses(ses);
1898 mutex_unlock(&ses->session_mutex);
1900 /* existing SMB ses has a server reference already */
1901 cifs_put_tcp_session(server, 0);
1906 cifs_dbg(FYI, "Existing smb sess not found\n");
1907 ses = sesInfoAlloc();
1911 /* new SMB session uses our server ref */
1912 ses->server = server;
1913 if (server->dstaddr.ss_family == AF_INET6)
1914 sprintf(ses->ip_addr, "%pI6", &addr6->sin6_addr);
1916 sprintf(ses->ip_addr, "%pI4", &addr->sin_addr);
1918 if (ctx->username) {
1919 ses->user_name = kstrdup(ctx->username, GFP_KERNEL);
1920 if (!ses->user_name)
1924 /* ctx->password freed at unmount */
1925 if (ctx->password) {
1926 ses->password = kstrdup(ctx->password, GFP_KERNEL);
1930 if (ctx->domainname) {
1931 ses->domainName = kstrdup(ctx->domainname, GFP_KERNEL);
1932 if (!ses->domainName)
1935 if (ctx->domainauto)
1936 ses->domainAuto = ctx->domainauto;
1937 ses->cred_uid = ctx->cred_uid;
1938 ses->linux_uid = ctx->linux_uid;
1940 ses->sectype = ctx->sectype;
1941 ses->sign = ctx->sign;
1942 mutex_lock(&ses->session_mutex);
1944 /* add server as first channel */
1945 ses->chans[0].server = server;
1946 ses->chan_count = 1;
1947 ses->chan_max = ctx->multichannel ? ctx->max_channels:1;
1949 rc = cifs_negotiate_protocol(xid, ses);
1951 rc = cifs_setup_session(xid, ses, ctx->local_nls);
1953 /* each channel uses a different signing key */
1954 memcpy(ses->chans[0].signkey, ses->smb3signingkey,
1955 sizeof(ses->smb3signingkey));
1957 mutex_unlock(&ses->session_mutex);
1961 /* success, put it on the list and add it as first channel */
1962 spin_lock(&cifs_tcp_ses_lock);
1963 list_add(&ses->smb_ses_list, &server->smb_ses_list);
1964 spin_unlock(&cifs_tcp_ses_lock);
1968 cifs_setup_ipc(ses, ctx);
1978 static int match_tcon(struct cifs_tcon *tcon, struct smb3_fs_context *ctx)
1980 if (tcon->tidStatus == CifsExiting)
1982 if (strncmp(tcon->treeName, ctx->UNC, MAX_TREE_SIZE))
1984 if (tcon->seal != ctx->seal)
1986 if (tcon->snapshot_time != ctx->snapshot_time)
1988 if (tcon->handle_timeout != ctx->handle_timeout)
1990 if (tcon->no_lease != ctx->no_lease)
1992 if (tcon->nodelete != ctx->nodelete)
1997 static struct cifs_tcon *
1998 cifs_find_tcon(struct cifs_ses *ses, struct smb3_fs_context *ctx)
2000 struct list_head *tmp;
2001 struct cifs_tcon *tcon;
2003 spin_lock(&cifs_tcp_ses_lock);
2004 list_for_each(tmp, &ses->tcon_list) {
2005 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
2006 #ifdef CONFIG_CIFS_DFS_UPCALL
2010 if (!match_tcon(tcon, ctx))
2013 spin_unlock(&cifs_tcp_ses_lock);
2016 spin_unlock(&cifs_tcp_ses_lock);
2021 cifs_put_tcon(struct cifs_tcon *tcon)
2024 struct cifs_ses *ses;
2027 * IPC tcon share the lifetime of their session and are
2028 * destroyed in the session put function
2030 if (tcon == NULL || tcon->ipc)
2034 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
2035 spin_lock(&cifs_tcp_ses_lock);
2036 if (--tcon->tc_count > 0) {
2037 spin_unlock(&cifs_tcp_ses_lock);
2041 if (tcon->use_witness) {
2044 rc = cifs_swn_unregister(tcon);
2046 cifs_dbg(VFS, "%s: Failed to unregister for witness notifications: %d\n",
2051 list_del_init(&tcon->tcon_list);
2052 spin_unlock(&cifs_tcp_ses_lock);
2055 if (ses->server->ops->tree_disconnect)
2056 ses->server->ops->tree_disconnect(xid, tcon);
2059 cifs_fscache_release_super_cookie(tcon);
2061 cifs_put_smb_ses(ses);
2065 * cifs_get_tcon - get a tcon matching @ctx data from @ses
2067 * - tcon refcount is the number of mount points using the tcon.
2068 * - ses refcount is the number of tcon using the session.
2070 * 1. This function assumes it is being called from cifs_mount() where
2071 * we already got a session reference (ses refcount +1).
2073 * 2. Since we're in the context of adding a mount point, the end
2074 * result should be either:
2076 * a) a new tcon already allocated with refcount=1 (1 mount point) and
2077 * its session refcount incremented (1 new tcon). This +1 was
2078 * already done in (1).
2080 * b) an existing tcon with refcount+1 (add a mount point to it) and
2081 * identical ses refcount (no new tcon). Because of (1) we need to
2082 * decrement the ses refcount.
2084 static struct cifs_tcon *
2085 cifs_get_tcon(struct cifs_ses *ses, struct smb3_fs_context *ctx)
2088 struct cifs_tcon *tcon;
2090 tcon = cifs_find_tcon(ses, ctx);
2093 * tcon has refcount already incremented but we need to
2094 * decrement extra ses reference gotten by caller (case b)
2096 cifs_dbg(FYI, "Found match on UNC path\n");
2097 cifs_put_smb_ses(ses);
2101 if (!ses->server->ops->tree_connect) {
2106 tcon = tconInfoAlloc();
2112 if (ctx->snapshot_time) {
2113 if (ses->server->vals->protocol_id == 0) {
2115 "Use SMB2 or later for snapshot mount option\n");
2119 tcon->snapshot_time = ctx->snapshot_time;
2122 if (ctx->handle_timeout) {
2123 if (ses->server->vals->protocol_id == 0) {
2125 "Use SMB2.1 or later for handle timeout option\n");
2129 tcon->handle_timeout = ctx->handle_timeout;
2133 if (ctx->password) {
2134 tcon->password = kstrdup(ctx->password, GFP_KERNEL);
2135 if (!tcon->password) {
2142 if (ses->server->vals->protocol_id == 0) {
2144 "SMB3 or later required for encryption\n");
2147 } else if (tcon->ses->server->capabilities &
2148 SMB2_GLOBAL_CAP_ENCRYPTION)
2151 cifs_dbg(VFS, "Encryption is not supported on share\n");
2157 if (ctx->linux_ext) {
2158 if (ses->server->posix_ext_supported) {
2159 tcon->posix_extensions = true;
2160 pr_warn_once("SMB3.11 POSIX Extensions are experimental\n");
2162 cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions\n");
2169 * BB Do we need to wrap session_mutex around this TCon call and Unix
2170 * SetFS as we do on SessSetup and reconnect?
2173 rc = ses->server->ops->tree_connect(xid, ses, ctx->UNC, tcon,
2176 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
2180 tcon->use_persistent = false;
2181 /* check if SMB2 or later, CIFS does not support persistent handles */
2182 if (ctx->persistent) {
2183 if (ses->server->vals->protocol_id == 0) {
2185 "SMB3 or later required for persistent handles\n");
2188 } else if (ses->server->capabilities &
2189 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
2190 tcon->use_persistent = true;
2191 else /* persistent handles requested but not supported */ {
2193 "Persistent handles not supported on share\n");
2197 } else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
2198 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
2199 && (ctx->nopersistent == false)) {
2200 cifs_dbg(FYI, "enabling persistent handles\n");
2201 tcon->use_persistent = true;
2202 } else if (ctx->resilient) {
2203 if (ses->server->vals->protocol_id == 0) {
2205 "SMB2.1 or later required for resilient handles\n");
2209 tcon->use_resilient = true;
2212 tcon->use_witness = false;
2213 if (IS_ENABLED(CONFIG_CIFS_SWN_UPCALL) && ctx->witness) {
2214 if (ses->server->vals->protocol_id >= SMB30_PROT_ID) {
2215 if (tcon->capabilities & SMB2_SHARE_CAP_CLUSTER) {
2217 * Set witness in use flag in first place
2218 * to retry registration in the echo task
2220 tcon->use_witness = true;
2221 /* And try to register immediately */
2222 rc = cifs_swn_register(tcon);
2224 cifs_dbg(VFS, "Failed to register for witness notifications: %d\n", rc);
2228 /* TODO: try to extend for non-cluster uses (eg multichannel) */
2229 cifs_dbg(VFS, "witness requested on mount but no CLUSTER capability on share\n");
2234 cifs_dbg(VFS, "SMB3 or later required for witness option\n");
2240 /* If the user really knows what they are doing they can override */
2241 if (tcon->share_flags & SMB2_SHAREFLAG_NO_CACHING) {
2243 cifs_dbg(VFS, "cache=ro requested on mount but NO_CACHING flag set on share\n");
2244 else if (ctx->cache_rw)
2245 cifs_dbg(VFS, "cache=singleclient requested on mount but NO_CACHING flag set on share\n");
2248 if (ctx->no_lease) {
2249 if (ses->server->vals->protocol_id == 0) {
2251 "SMB2 or later required for nolease option\n");
2255 tcon->no_lease = ctx->no_lease;
2259 * We can have only one retry value for a connection to a share so for
2260 * resources mounted more than once to the same server share the last
2261 * value passed in for the retry flag is used.
2263 tcon->retry = ctx->retry;
2264 tcon->nocase = ctx->nocase;
2265 if (ses->server->capabilities & SMB2_GLOBAL_CAP_DIRECTORY_LEASING)
2266 tcon->nohandlecache = ctx->nohandlecache;
2268 tcon->nohandlecache = true;
2269 tcon->nodelete = ctx->nodelete;
2270 tcon->local_lease = ctx->local_lease;
2271 INIT_LIST_HEAD(&tcon->pending_opens);
2273 spin_lock(&cifs_tcp_ses_lock);
2274 list_add(&tcon->tcon_list, &ses->tcon_list);
2275 spin_unlock(&cifs_tcp_ses_lock);
2277 cifs_fscache_get_super_cookie(tcon);
2287 cifs_put_tlink(struct tcon_link *tlink)
2289 if (!tlink || IS_ERR(tlink))
2292 if (!atomic_dec_and_test(&tlink->tl_count) ||
2293 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
2294 tlink->tl_time = jiffies;
2298 if (!IS_ERR(tlink_tcon(tlink)))
2299 cifs_put_tcon(tlink_tcon(tlink));
2305 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2307 struct cifs_sb_info *old = CIFS_SB(sb);
2308 struct cifs_sb_info *new = mnt_data->cifs_sb;
2309 unsigned int oldflags = old->mnt_cifs_flags & CIFS_MOUNT_MASK;
2310 unsigned int newflags = new->mnt_cifs_flags & CIFS_MOUNT_MASK;
2312 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
2315 if (old->mnt_cifs_serverino_autodisabled)
2316 newflags &= ~CIFS_MOUNT_SERVER_INUM;
2318 if (oldflags != newflags)
2322 * We want to share sb only if we don't specify an r/wsize or
2323 * specified r/wsize is greater than or equal to existing one.
2325 if (new->ctx->wsize && new->ctx->wsize < old->ctx->wsize)
2328 if (new->ctx->rsize && new->ctx->rsize < old->ctx->rsize)
2331 if (!uid_eq(old->ctx->linux_uid, new->ctx->linux_uid) ||
2332 !gid_eq(old->ctx->linux_gid, new->ctx->linux_gid))
2335 if (old->ctx->file_mode != new->ctx->file_mode ||
2336 old->ctx->dir_mode != new->ctx->dir_mode)
2339 if (strcmp(old->local_nls->charset, new->local_nls->charset))
2342 if (old->ctx->acregmax != new->ctx->acregmax)
2344 if (old->ctx->acdirmax != new->ctx->acdirmax)
2351 match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2353 struct cifs_sb_info *old = CIFS_SB(sb);
2354 struct cifs_sb_info *new = mnt_data->cifs_sb;
2355 bool old_set = (old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
2357 bool new_set = (new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
2360 if (old_set && new_set && !strcmp(new->prepath, old->prepath))
2362 else if (!old_set && !new_set)
2369 cifs_match_super(struct super_block *sb, void *data)
2371 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
2372 struct smb3_fs_context *ctx;
2373 struct cifs_sb_info *cifs_sb;
2374 struct TCP_Server_Info *tcp_srv;
2375 struct cifs_ses *ses;
2376 struct cifs_tcon *tcon;
2377 struct tcon_link *tlink;
2380 spin_lock(&cifs_tcp_ses_lock);
2381 cifs_sb = CIFS_SB(sb);
2382 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
2383 if (IS_ERR(tlink)) {
2384 spin_unlock(&cifs_tcp_ses_lock);
2387 tcon = tlink_tcon(tlink);
2389 tcp_srv = ses->server;
2391 ctx = mnt_data->ctx;
2393 if (!match_server(tcp_srv, ctx) ||
2394 !match_session(ses, ctx) ||
2395 !match_tcon(tcon, ctx) ||
2396 !match_prepath(sb, mnt_data)) {
2401 rc = compare_mount_options(sb, mnt_data);
2403 spin_unlock(&cifs_tcp_ses_lock);
2404 cifs_put_tlink(tlink);
2408 #ifdef CONFIG_DEBUG_LOCK_ALLOC
2409 static struct lock_class_key cifs_key[2];
2410 static struct lock_class_key cifs_slock_key[2];
2413 cifs_reclassify_socket4(struct socket *sock)
2415 struct sock *sk = sock->sk;
2416 BUG_ON(!sock_allow_reclassification(sk));
2417 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
2418 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
2422 cifs_reclassify_socket6(struct socket *sock)
2424 struct sock *sk = sock->sk;
2425 BUG_ON(!sock_allow_reclassification(sk));
2426 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
2427 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
2431 cifs_reclassify_socket4(struct socket *sock)
2436 cifs_reclassify_socket6(struct socket *sock)
2441 /* See RFC1001 section 14 on representation of Netbios names */
2442 static void rfc1002mangle(char *target, char *source, unsigned int length)
2446 for (i = 0, j = 0; i < (length); i++) {
2447 /* mask a nibble at a time and encode */
2448 target[j] = 'A' + (0x0F & (source[i] >> 4));
2449 target[j+1] = 'A' + (0x0F & source[i]);
2456 bind_socket(struct TCP_Server_Info *server)
2459 if (server->srcaddr.ss_family != AF_UNSPEC) {
2460 /* Bind to the specified local IP address */
2461 struct socket *socket = server->ssocket;
2462 rc = socket->ops->bind(socket,
2463 (struct sockaddr *) &server->srcaddr,
2464 sizeof(server->srcaddr));
2466 struct sockaddr_in *saddr4;
2467 struct sockaddr_in6 *saddr6;
2468 saddr4 = (struct sockaddr_in *)&server->srcaddr;
2469 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
2470 if (saddr6->sin6_family == AF_INET6)
2471 cifs_server_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
2472 &saddr6->sin6_addr, rc);
2474 cifs_server_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
2475 &saddr4->sin_addr.s_addr, rc);
2482 ip_rfc1001_connect(struct TCP_Server_Info *server)
2486 * some servers require RFC1001 sessinit before sending
2487 * negprot - BB check reconnection in case where second
2488 * sessinit is sent but no second negprot
2490 struct rfc1002_session_packet *ses_init_buf;
2491 struct smb_hdr *smb_buf;
2492 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
2495 ses_init_buf->trailer.session_req.called_len = 32;
2497 if (server->server_RFC1001_name[0] != 0)
2498 rfc1002mangle(ses_init_buf->trailer.
2499 session_req.called_name,
2500 server->server_RFC1001_name,
2501 RFC1001_NAME_LEN_WITH_NULL);
2503 rfc1002mangle(ses_init_buf->trailer.
2504 session_req.called_name,
2505 DEFAULT_CIFS_CALLED_NAME,
2506 RFC1001_NAME_LEN_WITH_NULL);
2508 ses_init_buf->trailer.session_req.calling_len = 32;
2511 * calling name ends in null (byte 16) from old smb
2514 if (server->workstation_RFC1001_name[0] != 0)
2515 rfc1002mangle(ses_init_buf->trailer.
2516 session_req.calling_name,
2517 server->workstation_RFC1001_name,
2518 RFC1001_NAME_LEN_WITH_NULL);
2520 rfc1002mangle(ses_init_buf->trailer.
2521 session_req.calling_name,
2523 RFC1001_NAME_LEN_WITH_NULL);
2525 ses_init_buf->trailer.session_req.scope1 = 0;
2526 ses_init_buf->trailer.session_req.scope2 = 0;
2527 smb_buf = (struct smb_hdr *)ses_init_buf;
2529 /* sizeof RFC1002_SESSION_REQUEST with no scope */
2530 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
2531 rc = smb_send(server, smb_buf, 0x44);
2532 kfree(ses_init_buf);
2534 * RFC1001 layer in at least one server
2535 * requires very short break before negprot
2536 * presumably because not expecting negprot
2537 * to follow so fast. This is a simple
2538 * solution that works without
2539 * complicating the code and causes no
2540 * significant slowing down on mount
2543 usleep_range(1000, 2000);
2546 * else the negprot may still work without this
2547 * even though malloc failed
2554 generic_ip_connect(struct TCP_Server_Info *server)
2559 struct socket *socket = server->ssocket;
2560 struct sockaddr *saddr;
2562 saddr = (struct sockaddr *) &server->dstaddr;
2564 if (server->dstaddr.ss_family == AF_INET6) {
2565 struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)&server->dstaddr;
2567 sport = ipv6->sin6_port;
2568 slen = sizeof(struct sockaddr_in6);
2570 cifs_dbg(FYI, "%s: connecting to [%pI6]:%d\n", __func__, &ipv6->sin6_addr,
2573 struct sockaddr_in *ipv4 = (struct sockaddr_in *)&server->dstaddr;
2575 sport = ipv4->sin_port;
2576 slen = sizeof(struct sockaddr_in);
2578 cifs_dbg(FYI, "%s: connecting to %pI4:%d\n", __func__, &ipv4->sin_addr,
2582 if (socket == NULL) {
2583 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
2584 IPPROTO_TCP, &socket, 1);
2586 cifs_server_dbg(VFS, "Error %d creating socket\n", rc);
2587 server->ssocket = NULL;
2591 /* BB other socket options to set KEEPALIVE, NODELAY? */
2592 cifs_dbg(FYI, "Socket created\n");
2593 server->ssocket = socket;
2594 socket->sk->sk_allocation = GFP_NOFS;
2595 if (sfamily == AF_INET6)
2596 cifs_reclassify_socket6(socket);
2598 cifs_reclassify_socket4(socket);
2601 rc = bind_socket(server);
2606 * Eventually check for other socket options to change from
2607 * the default. sock_setsockopt not used because it expects
2610 socket->sk->sk_rcvtimeo = 7 * HZ;
2611 socket->sk->sk_sndtimeo = 5 * HZ;
2613 /* make the bufsizes depend on wsize/rsize and max requests */
2614 if (server->noautotune) {
2615 if (socket->sk->sk_sndbuf < (200 * 1024))
2616 socket->sk->sk_sndbuf = 200 * 1024;
2617 if (socket->sk->sk_rcvbuf < (140 * 1024))
2618 socket->sk->sk_rcvbuf = 140 * 1024;
2621 if (server->tcp_nodelay)
2622 tcp_sock_set_nodelay(socket->sk);
2624 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
2625 socket->sk->sk_sndbuf,
2626 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
2628 rc = socket->ops->connect(socket, saddr, slen,
2629 server->noblockcnt ? O_NONBLOCK : 0);
2631 * When mounting SMB root file systems, we do not want to block in
2632 * connect. Otherwise bail out and then let cifs_reconnect() perform
2633 * reconnect failover - if possible.
2635 if (server->noblockcnt && rc == -EINPROGRESS)
2638 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
2639 sock_release(socket);
2640 server->ssocket = NULL;
2644 if (sport == htons(RFC1001_PORT))
2645 rc = ip_rfc1001_connect(server);
2651 ip_connect(struct TCP_Server_Info *server)
2654 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2655 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2657 if (server->dstaddr.ss_family == AF_INET6)
2658 sport = &addr6->sin6_port;
2660 sport = &addr->sin_port;
2665 /* try with 445 port at first */
2666 *sport = htons(CIFS_PORT);
2668 rc = generic_ip_connect(server);
2672 /* if it failed, try with 139 port */
2673 *sport = htons(RFC1001_PORT);
2676 return generic_ip_connect(server);
2679 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
2680 struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
2683 * If we are reconnecting then should we check to see if
2684 * any requested capabilities changed locally e.g. via
2685 * remount but we can not do much about it here
2686 * if they have (even if we could detect it by the following)
2687 * Perhaps we could add a backpointer to array of sb from tcon
2688 * or if we change to make all sb to same share the same
2689 * sb as NFS - then we only have one backpointer to sb.
2690 * What if we wanted to mount the server share twice once with
2691 * and once without posixacls or posix paths?
2693 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
2695 if (ctx && ctx->no_linux_ext) {
2696 tcon->fsUnixInfo.Capability = 0;
2697 tcon->unix_ext = 0; /* Unix Extensions disabled */
2698 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
2701 tcon->unix_ext = 1; /* Unix Extensions supported */
2703 if (!tcon->unix_ext) {
2704 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
2708 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
2709 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
2710 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
2712 * check for reconnect case in which we do not
2713 * want to change the mount behavior if we can avoid it
2717 * turn off POSIX ACL and PATHNAMES if not set
2718 * originally at mount time
2720 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
2721 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
2722 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
2723 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
2724 cifs_dbg(VFS, "POSIXPATH support change\n");
2725 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
2726 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
2727 cifs_dbg(VFS, "possible reconnect error\n");
2728 cifs_dbg(VFS, "server disabled POSIX path support\n");
2732 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
2733 cifs_dbg(VFS, "per-share encryption not supported yet\n");
2735 cap &= CIFS_UNIX_CAP_MASK;
2736 if (ctx && ctx->no_psx_acl)
2737 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
2738 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
2739 cifs_dbg(FYI, "negotiated posix acl support\n");
2741 cifs_sb->mnt_cifs_flags |=
2742 CIFS_MOUNT_POSIXACL;
2745 if (ctx && ctx->posix_paths == 0)
2746 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
2747 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
2748 cifs_dbg(FYI, "negotiate posix pathnames\n");
2750 cifs_sb->mnt_cifs_flags |=
2751 CIFS_MOUNT_POSIX_PATHS;
2754 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
2755 #ifdef CONFIG_CIFS_DEBUG2
2756 if (cap & CIFS_UNIX_FCNTL_CAP)
2757 cifs_dbg(FYI, "FCNTL cap\n");
2758 if (cap & CIFS_UNIX_EXTATTR_CAP)
2759 cifs_dbg(FYI, "EXTATTR cap\n");
2760 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
2761 cifs_dbg(FYI, "POSIX path cap\n");
2762 if (cap & CIFS_UNIX_XATTR_CAP)
2763 cifs_dbg(FYI, "XATTR cap\n");
2764 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
2765 cifs_dbg(FYI, "POSIX ACL cap\n");
2766 if (cap & CIFS_UNIX_LARGE_READ_CAP)
2767 cifs_dbg(FYI, "very large read cap\n");
2768 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
2769 cifs_dbg(FYI, "very large write cap\n");
2770 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
2771 cifs_dbg(FYI, "transport encryption cap\n");
2772 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
2773 cifs_dbg(FYI, "mandatory transport encryption cap\n");
2774 #endif /* CIFS_DEBUG2 */
2775 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
2777 cifs_dbg(FYI, "resetting capabilities failed\n");
2779 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");
2785 int cifs_setup_cifs_sb(struct cifs_sb_info *cifs_sb)
2787 struct smb3_fs_context *ctx = cifs_sb->ctx;
2789 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
2791 spin_lock_init(&cifs_sb->tlink_tree_lock);
2792 cifs_sb->tlink_tree = RB_ROOT;
2794 cifs_dbg(FYI, "file mode: %04ho dir mode: %04ho\n",
2795 ctx->file_mode, ctx->dir_mode);
2797 /* this is needed for ASCII cp to Unicode converts */
2798 if (ctx->iocharset == NULL) {
2799 /* load_nls_default cannot return null */
2800 cifs_sb->local_nls = load_nls_default();
2802 cifs_sb->local_nls = load_nls(ctx->iocharset);
2803 if (cifs_sb->local_nls == NULL) {
2804 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
2809 ctx->local_nls = cifs_sb->local_nls;
2811 smb3_update_mnt_flags(cifs_sb);
2814 cifs_dbg(FYI, "mounting share using direct i/o\n");
2815 if (ctx->cache_ro) {
2816 cifs_dbg(VFS, "mounting share with read only caching. Ensure that the share will not be modified while in use.\n");
2817 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RO_CACHE;
2818 } else if (ctx->cache_rw) {
2819 cifs_dbg(VFS, "mounting share in single client RW caching mode. Ensure that no other systems will be accessing the share.\n");
2820 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_RO_CACHE |
2821 CIFS_MOUNT_RW_CACHE);
2824 if ((ctx->cifs_acl) && (ctx->dynperm))
2825 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
2828 cifs_sb->prepath = kstrdup(ctx->prepath, GFP_KERNEL);
2829 if (cifs_sb->prepath == NULL)
2831 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
2837 /* Release all succeed connections */
2838 static inline void mount_put_conns(struct cifs_sb_info *cifs_sb,
2840 struct TCP_Server_Info *server,
2841 struct cifs_ses *ses, struct cifs_tcon *tcon)
2846 cifs_put_tcon(tcon);
2848 cifs_put_smb_ses(ses);
2850 cifs_put_tcp_session(server, 0);
2851 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
2855 /* Get connections for tcp, ses and tcon */
2856 static int mount_get_conns(struct smb3_fs_context *ctx, struct cifs_sb_info *cifs_sb,
2858 struct TCP_Server_Info **nserver,
2859 struct cifs_ses **nses, struct cifs_tcon **ntcon)
2862 struct TCP_Server_Info *server;
2863 struct cifs_ses *ses;
2864 struct cifs_tcon *tcon;
2872 /* get a reference to a tcp session */
2873 server = cifs_get_tcp_session(ctx);
2874 if (IS_ERR(server)) {
2875 rc = PTR_ERR(server);
2881 /* get a reference to a SMB session */
2882 ses = cifs_get_smb_ses(server, ctx);
2890 if ((ctx->persistent == true) && (!(ses->server->capabilities &
2891 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES))) {
2892 cifs_server_dbg(VFS, "persistent handles not supported by server\n");
2896 /* search for existing tcon to this server share */
2897 tcon = cifs_get_tcon(ses, ctx);
2905 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
2906 if (tcon->posix_extensions)
2907 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
2909 /* tell server which Unix caps we support */
2910 if (cap_unix(tcon->ses)) {
2912 * reset of caps checks mount to see if unix extensions disabled
2913 * for just this mount.
2915 reset_cifs_unix_caps(*xid, tcon, cifs_sb, ctx);
2916 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
2917 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
2918 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP))
2921 tcon->unix_ext = 0; /* server does not support them */
2923 /* do not care if a following call succeed - informational */
2924 if (!tcon->pipe && server->ops->qfs_tcon) {
2925 server->ops->qfs_tcon(*xid, tcon, cifs_sb);
2926 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE) {
2927 if (tcon->fsDevInfo.DeviceCharacteristics &
2928 cpu_to_le32(FILE_READ_ONLY_DEVICE))
2929 cifs_dbg(VFS, "mounted to read only share\n");
2930 else if ((cifs_sb->mnt_cifs_flags &
2931 CIFS_MOUNT_RW_CACHE) == 0)
2932 cifs_dbg(VFS, "read only mount of RW share\n");
2933 /* no need to log a RW mount of a typical RW share */
2938 * Clamp the rsize/wsize mount arguments if they are too big for the server
2939 * and set the rsize/wsize to the negotiated values if not passed in by
2942 if ((cifs_sb->ctx->wsize == 0) ||
2943 (cifs_sb->ctx->wsize > server->ops->negotiate_wsize(tcon, ctx)))
2944 cifs_sb->ctx->wsize = server->ops->negotiate_wsize(tcon, ctx);
2945 if ((cifs_sb->ctx->rsize == 0) ||
2946 (cifs_sb->ctx->rsize > server->ops->negotiate_rsize(tcon, ctx)))
2947 cifs_sb->ctx->rsize = server->ops->negotiate_rsize(tcon, ctx);
2952 static int mount_setup_tlink(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
2953 struct cifs_tcon *tcon)
2955 struct tcon_link *tlink;
2957 /* hang the tcon off of the superblock */
2958 tlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
2962 tlink->tl_uid = ses->linux_uid;
2963 tlink->tl_tcon = tcon;
2964 tlink->tl_time = jiffies;
2965 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
2966 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
2968 cifs_sb->master_tlink = tlink;
2969 spin_lock(&cifs_sb->tlink_tree_lock);
2970 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
2971 spin_unlock(&cifs_sb->tlink_tree_lock);
2973 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
2978 #ifdef CONFIG_CIFS_DFS_UPCALL
2980 * cifs_build_path_to_root returns full path to root when we do not have an
2981 * existing connection (tcon)
2984 build_unc_path_to_root(const struct smb3_fs_context *ctx,
2985 const struct cifs_sb_info *cifs_sb, bool useppath)
2987 char *full_path, *pos;
2988 unsigned int pplen = useppath && ctx->prepath ?
2989 strlen(ctx->prepath) + 1 : 0;
2990 unsigned int unc_len = strnlen(ctx->UNC, MAX_TREE_SIZE + 1);
2992 if (unc_len > MAX_TREE_SIZE)
2993 return ERR_PTR(-EINVAL);
2995 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
2996 if (full_path == NULL)
2997 return ERR_PTR(-ENOMEM);
2999 memcpy(full_path, ctx->UNC, unc_len);
3000 pos = full_path + unc_len;
3003 *pos = CIFS_DIR_SEP(cifs_sb);
3004 memcpy(pos + 1, ctx->prepath, pplen);
3008 *pos = '\0'; /* add trailing null */
3009 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
3010 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
3015 * expand_dfs_referral - Perform a dfs referral query and update the cifs_sb
3017 * If a referral is found, cifs_sb->ctx->mount_options will be (re-)allocated
3018 * to a string containing updated options for the submount. Otherwise it
3019 * will be left untouched.
3021 * Returns the rc from get_dfs_path to the caller, which can be used to
3022 * determine whether there were referrals.
3025 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
3026 struct smb3_fs_context *ctx, struct cifs_sb_info *cifs_sb,
3030 struct dfs_info3_param referral = {0};
3031 char *full_path = NULL, *mdata = NULL;
3033 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
3036 full_path = build_unc_path_to_root(ctx, cifs_sb, true);
3037 if (IS_ERR(full_path))
3038 return PTR_ERR(full_path);
3040 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
3041 ref_path, &referral, NULL);
3043 char *fake_devname = NULL;
3045 mdata = cifs_compose_mount_options(cifs_sb->ctx->mount_options,
3046 full_path + 1, &referral,
3048 free_dfs_info_param(&referral);
3050 if (IS_ERR(mdata)) {
3051 rc = PTR_ERR(mdata);
3055 * We can not clear out the whole structure since we
3056 * no longer have an explicit function to parse
3057 * a mount-string. Instead we need to clear out the
3058 * individual fields that are no longer valid.
3060 kfree(ctx->prepath);
3061 ctx->prepath = NULL;
3062 rc = cifs_setup_volume_info(ctx, mdata, fake_devname);
3064 kfree(fake_devname);
3065 kfree(cifs_sb->ctx->mount_options);
3066 cifs_sb->ctx->mount_options = mdata;
3072 static inline int get_next_dfs_tgt(const char *path,
3073 struct dfs_cache_tgt_list *tgt_list,
3074 struct dfs_cache_tgt_iterator **tgt_it)
3077 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
3079 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
3080 return !*tgt_it ? -EHOSTDOWN : 0;
3083 static int update_vol_info(const struct dfs_cache_tgt_iterator *tgt_it,
3084 struct smb3_fs_context *fake_ctx, struct smb3_fs_context *ctx)
3086 const char *tgt = dfs_cache_get_tgt_name(tgt_it);
3087 int len = strlen(tgt) + 2;
3090 new_unc = kmalloc(len, GFP_KERNEL);
3093 scnprintf(new_unc, len, "\\%s", tgt);
3098 if (fake_ctx->prepath) {
3099 kfree(ctx->prepath);
3100 ctx->prepath = fake_ctx->prepath;
3101 fake_ctx->prepath = NULL;
3103 memcpy(&ctx->dstaddr, &fake_ctx->dstaddr, sizeof(ctx->dstaddr));
3108 static int do_dfs_failover(const char *path, const char *full_path, struct cifs_sb_info *cifs_sb,
3109 struct smb3_fs_context *ctx, struct cifs_ses *root_ses,
3110 unsigned int *xid, struct TCP_Server_Info **server,
3111 struct cifs_ses **ses, struct cifs_tcon **tcon)
3114 struct dfs_cache_tgt_list tgt_list = {0};
3115 struct dfs_cache_tgt_iterator *tgt_it = NULL;
3116 struct smb3_fs_context tmp_ctx = {NULL};
3118 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
3121 cifs_dbg(FYI, "%s: path=%s full_path=%s\n", __func__, path, full_path);
3123 rc = dfs_cache_noreq_find(path, NULL, &tgt_list);
3127 * We use a 'tmp_ctx' here because we need pass it down to the mount_{get,put} functions to
3128 * test connection against new DFS targets.
3130 rc = smb3_fs_context_dup(&tmp_ctx, ctx);
3135 struct dfs_info3_param ref = {0};
3136 char *fake_devname = NULL, *mdata = NULL;
3138 /* Get next DFS target server - if any */
3139 rc = get_next_dfs_tgt(path, &tgt_list, &tgt_it);
3143 rc = dfs_cache_get_tgt_referral(path, tgt_it, &ref);
3147 cifs_dbg(FYI, "%s: old ctx: UNC=%s prepath=%s\n", __func__, tmp_ctx.UNC,
3150 mdata = cifs_compose_mount_options(cifs_sb->ctx->mount_options, full_path + 1, &ref,
3152 free_dfs_info_param(&ref);
3154 if (IS_ERR(mdata)) {
3155 rc = PTR_ERR(mdata);
3158 rc = cifs_setup_volume_info(&tmp_ctx, mdata, fake_devname);
3161 kfree(fake_devname);
3166 cifs_dbg(FYI, "%s: new ctx: UNC=%s prepath=%s\n", __func__, tmp_ctx.UNC,
3169 mount_put_conns(cifs_sb, *xid, *server, *ses, *tcon);
3170 rc = mount_get_conns(&tmp_ctx, cifs_sb, xid, server, ses, tcon);
3171 if (!rc || (*server && *ses)) {
3173 * We were able to connect to new target server. Update current context with
3174 * new target server.
3176 rc = update_vol_info(tgt_it, &tmp_ctx, ctx);
3181 cifs_dbg(FYI, "%s: final ctx: UNC=%s prepath=%s\n", __func__, tmp_ctx.UNC,
3184 * Update DFS target hint in DFS referral cache with the target server we
3185 * successfully reconnected to.
3187 rc = dfs_cache_update_tgthint(*xid, root_ses ? root_ses : *ses, cifs_sb->local_nls,
3188 cifs_remap(cifs_sb), path, tgt_it);
3192 smb3_cleanup_fs_context_contents(&tmp_ctx);
3193 dfs_cache_free_tgts(&tgt_list);
3198 /* TODO: all callers to this are broken. We are not parsing mount_options here
3199 * we should pass a clone of the original context?
3202 cifs_setup_volume_info(struct smb3_fs_context *ctx, const char *mntopts, const char *devname)
3207 cifs_dbg(FYI, "%s: devname=%s\n", __func__, devname);
3208 rc = smb3_parse_devname(devname, ctx);
3210 cifs_dbg(VFS, "%s: failed to parse %s: %d\n", __func__, devname, rc);
3218 rc = smb3_parse_opt(mntopts, "ip", &ip);
3220 cifs_dbg(VFS, "%s: failed to parse ip options: %d\n", __func__, rc);
3224 rc = cifs_convert_address((struct sockaddr *)&ctx->dstaddr, ip, strlen(ip));
3227 cifs_dbg(VFS, "%s: failed to convert ip address\n", __func__);
3232 if (ctx->nullauth) {
3233 cifs_dbg(FYI, "Anonymous login\n");
3234 kfree(ctx->username);
3235 ctx->username = NULL;
3236 } else if (ctx->username) {
3237 /* BB fixme parse for domain name here */
3238 cifs_dbg(FYI, "Username: %s\n", ctx->username);
3240 cifs_dbg(VFS, "No username specified\n");
3241 /* In userspace mount helper we can get user name from alternate
3242 locations such as env variables and files on disk */
3250 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
3252 struct cifs_tcon *tcon,
3253 struct cifs_sb_info *cifs_sb,
3260 int skip = added_treename ? 1 : 0;
3262 sep = CIFS_DIR_SEP(cifs_sb);
3265 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
3267 /* skip separators */
3272 /* next separator */
3273 while (*s && *s != sep)
3276 * if the treename is added, we then have to skip the first
3277 * part within the separators
3284 * temporarily null-terminate the path at the end of
3285 * the current component
3289 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3297 * Check if path is remote (e.g. a DFS share). Return -EREMOTE if it is,
3300 static int is_path_remote(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx,
3301 const unsigned int xid,
3302 struct TCP_Server_Info *server,
3303 struct cifs_tcon *tcon)
3308 if (!server->ops->is_path_accessible)
3312 * cifs_build_path_to_root works only when we have a valid tcon
3314 full_path = cifs_build_path_to_root(ctx, cifs_sb, tcon,
3315 tcon->Flags & SMB_SHARE_IS_IN_DFS);
3316 if (full_path == NULL)
3319 cifs_dbg(FYI, "%s: full_path: %s\n", __func__, full_path);
3321 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3323 if (rc != 0 && rc != -EREMOTE) {
3328 if (rc != -EREMOTE) {
3329 rc = cifs_are_all_path_components_accessible(server, xid, tcon,
3330 cifs_sb, full_path, tcon->Flags & SMB_SHARE_IS_IN_DFS);
3332 cifs_server_dbg(VFS, "cannot query dirs between root and final path, enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
3333 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
3342 #ifdef CONFIG_CIFS_DFS_UPCALL
3343 static void set_root_ses(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
3344 struct cifs_ses **root_ses)
3347 spin_lock(&cifs_tcp_ses_lock);
3350 ses->tcon_ipc->remap = cifs_remap(cifs_sb);
3351 spin_unlock(&cifs_tcp_ses_lock);
3356 static void put_root_ses(struct cifs_ses *ses)
3359 cifs_put_smb_ses(ses);
3362 /* Set up next dfs prefix path in @dfs_path */
3363 static int next_dfs_prepath(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx,
3364 const unsigned int xid, struct TCP_Server_Info *server,
3365 struct cifs_tcon *tcon, char **dfs_path)
3368 int added_treename = is_tcon_dfs(tcon);
3371 path = cifs_build_path_to_root(ctx, cifs_sb, tcon, added_treename);
3375 rc = is_path_remote(cifs_sb, ctx, xid, server, tcon);
3376 if (rc == -EREMOTE) {
3377 struct smb3_fs_context v = {NULL};
3378 /* if @path contains a tree name, skip it in the prefix path */
3379 if (added_treename) {
3380 rc = smb3_parse_devname(path, &v);
3383 npath = build_unc_path_to_root(&v, cifs_sb, true);
3384 smb3_cleanup_fs_context_contents(&v);
3387 v.prepath = path + 1;
3388 npath = build_unc_path_to_root(&v, cifs_sb, true);
3391 if (IS_ERR(npath)) {
3392 rc = PTR_ERR(npath);
3406 /* Check if resolved targets can handle any DFS referrals */
3407 static int is_referral_server(const char *ref_path, struct cifs_tcon *tcon, bool *ref_server)
3410 struct dfs_info3_param ref = {0};
3412 if (is_tcon_dfs(tcon)) {
3415 cifs_dbg(FYI, "%s: ref_path=%s\n", __func__, ref_path);
3417 rc = dfs_cache_noreq_find(ref_path, &ref, NULL);
3419 cifs_dbg(VFS, "%s: dfs_cache_noreq_find: failed (rc=%d)\n", __func__, rc);
3422 cifs_dbg(FYI, "%s: ref.flags=0x%x\n", __func__, ref.flags);
3424 * Check if all targets are capable of handling DFS referrals as per
3425 * MS-DFSC 2.2.4 RESP_GET_DFS_REFERRAL.
3427 *ref_server = !!(ref.flags & DFSREF_REFERRAL_SERVER);
3428 free_dfs_info_param(&ref);
3433 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
3437 struct TCP_Server_Info *server = NULL;
3438 struct cifs_ses *ses = NULL, *root_ses = NULL;
3439 struct cifs_tcon *tcon = NULL;
3441 char *ref_path = NULL, *full_path = NULL;
3442 char *oldmnt = NULL;
3443 char *mntdata = NULL;
3444 bool ref_server = false;
3446 rc = mount_get_conns(ctx, cifs_sb, &xid, &server, &ses, &tcon);
3448 * If called with 'nodfs' mount option, then skip DFS resolving. Otherwise unconditionally
3449 * try to get an DFS referral (even cached) to determine whether it is an DFS mount.
3451 * Skip prefix path to provide support for DFS referrals from w2k8 servers which don't seem
3452 * to respond with PATH_NOT_COVERED to requests that include the prefix.
3454 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS) ||
3455 dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb), ctx->UNC + 1, NULL,
3459 /* Check if it is fully accessible and then mount it */
3460 rc = is_path_remote(cifs_sb, ctx, xid, server, tcon);
3466 /* Save mount options */
3467 mntdata = kstrdup(cifs_sb->ctx->mount_options, GFP_KERNEL);
3472 /* Get path of DFS root */
3473 ref_path = build_unc_path_to_root(ctx, cifs_sb, false);
3474 if (IS_ERR(ref_path)) {
3475 rc = PTR_ERR(ref_path);
3480 set_root_ses(cifs_sb, ses, &root_ses);
3482 /* Save full path of last DFS path we used to resolve final target server */
3484 full_path = build_unc_path_to_root(ctx, cifs_sb, !!count);
3485 if (IS_ERR(full_path)) {
3486 rc = PTR_ERR(full_path);
3490 /* Chase referral */
3491 oldmnt = cifs_sb->ctx->mount_options;
3492 rc = expand_dfs_referral(xid, root_ses, ctx, cifs_sb, ref_path + 1);
3495 /* Connect to new DFS target only if we were redirected */
3496 if (oldmnt != cifs_sb->ctx->mount_options) {
3497 mount_put_conns(cifs_sb, xid, server, ses, tcon);
3498 rc = mount_get_conns(ctx, cifs_sb, &xid, &server, &ses, &tcon);
3500 if (rc && !server && !ses) {
3501 /* Failed to connect. Try to connect to other targets in the referral. */
3502 rc = do_dfs_failover(ref_path + 1, full_path, cifs_sb, ctx, root_ses, &xid,
3503 &server, &ses, &tcon);
3505 if (rc == -EACCES || rc == -EOPNOTSUPP || !server || !ses)
3510 /* Make sure that requests go through new root servers */
3511 rc = is_referral_server(ref_path + 1, tcon, &ref_server);
3515 put_root_ses(root_ses);
3516 set_root_ses(cifs_sb, ses, &root_ses);
3519 /* Get next dfs path and then continue chasing them if -EREMOTE */
3520 rc = next_dfs_prepath(cifs_sb, ctx, xid, server, tcon, &ref_path);
3521 /* Prevent recursion on broken link referrals */
3522 if (rc == -EREMOTE && ++count > MAX_NESTED_LINKS)
3524 } while (rc == -EREMOTE);
3528 put_root_ses(root_ses);
3533 * Store DFS full path in both superblock and tree connect structures.
3535 * For DFS root mounts, the prefix path (cifs_sb->prepath) is preserved during reconnect so
3536 * only the root path is set in cifs_sb->origin_fullpath and tcon->dfs_path. And for DFS
3537 * links, the prefix path is included in both and may be changed during reconnect. See
3538 * cifs_tree_connect().
3540 cifs_sb->origin_fullpath = kstrdup(full_path, GFP_KERNEL);
3541 if (!cifs_sb->origin_fullpath) {
3545 spin_lock(&cifs_tcp_ses_lock);
3546 tcon->dfs_path = full_path;
3548 tcon->remap = cifs_remap(cifs_sb);
3549 spin_unlock(&cifs_tcp_ses_lock);
3551 /* Add original context for DFS cache to be used when refreshing referrals */
3552 rc = dfs_cache_add_vol(mntdata, ctx, cifs_sb->origin_fullpath);
3556 * After reconnecting to a different server, unique ids won't
3557 * match anymore, so we disable serverino. This prevents
3558 * dentry revalidation to think the dentry are stale (ESTALE).
3560 cifs_autodisable_serverino(cifs_sb);
3562 * Force the use of prefix path to support failover on DFS paths that
3563 * resolve to targets that have different prefix paths.
3565 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
3566 kfree(cifs_sb->prepath);
3567 cifs_sb->prepath = ctx->prepath;
3568 ctx->prepath = NULL;
3572 cifs_try_adding_channels(cifs_sb, ses);
3573 return mount_setup_tlink(cifs_sb, ses, tcon);
3579 kfree(cifs_sb->origin_fullpath);
3580 put_root_ses(root_ses);
3581 mount_put_conns(cifs_sb, xid, server, ses, tcon);
3585 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
3589 struct cifs_ses *ses;
3590 struct cifs_tcon *tcon;
3591 struct TCP_Server_Info *server;
3593 rc = mount_get_conns(ctx, cifs_sb, &xid, &server, &ses, &tcon);
3598 rc = is_path_remote(cifs_sb, ctx, xid, server, tcon);
3607 return mount_setup_tlink(cifs_sb, ses, tcon);
3610 mount_put_conns(cifs_sb, xid, server, ses, tcon);
3616 * Issue a TREE_CONNECT request.
3619 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
3620 const char *tree, struct cifs_tcon *tcon,
3621 const struct nls_table *nls_codepage)
3623 struct smb_hdr *smb_buffer;
3624 struct smb_hdr *smb_buffer_response;
3627 unsigned char *bcc_ptr;
3630 __u16 bytes_left, count;
3635 smb_buffer = cifs_buf_get();
3636 if (smb_buffer == NULL)
3639 smb_buffer_response = smb_buffer;
3641 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
3642 NULL /*no tid */ , 4 /*wct */ );
3644 smb_buffer->Mid = get_next_mid(ses->server);
3645 smb_buffer->Uid = ses->Suid;
3646 pSMB = (TCONX_REQ *) smb_buffer;
3647 pSMBr = (TCONX_RSP *) smb_buffer_response;
3649 pSMB->AndXCommand = 0xFF;
3650 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
3651 bcc_ptr = &pSMB->Password[0];
3652 if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
3653 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
3654 *bcc_ptr = 0; /* password is null byte */
3655 bcc_ptr++; /* skip password */
3656 /* already aligned so no need to do it below */
3658 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
3659 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3660 specified as required (when that support is added to
3661 the vfs in the future) as only NTLM or the much
3662 weaker LANMAN (which we do not send by default) is accepted
3663 by Samba (not sure whether other servers allow
3664 NTLMv2 password here) */
3665 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3666 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
3667 (ses->sectype == LANMAN))
3668 calc_lanman_hash(tcon->password, ses->server->cryptkey,
3669 ses->server->sec_mode &
3670 SECMODE_PW_ENCRYPT ? true : false,
3673 #endif /* CIFS_WEAK_PW_HASH */
3674 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
3675 bcc_ptr, nls_codepage);
3677 cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
3679 cifs_buf_release(smb_buffer);
3683 bcc_ptr += CIFS_AUTH_RESP_SIZE;
3684 if (ses->capabilities & CAP_UNICODE) {
3685 /* must align unicode strings */
3686 *bcc_ptr = 0; /* null byte password */
3691 if (ses->server->sign)
3692 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
3694 if (ses->capabilities & CAP_STATUS32) {
3695 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
3697 if (ses->capabilities & CAP_DFS) {
3698 smb_buffer->Flags2 |= SMBFLG2_DFS;
3700 if (ses->capabilities & CAP_UNICODE) {
3701 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
3703 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
3704 6 /* max utf8 char length in bytes */ *
3705 (/* server len*/ + 256 /* share len */), nls_codepage);
3706 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
3707 bcc_ptr += 2; /* skip trailing null */
3708 } else { /* ASCII */
3709 strcpy(bcc_ptr, tree);
3710 bcc_ptr += strlen(tree) + 1;
3712 strcpy(bcc_ptr, "?????");
3713 bcc_ptr += strlen("?????");
3715 count = bcc_ptr - &pSMB->Password[0];
3716 be32_add_cpu(&pSMB->hdr.smb_buf_length, count);
3717 pSMB->ByteCount = cpu_to_le16(count);
3719 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
3722 /* above now done in SendReceive */
3726 tcon->tidStatus = CifsGood;
3727 tcon->need_reconnect = false;
3728 tcon->tid = smb_buffer_response->Tid;
3729 bcc_ptr = pByteArea(smb_buffer_response);
3730 bytes_left = get_bcc(smb_buffer_response);
3731 length = strnlen(bcc_ptr, bytes_left - 2);
3732 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
3738 /* skip service field (NB: this field is always ASCII) */
3740 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
3741 (bcc_ptr[2] == 'C')) {
3742 cifs_dbg(FYI, "IPC connection\n");
3746 } else if (length == 2) {
3747 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
3748 /* the most common case */
3749 cifs_dbg(FYI, "disk share connection\n");
3752 bcc_ptr += length + 1;
3753 bytes_left -= (length + 1);
3754 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
3756 /* mostly informational -- no need to fail on error here */
3757 kfree(tcon->nativeFileSystem);
3758 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
3759 bytes_left, is_unicode,
3762 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
3764 if ((smb_buffer_response->WordCount == 3) ||
3765 (smb_buffer_response->WordCount == 7))
3766 /* field is in same location */
3767 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
3770 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
3773 cifs_buf_release(smb_buffer);
3777 static void delayed_free(struct rcu_head *p)
3779 struct cifs_sb_info *cifs_sb = container_of(p, struct cifs_sb_info, rcu);
3781 unload_nls(cifs_sb->local_nls);
3782 smb3_cleanup_fs_context(cifs_sb->ctx);
3787 cifs_umount(struct cifs_sb_info *cifs_sb)
3789 struct rb_root *root = &cifs_sb->tlink_tree;
3790 struct rb_node *node;
3791 struct tcon_link *tlink;
3793 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
3795 spin_lock(&cifs_sb->tlink_tree_lock);
3796 while ((node = rb_first(root))) {
3797 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3798 cifs_get_tlink(tlink);
3799 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3800 rb_erase(node, root);
3802 spin_unlock(&cifs_sb->tlink_tree_lock);
3803 cifs_put_tlink(tlink);
3804 spin_lock(&cifs_sb->tlink_tree_lock);
3806 spin_unlock(&cifs_sb->tlink_tree_lock);
3808 kfree(cifs_sb->prepath);
3809 #ifdef CONFIG_CIFS_DFS_UPCALL
3810 dfs_cache_del_vol(cifs_sb->origin_fullpath);
3811 kfree(cifs_sb->origin_fullpath);
3813 call_rcu(&cifs_sb->rcu, delayed_free);
3817 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
3820 struct TCP_Server_Info *server = cifs_ses_server(ses);
3822 if (!server->ops->need_neg || !server->ops->negotiate)
3825 /* only send once per connect */
3826 if (!server->ops->need_neg(server))
3829 rc = server->ops->negotiate(xid, ses);
3831 spin_lock(&GlobalMid_Lock);
3832 if (server->tcpStatus == CifsNeedNegotiate)
3833 server->tcpStatus = CifsGood;
3836 spin_unlock(&GlobalMid_Lock);
3843 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
3844 struct nls_table *nls_info)
3847 struct TCP_Server_Info *server = cifs_ses_server(ses);
3849 if (!ses->binding) {
3850 ses->capabilities = server->capabilities;
3851 if (!linuxExtEnabled)
3852 ses->capabilities &= (~server->vals->cap_unix);
3854 if (ses->auth_key.response) {
3855 cifs_dbg(FYI, "Free previous auth_key.response = %p\n",
3856 ses->auth_key.response);
3857 kfree(ses->auth_key.response);
3858 ses->auth_key.response = NULL;
3859 ses->auth_key.len = 0;
3863 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
3864 server->sec_mode, server->capabilities, server->timeAdj);
3866 if (server->ops->sess_setup)
3867 rc = server->ops->sess_setup(xid, ses, nls_info);
3870 cifs_server_dbg(VFS, "Send error in SessSetup = %d\n", rc);
3876 cifs_set_vol_auth(struct smb3_fs_context *ctx, struct cifs_ses *ses)
3878 ctx->sectype = ses->sectype;
3880 /* krb5 is special, since we don't need username or pw */
3881 if (ctx->sectype == Kerberos)
3884 return cifs_set_cifscreds(ctx, ses);
3887 static struct cifs_tcon *
3888 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
3891 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
3892 struct cifs_ses *ses;
3893 struct cifs_tcon *tcon = NULL;
3894 struct smb3_fs_context *ctx;
3896 ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
3898 return ERR_PTR(-ENOMEM);
3900 ctx->local_nls = cifs_sb->local_nls;
3901 ctx->linux_uid = fsuid;
3902 ctx->cred_uid = fsuid;
3903 ctx->UNC = master_tcon->treeName;
3904 ctx->retry = master_tcon->retry;
3905 ctx->nocase = master_tcon->nocase;
3906 ctx->nohandlecache = master_tcon->nohandlecache;
3907 ctx->local_lease = master_tcon->local_lease;
3908 ctx->no_lease = master_tcon->no_lease;
3909 ctx->resilient = master_tcon->use_resilient;
3910 ctx->persistent = master_tcon->use_persistent;
3911 ctx->handle_timeout = master_tcon->handle_timeout;
3912 ctx->no_linux_ext = !master_tcon->unix_ext;
3913 ctx->linux_ext = master_tcon->posix_extensions;
3914 ctx->sectype = master_tcon->ses->sectype;
3915 ctx->sign = master_tcon->ses->sign;
3916 ctx->seal = master_tcon->seal;
3917 ctx->witness = master_tcon->use_witness;
3919 rc = cifs_set_vol_auth(ctx, master_tcon->ses);
3925 /* get a reference for the same TCP session */
3926 spin_lock(&cifs_tcp_ses_lock);
3927 ++master_tcon->ses->server->srv_count;
3928 spin_unlock(&cifs_tcp_ses_lock);
3930 ses = cifs_get_smb_ses(master_tcon->ses->server, ctx);
3932 tcon = (struct cifs_tcon *)ses;
3933 cifs_put_tcp_session(master_tcon->ses->server, 0);
3937 tcon = cifs_get_tcon(ses, ctx);
3939 cifs_put_smb_ses(ses);
3944 reset_cifs_unix_caps(0, tcon, NULL, ctx);
3947 kfree(ctx->username);
3948 kfree_sensitive(ctx->password);
3955 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
3957 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
3960 /* find and return a tlink with given uid */
3961 static struct tcon_link *
3962 tlink_rb_search(struct rb_root *root, kuid_t uid)
3964 struct rb_node *node = root->rb_node;
3965 struct tcon_link *tlink;
3968 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3970 if (uid_gt(tlink->tl_uid, uid))
3971 node = node->rb_left;
3972 else if (uid_lt(tlink->tl_uid, uid))
3973 node = node->rb_right;
3980 /* insert a tcon_link into the tree */
3982 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
3984 struct rb_node **new = &(root->rb_node), *parent = NULL;
3985 struct tcon_link *tlink;
3988 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
3991 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
3992 new = &((*new)->rb_left);
3994 new = &((*new)->rb_right);
3997 rb_link_node(&new_tlink->tl_rbnode, parent, new);
3998 rb_insert_color(&new_tlink->tl_rbnode, root);
4002 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
4005 * If the superblock doesn't refer to a multiuser mount, then just return
4006 * the master tcon for the mount.
4008 * First, search the rbtree for an existing tcon for this fsuid. If one
4009 * exists, then check to see if it's pending construction. If it is then wait
4010 * for construction to complete. Once it's no longer pending, check to see if
4011 * it failed and either return an error or retry construction, depending on
4014 * If one doesn't exist then insert a new tcon_link struct into the tree and
4015 * try to construct a new one.
4018 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
4021 kuid_t fsuid = current_fsuid();
4022 struct tcon_link *tlink, *newtlink;
4024 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
4025 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
4027 spin_lock(&cifs_sb->tlink_tree_lock);
4028 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4030 cifs_get_tlink(tlink);
4031 spin_unlock(&cifs_sb->tlink_tree_lock);
4033 if (tlink == NULL) {
4034 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4035 if (newtlink == NULL)
4036 return ERR_PTR(-ENOMEM);
4037 newtlink->tl_uid = fsuid;
4038 newtlink->tl_tcon = ERR_PTR(-EACCES);
4039 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
4040 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
4041 cifs_get_tlink(newtlink);
4043 spin_lock(&cifs_sb->tlink_tree_lock);
4044 /* was one inserted after previous search? */
4045 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4047 cifs_get_tlink(tlink);
4048 spin_unlock(&cifs_sb->tlink_tree_lock);
4050 goto wait_for_construction;
4053 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4054 spin_unlock(&cifs_sb->tlink_tree_lock);
4056 wait_for_construction:
4057 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
4058 TASK_INTERRUPTIBLE);
4060 cifs_put_tlink(tlink);
4061 return ERR_PTR(-ERESTARTSYS);
4064 /* if it's good, return it */
4065 if (!IS_ERR(tlink->tl_tcon))
4068 /* return error if we tried this already recently */
4069 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
4070 cifs_put_tlink(tlink);
4071 return ERR_PTR(-EACCES);
4074 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
4075 goto wait_for_construction;
4078 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
4079 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
4080 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
4082 if (IS_ERR(tlink->tl_tcon)) {
4083 cifs_put_tlink(tlink);
4084 return ERR_PTR(-EACCES);
4091 * periodic workqueue job that scans tcon_tree for a superblock and closes
4095 cifs_prune_tlinks(struct work_struct *work)
4097 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
4099 struct rb_root *root = &cifs_sb->tlink_tree;
4100 struct rb_node *node;
4101 struct rb_node *tmp;
4102 struct tcon_link *tlink;
4105 * Because we drop the spinlock in the loop in order to put the tlink
4106 * it's not guarded against removal of links from the tree. The only
4107 * places that remove entries from the tree are this function and
4108 * umounts. Because this function is non-reentrant and is canceled
4109 * before umount can proceed, this is safe.
4111 spin_lock(&cifs_sb->tlink_tree_lock);
4112 node = rb_first(root);
4113 while (node != NULL) {
4115 node = rb_next(tmp);
4116 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
4118 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
4119 atomic_read(&tlink->tl_count) != 0 ||
4120 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
4123 cifs_get_tlink(tlink);
4124 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4125 rb_erase(tmp, root);
4127 spin_unlock(&cifs_sb->tlink_tree_lock);
4128 cifs_put_tlink(tlink);
4129 spin_lock(&cifs_sb->tlink_tree_lock);
4131 spin_unlock(&cifs_sb->tlink_tree_lock);
4133 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4137 #ifdef CONFIG_CIFS_DFS_UPCALL
4138 int cifs_tree_connect(const unsigned int xid, struct cifs_tcon *tcon, const struct nls_table *nlsc)
4141 struct TCP_Server_Info *server = tcon->ses->server;
4142 const struct smb_version_operations *ops = server->ops;
4143 struct dfs_cache_tgt_list tl;
4144 struct dfs_cache_tgt_iterator *it = NULL;
4146 const char *tcp_host;
4147 size_t tcp_host_len;
4148 const char *dfs_host;
4149 size_t dfs_host_len;
4150 char *share = NULL, *prefix = NULL;
4151 struct dfs_info3_param ref = {0};
4154 tree = kzalloc(MAX_TREE_SIZE, GFP_KERNEL);
4158 /* If it is not dfs or there was no cached dfs referral, then reconnect to same share */
4159 if (!tcon->dfs_path || dfs_cache_noreq_find(tcon->dfs_path + 1, &ref, &tl)) {
4161 scnprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$", server->hostname);
4162 rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
4164 rc = ops->tree_connect(xid, tcon->ses, tcon->treeName, tcon, nlsc);
4169 isroot = ref.server_type == DFS_TYPE_ROOT;
4170 free_dfs_info_param(&ref);
4172 extract_unc_hostname(server->hostname, &tcp_host, &tcp_host_len);
4174 for (it = dfs_cache_get_tgt_iterator(&tl); it; it = dfs_cache_get_next_tgt(&tl, it)) {
4182 rc = dfs_cache_get_tgt_share(tcon->dfs_path + 1, it, &share, &prefix);
4184 cifs_dbg(VFS, "%s: failed to parse target share %d\n",
4189 extract_unc_hostname(share, &dfs_host, &dfs_host_len);
4191 if (dfs_host_len != tcp_host_len
4192 || strncasecmp(dfs_host, tcp_host, dfs_host_len) != 0) {
4193 cifs_dbg(FYI, "%s: %.*s doesn't match %.*s\n", __func__, (int)dfs_host_len,
4194 dfs_host, (int)tcp_host_len, tcp_host);
4196 rc = match_target_ip(server, dfs_host, dfs_host_len, &target_match);
4198 cifs_dbg(VFS, "%s: failed to match target ip: %d\n", __func__, rc);
4202 if (!target_match) {
4203 cifs_dbg(FYI, "%s: skipping target\n", __func__);
4209 scnprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$", share);
4210 rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
4212 scnprintf(tree, MAX_TREE_SIZE, "\\%s", share);
4213 rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
4214 /* Only handle prefix paths of DFS link targets */
4215 if (!rc && !isroot) {
4216 rc = update_super_prepath(tcon, prefix);
4229 rc = dfs_cache_noreq_update_tgthint(tcon->dfs_path + 1, it);
4233 dfs_cache_free_tgts(&tl);
4239 int cifs_tree_connect(const unsigned int xid, struct cifs_tcon *tcon, const struct nls_table *nlsc)
4241 const struct smb_version_operations *ops = tcon->ses->server->ops;
4243 return ops->tree_connect(xid, tcon->ses, tcon->treeName, tcon, nlsc);