1 // SPDX-License-Identifier: LGPL-2.1
5 * Copyright (C) International Business Machines Corp., 2002,2011
6 * Author(s): Steve French (sfrench@us.ibm.com)
10 #include <linux/net.h>
11 #include <linux/string.h>
12 #include <linux/sched/mm.h>
13 #include <linux/sched/signal.h>
14 #include <linux/list.h>
15 #include <linux/wait.h>
16 #include <linux/slab.h>
17 #include <linux/pagemap.h>
18 #include <linux/ctype.h>
19 #include <linux/utsname.h>
20 #include <linux/mempool.h>
21 #include <linux/delay.h>
22 #include <linux/completion.h>
23 #include <linux/kthread.h>
24 #include <linux/pagevec.h>
25 #include <linux/freezer.h>
26 #include <linux/namei.h>
27 #include <linux/uuid.h>
28 #include <linux/uaccess.h>
29 #include <asm/processor.h>
30 #include <linux/inet.h>
31 #include <linux/module.h>
32 #include <keys/user-type.h>
34 #include <linux/parser.h>
35 #include <linux/bvec.h>
38 #include "cifsproto.h"
39 #include "cifs_unicode.h"
40 #include "cifs_debug.h"
41 #include "cifs_fs_sb.h"
44 #include "rfc1002pdu.h"
46 #include "smb2proto.h"
47 #include "smbdirect.h"
48 #include "dns_resolve.h"
49 #ifdef CONFIG_CIFS_DFS_UPCALL
50 #include "dfs_cache.h"
52 #include "fs_context.h"
55 extern mempool_t *cifs_req_poolp;
56 extern bool disable_legacy_dialects;
58 /* FIXME: should these be tunable? */
59 #define TLINK_ERROR_EXPIRE (1 * HZ)
60 #define TLINK_IDLE_EXPIRE (600 * HZ)
62 /* Drop the connection to not overload the server */
63 #define NUM_STATUS_IO_TIMEOUT 5
65 static int ip_connect(struct TCP_Server_Info *server);
66 static int generic_ip_connect(struct TCP_Server_Info *server);
67 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
68 static void cifs_prune_tlinks(struct work_struct *work);
71 * Resolve hostname and set ip addr in tcp ses. Useful for hostnames that may
72 * get their ip addresses changed at some point.
74 * This should be called with server->srv_mutex held.
76 static int reconn_set_ipaddr_from_hostname(struct TCP_Server_Info *server)
80 char *unc, *ipaddr = NULL;
82 unsigned long ttl = SMB_DNS_RESOLVE_INTERVAL_DEFAULT;
84 if (!server->hostname)
87 len = strlen(server->hostname) + 3;
89 unc = kmalloc(len, GFP_KERNEL);
91 cifs_dbg(FYI, "%s: failed to create UNC path\n", __func__);
94 scnprintf(unc, len, "\\\\%s", server->hostname);
96 rc = dns_resolve_server_name_to_ip(unc, &ipaddr, &expiry);
100 cifs_dbg(FYI, "%s: failed to resolve server part of %s to IP: %d\n",
101 __func__, server->hostname, rc);
102 goto requeue_resolve;
105 spin_lock(&cifs_tcp_ses_lock);
106 rc = cifs_convert_address((struct sockaddr *)&server->dstaddr, ipaddr,
108 spin_unlock(&cifs_tcp_ses_lock);
111 /* rc == 1 means success here */
113 now = ktime_get_real_seconds();
114 if (expiry && expiry > now)
116 * To make sure we don't use the cached entry, retry 1s
119 ttl = (expiry - now + 1);
124 cifs_dbg(FYI, "%s: next dns resolution scheduled for %lu seconds in the future\n",
126 mod_delayed_work(cifsiod_wq, &server->resolve, (ttl * HZ));
132 static void cifs_resolve_server(struct work_struct *work)
135 struct TCP_Server_Info *server = container_of(work,
136 struct TCP_Server_Info, resolve.work);
138 mutex_lock(&server->srv_mutex);
141 * Resolve the hostname again to make sure that IP address is up-to-date.
143 rc = reconn_set_ipaddr_from_hostname(server);
145 cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
149 mutex_unlock(&server->srv_mutex);
152 #ifdef CONFIG_CIFS_DFS_UPCALL
153 /* These functions must be called with server->srv_mutex held */
154 static void reconn_set_next_dfs_target(struct TCP_Server_Info *server,
155 struct cifs_sb_info *cifs_sb,
156 struct dfs_cache_tgt_list *tgt_list,
157 struct dfs_cache_tgt_iterator **tgt_it)
162 if (!cifs_sb || !cifs_sb->origin_fullpath)
166 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
168 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
170 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
173 cifs_dbg(FYI, "%s: UNC: %s\n", __func__, cifs_sb->origin_fullpath);
175 name = dfs_cache_get_tgt_name(*tgt_it);
177 kfree(server->hostname);
179 server->hostname = extract_hostname(name);
180 if (IS_ERR(server->hostname)) {
182 "%s: failed to extract hostname from target: %ld\n",
183 __func__, PTR_ERR(server->hostname));
187 rc = reconn_set_ipaddr_from_hostname(server);
189 cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
194 static inline int reconn_setup_dfs_targets(struct cifs_sb_info *cifs_sb,
195 struct dfs_cache_tgt_list *tl)
197 if (!cifs_sb->origin_fullpath)
199 return dfs_cache_noreq_find(cifs_sb->origin_fullpath + 1, NULL, tl);
204 * cifs tcp session reconnection
206 * mark tcp session as reconnecting so temporarily locked
207 * mark all smb sessions as reconnecting for tcp session
208 * reconnect tcp session
209 * wake up waiters on reconnection? - (not needed currently)
212 cifs_reconnect(struct TCP_Server_Info *server)
215 struct list_head *tmp, *tmp2;
216 struct cifs_ses *ses;
217 struct cifs_tcon *tcon;
218 struct mid_q_entry *mid_entry;
219 struct list_head retry_list;
220 #ifdef CONFIG_CIFS_DFS_UPCALL
221 struct super_block *sb = NULL;
222 struct cifs_sb_info *cifs_sb = NULL;
223 struct dfs_cache_tgt_list tgt_list = DFS_CACHE_TGT_LIST_INIT(tgt_list);
224 struct dfs_cache_tgt_iterator *tgt_it = NULL;
227 spin_lock(&GlobalMid_Lock);
228 server->nr_targets = 1;
229 #ifdef CONFIG_CIFS_DFS_UPCALL
230 spin_unlock(&GlobalMid_Lock);
231 sb = cifs_get_tcp_super(server);
234 cifs_dbg(FYI, "%s: will not do DFS failover: rc = %d\n",
238 cifs_sb = CIFS_SB(sb);
239 rc = reconn_setup_dfs_targets(cifs_sb, &tgt_list);
242 if (rc != -EOPNOTSUPP) {
243 cifs_server_dbg(VFS, "%s: no target servers for DFS failover\n",
247 server->nr_targets = dfs_cache_get_nr_tgts(&tgt_list);
250 cifs_dbg(FYI, "%s: will retry %d target(s)\n", __func__,
252 spin_lock(&GlobalMid_Lock);
254 if (server->tcpStatus == CifsExiting) {
255 /* the demux thread will exit normally
256 next time through the loop */
257 spin_unlock(&GlobalMid_Lock);
258 #ifdef CONFIG_CIFS_DFS_UPCALL
259 dfs_cache_free_tgts(&tgt_list);
260 cifs_put_tcp_super(sb);
262 wake_up(&server->response_q);
265 server->tcpStatus = CifsNeedReconnect;
266 spin_unlock(&GlobalMid_Lock);
268 server->max_read = 0;
270 cifs_dbg(FYI, "Mark tcp session as need reconnect\n");
271 trace_smb3_reconnect(server->CurrentMid, server->conn_id, server->hostname);
273 /* before reconnecting the tcp session, mark the smb session (uid)
274 and the tid bad so they are not used until reconnected */
275 cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
277 spin_lock(&cifs_tcp_ses_lock);
278 list_for_each(tmp, &server->smb_ses_list) {
279 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
280 ses->need_reconnect = true;
281 list_for_each(tmp2, &ses->tcon_list) {
282 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
283 tcon->need_reconnect = true;
286 ses->tcon_ipc->need_reconnect = true;
288 spin_unlock(&cifs_tcp_ses_lock);
290 /* do not want to be sending data on a socket we are freeing */
291 cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
292 mutex_lock(&server->srv_mutex);
293 if (server->ssocket) {
294 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
295 server->ssocket->state, server->ssocket->flags);
296 kernel_sock_shutdown(server->ssocket, SHUT_WR);
297 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
298 server->ssocket->state, server->ssocket->flags);
299 sock_release(server->ssocket);
300 server->ssocket = NULL;
302 server->sequence_number = 0;
303 server->session_estab = false;
304 kfree(server->session_key.response);
305 server->session_key.response = NULL;
306 server->session_key.len = 0;
307 server->lstrp = jiffies;
309 /* mark submitted MIDs for retry and issue callback */
310 INIT_LIST_HEAD(&retry_list);
311 cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
312 spin_lock(&GlobalMid_Lock);
313 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
314 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
315 kref_get(&mid_entry->refcount);
316 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
317 mid_entry->mid_state = MID_RETRY_NEEDED;
318 list_move(&mid_entry->qhead, &retry_list);
319 mid_entry->mid_flags |= MID_DELETED;
321 spin_unlock(&GlobalMid_Lock);
322 mutex_unlock(&server->srv_mutex);
324 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
325 list_for_each_safe(tmp, tmp2, &retry_list) {
326 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
327 list_del_init(&mid_entry->qhead);
328 mid_entry->callback(mid_entry);
329 cifs_mid_q_entry_release(mid_entry);
332 if (cifs_rdma_enabled(server)) {
333 mutex_lock(&server->srv_mutex);
334 smbd_destroy(server);
335 mutex_unlock(&server->srv_mutex);
341 mutex_lock(&server->srv_mutex);
344 if (!cifs_swn_set_server_dstaddr(server)) {
345 #ifdef CONFIG_CIFS_DFS_UPCALL
346 if (cifs_sb && cifs_sb->origin_fullpath)
348 * Set up next DFS target server (if any) for reconnect. If DFS
349 * feature is disabled, then we will retry last server we
350 * connected to before.
352 reconn_set_next_dfs_target(server, cifs_sb, &tgt_list, &tgt_it);
356 * Resolve the hostname again to make sure that IP address is up-to-date.
358 rc = reconn_set_ipaddr_from_hostname(server);
360 cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
364 #ifdef CONFIG_CIFS_DFS_UPCALL
371 if (cifs_rdma_enabled(server))
372 rc = smbd_reconnect(server);
374 rc = generic_ip_connect(server);
376 cifs_dbg(FYI, "reconnect error %d\n", rc);
377 mutex_unlock(&server->srv_mutex);
380 atomic_inc(&tcpSesReconnectCount);
381 set_credits(server, 1);
382 spin_lock(&GlobalMid_Lock);
383 if (server->tcpStatus != CifsExiting)
384 server->tcpStatus = CifsNeedNegotiate;
385 spin_unlock(&GlobalMid_Lock);
386 cifs_swn_reset_server_dstaddr(server);
387 mutex_unlock(&server->srv_mutex);
389 } while (server->tcpStatus == CifsNeedReconnect);
391 #ifdef CONFIG_CIFS_DFS_UPCALL
393 rc = dfs_cache_noreq_update_tgthint(cifs_sb->origin_fullpath + 1,
396 cifs_server_dbg(VFS, "%s: failed to update DFS target hint: rc = %d\n",
399 dfs_cache_free_tgts(&tgt_list);
402 cifs_put_tcp_super(sb);
404 if (server->tcpStatus == CifsNeedNegotiate)
405 mod_delayed_work(cifsiod_wq, &server->echo, 0);
407 wake_up(&server->response_q);
412 cifs_echo_request(struct work_struct *work)
415 struct TCP_Server_Info *server = container_of(work,
416 struct TCP_Server_Info, echo.work);
419 * We cannot send an echo if it is disabled.
420 * Also, no need to ping if we got a response recently.
423 if (server->tcpStatus == CifsNeedReconnect ||
424 server->tcpStatus == CifsExiting ||
425 server->tcpStatus == CifsNew ||
426 (server->ops->can_echo && !server->ops->can_echo(server)) ||
427 time_before(jiffies, server->lstrp + server->echo_interval - HZ))
430 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
432 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
435 /* Check witness registrations */
439 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
443 allocate_buffers(struct TCP_Server_Info *server)
445 if (!server->bigbuf) {
446 server->bigbuf = (char *)cifs_buf_get();
447 if (!server->bigbuf) {
448 cifs_server_dbg(VFS, "No memory for large SMB response\n");
450 /* retry will check if exiting */
453 } else if (server->large_buf) {
454 /* we are reusing a dirty large buf, clear its start */
455 memset(server->bigbuf, 0, HEADER_SIZE(server));
458 if (!server->smallbuf) {
459 server->smallbuf = (char *)cifs_small_buf_get();
460 if (!server->smallbuf) {
461 cifs_server_dbg(VFS, "No memory for SMB response\n");
463 /* retry will check if exiting */
466 /* beginning of smb buffer is cleared in our buf_get */
468 /* if existing small buf clear beginning */
469 memset(server->smallbuf, 0, HEADER_SIZE(server));
476 server_unresponsive(struct TCP_Server_Info *server)
479 * We need to wait 3 echo intervals to make sure we handle such
481 * 1s client sends a normal SMB request
482 * 2s client gets a response
483 * 30s echo workqueue job pops, and decides we got a response recently
484 * and don't need to send another
486 * 65s kernel_recvmsg times out, and we see that we haven't gotten
487 * a response in >60s.
489 if ((server->tcpStatus == CifsGood ||
490 server->tcpStatus == CifsNeedNegotiate) &&
491 (!server->ops->can_echo || server->ops->can_echo(server)) &&
492 time_after(jiffies, server->lstrp + 3 * server->echo_interval)) {
493 cifs_server_dbg(VFS, "has not responded in %lu seconds. Reconnecting...\n",
494 (3 * server->echo_interval) / HZ);
495 cifs_reconnect(server);
503 zero_credits(struct TCP_Server_Info *server)
507 spin_lock(&server->req_lock);
508 val = server->credits + server->echo_credits + server->oplock_credits;
509 if (server->in_flight == 0 && val == 0) {
510 spin_unlock(&server->req_lock);
513 spin_unlock(&server->req_lock);
518 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
523 smb_msg->msg_control = NULL;
524 smb_msg->msg_controllen = 0;
526 for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
529 /* reconnect if no credits and no requests in flight */
530 if (zero_credits(server)) {
531 cifs_reconnect(server);
532 return -ECONNABORTED;
535 if (server_unresponsive(server))
536 return -ECONNABORTED;
537 if (cifs_rdma_enabled(server) && server->smbd_conn)
538 length = smbd_recv(server->smbd_conn, smb_msg);
540 length = sock_recvmsg(server->ssocket, smb_msg, 0);
542 if (server->tcpStatus == CifsExiting)
545 if (server->tcpStatus == CifsNeedReconnect) {
546 cifs_reconnect(server);
547 return -ECONNABORTED;
550 if (length == -ERESTARTSYS ||
554 * Minimum sleep to prevent looping, allowing socket
555 * to clear and app threads to set tcpStatus
556 * CifsNeedReconnect if server hung.
558 usleep_range(1000, 2000);
564 cifs_dbg(FYI, "Received no data or error: %d\n", length);
565 cifs_reconnect(server);
566 return -ECONNABORTED;
573 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
574 unsigned int to_read)
576 struct msghdr smb_msg;
577 struct kvec iov = {.iov_base = buf, .iov_len = to_read};
578 iov_iter_kvec(&smb_msg.msg_iter, READ, &iov, 1, to_read);
580 return cifs_readv_from_socket(server, &smb_msg);
584 cifs_discard_from_socket(struct TCP_Server_Info *server, size_t to_read)
586 struct msghdr smb_msg;
589 * iov_iter_discard already sets smb_msg.type and count and iov_offset
590 * and cifs_readv_from_socket sets msg_control and msg_controllen
591 * so little to initialize in struct msghdr
593 smb_msg.msg_name = NULL;
594 smb_msg.msg_namelen = 0;
595 iov_iter_discard(&smb_msg.msg_iter, READ, to_read);
597 return cifs_readv_from_socket(server, &smb_msg);
601 cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
602 unsigned int page_offset, unsigned int to_read)
604 struct msghdr smb_msg;
605 struct bio_vec bv = {
606 .bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
607 iov_iter_bvec(&smb_msg.msg_iter, READ, &bv, 1, to_read);
608 return cifs_readv_from_socket(server, &smb_msg);
612 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
615 * The first byte big endian of the length field,
616 * is actually not part of the length but the type
617 * with the most common, zero, as regular data.
620 case RFC1002_SESSION_MESSAGE:
621 /* Regular SMB response */
623 case RFC1002_SESSION_KEEP_ALIVE:
624 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
626 case RFC1002_POSITIVE_SESSION_RESPONSE:
627 cifs_dbg(FYI, "RFC 1002 positive session response\n");
629 case RFC1002_NEGATIVE_SESSION_RESPONSE:
631 * We get this from Windows 98 instead of an error on
632 * SMB negprot response.
634 cifs_dbg(FYI, "RFC 1002 negative session response\n");
635 /* give server a second to clean up */
638 * Always try 445 first on reconnect since we get NACK
639 * on some if we ever connected to port 139 (the NACK
640 * is since we do not begin with RFC1001 session
643 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
644 cifs_reconnect(server);
647 cifs_server_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
648 cifs_reconnect(server);
655 dequeue_mid(struct mid_q_entry *mid, bool malformed)
657 #ifdef CONFIG_CIFS_STATS2
658 mid->when_received = jiffies;
660 spin_lock(&GlobalMid_Lock);
662 mid->mid_state = MID_RESPONSE_RECEIVED;
664 mid->mid_state = MID_RESPONSE_MALFORMED;
666 * Trying to handle/dequeue a mid after the send_recv()
667 * function has finished processing it is a bug.
669 if (mid->mid_flags & MID_DELETED)
670 pr_warn_once("trying to dequeue a deleted mid\n");
672 list_del_init(&mid->qhead);
673 mid->mid_flags |= MID_DELETED;
675 spin_unlock(&GlobalMid_Lock);
679 smb2_get_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
681 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
684 * SMB1 does not use credits.
686 if (server->vals->header_preamble_size)
689 return le16_to_cpu(shdr->CreditRequest);
693 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
694 char *buf, int malformed)
696 if (server->ops->check_trans2 &&
697 server->ops->check_trans2(mid, server, buf, malformed))
699 mid->credits_received = smb2_get_credits_from_hdr(buf, server);
701 mid->large_buf = server->large_buf;
702 /* Was previous buf put in mpx struct for multi-rsp? */
703 if (!mid->multiRsp) {
704 /* smb buffer will be freed by user thread */
705 if (server->large_buf)
706 server->bigbuf = NULL;
708 server->smallbuf = NULL;
710 dequeue_mid(mid, malformed);
713 static void clean_demultiplex_info(struct TCP_Server_Info *server)
717 /* take it off the list, if it's not already */
718 spin_lock(&cifs_tcp_ses_lock);
719 list_del_init(&server->tcp_ses_list);
720 spin_unlock(&cifs_tcp_ses_lock);
722 cancel_delayed_work_sync(&server->echo);
723 cancel_delayed_work_sync(&server->resolve);
725 spin_lock(&GlobalMid_Lock);
726 server->tcpStatus = CifsExiting;
727 spin_unlock(&GlobalMid_Lock);
728 wake_up_all(&server->response_q);
730 /* check if we have blocked requests that need to free */
731 spin_lock(&server->req_lock);
732 if (server->credits <= 0)
734 spin_unlock(&server->req_lock);
736 * Although there should not be any requests blocked on this queue it
737 * can not hurt to be paranoid and try to wake up requests that may
738 * haven been blocked when more than 50 at time were on the wire to the
739 * same server - they now will see the session is in exit state and get
740 * out of SendReceive.
742 wake_up_all(&server->request_q);
743 /* give those requests time to exit */
745 if (cifs_rdma_enabled(server))
746 smbd_destroy(server);
747 if (server->ssocket) {
748 sock_release(server->ssocket);
749 server->ssocket = NULL;
752 if (!list_empty(&server->pending_mid_q)) {
753 struct list_head dispose_list;
754 struct mid_q_entry *mid_entry;
755 struct list_head *tmp, *tmp2;
757 INIT_LIST_HEAD(&dispose_list);
758 spin_lock(&GlobalMid_Lock);
759 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
760 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
761 cifs_dbg(FYI, "Clearing mid %llu\n", mid_entry->mid);
762 kref_get(&mid_entry->refcount);
763 mid_entry->mid_state = MID_SHUTDOWN;
764 list_move(&mid_entry->qhead, &dispose_list);
765 mid_entry->mid_flags |= MID_DELETED;
767 spin_unlock(&GlobalMid_Lock);
769 /* now walk dispose list and issue callbacks */
770 list_for_each_safe(tmp, tmp2, &dispose_list) {
771 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
772 cifs_dbg(FYI, "Callback mid %llu\n", mid_entry->mid);
773 list_del_init(&mid_entry->qhead);
774 mid_entry->callback(mid_entry);
775 cifs_mid_q_entry_release(mid_entry);
777 /* 1/8th of sec is more than enough time for them to exit */
781 if (!list_empty(&server->pending_mid_q)) {
783 * mpx threads have not exited yet give them at least the smb
784 * send timeout time for long ops.
786 * Due to delays on oplock break requests, we need to wait at
787 * least 45 seconds before giving up on a request getting a
788 * response and going ahead and killing cifsd.
790 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
793 * If threads still have not exited they are probably never
794 * coming home not much else we can do but free the memory.
798 kfree(server->hostname);
801 length = atomic_dec_return(&tcpSesAllocCount);
803 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
807 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
810 char *buf = server->smallbuf;
811 unsigned int pdu_length = server->pdu_size;
813 /* make sure this will fit in a large buffer */
814 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
815 server->vals->header_preamble_size) {
816 cifs_server_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
817 cifs_reconnect(server);
818 return -ECONNABORTED;
821 /* switch to large buffer if too big for a small one */
822 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
823 server->large_buf = true;
824 memcpy(server->bigbuf, buf, server->total_read);
825 buf = server->bigbuf;
828 /* now read the rest */
829 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
830 pdu_length - HEADER_SIZE(server) + 1
831 + server->vals->header_preamble_size);
835 server->total_read += length;
837 dump_smb(buf, server->total_read);
839 return cifs_handle_standard(server, mid);
843 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
845 char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
849 * We know that we received enough to get to the MID as we
850 * checked the pdu_length earlier. Now check to see
851 * if the rest of the header is OK. We borrow the length
852 * var for the rest of the loop to avoid a new stack var.
854 * 48 bytes is enough to display the header and a little bit
855 * into the payload for debugging purposes.
857 length = server->ops->check_message(buf, server->total_read, server);
859 cifs_dump_mem("Bad SMB: ", buf,
860 min_t(unsigned int, server->total_read, 48));
862 if (server->ops->is_session_expired &&
863 server->ops->is_session_expired(buf)) {
864 cifs_reconnect(server);
868 if (server->ops->is_status_pending &&
869 server->ops->is_status_pending(buf, server))
875 handle_mid(mid, server, buf, length);
880 smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
882 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
883 int scredits, in_flight;
886 * SMB1 does not use credits.
888 if (server->vals->header_preamble_size)
891 if (shdr->CreditRequest) {
892 spin_lock(&server->req_lock);
893 server->credits += le16_to_cpu(shdr->CreditRequest);
894 scredits = server->credits;
895 in_flight = server->in_flight;
896 spin_unlock(&server->req_lock);
897 wake_up(&server->request_q);
899 trace_smb3_add_credits(server->CurrentMid,
900 server->conn_id, server->hostname, scredits,
901 le16_to_cpu(shdr->CreditRequest), in_flight);
902 cifs_server_dbg(FYI, "%s: added %u credits total=%d\n",
903 __func__, le16_to_cpu(shdr->CreditRequest),
910 cifs_demultiplex_thread(void *p)
912 int i, num_mids, length;
913 struct TCP_Server_Info *server = p;
914 unsigned int pdu_length;
915 unsigned int next_offset;
917 struct task_struct *task_to_wake = NULL;
918 struct mid_q_entry *mids[MAX_COMPOUND];
919 char *bufs[MAX_COMPOUND];
920 unsigned int noreclaim_flag, num_io_timeout = 0;
922 noreclaim_flag = memalloc_noreclaim_save();
923 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
925 length = atomic_inc_return(&tcpSesAllocCount);
927 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
930 allow_kernel_signal(SIGKILL);
931 while (server->tcpStatus != CifsExiting) {
935 if (!allocate_buffers(server))
938 server->large_buf = false;
939 buf = server->smallbuf;
940 pdu_length = 4; /* enough to get RFC1001 header */
942 length = cifs_read_from_socket(server, buf, pdu_length);
946 if (server->vals->header_preamble_size == 0)
947 server->total_read = 0;
949 server->total_read = length;
952 * The right amount was read from socket - 4 bytes,
953 * so we can now interpret the length field.
955 pdu_length = get_rfc1002_length(buf);
957 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
958 if (!is_smb_response(server, buf[0]))
961 server->pdu_size = pdu_length;
963 /* make sure we have enough to get to the MID */
964 if (server->pdu_size < HEADER_SIZE(server) - 1 -
965 server->vals->header_preamble_size) {
966 cifs_server_dbg(VFS, "SMB response too short (%u bytes)\n",
968 cifs_reconnect(server);
972 /* read down to the MID */
973 length = cifs_read_from_socket(server,
974 buf + server->vals->header_preamble_size,
975 HEADER_SIZE(server) - 1
976 - server->vals->header_preamble_size);
979 server->total_read += length;
981 if (server->ops->next_header) {
982 next_offset = server->ops->next_header(buf);
984 server->pdu_size = next_offset;
987 memset(mids, 0, sizeof(mids));
988 memset(bufs, 0, sizeof(bufs));
991 if (server->ops->is_transform_hdr &&
992 server->ops->receive_transform &&
993 server->ops->is_transform_hdr(buf)) {
994 length = server->ops->receive_transform(server,
999 mids[0] = server->ops->find_mid(server, buf);
1003 if (!mids[0] || !mids[0]->receive)
1004 length = standard_receive3(server, mids[0]);
1006 length = mids[0]->receive(server, mids[0]);
1010 for (i = 0; i < num_mids; i++)
1012 cifs_mid_q_entry_release(mids[i]);
1016 if (server->ops->is_status_io_timeout &&
1017 server->ops->is_status_io_timeout(buf)) {
1019 if (num_io_timeout > NUM_STATUS_IO_TIMEOUT) {
1020 cifs_reconnect(server);
1026 server->lstrp = jiffies;
1028 for (i = 0; i < num_mids; i++) {
1029 if (mids[i] != NULL) {
1030 mids[i]->resp_buf_size = server->pdu_size;
1032 if (bufs[i] && server->ops->is_network_name_deleted)
1033 server->ops->is_network_name_deleted(bufs[i],
1036 if (!mids[i]->multiRsp || mids[i]->multiEnd)
1037 mids[i]->callback(mids[i]);
1039 cifs_mid_q_entry_release(mids[i]);
1040 } else if (server->ops->is_oplock_break &&
1041 server->ops->is_oplock_break(bufs[i],
1043 smb2_add_credits_from_hdr(bufs[i], server);
1044 cifs_dbg(FYI, "Received oplock break\n");
1046 cifs_server_dbg(VFS, "No task to wake, unknown frame received! NumMids %d\n",
1047 atomic_read(&midCount));
1048 cifs_dump_mem("Received Data is: ", bufs[i],
1049 HEADER_SIZE(server));
1050 smb2_add_credits_from_hdr(bufs[i], server);
1051 #ifdef CONFIG_CIFS_DEBUG2
1052 if (server->ops->dump_detail)
1053 server->ops->dump_detail(bufs[i],
1055 cifs_dump_mids(server);
1056 #endif /* CIFS_DEBUG2 */
1060 if (pdu_length > server->pdu_size) {
1061 if (!allocate_buffers(server))
1063 pdu_length -= server->pdu_size;
1064 server->total_read = 0;
1065 server->large_buf = false;
1066 buf = server->smallbuf;
1069 } /* end while !EXITING */
1071 /* buffer usually freed in free_mid - need to free it here on exit */
1072 cifs_buf_release(server->bigbuf);
1073 if (server->smallbuf) /* no sense logging a debug message if NULL */
1074 cifs_small_buf_release(server->smallbuf);
1076 task_to_wake = xchg(&server->tsk, NULL);
1077 clean_demultiplex_info(server);
1079 /* if server->tsk was NULL then wait for a signal before exiting */
1080 if (!task_to_wake) {
1081 set_current_state(TASK_INTERRUPTIBLE);
1082 while (!signal_pending(current)) {
1084 set_current_state(TASK_INTERRUPTIBLE);
1086 set_current_state(TASK_RUNNING);
1089 memalloc_noreclaim_restore(noreclaim_flag);
1090 module_put_and_exit(0);
1094 * Returns true if srcaddr isn't specified and rhs isn't specified, or
1095 * if srcaddr is specified and matches the IP address of the rhs argument
1098 cifs_match_ipaddr(struct sockaddr *srcaddr, struct sockaddr *rhs)
1100 switch (srcaddr->sa_family) {
1102 return (rhs->sa_family == AF_UNSPEC);
1104 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
1105 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
1106 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
1109 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
1110 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
1111 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
1115 return false; /* don't expect to be here */
1120 * If no port is specified in addr structure, we try to match with 445 port
1121 * and if it fails - with 139 ports. It should be called only if address
1122 * families of server and addr are equal.
1125 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
1127 __be16 port, *sport;
1129 /* SMBDirect manages its own ports, don't match it here */
1133 switch (addr->sa_family) {
1135 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
1136 port = ((struct sockaddr_in *) addr)->sin_port;
1139 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
1140 port = ((struct sockaddr_in6 *) addr)->sin6_port;
1148 port = htons(CIFS_PORT);
1152 port = htons(RFC1001_PORT);
1155 return port == *sport;
1159 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
1160 struct sockaddr *srcaddr)
1162 switch (addr->sa_family) {
1164 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
1165 struct sockaddr_in *srv_addr4 =
1166 (struct sockaddr_in *)&server->dstaddr;
1168 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
1173 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
1174 struct sockaddr_in6 *srv_addr6 =
1175 (struct sockaddr_in6 *)&server->dstaddr;
1177 if (!ipv6_addr_equal(&addr6->sin6_addr,
1178 &srv_addr6->sin6_addr))
1180 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
1186 return false; /* don't expect to be here */
1189 if (!cifs_match_ipaddr(srcaddr, (struct sockaddr *)&server->srcaddr))
1196 match_security(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1199 * The select_sectype function should either return the ctx->sectype
1200 * that was specified, or "Unspecified" if that sectype was not
1201 * compatible with the given NEGOTIATE request.
1203 if (server->ops->select_sectype(server, ctx->sectype)
1208 * Now check if signing mode is acceptable. No need to check
1209 * global_secflags at this point since if MUST_SIGN is set then
1210 * the server->sign had better be too.
1212 if (ctx->sign && !server->sign)
1218 static int match_server(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1220 struct sockaddr *addr = (struct sockaddr *)&ctx->dstaddr;
1222 if (ctx->nosharesock)
1225 /* If multidialect negotiation see if existing sessions match one */
1226 if (strcmp(ctx->vals->version_string, SMB3ANY_VERSION_STRING) == 0) {
1227 if (server->vals->protocol_id < SMB30_PROT_ID)
1229 } else if (strcmp(ctx->vals->version_string,
1230 SMBDEFAULT_VERSION_STRING) == 0) {
1231 if (server->vals->protocol_id < SMB21_PROT_ID)
1233 } else if ((server->vals != ctx->vals) || (server->ops != ctx->ops))
1236 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
1239 if (!match_address(server, addr,
1240 (struct sockaddr *)&ctx->srcaddr))
1243 if (!match_port(server, addr))
1246 if (!match_security(server, ctx))
1249 if (server->echo_interval != ctx->echo_interval * HZ)
1252 if (server->rdma != ctx->rdma)
1255 if (server->ignore_signature != ctx->ignore_signature)
1258 if (server->min_offload != ctx->min_offload)
1264 struct TCP_Server_Info *
1265 cifs_find_tcp_session(struct smb3_fs_context *ctx)
1267 struct TCP_Server_Info *server;
1269 spin_lock(&cifs_tcp_ses_lock);
1270 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
1271 #ifdef CONFIG_CIFS_DFS_UPCALL
1273 * DFS failover implementation in cifs_reconnect() requires unique tcp sessions for
1274 * DFS connections to do failover properly, so avoid sharing them with regular
1275 * shares or even links that may connect to same server but having completely
1276 * different failover targets.
1278 if (server->is_dfs_conn)
1282 * Skip ses channels since they're only handled in lower layers
1283 * (e.g. cifs_send_recv).
1285 if (server->is_channel || !match_server(server, ctx))
1288 ++server->srv_count;
1289 spin_unlock(&cifs_tcp_ses_lock);
1290 cifs_dbg(FYI, "Existing tcp session with server found\n");
1293 spin_unlock(&cifs_tcp_ses_lock);
1298 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
1300 struct task_struct *task;
1302 spin_lock(&cifs_tcp_ses_lock);
1303 if (--server->srv_count > 0) {
1304 spin_unlock(&cifs_tcp_ses_lock);
1308 /* srv_count can never go negative */
1309 WARN_ON(server->srv_count < 0);
1311 put_net(cifs_net_ns(server));
1313 list_del_init(&server->tcp_ses_list);
1314 spin_unlock(&cifs_tcp_ses_lock);
1316 cancel_delayed_work_sync(&server->echo);
1317 cancel_delayed_work_sync(&server->resolve);
1321 * Avoid deadlock here: reconnect work calls
1322 * cifs_put_tcp_session() at its end. Need to be sure
1323 * that reconnect work does nothing with server pointer after
1326 cancel_delayed_work(&server->reconnect);
1328 cancel_delayed_work_sync(&server->reconnect);
1330 spin_lock(&GlobalMid_Lock);
1331 server->tcpStatus = CifsExiting;
1332 spin_unlock(&GlobalMid_Lock);
1334 cifs_crypto_secmech_release(server);
1335 cifs_fscache_release_client_cookie(server);
1337 kfree(server->session_key.response);
1338 server->session_key.response = NULL;
1339 server->session_key.len = 0;
1341 task = xchg(&server->tsk, NULL);
1343 send_sig(SIGKILL, task, 1);
1346 struct TCP_Server_Info *
1347 cifs_get_tcp_session(struct smb3_fs_context *ctx)
1349 struct TCP_Server_Info *tcp_ses = NULL;
1352 cifs_dbg(FYI, "UNC: %s\n", ctx->UNC);
1354 /* see if we already have a matching tcp_ses */
1355 tcp_ses = cifs_find_tcp_session(ctx);
1359 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
1365 tcp_ses->ops = ctx->ops;
1366 tcp_ses->vals = ctx->vals;
1367 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
1368 tcp_ses->hostname = extract_hostname(ctx->UNC);
1369 if (IS_ERR(tcp_ses->hostname)) {
1370 rc = PTR_ERR(tcp_ses->hostname);
1371 goto out_err_crypto_release;
1374 tcp_ses->conn_id = atomic_inc_return(&tcpSesNextId);
1375 tcp_ses->noblockcnt = ctx->rootfs;
1376 tcp_ses->noblocksnd = ctx->noblocksnd || ctx->rootfs;
1377 tcp_ses->noautotune = ctx->noautotune;
1378 tcp_ses->tcp_nodelay = ctx->sockopt_tcp_nodelay;
1379 tcp_ses->rdma = ctx->rdma;
1380 tcp_ses->in_flight = 0;
1381 tcp_ses->max_in_flight = 0;
1382 tcp_ses->credits = 1;
1383 init_waitqueue_head(&tcp_ses->response_q);
1384 init_waitqueue_head(&tcp_ses->request_q);
1385 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
1386 mutex_init(&tcp_ses->srv_mutex);
1387 memcpy(tcp_ses->workstation_RFC1001_name,
1388 ctx->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
1389 memcpy(tcp_ses->server_RFC1001_name,
1390 ctx->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
1391 tcp_ses->session_estab = false;
1392 tcp_ses->sequence_number = 0;
1393 tcp_ses->reconnect_instance = 1;
1394 tcp_ses->lstrp = jiffies;
1395 tcp_ses->compress_algorithm = cpu_to_le16(ctx->compression);
1396 spin_lock_init(&tcp_ses->req_lock);
1397 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
1398 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
1399 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
1400 INIT_DELAYED_WORK(&tcp_ses->resolve, cifs_resolve_server);
1401 INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
1402 mutex_init(&tcp_ses->reconnect_mutex);
1403 memcpy(&tcp_ses->srcaddr, &ctx->srcaddr,
1404 sizeof(tcp_ses->srcaddr));
1405 memcpy(&tcp_ses->dstaddr, &ctx->dstaddr,
1406 sizeof(tcp_ses->dstaddr));
1407 if (ctx->use_client_guid)
1408 memcpy(tcp_ses->client_guid, ctx->client_guid,
1409 SMB2_CLIENT_GUID_SIZE);
1411 generate_random_uuid(tcp_ses->client_guid);
1413 * at this point we are the only ones with the pointer
1414 * to the struct since the kernel thread not created yet
1415 * no need to spinlock this init of tcpStatus or srv_count
1417 tcp_ses->tcpStatus = CifsNew;
1418 ++tcp_ses->srv_count;
1420 if (ctx->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
1421 ctx->echo_interval <= SMB_ECHO_INTERVAL_MAX)
1422 tcp_ses->echo_interval = ctx->echo_interval * HZ;
1424 tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
1425 if (tcp_ses->rdma) {
1426 #ifndef CONFIG_CIFS_SMB_DIRECT
1427 cifs_dbg(VFS, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
1429 goto out_err_crypto_release;
1431 tcp_ses->smbd_conn = smbd_get_connection(
1432 tcp_ses, (struct sockaddr *)&ctx->dstaddr);
1433 if (tcp_ses->smbd_conn) {
1434 cifs_dbg(VFS, "RDMA transport established\n");
1436 goto smbd_connected;
1439 goto out_err_crypto_release;
1442 rc = ip_connect(tcp_ses);
1444 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
1445 goto out_err_crypto_release;
1449 * since we're in a cifs function already, we know that
1450 * this will succeed. No need for try_module_get().
1452 __module_get(THIS_MODULE);
1453 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
1455 if (IS_ERR(tcp_ses->tsk)) {
1456 rc = PTR_ERR(tcp_ses->tsk);
1457 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
1458 module_put(THIS_MODULE);
1459 goto out_err_crypto_release;
1461 tcp_ses->min_offload = ctx->min_offload;
1463 * at this point we are the only ones with the pointer
1464 * to the struct since the kernel thread not created yet
1465 * no need to spinlock this update of tcpStatus
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.
1611 * On session close, the IPC is closed and the server must release all tcons of the session.
1612 * No need to send a tree disconnect here.
1614 * Besides, it will make the server to not close durable and resilient files on session close, as
1615 * specified in MS-SMB2 3.3.5.6 Receiving an SMB2 LOGOFF Request.
1618 cifs_free_ipc(struct cifs_ses *ses)
1620 struct cifs_tcon *tcon = ses->tcon_ipc;
1626 ses->tcon_ipc = NULL;
1630 static struct cifs_ses *
1631 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1633 struct cifs_ses *ses;
1635 spin_lock(&cifs_tcp_ses_lock);
1636 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
1637 if (ses->status == CifsExiting)
1639 if (!match_session(ses, ctx))
1642 spin_unlock(&cifs_tcp_ses_lock);
1645 spin_unlock(&cifs_tcp_ses_lock);
1649 void cifs_put_smb_ses(struct cifs_ses *ses)
1651 unsigned int rc, xid;
1652 struct TCP_Server_Info *server = ses->server;
1653 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
1655 spin_lock(&cifs_tcp_ses_lock);
1656 if (ses->status == CifsExiting) {
1657 spin_unlock(&cifs_tcp_ses_lock);
1661 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
1662 cifs_dbg(FYI, "%s: ses ipc: %s\n", __func__, ses->tcon_ipc ? ses->tcon_ipc->treeName : "NONE");
1664 if (--ses->ses_count > 0) {
1665 spin_unlock(&cifs_tcp_ses_lock);
1668 spin_unlock(&cifs_tcp_ses_lock);
1670 /* ses_count can never go negative */
1671 WARN_ON(ses->ses_count < 0);
1673 spin_lock(&GlobalMid_Lock);
1674 if (ses->status == CifsGood)
1675 ses->status = CifsExiting;
1676 spin_unlock(&GlobalMid_Lock);
1680 if (ses->status == CifsExiting && server->ops->logoff) {
1682 rc = server->ops->logoff(xid, ses);
1684 cifs_server_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
1689 spin_lock(&cifs_tcp_ses_lock);
1690 list_del_init(&ses->smb_ses_list);
1691 spin_unlock(&cifs_tcp_ses_lock);
1693 /* close any extra channels */
1694 if (ses->chan_count > 1) {
1697 for (i = 1; i < ses->chan_count; i++)
1698 cifs_put_tcp_session(ses->chans[i].server, 0);
1702 cifs_put_tcp_session(server, 0);
1707 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
1708 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
1710 /* Populate username and pw fields from keyring if possible */
1712 cifs_set_cifscreds(struct smb3_fs_context *ctx, struct cifs_ses *ses)
1716 const char *delim, *payload;
1720 struct TCP_Server_Info *server = ses->server;
1721 struct sockaddr_in *sa;
1722 struct sockaddr_in6 *sa6;
1723 const struct user_key_payload *upayload;
1725 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
1729 /* try to find an address key first */
1730 switch (server->dstaddr.ss_family) {
1732 sa = (struct sockaddr_in *)&server->dstaddr;
1733 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
1736 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
1737 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
1740 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
1741 server->dstaddr.ss_family);
1746 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
1747 key = request_key(&key_type_logon, desc, "");
1749 if (!ses->domainName) {
1750 cifs_dbg(FYI, "domainName is NULL\n");
1755 /* didn't work, try to find a domain key */
1756 sprintf(desc, "cifs:d:%s", ses->domainName);
1757 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
1758 key = request_key(&key_type_logon, desc, "");
1766 down_read(&key->sem);
1767 upayload = user_key_payload_locked(key);
1768 if (IS_ERR_OR_NULL(upayload)) {
1769 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
1773 /* find first : in payload */
1774 payload = upayload->data;
1775 delim = strnchr(payload, upayload->datalen, ':');
1776 cifs_dbg(FYI, "payload=%s\n", payload);
1778 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
1784 len = delim - payload;
1785 if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
1786 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
1792 ctx->username = kstrndup(payload, len, GFP_KERNEL);
1793 if (!ctx->username) {
1794 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
1799 cifs_dbg(FYI, "%s: username=%s\n", __func__, ctx->username);
1801 len = key->datalen - (len + 1);
1802 if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
1803 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
1805 kfree(ctx->username);
1806 ctx->username = NULL;
1811 ctx->password = kstrndup(delim, len, GFP_KERNEL);
1812 if (!ctx->password) {
1813 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
1816 kfree(ctx->username);
1817 ctx->username = NULL;
1822 * If we have a domain key then we must set the domainName in the
1825 if (is_domain && ses->domainName) {
1826 ctx->domainname = kstrdup(ses->domainName, GFP_KERNEL);
1827 if (!ctx->domainname) {
1828 cifs_dbg(FYI, "Unable to allocate %zd bytes for domain\n",
1831 kfree(ctx->username);
1832 ctx->username = NULL;
1833 kfree_sensitive(ctx->password);
1834 ctx->password = NULL;
1844 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
1847 #else /* ! CONFIG_KEYS */
1849 cifs_set_cifscreds(struct smb3_fs_context *ctx __attribute__((unused)),
1850 struct cifs_ses *ses __attribute__((unused)))
1854 #endif /* CONFIG_KEYS */
1857 * cifs_get_smb_ses - get a session matching @ctx data from @server
1859 * This function assumes it is being called from cifs_mount() where we
1860 * already got a server reference (server refcount +1). See
1861 * cifs_get_tcon() for refcount explanations.
1864 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1868 struct cifs_ses *ses;
1869 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
1870 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
1874 ses = cifs_find_smb_ses(server, ctx);
1876 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
1879 mutex_lock(&ses->session_mutex);
1880 rc = cifs_negotiate_protocol(xid, ses);
1882 mutex_unlock(&ses->session_mutex);
1883 /* problem -- put our ses reference */
1884 cifs_put_smb_ses(ses);
1888 if (ses->need_reconnect) {
1889 cifs_dbg(FYI, "Session needs reconnect\n");
1890 rc = cifs_setup_session(xid, ses,
1893 mutex_unlock(&ses->session_mutex);
1894 /* problem -- put our reference */
1895 cifs_put_smb_ses(ses);
1900 mutex_unlock(&ses->session_mutex);
1902 /* existing SMB ses has a server reference already */
1903 cifs_put_tcp_session(server, 0);
1908 cifs_dbg(FYI, "Existing smb sess not found\n");
1909 ses = sesInfoAlloc();
1913 /* new SMB session uses our server ref */
1914 ses->server = server;
1915 if (server->dstaddr.ss_family == AF_INET6)
1916 sprintf(ses->ip_addr, "%pI6", &addr6->sin6_addr);
1918 sprintf(ses->ip_addr, "%pI4", &addr->sin_addr);
1920 if (ctx->username) {
1921 ses->user_name = kstrdup(ctx->username, GFP_KERNEL);
1922 if (!ses->user_name)
1926 /* ctx->password freed at unmount */
1927 if (ctx->password) {
1928 ses->password = kstrdup(ctx->password, GFP_KERNEL);
1932 if (ctx->domainname) {
1933 ses->domainName = kstrdup(ctx->domainname, GFP_KERNEL);
1934 if (!ses->domainName)
1937 if (ctx->domainauto)
1938 ses->domainAuto = ctx->domainauto;
1939 ses->cred_uid = ctx->cred_uid;
1940 ses->linux_uid = ctx->linux_uid;
1942 ses->sectype = ctx->sectype;
1943 ses->sign = ctx->sign;
1944 mutex_lock(&ses->session_mutex);
1946 /* add server as first channel */
1947 ses->chans[0].server = server;
1948 ses->chan_count = 1;
1949 ses->chan_max = ctx->multichannel ? ctx->max_channels:1;
1951 rc = cifs_negotiate_protocol(xid, ses);
1953 rc = cifs_setup_session(xid, ses, ctx->local_nls);
1955 /* each channel uses a different signing key */
1956 memcpy(ses->chans[0].signkey, ses->smb3signingkey,
1957 sizeof(ses->smb3signingkey));
1959 mutex_unlock(&ses->session_mutex);
1963 /* success, put it on the list and add it as first channel */
1964 spin_lock(&cifs_tcp_ses_lock);
1965 list_add(&ses->smb_ses_list, &server->smb_ses_list);
1966 spin_unlock(&cifs_tcp_ses_lock);
1970 cifs_setup_ipc(ses, ctx);
1980 static int match_tcon(struct cifs_tcon *tcon, struct smb3_fs_context *ctx)
1982 if (tcon->tidStatus == CifsExiting)
1984 if (strncmp(tcon->treeName, ctx->UNC, MAX_TREE_SIZE))
1986 if (tcon->seal != ctx->seal)
1988 if (tcon->snapshot_time != ctx->snapshot_time)
1990 if (tcon->handle_timeout != ctx->handle_timeout)
1992 if (tcon->no_lease != ctx->no_lease)
1994 if (tcon->nodelete != ctx->nodelete)
1999 static struct cifs_tcon *
2000 cifs_find_tcon(struct cifs_ses *ses, struct smb3_fs_context *ctx)
2002 struct list_head *tmp;
2003 struct cifs_tcon *tcon;
2005 spin_lock(&cifs_tcp_ses_lock);
2006 list_for_each(tmp, &ses->tcon_list) {
2007 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
2009 if (!match_tcon(tcon, ctx))
2012 spin_unlock(&cifs_tcp_ses_lock);
2015 spin_unlock(&cifs_tcp_ses_lock);
2020 cifs_put_tcon(struct cifs_tcon *tcon)
2023 struct cifs_ses *ses;
2026 * IPC tcon share the lifetime of their session and are
2027 * destroyed in the session put function
2029 if (tcon == NULL || tcon->ipc)
2033 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
2034 spin_lock(&cifs_tcp_ses_lock);
2035 if (--tcon->tc_count > 0) {
2036 spin_unlock(&cifs_tcp_ses_lock);
2040 /* tc_count can never go negative */
2041 WARN_ON(tcon->tc_count < 0);
2043 if (tcon->use_witness) {
2046 rc = cifs_swn_unregister(tcon);
2048 cifs_dbg(VFS, "%s: Failed to unregister for witness notifications: %d\n",
2053 list_del_init(&tcon->tcon_list);
2054 spin_unlock(&cifs_tcp_ses_lock);
2057 if (ses->server->ops->tree_disconnect)
2058 ses->server->ops->tree_disconnect(xid, tcon);
2061 cifs_fscache_release_super_cookie(tcon);
2063 cifs_put_smb_ses(ses);
2067 * cifs_get_tcon - get a tcon matching @ctx data from @ses
2069 * - tcon refcount is the number of mount points using the tcon.
2070 * - ses refcount is the number of tcon using the session.
2072 * 1. This function assumes it is being called from cifs_mount() where
2073 * we already got a session reference (ses refcount +1).
2075 * 2. Since we're in the context of adding a mount point, the end
2076 * result should be either:
2078 * a) a new tcon already allocated with refcount=1 (1 mount point) and
2079 * its session refcount incremented (1 new tcon). This +1 was
2080 * already done in (1).
2082 * b) an existing tcon with refcount+1 (add a mount point to it) and
2083 * identical ses refcount (no new tcon). Because of (1) we need to
2084 * decrement the ses refcount.
2086 static struct cifs_tcon *
2087 cifs_get_tcon(struct cifs_ses *ses, struct smb3_fs_context *ctx)
2090 struct cifs_tcon *tcon;
2092 tcon = cifs_find_tcon(ses, ctx);
2095 * tcon has refcount already incremented but we need to
2096 * decrement extra ses reference gotten by caller (case b)
2098 cifs_dbg(FYI, "Found match on UNC path\n");
2099 cifs_put_smb_ses(ses);
2103 if (!ses->server->ops->tree_connect) {
2108 tcon = tconInfoAlloc();
2114 if (ctx->snapshot_time) {
2115 if (ses->server->vals->protocol_id == 0) {
2117 "Use SMB2 or later for snapshot mount option\n");
2121 tcon->snapshot_time = ctx->snapshot_time;
2124 if (ctx->handle_timeout) {
2125 if (ses->server->vals->protocol_id == 0) {
2127 "Use SMB2.1 or later for handle timeout option\n");
2131 tcon->handle_timeout = ctx->handle_timeout;
2135 if (ctx->password) {
2136 tcon->password = kstrdup(ctx->password, GFP_KERNEL);
2137 if (!tcon->password) {
2144 if (ses->server->vals->protocol_id == 0) {
2146 "SMB3 or later required for encryption\n");
2149 } else if (tcon->ses->server->capabilities &
2150 SMB2_GLOBAL_CAP_ENCRYPTION)
2153 cifs_dbg(VFS, "Encryption is not supported on share\n");
2159 if (ctx->linux_ext) {
2160 if (ses->server->posix_ext_supported) {
2161 tcon->posix_extensions = true;
2162 pr_warn_once("SMB3.11 POSIX Extensions are experimental\n");
2164 cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions\n");
2171 * BB Do we need to wrap session_mutex around this TCon call and Unix
2172 * SetFS as we do on SessSetup and reconnect?
2175 rc = ses->server->ops->tree_connect(xid, ses, ctx->UNC, tcon,
2178 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
2182 tcon->use_persistent = false;
2183 /* check if SMB2 or later, CIFS does not support persistent handles */
2184 if (ctx->persistent) {
2185 if (ses->server->vals->protocol_id == 0) {
2187 "SMB3 or later required for persistent handles\n");
2190 } else if (ses->server->capabilities &
2191 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
2192 tcon->use_persistent = true;
2193 else /* persistent handles requested but not supported */ {
2195 "Persistent handles not supported on share\n");
2199 } else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
2200 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
2201 && (ctx->nopersistent == false)) {
2202 cifs_dbg(FYI, "enabling persistent handles\n");
2203 tcon->use_persistent = true;
2204 } else if (ctx->resilient) {
2205 if (ses->server->vals->protocol_id == 0) {
2207 "SMB2.1 or later required for resilient handles\n");
2211 tcon->use_resilient = true;
2214 tcon->use_witness = false;
2215 if (IS_ENABLED(CONFIG_CIFS_SWN_UPCALL) && ctx->witness) {
2216 if (ses->server->vals->protocol_id >= SMB30_PROT_ID) {
2217 if (tcon->capabilities & SMB2_SHARE_CAP_CLUSTER) {
2219 * Set witness in use flag in first place
2220 * to retry registration in the echo task
2222 tcon->use_witness = true;
2223 /* And try to register immediately */
2224 rc = cifs_swn_register(tcon);
2226 cifs_dbg(VFS, "Failed to register for witness notifications: %d\n", rc);
2230 /* TODO: try to extend for non-cluster uses (eg multichannel) */
2231 cifs_dbg(VFS, "witness requested on mount but no CLUSTER capability on share\n");
2236 cifs_dbg(VFS, "SMB3 or later required for witness option\n");
2242 /* If the user really knows what they are doing they can override */
2243 if (tcon->share_flags & SMB2_SHAREFLAG_NO_CACHING) {
2245 cifs_dbg(VFS, "cache=ro requested on mount but NO_CACHING flag set on share\n");
2246 else if (ctx->cache_rw)
2247 cifs_dbg(VFS, "cache=singleclient requested on mount but NO_CACHING flag set on share\n");
2250 if (ctx->no_lease) {
2251 if (ses->server->vals->protocol_id == 0) {
2253 "SMB2 or later required for nolease option\n");
2257 tcon->no_lease = ctx->no_lease;
2261 * We can have only one retry value for a connection to a share so for
2262 * resources mounted more than once to the same server share the last
2263 * value passed in for the retry flag is used.
2265 tcon->retry = ctx->retry;
2266 tcon->nocase = ctx->nocase;
2267 if (ses->server->capabilities & SMB2_GLOBAL_CAP_DIRECTORY_LEASING)
2268 tcon->nohandlecache = ctx->nohandlecache;
2270 tcon->nohandlecache = true;
2271 tcon->nodelete = ctx->nodelete;
2272 tcon->local_lease = ctx->local_lease;
2273 INIT_LIST_HEAD(&tcon->pending_opens);
2275 spin_lock(&cifs_tcp_ses_lock);
2276 list_add(&tcon->tcon_list, &ses->tcon_list);
2277 spin_unlock(&cifs_tcp_ses_lock);
2279 cifs_fscache_get_super_cookie(tcon);
2289 cifs_put_tlink(struct tcon_link *tlink)
2291 if (!tlink || IS_ERR(tlink))
2294 if (!atomic_dec_and_test(&tlink->tl_count) ||
2295 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
2296 tlink->tl_time = jiffies;
2300 if (!IS_ERR(tlink_tcon(tlink)))
2301 cifs_put_tcon(tlink_tcon(tlink));
2307 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2309 struct cifs_sb_info *old = CIFS_SB(sb);
2310 struct cifs_sb_info *new = mnt_data->cifs_sb;
2311 unsigned int oldflags = old->mnt_cifs_flags & CIFS_MOUNT_MASK;
2312 unsigned int newflags = new->mnt_cifs_flags & CIFS_MOUNT_MASK;
2314 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
2317 if (old->mnt_cifs_serverino_autodisabled)
2318 newflags &= ~CIFS_MOUNT_SERVER_INUM;
2320 if (oldflags != newflags)
2324 * We want to share sb only if we don't specify an r/wsize or
2325 * specified r/wsize is greater than or equal to existing one.
2327 if (new->ctx->wsize && new->ctx->wsize < old->ctx->wsize)
2330 if (new->ctx->rsize && new->ctx->rsize < old->ctx->rsize)
2333 if (!uid_eq(old->ctx->linux_uid, new->ctx->linux_uid) ||
2334 !gid_eq(old->ctx->linux_gid, new->ctx->linux_gid))
2337 if (old->ctx->file_mode != new->ctx->file_mode ||
2338 old->ctx->dir_mode != new->ctx->dir_mode)
2341 if (strcmp(old->local_nls->charset, new->local_nls->charset))
2344 if (old->ctx->acregmax != new->ctx->acregmax)
2346 if (old->ctx->acdirmax != new->ctx->acdirmax)
2353 match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2355 struct cifs_sb_info *old = CIFS_SB(sb);
2356 struct cifs_sb_info *new = mnt_data->cifs_sb;
2357 bool old_set = (old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
2359 bool new_set = (new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
2362 if (old_set && new_set && !strcmp(new->prepath, old->prepath))
2364 else if (!old_set && !new_set)
2371 cifs_match_super(struct super_block *sb, void *data)
2373 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
2374 struct smb3_fs_context *ctx;
2375 struct cifs_sb_info *cifs_sb;
2376 struct TCP_Server_Info *tcp_srv;
2377 struct cifs_ses *ses;
2378 struct cifs_tcon *tcon;
2379 struct tcon_link *tlink;
2382 spin_lock(&cifs_tcp_ses_lock);
2383 cifs_sb = CIFS_SB(sb);
2384 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
2385 if (IS_ERR(tlink)) {
2386 spin_unlock(&cifs_tcp_ses_lock);
2389 tcon = tlink_tcon(tlink);
2391 tcp_srv = ses->server;
2393 ctx = mnt_data->ctx;
2395 if (!match_server(tcp_srv, ctx) ||
2396 !match_session(ses, ctx) ||
2397 !match_tcon(tcon, ctx) ||
2398 !match_prepath(sb, mnt_data)) {
2403 rc = compare_mount_options(sb, mnt_data);
2405 spin_unlock(&cifs_tcp_ses_lock);
2406 cifs_put_tlink(tlink);
2410 #ifdef CONFIG_DEBUG_LOCK_ALLOC
2411 static struct lock_class_key cifs_key[2];
2412 static struct lock_class_key cifs_slock_key[2];
2415 cifs_reclassify_socket4(struct socket *sock)
2417 struct sock *sk = sock->sk;
2418 BUG_ON(!sock_allow_reclassification(sk));
2419 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
2420 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
2424 cifs_reclassify_socket6(struct socket *sock)
2426 struct sock *sk = sock->sk;
2427 BUG_ON(!sock_allow_reclassification(sk));
2428 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
2429 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
2433 cifs_reclassify_socket4(struct socket *sock)
2438 cifs_reclassify_socket6(struct socket *sock)
2443 /* See RFC1001 section 14 on representation of Netbios names */
2444 static void rfc1002mangle(char *target, char *source, unsigned int length)
2448 for (i = 0, j = 0; i < (length); i++) {
2449 /* mask a nibble at a time and encode */
2450 target[j] = 'A' + (0x0F & (source[i] >> 4));
2451 target[j+1] = 'A' + (0x0F & source[i]);
2458 bind_socket(struct TCP_Server_Info *server)
2461 if (server->srcaddr.ss_family != AF_UNSPEC) {
2462 /* Bind to the specified local IP address */
2463 struct socket *socket = server->ssocket;
2464 rc = socket->ops->bind(socket,
2465 (struct sockaddr *) &server->srcaddr,
2466 sizeof(server->srcaddr));
2468 struct sockaddr_in *saddr4;
2469 struct sockaddr_in6 *saddr6;
2470 saddr4 = (struct sockaddr_in *)&server->srcaddr;
2471 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
2472 if (saddr6->sin6_family == AF_INET6)
2473 cifs_server_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
2474 &saddr6->sin6_addr, rc);
2476 cifs_server_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
2477 &saddr4->sin_addr.s_addr, rc);
2484 ip_rfc1001_connect(struct TCP_Server_Info *server)
2488 * some servers require RFC1001 sessinit before sending
2489 * negprot - BB check reconnection in case where second
2490 * sessinit is sent but no second negprot
2492 struct rfc1002_session_packet *ses_init_buf;
2493 struct smb_hdr *smb_buf;
2494 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
2497 ses_init_buf->trailer.session_req.called_len = 32;
2499 if (server->server_RFC1001_name[0] != 0)
2500 rfc1002mangle(ses_init_buf->trailer.
2501 session_req.called_name,
2502 server->server_RFC1001_name,
2503 RFC1001_NAME_LEN_WITH_NULL);
2505 rfc1002mangle(ses_init_buf->trailer.
2506 session_req.called_name,
2507 DEFAULT_CIFS_CALLED_NAME,
2508 RFC1001_NAME_LEN_WITH_NULL);
2510 ses_init_buf->trailer.session_req.calling_len = 32;
2513 * calling name ends in null (byte 16) from old smb
2516 if (server->workstation_RFC1001_name[0] != 0)
2517 rfc1002mangle(ses_init_buf->trailer.
2518 session_req.calling_name,
2519 server->workstation_RFC1001_name,
2520 RFC1001_NAME_LEN_WITH_NULL);
2522 rfc1002mangle(ses_init_buf->trailer.
2523 session_req.calling_name,
2525 RFC1001_NAME_LEN_WITH_NULL);
2527 ses_init_buf->trailer.session_req.scope1 = 0;
2528 ses_init_buf->trailer.session_req.scope2 = 0;
2529 smb_buf = (struct smb_hdr *)ses_init_buf;
2531 /* sizeof RFC1002_SESSION_REQUEST with no scope */
2532 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
2533 rc = smb_send(server, smb_buf, 0x44);
2534 kfree(ses_init_buf);
2536 * RFC1001 layer in at least one server
2537 * requires very short break before negprot
2538 * presumably because not expecting negprot
2539 * to follow so fast. This is a simple
2540 * solution that works without
2541 * complicating the code and causes no
2542 * significant slowing down on mount
2545 usleep_range(1000, 2000);
2548 * else the negprot may still work without this
2549 * even though malloc failed
2556 generic_ip_connect(struct TCP_Server_Info *server)
2561 struct socket *socket = server->ssocket;
2562 struct sockaddr *saddr;
2564 saddr = (struct sockaddr *) &server->dstaddr;
2566 if (server->dstaddr.ss_family == AF_INET6) {
2567 struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)&server->dstaddr;
2569 sport = ipv6->sin6_port;
2570 slen = sizeof(struct sockaddr_in6);
2572 cifs_dbg(FYI, "%s: connecting to [%pI6]:%d\n", __func__, &ipv6->sin6_addr,
2575 struct sockaddr_in *ipv4 = (struct sockaddr_in *)&server->dstaddr;
2577 sport = ipv4->sin_port;
2578 slen = sizeof(struct sockaddr_in);
2580 cifs_dbg(FYI, "%s: connecting to %pI4:%d\n", __func__, &ipv4->sin_addr,
2584 if (socket == NULL) {
2585 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
2586 IPPROTO_TCP, &socket, 1);
2588 cifs_server_dbg(VFS, "Error %d creating socket\n", rc);
2589 server->ssocket = NULL;
2593 /* BB other socket options to set KEEPALIVE, NODELAY? */
2594 cifs_dbg(FYI, "Socket created\n");
2595 server->ssocket = socket;
2596 socket->sk->sk_allocation = GFP_NOFS;
2597 if (sfamily == AF_INET6)
2598 cifs_reclassify_socket6(socket);
2600 cifs_reclassify_socket4(socket);
2603 rc = bind_socket(server);
2608 * Eventually check for other socket options to change from
2609 * the default. sock_setsockopt not used because it expects
2612 socket->sk->sk_rcvtimeo = 7 * HZ;
2613 socket->sk->sk_sndtimeo = 5 * HZ;
2615 /* make the bufsizes depend on wsize/rsize and max requests */
2616 if (server->noautotune) {
2617 if (socket->sk->sk_sndbuf < (200 * 1024))
2618 socket->sk->sk_sndbuf = 200 * 1024;
2619 if (socket->sk->sk_rcvbuf < (140 * 1024))
2620 socket->sk->sk_rcvbuf = 140 * 1024;
2623 if (server->tcp_nodelay)
2624 tcp_sock_set_nodelay(socket->sk);
2626 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
2627 socket->sk->sk_sndbuf,
2628 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
2630 rc = socket->ops->connect(socket, saddr, slen,
2631 server->noblockcnt ? O_NONBLOCK : 0);
2633 * When mounting SMB root file systems, we do not want to block in
2634 * connect. Otherwise bail out and then let cifs_reconnect() perform
2635 * reconnect failover - if possible.
2637 if (server->noblockcnt && rc == -EINPROGRESS)
2640 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
2641 sock_release(socket);
2642 server->ssocket = NULL;
2646 if (sport == htons(RFC1001_PORT))
2647 rc = ip_rfc1001_connect(server);
2653 ip_connect(struct TCP_Server_Info *server)
2656 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2657 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2659 if (server->dstaddr.ss_family == AF_INET6)
2660 sport = &addr6->sin6_port;
2662 sport = &addr->sin_port;
2667 /* try with 445 port at first */
2668 *sport = htons(CIFS_PORT);
2670 rc = generic_ip_connect(server);
2674 /* if it failed, try with 139 port */
2675 *sport = htons(RFC1001_PORT);
2678 return generic_ip_connect(server);
2681 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
2682 struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
2685 * If we are reconnecting then should we check to see if
2686 * any requested capabilities changed locally e.g. via
2687 * remount but we can not do much about it here
2688 * if they have (even if we could detect it by the following)
2689 * Perhaps we could add a backpointer to array of sb from tcon
2690 * or if we change to make all sb to same share the same
2691 * sb as NFS - then we only have one backpointer to sb.
2692 * What if we wanted to mount the server share twice once with
2693 * and once without posixacls or posix paths?
2695 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
2697 if (ctx && ctx->no_linux_ext) {
2698 tcon->fsUnixInfo.Capability = 0;
2699 tcon->unix_ext = 0; /* Unix Extensions disabled */
2700 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
2703 tcon->unix_ext = 1; /* Unix Extensions supported */
2705 if (!tcon->unix_ext) {
2706 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
2710 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
2711 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
2712 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
2714 * check for reconnect case in which we do not
2715 * want to change the mount behavior if we can avoid it
2719 * turn off POSIX ACL and PATHNAMES if not set
2720 * originally at mount time
2722 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
2723 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
2724 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
2725 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
2726 cifs_dbg(VFS, "POSIXPATH support change\n");
2727 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
2728 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
2729 cifs_dbg(VFS, "possible reconnect error\n");
2730 cifs_dbg(VFS, "server disabled POSIX path support\n");
2734 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
2735 cifs_dbg(VFS, "per-share encryption not supported yet\n");
2737 cap &= CIFS_UNIX_CAP_MASK;
2738 if (ctx && ctx->no_psx_acl)
2739 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
2740 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
2741 cifs_dbg(FYI, "negotiated posix acl support\n");
2743 cifs_sb->mnt_cifs_flags |=
2744 CIFS_MOUNT_POSIXACL;
2747 if (ctx && ctx->posix_paths == 0)
2748 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
2749 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
2750 cifs_dbg(FYI, "negotiate posix pathnames\n");
2752 cifs_sb->mnt_cifs_flags |=
2753 CIFS_MOUNT_POSIX_PATHS;
2756 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
2757 #ifdef CONFIG_CIFS_DEBUG2
2758 if (cap & CIFS_UNIX_FCNTL_CAP)
2759 cifs_dbg(FYI, "FCNTL cap\n");
2760 if (cap & CIFS_UNIX_EXTATTR_CAP)
2761 cifs_dbg(FYI, "EXTATTR cap\n");
2762 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
2763 cifs_dbg(FYI, "POSIX path cap\n");
2764 if (cap & CIFS_UNIX_XATTR_CAP)
2765 cifs_dbg(FYI, "XATTR cap\n");
2766 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
2767 cifs_dbg(FYI, "POSIX ACL cap\n");
2768 if (cap & CIFS_UNIX_LARGE_READ_CAP)
2769 cifs_dbg(FYI, "very large read cap\n");
2770 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
2771 cifs_dbg(FYI, "very large write cap\n");
2772 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
2773 cifs_dbg(FYI, "transport encryption cap\n");
2774 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
2775 cifs_dbg(FYI, "mandatory transport encryption cap\n");
2776 #endif /* CIFS_DEBUG2 */
2777 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
2779 cifs_dbg(FYI, "resetting capabilities failed\n");
2781 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");
2787 int cifs_setup_cifs_sb(struct cifs_sb_info *cifs_sb)
2789 struct smb3_fs_context *ctx = cifs_sb->ctx;
2791 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
2793 spin_lock_init(&cifs_sb->tlink_tree_lock);
2794 cifs_sb->tlink_tree = RB_ROOT;
2796 cifs_dbg(FYI, "file mode: %04ho dir mode: %04ho\n",
2797 ctx->file_mode, ctx->dir_mode);
2799 /* this is needed for ASCII cp to Unicode converts */
2800 if (ctx->iocharset == NULL) {
2801 /* load_nls_default cannot return null */
2802 cifs_sb->local_nls = load_nls_default();
2804 cifs_sb->local_nls = load_nls(ctx->iocharset);
2805 if (cifs_sb->local_nls == NULL) {
2806 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
2811 ctx->local_nls = cifs_sb->local_nls;
2813 smb3_update_mnt_flags(cifs_sb);
2816 cifs_dbg(FYI, "mounting share using direct i/o\n");
2817 if (ctx->cache_ro) {
2818 cifs_dbg(VFS, "mounting share with read only caching. Ensure that the share will not be modified while in use.\n");
2819 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RO_CACHE;
2820 } else if (ctx->cache_rw) {
2821 cifs_dbg(VFS, "mounting share in single client RW caching mode. Ensure that no other systems will be accessing the share.\n");
2822 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_RO_CACHE |
2823 CIFS_MOUNT_RW_CACHE);
2826 if ((ctx->cifs_acl) && (ctx->dynperm))
2827 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
2830 cifs_sb->prepath = kstrdup(ctx->prepath, GFP_KERNEL);
2831 if (cifs_sb->prepath == NULL)
2833 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
2839 /* Release all succeed connections */
2840 static inline void mount_put_conns(struct cifs_sb_info *cifs_sb,
2842 struct TCP_Server_Info *server,
2843 struct cifs_ses *ses, struct cifs_tcon *tcon)
2848 cifs_put_tcon(tcon);
2850 cifs_put_smb_ses(ses);
2852 cifs_put_tcp_session(server, 0);
2853 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
2857 /* Get connections for tcp, ses and tcon */
2858 static int mount_get_conns(struct smb3_fs_context *ctx, struct cifs_sb_info *cifs_sb,
2860 struct TCP_Server_Info **nserver,
2861 struct cifs_ses **nses, struct cifs_tcon **ntcon)
2864 struct TCP_Server_Info *server;
2865 struct cifs_ses *ses;
2866 struct cifs_tcon *tcon;
2874 /* get a reference to a tcp session */
2875 server = cifs_get_tcp_session(ctx);
2876 if (IS_ERR(server)) {
2877 rc = PTR_ERR(server);
2883 /* get a reference to a SMB session */
2884 ses = cifs_get_smb_ses(server, ctx);
2892 if ((ctx->persistent == true) && (!(ses->server->capabilities &
2893 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES))) {
2894 cifs_server_dbg(VFS, "persistent handles not supported by server\n");
2898 /* search for existing tcon to this server share */
2899 tcon = cifs_get_tcon(ses, ctx);
2907 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
2908 if (tcon->posix_extensions)
2909 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
2911 /* tell server which Unix caps we support */
2912 if (cap_unix(tcon->ses)) {
2914 * reset of caps checks mount to see if unix extensions disabled
2915 * for just this mount.
2917 reset_cifs_unix_caps(*xid, tcon, cifs_sb, ctx);
2918 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
2919 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
2920 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP))
2923 tcon->unix_ext = 0; /* server does not support them */
2925 /* do not care if a following call succeed - informational */
2926 if (!tcon->pipe && server->ops->qfs_tcon) {
2927 server->ops->qfs_tcon(*xid, tcon, cifs_sb);
2928 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE) {
2929 if (tcon->fsDevInfo.DeviceCharacteristics &
2930 cpu_to_le32(FILE_READ_ONLY_DEVICE))
2931 cifs_dbg(VFS, "mounted to read only share\n");
2932 else if ((cifs_sb->mnt_cifs_flags &
2933 CIFS_MOUNT_RW_CACHE) == 0)
2934 cifs_dbg(VFS, "read only mount of RW share\n");
2935 /* no need to log a RW mount of a typical RW share */
2940 * Clamp the rsize/wsize mount arguments if they are too big for the server
2941 * and set the rsize/wsize to the negotiated values if not passed in by
2944 if ((cifs_sb->ctx->wsize == 0) ||
2945 (cifs_sb->ctx->wsize > server->ops->negotiate_wsize(tcon, ctx)))
2946 cifs_sb->ctx->wsize = server->ops->negotiate_wsize(tcon, ctx);
2947 if ((cifs_sb->ctx->rsize == 0) ||
2948 (cifs_sb->ctx->rsize > server->ops->negotiate_rsize(tcon, ctx)))
2949 cifs_sb->ctx->rsize = server->ops->negotiate_rsize(tcon, ctx);
2954 static int mount_setup_tlink(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
2955 struct cifs_tcon *tcon)
2957 struct tcon_link *tlink;
2959 /* hang the tcon off of the superblock */
2960 tlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
2964 tlink->tl_uid = ses->linux_uid;
2965 tlink->tl_tcon = tcon;
2966 tlink->tl_time = jiffies;
2967 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
2968 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
2970 cifs_sb->master_tlink = tlink;
2971 spin_lock(&cifs_sb->tlink_tree_lock);
2972 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
2973 spin_unlock(&cifs_sb->tlink_tree_lock);
2975 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
2980 #ifdef CONFIG_CIFS_DFS_UPCALL
2981 static int mount_get_dfs_conns(struct smb3_fs_context *ctx, struct cifs_sb_info *cifs_sb,
2982 unsigned int *xid, struct TCP_Server_Info **nserver,
2983 struct cifs_ses **nses, struct cifs_tcon **ntcon)
2987 ctx->nosharesock = true;
2988 rc = mount_get_conns(ctx, cifs_sb, xid, nserver, nses, ntcon);
2990 cifs_dbg(FYI, "%s: marking tcp session as a dfs connection\n", __func__);
2991 spin_lock(&cifs_tcp_ses_lock);
2992 (*nserver)->is_dfs_conn = true;
2993 spin_unlock(&cifs_tcp_ses_lock);
2999 * cifs_build_path_to_root returns full path to root when we do not have an
3000 * existing connection (tcon)
3003 build_unc_path_to_root(const struct smb3_fs_context *ctx,
3004 const struct cifs_sb_info *cifs_sb, bool useppath)
3006 char *full_path, *pos;
3007 unsigned int pplen = useppath && ctx->prepath ?
3008 strlen(ctx->prepath) + 1 : 0;
3009 unsigned int unc_len = strnlen(ctx->UNC, MAX_TREE_SIZE + 1);
3011 if (unc_len > MAX_TREE_SIZE)
3012 return ERR_PTR(-EINVAL);
3014 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
3015 if (full_path == NULL)
3016 return ERR_PTR(-ENOMEM);
3018 memcpy(full_path, ctx->UNC, unc_len);
3019 pos = full_path + unc_len;
3022 *pos = CIFS_DIR_SEP(cifs_sb);
3023 memcpy(pos + 1, ctx->prepath, pplen);
3027 *pos = '\0'; /* add trailing null */
3028 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
3029 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
3034 * expand_dfs_referral - Perform a dfs referral query and update the cifs_sb
3036 * If a referral is found, cifs_sb->ctx->mount_options will be (re-)allocated
3037 * to a string containing updated options for the submount. Otherwise it
3038 * will be left untouched.
3040 * Returns the rc from get_dfs_path to the caller, which can be used to
3041 * determine whether there were referrals.
3044 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
3045 struct smb3_fs_context *ctx, struct cifs_sb_info *cifs_sb,
3049 struct dfs_info3_param referral = {0};
3050 char *full_path = NULL, *mdata = NULL;
3052 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
3055 full_path = build_unc_path_to_root(ctx, cifs_sb, true);
3056 if (IS_ERR(full_path))
3057 return PTR_ERR(full_path);
3059 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
3060 ref_path, &referral, NULL);
3062 char *fake_devname = NULL;
3064 mdata = cifs_compose_mount_options(cifs_sb->ctx->mount_options,
3065 full_path + 1, &referral,
3067 free_dfs_info_param(&referral);
3069 if (IS_ERR(mdata)) {
3070 rc = PTR_ERR(mdata);
3074 * We can not clear out the whole structure since we
3075 * no longer have an explicit function to parse
3076 * a mount-string. Instead we need to clear out the
3077 * individual fields that are no longer valid.
3079 kfree(ctx->prepath);
3080 ctx->prepath = NULL;
3081 rc = cifs_setup_volume_info(ctx, mdata, fake_devname);
3083 kfree(fake_devname);
3084 kfree(cifs_sb->ctx->mount_options);
3085 cifs_sb->ctx->mount_options = mdata;
3091 static int get_next_dfs_tgt(struct dfs_cache_tgt_list *tgt_list,
3092 struct dfs_cache_tgt_iterator **tgt_it)
3095 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
3097 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
3098 return !*tgt_it ? -EHOSTDOWN : 0;
3101 static int update_vol_info(const struct dfs_cache_tgt_iterator *tgt_it,
3102 struct smb3_fs_context *fake_ctx, struct smb3_fs_context *ctx)
3104 const char *tgt = dfs_cache_get_tgt_name(tgt_it);
3105 int len = strlen(tgt) + 2;
3108 new_unc = kmalloc(len, GFP_KERNEL);
3111 scnprintf(new_unc, len, "\\%s", tgt);
3116 if (fake_ctx->prepath) {
3117 kfree(ctx->prepath);
3118 ctx->prepath = fake_ctx->prepath;
3119 fake_ctx->prepath = NULL;
3121 memcpy(&ctx->dstaddr, &fake_ctx->dstaddr, sizeof(ctx->dstaddr));
3126 static int do_dfs_failover(const char *path, const char *full_path, struct cifs_sb_info *cifs_sb,
3127 struct smb3_fs_context *ctx, struct cifs_ses *root_ses,
3128 unsigned int *xid, struct TCP_Server_Info **server,
3129 struct cifs_ses **ses, struct cifs_tcon **tcon)
3133 struct dfs_cache_tgt_list tgt_list = DFS_CACHE_TGT_LIST_INIT(tgt_list);
3134 struct dfs_cache_tgt_iterator *tgt_it = NULL;
3135 struct smb3_fs_context tmp_ctx = {NULL};
3137 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
3140 npath = dfs_cache_canonical_path(path, cifs_sb->local_nls, cifs_remap(cifs_sb));
3142 return PTR_ERR(npath);
3144 cifs_dbg(FYI, "%s: path=%s full_path=%s\n", __func__, npath, full_path);
3146 rc = dfs_cache_noreq_find(npath, NULL, &tgt_list);
3150 * We use a 'tmp_ctx' here because we need pass it down to the mount_{get,put} functions to
3151 * test connection against new DFS targets.
3153 rc = smb3_fs_context_dup(&tmp_ctx, ctx);
3158 struct dfs_info3_param ref = {0};
3159 char *fake_devname = NULL, *mdata = NULL;
3161 /* Get next DFS target server - if any */
3162 rc = get_next_dfs_tgt(&tgt_list, &tgt_it);
3166 rc = dfs_cache_get_tgt_referral(npath, tgt_it, &ref);
3170 cifs_dbg(FYI, "%s: old ctx: UNC=%s prepath=%s\n", __func__, tmp_ctx.UNC,
3173 mdata = cifs_compose_mount_options(cifs_sb->ctx->mount_options, full_path + 1, &ref,
3175 free_dfs_info_param(&ref);
3177 if (IS_ERR(mdata)) {
3178 rc = PTR_ERR(mdata);
3181 rc = cifs_setup_volume_info(&tmp_ctx, mdata, fake_devname);
3184 kfree(fake_devname);
3189 cifs_dbg(FYI, "%s: new ctx: UNC=%s prepath=%s\n", __func__, tmp_ctx.UNC,
3192 mount_put_conns(cifs_sb, *xid, *server, *ses, *tcon);
3193 rc = mount_get_dfs_conns(&tmp_ctx, cifs_sb, xid, server, ses, tcon);
3194 if (!rc || (*server && *ses)) {
3196 * We were able to connect to new target server. Update current context with
3197 * new target server.
3199 rc = update_vol_info(tgt_it, &tmp_ctx, ctx);
3204 cifs_dbg(FYI, "%s: final ctx: UNC=%s prepath=%s\n", __func__, tmp_ctx.UNC,
3207 * Update DFS target hint in DFS referral cache with the target server we
3208 * successfully reconnected to.
3210 rc = dfs_cache_update_tgthint(*xid, root_ses ? root_ses : *ses, cifs_sb->local_nls,
3211 cifs_remap(cifs_sb), path, tgt_it);
3216 smb3_cleanup_fs_context_contents(&tmp_ctx);
3217 dfs_cache_free_tgts(&tgt_list);
3222 /* TODO: all callers to this are broken. We are not parsing mount_options here
3223 * we should pass a clone of the original context?
3226 cifs_setup_volume_info(struct smb3_fs_context *ctx, const char *mntopts, const char *devname)
3231 cifs_dbg(FYI, "%s: devname=%s\n", __func__, devname);
3232 rc = smb3_parse_devname(devname, ctx);
3234 cifs_dbg(VFS, "%s: failed to parse %s: %d\n", __func__, devname, rc);
3242 rc = smb3_parse_opt(mntopts, "ip", &ip);
3244 cifs_dbg(VFS, "%s: failed to parse ip options: %d\n", __func__, rc);
3248 rc = cifs_convert_address((struct sockaddr *)&ctx->dstaddr, ip, strlen(ip));
3251 cifs_dbg(VFS, "%s: failed to convert ip address\n", __func__);
3256 if (ctx->nullauth) {
3257 cifs_dbg(FYI, "Anonymous login\n");
3258 kfree(ctx->username);
3259 ctx->username = NULL;
3260 } else if (ctx->username) {
3261 /* BB fixme parse for domain name here */
3262 cifs_dbg(FYI, "Username: %s\n", ctx->username);
3264 cifs_dbg(VFS, "No username specified\n");
3265 /* In userspace mount helper we can get user name from alternate
3266 locations such as env variables and files on disk */
3274 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
3276 struct cifs_tcon *tcon,
3277 struct cifs_sb_info *cifs_sb,
3284 int skip = added_treename ? 1 : 0;
3286 sep = CIFS_DIR_SEP(cifs_sb);
3289 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
3291 /* skip separators */
3296 /* next separator */
3297 while (*s && *s != sep)
3300 * if the treename is added, we then have to skip the first
3301 * part within the separators
3308 * temporarily null-terminate the path at the end of
3309 * the current component
3313 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3321 * Check if path is remote (e.g. a DFS share). Return -EREMOTE if it is,
3324 static int is_path_remote(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx,
3325 const unsigned int xid,
3326 struct TCP_Server_Info *server,
3327 struct cifs_tcon *tcon)
3332 if (!server->ops->is_path_accessible)
3336 * cifs_build_path_to_root works only when we have a valid tcon
3338 full_path = cifs_build_path_to_root(ctx, cifs_sb, tcon,
3339 tcon->Flags & SMB_SHARE_IS_IN_DFS);
3340 if (full_path == NULL)
3343 cifs_dbg(FYI, "%s: full_path: %s\n", __func__, full_path);
3345 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3347 if (rc != 0 && rc != -EREMOTE) {
3352 if (rc != -EREMOTE) {
3353 rc = cifs_are_all_path_components_accessible(server, xid, tcon,
3354 cifs_sb, full_path, tcon->Flags & SMB_SHARE_IS_IN_DFS);
3356 cifs_server_dbg(VFS, "cannot query dirs between root and final path, enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
3357 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
3366 #ifdef CONFIG_CIFS_DFS_UPCALL
3367 static void set_root_ses(struct cifs_sb_info *cifs_sb, const uuid_t *mount_id, struct cifs_ses *ses,
3368 struct cifs_ses **root_ses)
3371 spin_lock(&cifs_tcp_ses_lock);
3373 spin_unlock(&cifs_tcp_ses_lock);
3374 dfs_cache_add_refsrv_session(mount_id, ses);
3379 /* Set up next dfs prefix path in @dfs_path */
3380 static int next_dfs_prepath(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx,
3381 const unsigned int xid, struct TCP_Server_Info *server,
3382 struct cifs_tcon *tcon, char **dfs_path)
3385 int added_treename = is_tcon_dfs(tcon);
3388 path = cifs_build_path_to_root(ctx, cifs_sb, tcon, added_treename);
3392 rc = is_path_remote(cifs_sb, ctx, xid, server, tcon);
3393 if (rc == -EREMOTE) {
3394 struct smb3_fs_context v = {NULL};
3395 /* if @path contains a tree name, skip it in the prefix path */
3396 if (added_treename) {
3397 rc = smb3_parse_devname(path, &v);
3400 npath = build_unc_path_to_root(&v, cifs_sb, true);
3401 smb3_cleanup_fs_context_contents(&v);
3404 v.prepath = path + 1;
3405 npath = build_unc_path_to_root(&v, cifs_sb, true);
3408 if (IS_ERR(npath)) {
3409 rc = PTR_ERR(npath);
3423 /* Check if resolved targets can handle any DFS referrals */
3424 static int is_referral_server(const char *ref_path, struct cifs_sb_info *cifs_sb,
3425 struct cifs_tcon *tcon, bool *ref_server)
3428 struct dfs_info3_param ref = {0};
3430 cifs_dbg(FYI, "%s: ref_path=%s\n", __func__, ref_path);
3432 if (is_tcon_dfs(tcon)) {
3437 npath = dfs_cache_canonical_path(ref_path, cifs_sb->local_nls, cifs_remap(cifs_sb));
3439 return PTR_ERR(npath);
3441 rc = dfs_cache_noreq_find(npath, &ref, NULL);
3444 cifs_dbg(VFS, "%s: dfs_cache_noreq_find: failed (rc=%d)\n", __func__, rc);
3447 cifs_dbg(FYI, "%s: ref.flags=0x%x\n", __func__, ref.flags);
3449 * Check if all targets are capable of handling DFS referrals as per
3450 * MS-DFSC 2.2.4 RESP_GET_DFS_REFERRAL.
3452 *ref_server = !!(ref.flags & DFSREF_REFERRAL_SERVER);
3453 free_dfs_info_param(&ref);
3458 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
3462 struct TCP_Server_Info *server = NULL;
3463 struct cifs_ses *ses = NULL, *root_ses = NULL;
3464 struct cifs_tcon *tcon = NULL;
3466 uuid_t mount_id = {0};
3467 char *ref_path = NULL, *full_path = NULL;
3468 char *oldmnt = NULL;
3469 bool ref_server = false;
3471 rc = mount_get_conns(ctx, cifs_sb, &xid, &server, &ses, &tcon);
3473 * If called with 'nodfs' mount option, then skip DFS resolving. Otherwise unconditionally
3474 * try to get an DFS referral (even cached) to determine whether it is an DFS mount.
3476 * Skip prefix path to provide support for DFS referrals from w2k8 servers which don't seem
3477 * to respond with PATH_NOT_COVERED to requests that include the prefix.
3479 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS) ||
3480 dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb), ctx->UNC + 1, NULL,
3484 /* Check if it is fully accessible and then mount it */
3485 rc = is_path_remote(cifs_sb, ctx, xid, server, tcon);
3492 mount_put_conns(cifs_sb, xid, server, ses, tcon);
3494 * Ignore error check here because we may failover to other targets from cached a
3497 (void)mount_get_dfs_conns(ctx, cifs_sb, &xid, &server, &ses, &tcon);
3499 /* Get path of DFS root */
3500 ref_path = build_unc_path_to_root(ctx, cifs_sb, false);
3501 if (IS_ERR(ref_path)) {
3502 rc = PTR_ERR(ref_path);
3507 uuid_gen(&mount_id);
3508 set_root_ses(cifs_sb, &mount_id, ses, &root_ses);
3510 /* Save full path of last DFS path we used to resolve final target server */
3512 full_path = build_unc_path_to_root(ctx, cifs_sb, !!count);
3513 if (IS_ERR(full_path)) {
3514 rc = PTR_ERR(full_path);
3518 /* Chase referral */
3519 oldmnt = cifs_sb->ctx->mount_options;
3520 rc = expand_dfs_referral(xid, root_ses, ctx, cifs_sb, ref_path + 1);
3523 /* Connect to new DFS target only if we were redirected */
3524 if (oldmnt != cifs_sb->ctx->mount_options) {
3525 mount_put_conns(cifs_sb, xid, server, ses, tcon);
3526 rc = mount_get_dfs_conns(ctx, cifs_sb, &xid, &server, &ses, &tcon);
3528 if (rc && !server && !ses) {
3529 /* Failed to connect. Try to connect to other targets in the referral. */
3530 rc = do_dfs_failover(ref_path + 1, full_path, cifs_sb, ctx, root_ses, &xid,
3531 &server, &ses, &tcon);
3533 if (rc == -EACCES || rc == -EOPNOTSUPP || !server || !ses)
3538 /* Make sure that requests go through new root servers */
3539 rc = is_referral_server(ref_path + 1, cifs_sb, tcon, &ref_server);
3543 set_root_ses(cifs_sb, &mount_id, ses, &root_ses);
3545 /* Get next dfs path and then continue chasing them if -EREMOTE */
3546 rc = next_dfs_prepath(cifs_sb, ctx, xid, server, tcon, &ref_path);
3547 /* Prevent recursion on broken link referrals */
3548 if (rc == -EREMOTE && ++count > MAX_NESTED_LINKS)
3550 } while (rc == -EREMOTE);
3552 if (rc || !tcon || !ses)
3557 * Store DFS full path in both superblock and tree connect structures.
3559 * For DFS root mounts, the prefix path (cifs_sb->prepath) is preserved during reconnect so
3560 * only the root path is set in cifs_sb->origin_fullpath and tcon->dfs_path. And for DFS
3561 * links, the prefix path is included in both and may be changed during reconnect. See
3562 * cifs_tree_connect().
3564 ref_path = dfs_cache_canonical_path(full_path, cifs_sb->local_nls, cifs_remap(cifs_sb));
3568 if (IS_ERR(ref_path)) {
3569 rc = PTR_ERR(ref_path);
3573 cifs_sb->origin_fullpath = ref_path;
3575 ref_path = kstrdup(cifs_sb->origin_fullpath, GFP_KERNEL);
3580 spin_lock(&cifs_tcp_ses_lock);
3581 tcon->dfs_path = ref_path;
3583 spin_unlock(&cifs_tcp_ses_lock);
3586 * After reconnecting to a different server, unique ids won't
3587 * match anymore, so we disable serverino. This prevents
3588 * dentry revalidation to think the dentry are stale (ESTALE).
3590 cifs_autodisable_serverino(cifs_sb);
3592 * Force the use of prefix path to support failover on DFS paths that
3593 * resolve to targets that have different prefix paths.
3595 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
3596 kfree(cifs_sb->prepath);
3597 cifs_sb->prepath = ctx->prepath;
3598 ctx->prepath = NULL;
3599 uuid_copy(&cifs_sb->dfs_mount_id, &mount_id);
3603 cifs_try_adding_channels(cifs_sb, ses);
3604 return mount_setup_tlink(cifs_sb, ses, tcon);
3609 kfree(cifs_sb->origin_fullpath);
3610 dfs_cache_put_refsrv_sessions(&mount_id);
3611 mount_put_conns(cifs_sb, xid, server, ses, tcon);
3615 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
3619 struct cifs_ses *ses;
3620 struct cifs_tcon *tcon;
3621 struct TCP_Server_Info *server;
3623 rc = mount_get_conns(ctx, cifs_sb, &xid, &server, &ses, &tcon);
3628 rc = is_path_remote(cifs_sb, ctx, xid, server, tcon);
3637 return mount_setup_tlink(cifs_sb, ses, tcon);
3640 mount_put_conns(cifs_sb, xid, server, ses, tcon);
3646 * Issue a TREE_CONNECT request.
3649 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
3650 const char *tree, struct cifs_tcon *tcon,
3651 const struct nls_table *nls_codepage)
3653 struct smb_hdr *smb_buffer;
3654 struct smb_hdr *smb_buffer_response;
3657 unsigned char *bcc_ptr;
3660 __u16 bytes_left, count;
3665 smb_buffer = cifs_buf_get();
3666 if (smb_buffer == NULL)
3669 smb_buffer_response = smb_buffer;
3671 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
3672 NULL /*no tid */ , 4 /*wct */ );
3674 smb_buffer->Mid = get_next_mid(ses->server);
3675 smb_buffer->Uid = ses->Suid;
3676 pSMB = (TCONX_REQ *) smb_buffer;
3677 pSMBr = (TCONX_RSP *) smb_buffer_response;
3679 pSMB->AndXCommand = 0xFF;
3680 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
3681 bcc_ptr = &pSMB->Password[0];
3682 if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
3683 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
3684 *bcc_ptr = 0; /* password is null byte */
3685 bcc_ptr++; /* skip password */
3686 /* already aligned so no need to do it below */
3688 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
3689 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3690 specified as required (when that support is added to
3691 the vfs in the future) as only NTLM or the much
3692 weaker LANMAN (which we do not send by default) is accepted
3693 by Samba (not sure whether other servers allow
3694 NTLMv2 password here) */
3695 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3696 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
3697 (ses->sectype == LANMAN))
3698 calc_lanman_hash(tcon->password, ses->server->cryptkey,
3699 ses->server->sec_mode &
3700 SECMODE_PW_ENCRYPT ? true : false,
3703 #endif /* CIFS_WEAK_PW_HASH */
3704 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
3705 bcc_ptr, nls_codepage);
3707 cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
3709 cifs_buf_release(smb_buffer);
3713 bcc_ptr += CIFS_AUTH_RESP_SIZE;
3714 if (ses->capabilities & CAP_UNICODE) {
3715 /* must align unicode strings */
3716 *bcc_ptr = 0; /* null byte password */
3721 if (ses->server->sign)
3722 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
3724 if (ses->capabilities & CAP_STATUS32) {
3725 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
3727 if (ses->capabilities & CAP_DFS) {
3728 smb_buffer->Flags2 |= SMBFLG2_DFS;
3730 if (ses->capabilities & CAP_UNICODE) {
3731 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
3733 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
3734 6 /* max utf8 char length in bytes */ *
3735 (/* server len*/ + 256 /* share len */), nls_codepage);
3736 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
3737 bcc_ptr += 2; /* skip trailing null */
3738 } else { /* ASCII */
3739 strcpy(bcc_ptr, tree);
3740 bcc_ptr += strlen(tree) + 1;
3742 strcpy(bcc_ptr, "?????");
3743 bcc_ptr += strlen("?????");
3745 count = bcc_ptr - &pSMB->Password[0];
3746 be32_add_cpu(&pSMB->hdr.smb_buf_length, count);
3747 pSMB->ByteCount = cpu_to_le16(count);
3749 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
3752 /* above now done in SendReceive */
3756 tcon->tidStatus = CifsGood;
3757 tcon->need_reconnect = false;
3758 tcon->tid = smb_buffer_response->Tid;
3759 bcc_ptr = pByteArea(smb_buffer_response);
3760 bytes_left = get_bcc(smb_buffer_response);
3761 length = strnlen(bcc_ptr, bytes_left - 2);
3762 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
3768 /* skip service field (NB: this field is always ASCII) */
3770 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
3771 (bcc_ptr[2] == 'C')) {
3772 cifs_dbg(FYI, "IPC connection\n");
3776 } else if (length == 2) {
3777 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
3778 /* the most common case */
3779 cifs_dbg(FYI, "disk share connection\n");
3782 bcc_ptr += length + 1;
3783 bytes_left -= (length + 1);
3784 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
3786 /* mostly informational -- no need to fail on error here */
3787 kfree(tcon->nativeFileSystem);
3788 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
3789 bytes_left, is_unicode,
3792 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
3794 if ((smb_buffer_response->WordCount == 3) ||
3795 (smb_buffer_response->WordCount == 7))
3796 /* field is in same location */
3797 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
3800 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
3803 cifs_buf_release(smb_buffer);
3807 static void delayed_free(struct rcu_head *p)
3809 struct cifs_sb_info *cifs_sb = container_of(p, struct cifs_sb_info, rcu);
3811 unload_nls(cifs_sb->local_nls);
3812 smb3_cleanup_fs_context(cifs_sb->ctx);
3817 cifs_umount(struct cifs_sb_info *cifs_sb)
3819 struct rb_root *root = &cifs_sb->tlink_tree;
3820 struct rb_node *node;
3821 struct tcon_link *tlink;
3823 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
3825 spin_lock(&cifs_sb->tlink_tree_lock);
3826 while ((node = rb_first(root))) {
3827 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3828 cifs_get_tlink(tlink);
3829 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3830 rb_erase(node, root);
3832 spin_unlock(&cifs_sb->tlink_tree_lock);
3833 cifs_put_tlink(tlink);
3834 spin_lock(&cifs_sb->tlink_tree_lock);
3836 spin_unlock(&cifs_sb->tlink_tree_lock);
3838 kfree(cifs_sb->prepath);
3839 #ifdef CONFIG_CIFS_DFS_UPCALL
3840 dfs_cache_put_refsrv_sessions(&cifs_sb->dfs_mount_id);
3841 kfree(cifs_sb->origin_fullpath);
3843 call_rcu(&cifs_sb->rcu, delayed_free);
3847 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
3850 struct TCP_Server_Info *server = cifs_ses_server(ses);
3852 if (!server->ops->need_neg || !server->ops->negotiate)
3855 /* only send once per connect */
3856 if (!server->ops->need_neg(server))
3859 rc = server->ops->negotiate(xid, ses);
3861 spin_lock(&GlobalMid_Lock);
3862 if (server->tcpStatus == CifsNeedNegotiate)
3863 server->tcpStatus = CifsGood;
3866 spin_unlock(&GlobalMid_Lock);
3873 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
3874 struct nls_table *nls_info)
3877 struct TCP_Server_Info *server = cifs_ses_server(ses);
3879 if (!ses->binding) {
3880 ses->capabilities = server->capabilities;
3881 if (!linuxExtEnabled)
3882 ses->capabilities &= (~server->vals->cap_unix);
3884 if (ses->auth_key.response) {
3885 cifs_dbg(FYI, "Free previous auth_key.response = %p\n",
3886 ses->auth_key.response);
3887 kfree(ses->auth_key.response);
3888 ses->auth_key.response = NULL;
3889 ses->auth_key.len = 0;
3893 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
3894 server->sec_mode, server->capabilities, server->timeAdj);
3896 if (server->ops->sess_setup)
3897 rc = server->ops->sess_setup(xid, ses, nls_info);
3900 cifs_server_dbg(VFS, "Send error in SessSetup = %d\n", rc);
3906 cifs_set_vol_auth(struct smb3_fs_context *ctx, struct cifs_ses *ses)
3908 ctx->sectype = ses->sectype;
3910 /* krb5 is special, since we don't need username or pw */
3911 if (ctx->sectype == Kerberos)
3914 return cifs_set_cifscreds(ctx, ses);
3917 static struct cifs_tcon *
3918 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
3921 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
3922 struct cifs_ses *ses;
3923 struct cifs_tcon *tcon = NULL;
3924 struct smb3_fs_context *ctx;
3926 ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
3928 return ERR_PTR(-ENOMEM);
3930 ctx->local_nls = cifs_sb->local_nls;
3931 ctx->linux_uid = fsuid;
3932 ctx->cred_uid = fsuid;
3933 ctx->UNC = master_tcon->treeName;
3934 ctx->retry = master_tcon->retry;
3935 ctx->nocase = master_tcon->nocase;
3936 ctx->nohandlecache = master_tcon->nohandlecache;
3937 ctx->local_lease = master_tcon->local_lease;
3938 ctx->no_lease = master_tcon->no_lease;
3939 ctx->resilient = master_tcon->use_resilient;
3940 ctx->persistent = master_tcon->use_persistent;
3941 ctx->handle_timeout = master_tcon->handle_timeout;
3942 ctx->no_linux_ext = !master_tcon->unix_ext;
3943 ctx->linux_ext = master_tcon->posix_extensions;
3944 ctx->sectype = master_tcon->ses->sectype;
3945 ctx->sign = master_tcon->ses->sign;
3946 ctx->seal = master_tcon->seal;
3947 ctx->witness = master_tcon->use_witness;
3949 rc = cifs_set_vol_auth(ctx, master_tcon->ses);
3955 /* get a reference for the same TCP session */
3956 spin_lock(&cifs_tcp_ses_lock);
3957 ++master_tcon->ses->server->srv_count;
3958 spin_unlock(&cifs_tcp_ses_lock);
3960 ses = cifs_get_smb_ses(master_tcon->ses->server, ctx);
3962 tcon = (struct cifs_tcon *)ses;
3963 cifs_put_tcp_session(master_tcon->ses->server, 0);
3967 tcon = cifs_get_tcon(ses, ctx);
3969 cifs_put_smb_ses(ses);
3974 reset_cifs_unix_caps(0, tcon, NULL, ctx);
3977 kfree(ctx->username);
3978 kfree_sensitive(ctx->password);
3985 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
3987 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
3990 /* find and return a tlink with given uid */
3991 static struct tcon_link *
3992 tlink_rb_search(struct rb_root *root, kuid_t uid)
3994 struct rb_node *node = root->rb_node;
3995 struct tcon_link *tlink;
3998 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
4000 if (uid_gt(tlink->tl_uid, uid))
4001 node = node->rb_left;
4002 else if (uid_lt(tlink->tl_uid, uid))
4003 node = node->rb_right;
4010 /* insert a tcon_link into the tree */
4012 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
4014 struct rb_node **new = &(root->rb_node), *parent = NULL;
4015 struct tcon_link *tlink;
4018 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
4021 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
4022 new = &((*new)->rb_left);
4024 new = &((*new)->rb_right);
4027 rb_link_node(&new_tlink->tl_rbnode, parent, new);
4028 rb_insert_color(&new_tlink->tl_rbnode, root);
4032 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
4035 * If the superblock doesn't refer to a multiuser mount, then just return
4036 * the master tcon for the mount.
4038 * First, search the rbtree for an existing tcon for this fsuid. If one
4039 * exists, then check to see if it's pending construction. If it is then wait
4040 * for construction to complete. Once it's no longer pending, check to see if
4041 * it failed and either return an error or retry construction, depending on
4044 * If one doesn't exist then insert a new tcon_link struct into the tree and
4045 * try to construct a new one.
4048 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
4051 kuid_t fsuid = current_fsuid();
4052 struct tcon_link *tlink, *newtlink;
4054 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
4055 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
4057 spin_lock(&cifs_sb->tlink_tree_lock);
4058 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4060 cifs_get_tlink(tlink);
4061 spin_unlock(&cifs_sb->tlink_tree_lock);
4063 if (tlink == NULL) {
4064 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
4065 if (newtlink == NULL)
4066 return ERR_PTR(-ENOMEM);
4067 newtlink->tl_uid = fsuid;
4068 newtlink->tl_tcon = ERR_PTR(-EACCES);
4069 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
4070 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
4071 cifs_get_tlink(newtlink);
4073 spin_lock(&cifs_sb->tlink_tree_lock);
4074 /* was one inserted after previous search? */
4075 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
4077 cifs_get_tlink(tlink);
4078 spin_unlock(&cifs_sb->tlink_tree_lock);
4080 goto wait_for_construction;
4083 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4084 spin_unlock(&cifs_sb->tlink_tree_lock);
4086 wait_for_construction:
4087 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
4088 TASK_INTERRUPTIBLE);
4090 cifs_put_tlink(tlink);
4091 return ERR_PTR(-ERESTARTSYS);
4094 /* if it's good, return it */
4095 if (!IS_ERR(tlink->tl_tcon))
4098 /* return error if we tried this already recently */
4099 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
4100 cifs_put_tlink(tlink);
4101 return ERR_PTR(-EACCES);
4104 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
4105 goto wait_for_construction;
4108 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
4109 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
4110 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
4112 if (IS_ERR(tlink->tl_tcon)) {
4113 cifs_put_tlink(tlink);
4114 return ERR_PTR(-EACCES);
4121 * periodic workqueue job that scans tcon_tree for a superblock and closes
4125 cifs_prune_tlinks(struct work_struct *work)
4127 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
4129 struct rb_root *root = &cifs_sb->tlink_tree;
4130 struct rb_node *node;
4131 struct rb_node *tmp;
4132 struct tcon_link *tlink;
4135 * Because we drop the spinlock in the loop in order to put the tlink
4136 * it's not guarded against removal of links from the tree. The only
4137 * places that remove entries from the tree are this function and
4138 * umounts. Because this function is non-reentrant and is canceled
4139 * before umount can proceed, this is safe.
4141 spin_lock(&cifs_sb->tlink_tree_lock);
4142 node = rb_first(root);
4143 while (node != NULL) {
4145 node = rb_next(tmp);
4146 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
4148 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
4149 atomic_read(&tlink->tl_count) != 0 ||
4150 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
4153 cifs_get_tlink(tlink);
4154 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4155 rb_erase(tmp, root);
4157 spin_unlock(&cifs_sb->tlink_tree_lock);
4158 cifs_put_tlink(tlink);
4159 spin_lock(&cifs_sb->tlink_tree_lock);
4161 spin_unlock(&cifs_sb->tlink_tree_lock);
4163 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4167 #ifdef CONFIG_CIFS_DFS_UPCALL
4168 int cifs_tree_connect(const unsigned int xid, struct cifs_tcon *tcon, const struct nls_table *nlsc)
4171 struct TCP_Server_Info *server = tcon->ses->server;
4172 const struct smb_version_operations *ops = server->ops;
4173 struct dfs_cache_tgt_list tl;
4174 struct dfs_cache_tgt_iterator *it = NULL;
4176 const char *tcp_host;
4177 size_t tcp_host_len;
4178 const char *dfs_host;
4179 size_t dfs_host_len;
4180 char *share = NULL, *prefix = NULL;
4181 struct dfs_info3_param ref = {0};
4184 tree = kzalloc(MAX_TREE_SIZE, GFP_KERNEL);
4188 /* If it is not dfs or there was no cached dfs referral, then reconnect to same share */
4189 if (!tcon->dfs_path || dfs_cache_noreq_find(tcon->dfs_path + 1, &ref, &tl)) {
4191 scnprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$", server->hostname);
4192 rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
4194 rc = ops->tree_connect(xid, tcon->ses, tcon->treeName, tcon, nlsc);
4199 isroot = ref.server_type == DFS_TYPE_ROOT;
4200 free_dfs_info_param(&ref);
4202 extract_unc_hostname(server->hostname, &tcp_host, &tcp_host_len);
4204 for (it = dfs_cache_get_tgt_iterator(&tl); it; it = dfs_cache_get_next_tgt(&tl, it)) {
4212 rc = dfs_cache_get_tgt_share(tcon->dfs_path + 1, it, &share, &prefix);
4214 cifs_dbg(VFS, "%s: failed to parse target share %d\n",
4219 extract_unc_hostname(share, &dfs_host, &dfs_host_len);
4221 if (dfs_host_len != tcp_host_len
4222 || strncasecmp(dfs_host, tcp_host, dfs_host_len) != 0) {
4223 cifs_dbg(FYI, "%s: %.*s doesn't match %.*s\n", __func__, (int)dfs_host_len,
4224 dfs_host, (int)tcp_host_len, tcp_host);
4226 rc = match_target_ip(server, dfs_host, dfs_host_len, &target_match);
4228 cifs_dbg(VFS, "%s: failed to match target ip: %d\n", __func__, rc);
4232 if (!target_match) {
4233 cifs_dbg(FYI, "%s: skipping target\n", __func__);
4239 scnprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$", share);
4240 rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
4242 scnprintf(tree, MAX_TREE_SIZE, "\\%s", share);
4243 rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
4244 /* Only handle prefix paths of DFS link targets */
4245 if (!rc && !isroot) {
4246 rc = update_super_prepath(tcon, prefix);
4259 rc = dfs_cache_noreq_update_tgthint(tcon->dfs_path + 1, it);
4263 dfs_cache_free_tgts(&tl);
4269 int cifs_tree_connect(const unsigned int xid, struct cifs_tcon *tcon, const struct nls_table *nlsc)
4271 const struct smb_version_operations *ops = tcon->ses->server->ops;
4273 return ops->tree_connect(xid, tcon->ses, tcon->treeName, tcon, nlsc);