4 * Copyright (C) International Business Machines Corp., 2002,2011
5 * Author(s): Steve French (sfrench@us.ibm.com)
7 * This library is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser General Public License as published
9 * by the Free Software Foundation; either version 2.1 of the License, or
10 * (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
15 * the GNU Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include <linux/net.h>
23 #include <linux/string.h>
24 #include <linux/sched/mm.h>
25 #include <linux/sched/signal.h>
26 #include <linux/list.h>
27 #include <linux/wait.h>
28 #include <linux/slab.h>
29 #include <linux/pagemap.h>
30 #include <linux/ctype.h>
31 #include <linux/utsname.h>
32 #include <linux/mempool.h>
33 #include <linux/delay.h>
34 #include <linux/completion.h>
35 #include <linux/kthread.h>
36 #include <linux/pagevec.h>
37 #include <linux/freezer.h>
38 #include <linux/namei.h>
39 #include <linux/uuid.h>
40 #include <linux/uaccess.h>
41 #include <asm/processor.h>
42 #include <linux/inet.h>
43 #include <linux/module.h>
44 #include <keys/user-type.h>
46 #include <linux/parser.h>
47 #include <linux/bvec.h>
50 #include "cifsproto.h"
51 #include "cifs_unicode.h"
52 #include "cifs_debug.h"
53 #include "cifs_fs_sb.h"
56 #include "rfc1002pdu.h"
58 #include "smb2proto.h"
59 #include "smbdirect.h"
60 #include "dns_resolve.h"
61 #ifdef CONFIG_CIFS_DFS_UPCALL
62 #include "dfs_cache.h"
64 #include "fs_context.h"
67 extern mempool_t *cifs_req_poolp;
68 extern bool disable_legacy_dialects;
70 /* FIXME: should these be tunable? */
71 #define TLINK_ERROR_EXPIRE (1 * HZ)
72 #define TLINK_IDLE_EXPIRE (600 * HZ)
74 /* Drop the connection to not overload the server */
75 #define NUM_STATUS_IO_TIMEOUT 5
77 static int ip_connect(struct TCP_Server_Info *server);
78 static int generic_ip_connect(struct TCP_Server_Info *server);
79 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
80 static void cifs_prune_tlinks(struct work_struct *work);
83 * Resolve hostname and set ip addr in tcp ses. Useful for hostnames that may
84 * get their ip addresses changed at some point.
86 * This should be called with server->srv_mutex held.
88 static int reconn_set_ipaddr_from_hostname(struct TCP_Server_Info *server)
92 char *unc, *ipaddr = NULL;
94 if (!server->hostname)
97 len = strlen(server->hostname) + 3;
99 unc = kmalloc(len, GFP_KERNEL);
101 cifs_dbg(FYI, "%s: failed to create UNC path\n", __func__);
104 scnprintf(unc, len, "\\\\%s", server->hostname);
106 rc = dns_resolve_server_name_to_ip(unc, &ipaddr);
110 cifs_dbg(FYI, "%s: failed to resolve server part of %s to IP: %d\n",
111 __func__, server->hostname, rc);
115 spin_lock(&cifs_tcp_ses_lock);
116 rc = cifs_convert_address((struct sockaddr *)&server->dstaddr, ipaddr,
118 spin_unlock(&cifs_tcp_ses_lock);
124 #ifdef CONFIG_CIFS_DFS_UPCALL
125 /* These functions must be called with server->srv_mutex held */
126 static void reconn_set_next_dfs_target(struct TCP_Server_Info *server,
127 struct cifs_sb_info *cifs_sb,
128 struct dfs_cache_tgt_list *tgt_list,
129 struct dfs_cache_tgt_iterator **tgt_it)
134 if (!cifs_sb || !cifs_sb->origin_fullpath)
138 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
140 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
142 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
145 cifs_dbg(FYI, "%s: UNC: %s\n", __func__, cifs_sb->origin_fullpath);
147 name = dfs_cache_get_tgt_name(*tgt_it);
149 kfree(server->hostname);
151 server->hostname = extract_hostname(name);
152 if (IS_ERR(server->hostname)) {
154 "%s: failed to extract hostname from target: %ld\n",
155 __func__, PTR_ERR(server->hostname));
159 rc = reconn_set_ipaddr_from_hostname(server);
161 cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
166 static inline int reconn_setup_dfs_targets(struct cifs_sb_info *cifs_sb,
167 struct dfs_cache_tgt_list *tl)
169 if (!cifs_sb->origin_fullpath)
171 return dfs_cache_noreq_find(cifs_sb->origin_fullpath + 1, NULL, tl);
176 * cifs tcp session reconnection
178 * mark tcp session as reconnecting so temporarily locked
179 * mark all smb sessions as reconnecting for tcp session
180 * reconnect tcp session
181 * wake up waiters on reconnection? - (not needed currently)
184 cifs_reconnect(struct TCP_Server_Info *server)
187 struct list_head *tmp, *tmp2;
188 struct cifs_ses *ses;
189 struct cifs_tcon *tcon;
190 struct mid_q_entry *mid_entry;
191 struct list_head retry_list;
192 #ifdef CONFIG_CIFS_DFS_UPCALL
193 struct super_block *sb = NULL;
194 struct cifs_sb_info *cifs_sb = NULL;
195 struct dfs_cache_tgt_list tgt_list = {0};
196 struct dfs_cache_tgt_iterator *tgt_it = NULL;
199 spin_lock(&GlobalMid_Lock);
200 server->nr_targets = 1;
201 #ifdef CONFIG_CIFS_DFS_UPCALL
202 spin_unlock(&GlobalMid_Lock);
203 sb = cifs_get_tcp_super(server);
206 cifs_dbg(FYI, "%s: will not do DFS failover: rc = %d\n",
210 cifs_sb = CIFS_SB(sb);
211 rc = reconn_setup_dfs_targets(cifs_sb, &tgt_list);
214 if (rc != -EOPNOTSUPP) {
215 cifs_server_dbg(VFS, "%s: no target servers for DFS failover\n",
219 server->nr_targets = dfs_cache_get_nr_tgts(&tgt_list);
222 cifs_dbg(FYI, "%s: will retry %d target(s)\n", __func__,
224 spin_lock(&GlobalMid_Lock);
226 if (server->tcpStatus == CifsExiting) {
227 /* the demux thread will exit normally
228 next time through the loop */
229 spin_unlock(&GlobalMid_Lock);
230 #ifdef CONFIG_CIFS_DFS_UPCALL
231 dfs_cache_free_tgts(&tgt_list);
232 cifs_put_tcp_super(sb);
234 wake_up(&server->response_q);
237 server->tcpStatus = CifsNeedReconnect;
238 spin_unlock(&GlobalMid_Lock);
240 server->max_read = 0;
242 cifs_dbg(FYI, "Mark tcp session as need reconnect\n");
243 trace_smb3_reconnect(server->CurrentMid, server->conn_id, server->hostname);
245 /* before reconnecting the tcp session, mark the smb session (uid)
246 and the tid bad so they are not used until reconnected */
247 cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
249 spin_lock(&cifs_tcp_ses_lock);
250 list_for_each(tmp, &server->smb_ses_list) {
251 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
252 ses->need_reconnect = true;
253 list_for_each(tmp2, &ses->tcon_list) {
254 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
255 tcon->need_reconnect = true;
258 ses->tcon_ipc->need_reconnect = true;
260 spin_unlock(&cifs_tcp_ses_lock);
262 /* do not want to be sending data on a socket we are freeing */
263 cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
264 mutex_lock(&server->srv_mutex);
265 if (server->ssocket) {
266 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
267 server->ssocket->state, server->ssocket->flags);
268 kernel_sock_shutdown(server->ssocket, SHUT_WR);
269 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
270 server->ssocket->state, server->ssocket->flags);
271 sock_release(server->ssocket);
272 server->ssocket = NULL;
274 server->sequence_number = 0;
275 server->session_estab = false;
276 kfree(server->session_key.response);
277 server->session_key.response = NULL;
278 server->session_key.len = 0;
279 server->lstrp = jiffies;
281 /* mark submitted MIDs for retry and issue callback */
282 INIT_LIST_HEAD(&retry_list);
283 cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
284 spin_lock(&GlobalMid_Lock);
285 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
286 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
287 kref_get(&mid_entry->refcount);
288 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
289 mid_entry->mid_state = MID_RETRY_NEEDED;
290 list_move(&mid_entry->qhead, &retry_list);
291 mid_entry->mid_flags |= MID_DELETED;
293 spin_unlock(&GlobalMid_Lock);
294 mutex_unlock(&server->srv_mutex);
296 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
297 list_for_each_safe(tmp, tmp2, &retry_list) {
298 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
299 list_del_init(&mid_entry->qhead);
300 mid_entry->callback(mid_entry);
301 cifs_mid_q_entry_release(mid_entry);
304 if (cifs_rdma_enabled(server)) {
305 mutex_lock(&server->srv_mutex);
306 smbd_destroy(server);
307 mutex_unlock(&server->srv_mutex);
313 mutex_lock(&server->srv_mutex);
316 if (!cifs_swn_set_server_dstaddr(server)) {
317 #ifdef CONFIG_CIFS_DFS_UPCALL
318 if (cifs_sb && cifs_sb->origin_fullpath)
320 * Set up next DFS target server (if any) for reconnect. If DFS
321 * feature is disabled, then we will retry last server we
322 * connected to before.
324 reconn_set_next_dfs_target(server, cifs_sb, &tgt_list, &tgt_it);
328 * Resolve the hostname again to make sure that IP address is up-to-date.
330 rc = reconn_set_ipaddr_from_hostname(server);
332 cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
336 #ifdef CONFIG_CIFS_DFS_UPCALL
343 if (cifs_rdma_enabled(server))
344 rc = smbd_reconnect(server);
346 rc = generic_ip_connect(server);
348 cifs_dbg(FYI, "reconnect error %d\n", rc);
349 mutex_unlock(&server->srv_mutex);
352 atomic_inc(&tcpSesReconnectCount);
353 set_credits(server, 1);
354 spin_lock(&GlobalMid_Lock);
355 if (server->tcpStatus != CifsExiting)
356 server->tcpStatus = CifsNeedNegotiate;
357 spin_unlock(&GlobalMid_Lock);
358 cifs_swn_reset_server_dstaddr(server);
359 mutex_unlock(&server->srv_mutex);
361 } while (server->tcpStatus == CifsNeedReconnect);
363 #ifdef CONFIG_CIFS_DFS_UPCALL
365 rc = dfs_cache_noreq_update_tgthint(cifs_sb->origin_fullpath + 1,
368 cifs_server_dbg(VFS, "%s: failed to update DFS target hint: rc = %d\n",
371 rc = dfs_cache_update_vol(cifs_sb->origin_fullpath, server);
373 cifs_server_dbg(VFS, "%s: failed to update vol info in DFS cache: rc = %d\n",
376 dfs_cache_free_tgts(&tgt_list);
380 cifs_put_tcp_super(sb);
382 if (server->tcpStatus == CifsNeedNegotiate)
383 mod_delayed_work(cifsiod_wq, &server->echo, 0);
385 wake_up(&server->response_q);
390 cifs_echo_request(struct work_struct *work)
393 struct TCP_Server_Info *server = container_of(work,
394 struct TCP_Server_Info, echo.work);
395 unsigned long echo_interval;
398 * If we need to renegotiate, set echo interval to zero to
399 * immediately call echo service where we can renegotiate.
401 if (server->tcpStatus == CifsNeedNegotiate)
404 echo_interval = server->echo_interval;
407 * We cannot send an echo if it is disabled.
408 * Also, no need to ping if we got a response recently.
411 if (server->tcpStatus == CifsNeedReconnect ||
412 server->tcpStatus == CifsExiting ||
413 server->tcpStatus == CifsNew ||
414 (server->ops->can_echo && !server->ops->can_echo(server)) ||
415 time_before(jiffies, server->lstrp + echo_interval - HZ))
418 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
420 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
423 /* Check witness registrations */
427 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
431 allocate_buffers(struct TCP_Server_Info *server)
433 if (!server->bigbuf) {
434 server->bigbuf = (char *)cifs_buf_get();
435 if (!server->bigbuf) {
436 cifs_server_dbg(VFS, "No memory for large SMB response\n");
438 /* retry will check if exiting */
441 } else if (server->large_buf) {
442 /* we are reusing a dirty large buf, clear its start */
443 memset(server->bigbuf, 0, HEADER_SIZE(server));
446 if (!server->smallbuf) {
447 server->smallbuf = (char *)cifs_small_buf_get();
448 if (!server->smallbuf) {
449 cifs_server_dbg(VFS, "No memory for SMB response\n");
451 /* retry will check if exiting */
454 /* beginning of smb buffer is cleared in our buf_get */
456 /* if existing small buf clear beginning */
457 memset(server->smallbuf, 0, HEADER_SIZE(server));
464 server_unresponsive(struct TCP_Server_Info *server)
467 * We need to wait 3 echo intervals to make sure we handle such
469 * 1s client sends a normal SMB request
470 * 2s client gets a response
471 * 30s echo workqueue job pops, and decides we got a response recently
472 * and don't need to send another
474 * 65s kernel_recvmsg times out, and we see that we haven't gotten
475 * a response in >60s.
477 if ((server->tcpStatus == CifsGood ||
478 server->tcpStatus == CifsNeedNegotiate) &&
479 time_after(jiffies, server->lstrp + 3 * server->echo_interval)) {
480 cifs_server_dbg(VFS, "has not responded in %lu seconds. Reconnecting...\n",
481 (3 * server->echo_interval) / HZ);
482 cifs_reconnect(server);
490 zero_credits(struct TCP_Server_Info *server)
494 spin_lock(&server->req_lock);
495 val = server->credits + server->echo_credits + server->oplock_credits;
496 if (server->in_flight == 0 && val == 0) {
497 spin_unlock(&server->req_lock);
500 spin_unlock(&server->req_lock);
505 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
510 smb_msg->msg_control = NULL;
511 smb_msg->msg_controllen = 0;
513 for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
516 /* reconnect if no credits and no requests in flight */
517 if (zero_credits(server)) {
518 cifs_reconnect(server);
519 return -ECONNABORTED;
522 if (server_unresponsive(server))
523 return -ECONNABORTED;
524 if (cifs_rdma_enabled(server) && server->smbd_conn)
525 length = smbd_recv(server->smbd_conn, smb_msg);
527 length = sock_recvmsg(server->ssocket, smb_msg, 0);
529 if (server->tcpStatus == CifsExiting)
532 if (server->tcpStatus == CifsNeedReconnect) {
533 cifs_reconnect(server);
534 return -ECONNABORTED;
537 if (length == -ERESTARTSYS ||
541 * Minimum sleep to prevent looping, allowing socket
542 * to clear and app threads to set tcpStatus
543 * CifsNeedReconnect if server hung.
545 usleep_range(1000, 2000);
551 cifs_dbg(FYI, "Received no data or error: %d\n", length);
552 cifs_reconnect(server);
553 return -ECONNABORTED;
560 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
561 unsigned int to_read)
563 struct msghdr smb_msg;
564 struct kvec iov = {.iov_base = buf, .iov_len = to_read};
565 iov_iter_kvec(&smb_msg.msg_iter, READ, &iov, 1, to_read);
567 return cifs_readv_from_socket(server, &smb_msg);
571 cifs_discard_from_socket(struct TCP_Server_Info *server, size_t to_read)
573 struct msghdr smb_msg;
576 * iov_iter_discard already sets smb_msg.type and count and iov_offset
577 * and cifs_readv_from_socket sets msg_control and msg_controllen
578 * so little to initialize in struct msghdr
580 smb_msg.msg_name = NULL;
581 smb_msg.msg_namelen = 0;
582 iov_iter_discard(&smb_msg.msg_iter, READ, to_read);
584 return cifs_readv_from_socket(server, &smb_msg);
588 cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
589 unsigned int page_offset, unsigned int to_read)
591 struct msghdr smb_msg;
592 struct bio_vec bv = {
593 .bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
594 iov_iter_bvec(&smb_msg.msg_iter, READ, &bv, 1, to_read);
595 return cifs_readv_from_socket(server, &smb_msg);
599 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
602 * The first byte big endian of the length field,
603 * is actually not part of the length but the type
604 * with the most common, zero, as regular data.
607 case RFC1002_SESSION_MESSAGE:
608 /* Regular SMB response */
610 case RFC1002_SESSION_KEEP_ALIVE:
611 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
613 case RFC1002_POSITIVE_SESSION_RESPONSE:
614 cifs_dbg(FYI, "RFC 1002 positive session response\n");
616 case RFC1002_NEGATIVE_SESSION_RESPONSE:
618 * We get this from Windows 98 instead of an error on
619 * SMB negprot response.
621 cifs_dbg(FYI, "RFC 1002 negative session response\n");
622 /* give server a second to clean up */
625 * Always try 445 first on reconnect since we get NACK
626 * on some if we ever connected to port 139 (the NACK
627 * is since we do not begin with RFC1001 session
630 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
631 cifs_reconnect(server);
634 cifs_server_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
635 cifs_reconnect(server);
642 dequeue_mid(struct mid_q_entry *mid, bool malformed)
644 #ifdef CONFIG_CIFS_STATS2
645 mid->when_received = jiffies;
647 spin_lock(&GlobalMid_Lock);
649 mid->mid_state = MID_RESPONSE_RECEIVED;
651 mid->mid_state = MID_RESPONSE_MALFORMED;
653 * Trying to handle/dequeue a mid after the send_recv()
654 * function has finished processing it is a bug.
656 if (mid->mid_flags & MID_DELETED)
657 pr_warn_once("trying to dequeue a deleted mid\n");
659 list_del_init(&mid->qhead);
660 mid->mid_flags |= MID_DELETED;
662 spin_unlock(&GlobalMid_Lock);
666 smb2_get_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
668 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
671 * SMB1 does not use credits.
673 if (server->vals->header_preamble_size)
676 return le16_to_cpu(shdr->CreditRequest);
680 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
681 char *buf, int malformed)
683 if (server->ops->check_trans2 &&
684 server->ops->check_trans2(mid, server, buf, malformed))
686 mid->credits_received = smb2_get_credits_from_hdr(buf, server);
688 mid->large_buf = server->large_buf;
689 /* Was previous buf put in mpx struct for multi-rsp? */
690 if (!mid->multiRsp) {
691 /* smb buffer will be freed by user thread */
692 if (server->large_buf)
693 server->bigbuf = NULL;
695 server->smallbuf = NULL;
697 dequeue_mid(mid, malformed);
700 static void clean_demultiplex_info(struct TCP_Server_Info *server)
704 /* take it off the list, if it's not already */
705 spin_lock(&cifs_tcp_ses_lock);
706 list_del_init(&server->tcp_ses_list);
707 spin_unlock(&cifs_tcp_ses_lock);
709 cancel_delayed_work_sync(&server->echo);
711 spin_lock(&GlobalMid_Lock);
712 server->tcpStatus = CifsExiting;
713 spin_unlock(&GlobalMid_Lock);
714 wake_up_all(&server->response_q);
716 /* check if we have blocked requests that need to free */
717 spin_lock(&server->req_lock);
718 if (server->credits <= 0)
720 spin_unlock(&server->req_lock);
722 * Although there should not be any requests blocked on this queue it
723 * can not hurt to be paranoid and try to wake up requests that may
724 * haven been blocked when more than 50 at time were on the wire to the
725 * same server - they now will see the session is in exit state and get
726 * out of SendReceive.
728 wake_up_all(&server->request_q);
729 /* give those requests time to exit */
731 if (cifs_rdma_enabled(server))
732 smbd_destroy(server);
733 if (server->ssocket) {
734 sock_release(server->ssocket);
735 server->ssocket = NULL;
738 if (!list_empty(&server->pending_mid_q)) {
739 struct list_head dispose_list;
740 struct mid_q_entry *mid_entry;
741 struct list_head *tmp, *tmp2;
743 INIT_LIST_HEAD(&dispose_list);
744 spin_lock(&GlobalMid_Lock);
745 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
746 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
747 cifs_dbg(FYI, "Clearing mid %llu\n", mid_entry->mid);
748 kref_get(&mid_entry->refcount);
749 mid_entry->mid_state = MID_SHUTDOWN;
750 list_move(&mid_entry->qhead, &dispose_list);
751 mid_entry->mid_flags |= MID_DELETED;
753 spin_unlock(&GlobalMid_Lock);
755 /* now walk dispose list and issue callbacks */
756 list_for_each_safe(tmp, tmp2, &dispose_list) {
757 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
758 cifs_dbg(FYI, "Callback mid %llu\n", mid_entry->mid);
759 list_del_init(&mid_entry->qhead);
760 mid_entry->callback(mid_entry);
761 cifs_mid_q_entry_release(mid_entry);
763 /* 1/8th of sec is more than enough time for them to exit */
767 if (!list_empty(&server->pending_mid_q)) {
769 * mpx threads have not exited yet give them at least the smb
770 * send timeout time for long ops.
772 * Due to delays on oplock break requests, we need to wait at
773 * least 45 seconds before giving up on a request getting a
774 * response and going ahead and killing cifsd.
776 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
779 * If threads still have not exited they are probably never
780 * coming home not much else we can do but free the memory.
784 kfree(server->hostname);
787 length = atomic_dec_return(&tcpSesAllocCount);
789 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
793 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
796 char *buf = server->smallbuf;
797 unsigned int pdu_length = server->pdu_size;
799 /* make sure this will fit in a large buffer */
800 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
801 server->vals->header_preamble_size) {
802 cifs_server_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
803 cifs_reconnect(server);
804 return -ECONNABORTED;
807 /* switch to large buffer if too big for a small one */
808 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
809 server->large_buf = true;
810 memcpy(server->bigbuf, buf, server->total_read);
811 buf = server->bigbuf;
814 /* now read the rest */
815 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
816 pdu_length - HEADER_SIZE(server) + 1
817 + server->vals->header_preamble_size);
821 server->total_read += length;
823 dump_smb(buf, server->total_read);
825 return cifs_handle_standard(server, mid);
829 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
831 char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
835 * We know that we received enough to get to the MID as we
836 * checked the pdu_length earlier. Now check to see
837 * if the rest of the header is OK. We borrow the length
838 * var for the rest of the loop to avoid a new stack var.
840 * 48 bytes is enough to display the header and a little bit
841 * into the payload for debugging purposes.
843 length = server->ops->check_message(buf, server->total_read, server);
845 cifs_dump_mem("Bad SMB: ", buf,
846 min_t(unsigned int, server->total_read, 48));
848 if (server->ops->is_session_expired &&
849 server->ops->is_session_expired(buf)) {
850 cifs_reconnect(server);
854 if (server->ops->is_status_pending &&
855 server->ops->is_status_pending(buf, server))
861 handle_mid(mid, server, buf, length);
866 smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
868 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
869 int scredits, in_flight;
872 * SMB1 does not use credits.
874 if (server->vals->header_preamble_size)
877 if (shdr->CreditRequest) {
878 spin_lock(&server->req_lock);
879 server->credits += le16_to_cpu(shdr->CreditRequest);
880 scredits = server->credits;
881 in_flight = server->in_flight;
882 spin_unlock(&server->req_lock);
883 wake_up(&server->request_q);
885 trace_smb3_add_credits(server->CurrentMid,
886 server->conn_id, server->hostname, scredits,
887 le16_to_cpu(shdr->CreditRequest), in_flight);
888 cifs_server_dbg(FYI, "%s: added %u credits total=%d\n",
889 __func__, le16_to_cpu(shdr->CreditRequest),
896 cifs_demultiplex_thread(void *p)
898 int i, num_mids, length;
899 struct TCP_Server_Info *server = p;
900 unsigned int pdu_length;
901 unsigned int next_offset;
903 struct task_struct *task_to_wake = NULL;
904 struct mid_q_entry *mids[MAX_COMPOUND];
905 char *bufs[MAX_COMPOUND];
906 unsigned int noreclaim_flag, num_io_timeout = 0;
908 noreclaim_flag = memalloc_noreclaim_save();
909 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
911 length = atomic_inc_return(&tcpSesAllocCount);
913 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
916 allow_kernel_signal(SIGKILL);
917 while (server->tcpStatus != CifsExiting) {
921 if (!allocate_buffers(server))
924 server->large_buf = false;
925 buf = server->smallbuf;
926 pdu_length = 4; /* enough to get RFC1001 header */
928 length = cifs_read_from_socket(server, buf, pdu_length);
932 if (server->vals->header_preamble_size == 0)
933 server->total_read = 0;
935 server->total_read = length;
938 * The right amount was read from socket - 4 bytes,
939 * so we can now interpret the length field.
941 pdu_length = get_rfc1002_length(buf);
943 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
944 if (!is_smb_response(server, buf[0]))
947 server->pdu_size = pdu_length;
949 /* make sure we have enough to get to the MID */
950 if (server->pdu_size < HEADER_SIZE(server) - 1 -
951 server->vals->header_preamble_size) {
952 cifs_server_dbg(VFS, "SMB response too short (%u bytes)\n",
954 cifs_reconnect(server);
958 /* read down to the MID */
959 length = cifs_read_from_socket(server,
960 buf + server->vals->header_preamble_size,
961 HEADER_SIZE(server) - 1
962 - server->vals->header_preamble_size);
965 server->total_read += length;
967 if (server->ops->next_header) {
968 next_offset = server->ops->next_header(buf);
970 server->pdu_size = next_offset;
973 memset(mids, 0, sizeof(mids));
974 memset(bufs, 0, sizeof(bufs));
977 if (server->ops->is_transform_hdr &&
978 server->ops->receive_transform &&
979 server->ops->is_transform_hdr(buf)) {
980 length = server->ops->receive_transform(server,
985 mids[0] = server->ops->find_mid(server, buf);
989 if (!mids[0] || !mids[0]->receive)
990 length = standard_receive3(server, mids[0]);
992 length = mids[0]->receive(server, mids[0]);
996 for (i = 0; i < num_mids; i++)
998 cifs_mid_q_entry_release(mids[i]);
1002 if (server->ops->is_status_io_timeout &&
1003 server->ops->is_status_io_timeout(buf)) {
1005 if (num_io_timeout > NUM_STATUS_IO_TIMEOUT) {
1006 cifs_reconnect(server);
1012 server->lstrp = jiffies;
1014 for (i = 0; i < num_mids; i++) {
1015 if (mids[i] != NULL) {
1016 mids[i]->resp_buf_size = server->pdu_size;
1018 if (bufs[i] && server->ops->is_network_name_deleted)
1019 server->ops->is_network_name_deleted(bufs[i],
1022 if (!mids[i]->multiRsp || mids[i]->multiEnd)
1023 mids[i]->callback(mids[i]);
1025 cifs_mid_q_entry_release(mids[i]);
1026 } else if (server->ops->is_oplock_break &&
1027 server->ops->is_oplock_break(bufs[i],
1029 smb2_add_credits_from_hdr(bufs[i], server);
1030 cifs_dbg(FYI, "Received oplock break\n");
1032 cifs_server_dbg(VFS, "No task to wake, unknown frame received! NumMids %d\n",
1033 atomic_read(&midCount));
1034 cifs_dump_mem("Received Data is: ", bufs[i],
1035 HEADER_SIZE(server));
1036 smb2_add_credits_from_hdr(bufs[i], server);
1037 #ifdef CONFIG_CIFS_DEBUG2
1038 if (server->ops->dump_detail)
1039 server->ops->dump_detail(bufs[i],
1041 cifs_dump_mids(server);
1042 #endif /* CIFS_DEBUG2 */
1046 if (pdu_length > server->pdu_size) {
1047 if (!allocate_buffers(server))
1049 pdu_length -= server->pdu_size;
1050 server->total_read = 0;
1051 server->large_buf = false;
1052 buf = server->smallbuf;
1055 } /* end while !EXITING */
1057 /* buffer usually freed in free_mid - need to free it here on exit */
1058 cifs_buf_release(server->bigbuf);
1059 if (server->smallbuf) /* no sense logging a debug message if NULL */
1060 cifs_small_buf_release(server->smallbuf);
1062 task_to_wake = xchg(&server->tsk, NULL);
1063 clean_demultiplex_info(server);
1065 /* if server->tsk was NULL then wait for a signal before exiting */
1066 if (!task_to_wake) {
1067 set_current_state(TASK_INTERRUPTIBLE);
1068 while (!signal_pending(current)) {
1070 set_current_state(TASK_INTERRUPTIBLE);
1072 set_current_state(TASK_RUNNING);
1075 memalloc_noreclaim_restore(noreclaim_flag);
1076 module_put_and_exit(0);
1080 * Returns true if srcaddr isn't specified and rhs isn't specified, or
1081 * if srcaddr is specified and matches the IP address of the rhs argument
1084 cifs_match_ipaddr(struct sockaddr *srcaddr, struct sockaddr *rhs)
1086 switch (srcaddr->sa_family) {
1088 return (rhs->sa_family == AF_UNSPEC);
1090 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
1091 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
1092 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
1095 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
1096 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
1097 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
1101 return false; /* don't expect to be here */
1106 * If no port is specified in addr structure, we try to match with 445 port
1107 * and if it fails - with 139 ports. It should be called only if address
1108 * families of server and addr are equal.
1111 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
1113 __be16 port, *sport;
1115 /* SMBDirect manages its own ports, don't match it here */
1119 switch (addr->sa_family) {
1121 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
1122 port = ((struct sockaddr_in *) addr)->sin_port;
1125 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
1126 port = ((struct sockaddr_in6 *) addr)->sin6_port;
1134 port = htons(CIFS_PORT);
1138 port = htons(RFC1001_PORT);
1141 return port == *sport;
1145 match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
1146 struct sockaddr *srcaddr)
1148 switch (addr->sa_family) {
1150 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
1151 struct sockaddr_in *srv_addr4 =
1152 (struct sockaddr_in *)&server->dstaddr;
1154 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
1159 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
1160 struct sockaddr_in6 *srv_addr6 =
1161 (struct sockaddr_in6 *)&server->dstaddr;
1163 if (!ipv6_addr_equal(&addr6->sin6_addr,
1164 &srv_addr6->sin6_addr))
1166 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
1172 return false; /* don't expect to be here */
1175 if (!cifs_match_ipaddr(srcaddr, (struct sockaddr *)&server->srcaddr))
1182 match_security(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1185 * The select_sectype function should either return the ctx->sectype
1186 * that was specified, or "Unspecified" if that sectype was not
1187 * compatible with the given NEGOTIATE request.
1189 if (server->ops->select_sectype(server, ctx->sectype)
1194 * Now check if signing mode is acceptable. No need to check
1195 * global_secflags at this point since if MUST_SIGN is set then
1196 * the server->sign had better be too.
1198 if (ctx->sign && !server->sign)
1204 static int match_server(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1206 struct sockaddr *addr = (struct sockaddr *)&ctx->dstaddr;
1208 if (ctx->nosharesock)
1211 /* If multidialect negotiation see if existing sessions match one */
1212 if (strcmp(ctx->vals->version_string, SMB3ANY_VERSION_STRING) == 0) {
1213 if (server->vals->protocol_id < SMB30_PROT_ID)
1215 } else if (strcmp(ctx->vals->version_string,
1216 SMBDEFAULT_VERSION_STRING) == 0) {
1217 if (server->vals->protocol_id < SMB21_PROT_ID)
1219 } else if ((server->vals != ctx->vals) || (server->ops != ctx->ops))
1222 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
1225 if (!match_address(server, addr,
1226 (struct sockaddr *)&ctx->srcaddr))
1229 if (!match_port(server, addr))
1232 if (!match_security(server, ctx))
1235 if (server->echo_interval != ctx->echo_interval * HZ)
1238 if (server->rdma != ctx->rdma)
1241 if (server->ignore_signature != ctx->ignore_signature)
1244 if (server->min_offload != ctx->min_offload)
1250 struct TCP_Server_Info *
1251 cifs_find_tcp_session(struct smb3_fs_context *ctx)
1253 struct TCP_Server_Info *server;
1255 spin_lock(&cifs_tcp_ses_lock);
1256 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
1258 * Skip ses channels since they're only handled in lower layers
1259 * (e.g. cifs_send_recv).
1261 if (server->is_channel || !match_server(server, ctx))
1264 ++server->srv_count;
1265 spin_unlock(&cifs_tcp_ses_lock);
1266 cifs_dbg(FYI, "Existing tcp session with server found\n");
1269 spin_unlock(&cifs_tcp_ses_lock);
1274 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
1276 struct task_struct *task;
1278 spin_lock(&cifs_tcp_ses_lock);
1279 if (--server->srv_count > 0) {
1280 spin_unlock(&cifs_tcp_ses_lock);
1284 put_net(cifs_net_ns(server));
1286 list_del_init(&server->tcp_ses_list);
1287 spin_unlock(&cifs_tcp_ses_lock);
1289 cancel_delayed_work_sync(&server->echo);
1293 * Avoid deadlock here: reconnect work calls
1294 * cifs_put_tcp_session() at its end. Need to be sure
1295 * that reconnect work does nothing with server pointer after
1298 cancel_delayed_work(&server->reconnect);
1300 cancel_delayed_work_sync(&server->reconnect);
1302 spin_lock(&GlobalMid_Lock);
1303 server->tcpStatus = CifsExiting;
1304 spin_unlock(&GlobalMid_Lock);
1306 cifs_crypto_secmech_release(server);
1307 cifs_fscache_release_client_cookie(server);
1309 kfree(server->session_key.response);
1310 server->session_key.response = NULL;
1311 server->session_key.len = 0;
1313 task = xchg(&server->tsk, NULL);
1315 send_sig(SIGKILL, task, 1);
1318 struct TCP_Server_Info *
1319 cifs_get_tcp_session(struct smb3_fs_context *ctx)
1321 struct TCP_Server_Info *tcp_ses = NULL;
1324 cifs_dbg(FYI, "UNC: %s\n", ctx->UNC);
1326 /* see if we already have a matching tcp_ses */
1327 tcp_ses = cifs_find_tcp_session(ctx);
1331 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
1337 tcp_ses->ops = ctx->ops;
1338 tcp_ses->vals = ctx->vals;
1339 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
1340 tcp_ses->hostname = extract_hostname(ctx->UNC);
1341 if (IS_ERR(tcp_ses->hostname)) {
1342 rc = PTR_ERR(tcp_ses->hostname);
1343 goto out_err_crypto_release;
1346 tcp_ses->conn_id = atomic_inc_return(&tcpSesNextId);
1347 tcp_ses->noblockcnt = ctx->rootfs;
1348 tcp_ses->noblocksnd = ctx->noblocksnd || ctx->rootfs;
1349 tcp_ses->noautotune = ctx->noautotune;
1350 tcp_ses->tcp_nodelay = ctx->sockopt_tcp_nodelay;
1351 tcp_ses->rdma = ctx->rdma;
1352 tcp_ses->in_flight = 0;
1353 tcp_ses->max_in_flight = 0;
1354 tcp_ses->credits = 1;
1355 init_waitqueue_head(&tcp_ses->response_q);
1356 init_waitqueue_head(&tcp_ses->request_q);
1357 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
1358 mutex_init(&tcp_ses->srv_mutex);
1359 memcpy(tcp_ses->workstation_RFC1001_name,
1360 ctx->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
1361 memcpy(tcp_ses->server_RFC1001_name,
1362 ctx->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
1363 tcp_ses->session_estab = false;
1364 tcp_ses->sequence_number = 0;
1365 tcp_ses->reconnect_instance = 1;
1366 tcp_ses->lstrp = jiffies;
1367 tcp_ses->compress_algorithm = cpu_to_le16(ctx->compression);
1368 spin_lock_init(&tcp_ses->req_lock);
1369 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
1370 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
1371 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
1372 INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
1373 mutex_init(&tcp_ses->reconnect_mutex);
1374 memcpy(&tcp_ses->srcaddr, &ctx->srcaddr,
1375 sizeof(tcp_ses->srcaddr));
1376 memcpy(&tcp_ses->dstaddr, &ctx->dstaddr,
1377 sizeof(tcp_ses->dstaddr));
1378 if (ctx->use_client_guid)
1379 memcpy(tcp_ses->client_guid, ctx->client_guid,
1380 SMB2_CLIENT_GUID_SIZE);
1382 generate_random_uuid(tcp_ses->client_guid);
1384 * at this point we are the only ones with the pointer
1385 * to the struct since the kernel thread not created yet
1386 * no need to spinlock this init of tcpStatus or srv_count
1388 tcp_ses->tcpStatus = CifsNew;
1389 ++tcp_ses->srv_count;
1391 if (ctx->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
1392 ctx->echo_interval <= SMB_ECHO_INTERVAL_MAX)
1393 tcp_ses->echo_interval = ctx->echo_interval * HZ;
1395 tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
1396 if (tcp_ses->rdma) {
1397 #ifndef CONFIG_CIFS_SMB_DIRECT
1398 cifs_dbg(VFS, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
1400 goto out_err_crypto_release;
1402 tcp_ses->smbd_conn = smbd_get_connection(
1403 tcp_ses, (struct sockaddr *)&ctx->dstaddr);
1404 if (tcp_ses->smbd_conn) {
1405 cifs_dbg(VFS, "RDMA transport established\n");
1407 goto smbd_connected;
1410 goto out_err_crypto_release;
1413 rc = ip_connect(tcp_ses);
1415 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
1416 goto out_err_crypto_release;
1420 * since we're in a cifs function already, we know that
1421 * this will succeed. No need for try_module_get().
1423 __module_get(THIS_MODULE);
1424 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
1426 if (IS_ERR(tcp_ses->tsk)) {
1427 rc = PTR_ERR(tcp_ses->tsk);
1428 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
1429 module_put(THIS_MODULE);
1430 goto out_err_crypto_release;
1432 tcp_ses->min_offload = ctx->min_offload;
1433 tcp_ses->tcpStatus = CifsNeedNegotiate;
1435 if ((ctx->max_credits < 20) || (ctx->max_credits > 60000))
1436 tcp_ses->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
1438 tcp_ses->max_credits = ctx->max_credits;
1440 tcp_ses->nr_targets = 1;
1441 tcp_ses->ignore_signature = ctx->ignore_signature;
1442 /* thread spawned, put it on the list */
1443 spin_lock(&cifs_tcp_ses_lock);
1444 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
1445 spin_unlock(&cifs_tcp_ses_lock);
1447 cifs_fscache_get_client_cookie(tcp_ses);
1449 /* queue echo request delayed work */
1450 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
1454 out_err_crypto_release:
1455 cifs_crypto_secmech_release(tcp_ses);
1457 put_net(cifs_net_ns(tcp_ses));
1461 if (!IS_ERR(tcp_ses->hostname))
1462 kfree(tcp_ses->hostname);
1463 if (tcp_ses->ssocket)
1464 sock_release(tcp_ses->ssocket);
1470 static int match_session(struct cifs_ses *ses, struct smb3_fs_context *ctx)
1472 if (ctx->sectype != Unspecified &&
1473 ctx->sectype != ses->sectype)
1477 * If an existing session is limited to less channels than
1478 * requested, it should not be reused
1480 if (ses->chan_max < ctx->max_channels)
1483 switch (ses->sectype) {
1485 if (!uid_eq(ctx->cred_uid, ses->cred_uid))
1489 /* NULL username means anonymous session */
1490 if (ses->user_name == NULL) {
1496 /* anything else takes username/password */
1497 if (strncmp(ses->user_name,
1498 ctx->username ? ctx->username : "",
1499 CIFS_MAX_USERNAME_LEN))
1501 if ((ctx->username && strlen(ctx->username) != 0) &&
1502 ses->password != NULL &&
1503 strncmp(ses->password,
1504 ctx->password ? ctx->password : "",
1505 CIFS_MAX_PASSWORD_LEN))
1512 * cifs_setup_ipc - helper to setup the IPC tcon for the session
1514 * A new IPC connection is made and stored in the session
1515 * tcon_ipc. The IPC tcon has the same lifetime as the session.
1518 cifs_setup_ipc(struct cifs_ses *ses, struct smb3_fs_context *ctx)
1521 struct cifs_tcon *tcon;
1522 char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0};
1524 struct TCP_Server_Info *server = ses->server;
1527 * If the mount request that resulted in the creation of the
1528 * session requires encryption, force IPC to be encrypted too.
1531 if (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
1534 cifs_server_dbg(VFS,
1535 "IPC: server doesn't support encryption\n");
1540 tcon = tconInfoAlloc();
1544 scnprintf(unc, sizeof(unc), "\\\\%s\\IPC$", server->hostname);
1550 rc = server->ops->tree_connect(xid, ses, unc, tcon, ctx->local_nls);
1554 cifs_server_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
1559 cifs_dbg(FYI, "IPC tcon rc = %d ipc tid = %d\n", rc, tcon->tid);
1561 ses->tcon_ipc = tcon;
1567 * cifs_free_ipc - helper to release the session IPC tcon
1569 * Needs to be called everytime a session is destroyed
1572 cifs_free_ipc(struct cifs_ses *ses)
1575 struct cifs_tcon *tcon = ses->tcon_ipc;
1580 if (ses->server->ops->tree_disconnect) {
1582 rc = ses->server->ops->tree_disconnect(xid, tcon);
1587 cifs_dbg(FYI, "failed to disconnect IPC tcon (rc=%d)\n", rc);
1590 ses->tcon_ipc = NULL;
1594 static struct cifs_ses *
1595 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1597 struct cifs_ses *ses;
1599 spin_lock(&cifs_tcp_ses_lock);
1600 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
1601 if (ses->status == CifsExiting)
1603 if (!match_session(ses, ctx))
1606 spin_unlock(&cifs_tcp_ses_lock);
1609 spin_unlock(&cifs_tcp_ses_lock);
1613 void cifs_put_smb_ses(struct cifs_ses *ses)
1615 unsigned int rc, xid;
1616 struct TCP_Server_Info *server = ses->server;
1618 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
1620 spin_lock(&cifs_tcp_ses_lock);
1621 if (ses->status == CifsExiting) {
1622 spin_unlock(&cifs_tcp_ses_lock);
1625 if (--ses->ses_count > 0) {
1626 spin_unlock(&cifs_tcp_ses_lock);
1629 if (ses->status == CifsGood)
1630 ses->status = CifsExiting;
1631 spin_unlock(&cifs_tcp_ses_lock);
1635 if (ses->status == CifsExiting && server->ops->logoff) {
1637 rc = server->ops->logoff(xid, ses);
1639 cifs_server_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
1644 spin_lock(&cifs_tcp_ses_lock);
1645 list_del_init(&ses->smb_ses_list);
1646 spin_unlock(&cifs_tcp_ses_lock);
1648 /* close any extra channels */
1649 if (ses->chan_count > 1) {
1652 for (i = 1; i < ses->chan_count; i++)
1653 cifs_put_tcp_session(ses->chans[i].server, 0);
1657 cifs_put_tcp_session(server, 0);
1662 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
1663 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
1665 /* Populate username and pw fields from keyring if possible */
1667 cifs_set_cifscreds(struct smb3_fs_context *ctx, struct cifs_ses *ses)
1671 const char *delim, *payload;
1675 struct TCP_Server_Info *server = ses->server;
1676 struct sockaddr_in *sa;
1677 struct sockaddr_in6 *sa6;
1678 const struct user_key_payload *upayload;
1680 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
1684 /* try to find an address key first */
1685 switch (server->dstaddr.ss_family) {
1687 sa = (struct sockaddr_in *)&server->dstaddr;
1688 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
1691 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
1692 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
1695 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
1696 server->dstaddr.ss_family);
1701 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
1702 key = request_key(&key_type_logon, desc, "");
1704 if (!ses->domainName) {
1705 cifs_dbg(FYI, "domainName is NULL\n");
1710 /* didn't work, try to find a domain key */
1711 sprintf(desc, "cifs:d:%s", ses->domainName);
1712 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
1713 key = request_key(&key_type_logon, desc, "");
1721 down_read(&key->sem);
1722 upayload = user_key_payload_locked(key);
1723 if (IS_ERR_OR_NULL(upayload)) {
1724 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
1728 /* find first : in payload */
1729 payload = upayload->data;
1730 delim = strnchr(payload, upayload->datalen, ':');
1731 cifs_dbg(FYI, "payload=%s\n", payload);
1733 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
1739 len = delim - payload;
1740 if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
1741 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
1747 ctx->username = kstrndup(payload, len, GFP_KERNEL);
1748 if (!ctx->username) {
1749 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
1754 cifs_dbg(FYI, "%s: username=%s\n", __func__, ctx->username);
1756 len = key->datalen - (len + 1);
1757 if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
1758 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
1760 kfree(ctx->username);
1761 ctx->username = NULL;
1766 ctx->password = kstrndup(delim, len, GFP_KERNEL);
1767 if (!ctx->password) {
1768 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
1771 kfree(ctx->username);
1772 ctx->username = NULL;
1777 * If we have a domain key then we must set the domainName in the
1780 if (is_domain && ses->domainName) {
1781 ctx->domainname = kstrdup(ses->domainName, GFP_KERNEL);
1782 if (!ctx->domainname) {
1783 cifs_dbg(FYI, "Unable to allocate %zd bytes for domain\n",
1786 kfree(ctx->username);
1787 ctx->username = NULL;
1788 kfree_sensitive(ctx->password);
1789 ctx->password = NULL;
1799 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
1802 #else /* ! CONFIG_KEYS */
1804 cifs_set_cifscreds(struct smb3_fs_context *ctx __attribute__((unused)),
1805 struct cifs_ses *ses __attribute__((unused)))
1809 #endif /* CONFIG_KEYS */
1812 * cifs_get_smb_ses - get a session matching @ctx data from @server
1814 * This function assumes it is being called from cifs_mount() where we
1815 * already got a server reference (server refcount +1). See
1816 * cifs_get_tcon() for refcount explanations.
1819 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1823 struct cifs_ses *ses;
1824 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
1825 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
1829 ses = cifs_find_smb_ses(server, ctx);
1831 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
1834 mutex_lock(&ses->session_mutex);
1835 rc = cifs_negotiate_protocol(xid, ses);
1837 mutex_unlock(&ses->session_mutex);
1838 /* problem -- put our ses reference */
1839 cifs_put_smb_ses(ses);
1843 if (ses->need_reconnect) {
1844 cifs_dbg(FYI, "Session needs reconnect\n");
1845 rc = cifs_setup_session(xid, ses,
1848 mutex_unlock(&ses->session_mutex);
1849 /* problem -- put our reference */
1850 cifs_put_smb_ses(ses);
1855 mutex_unlock(&ses->session_mutex);
1857 /* existing SMB ses has a server reference already */
1858 cifs_put_tcp_session(server, 0);
1863 cifs_dbg(FYI, "Existing smb sess not found\n");
1864 ses = sesInfoAlloc();
1868 /* new SMB session uses our server ref */
1869 ses->server = server;
1870 if (server->dstaddr.ss_family == AF_INET6)
1871 sprintf(ses->ip_addr, "%pI6", &addr6->sin6_addr);
1873 sprintf(ses->ip_addr, "%pI4", &addr->sin_addr);
1875 if (ctx->username) {
1876 ses->user_name = kstrdup(ctx->username, GFP_KERNEL);
1877 if (!ses->user_name)
1881 /* ctx->password freed at unmount */
1882 if (ctx->password) {
1883 ses->password = kstrdup(ctx->password, GFP_KERNEL);
1887 if (ctx->domainname) {
1888 ses->domainName = kstrdup(ctx->domainname, GFP_KERNEL);
1889 if (!ses->domainName)
1892 if (ctx->domainauto)
1893 ses->domainAuto = ctx->domainauto;
1894 ses->cred_uid = ctx->cred_uid;
1895 ses->linux_uid = ctx->linux_uid;
1897 ses->sectype = ctx->sectype;
1898 ses->sign = ctx->sign;
1899 mutex_lock(&ses->session_mutex);
1901 /* add server as first channel */
1902 ses->chans[0].server = server;
1903 ses->chan_count = 1;
1904 ses->chan_max = ctx->multichannel ? ctx->max_channels:1;
1906 rc = cifs_negotiate_protocol(xid, ses);
1908 rc = cifs_setup_session(xid, ses, ctx->local_nls);
1910 /* each channel uses a different signing key */
1911 memcpy(ses->chans[0].signkey, ses->smb3signingkey,
1912 sizeof(ses->smb3signingkey));
1914 mutex_unlock(&ses->session_mutex);
1918 /* success, put it on the list and add it as first channel */
1919 spin_lock(&cifs_tcp_ses_lock);
1920 list_add(&ses->smb_ses_list, &server->smb_ses_list);
1921 spin_unlock(&cifs_tcp_ses_lock);
1925 cifs_setup_ipc(ses, ctx);
1935 static int match_tcon(struct cifs_tcon *tcon, struct smb3_fs_context *ctx)
1937 if (tcon->tidStatus == CifsExiting)
1939 if (strncmp(tcon->treeName, ctx->UNC, MAX_TREE_SIZE))
1941 if (tcon->seal != ctx->seal)
1943 if (tcon->snapshot_time != ctx->snapshot_time)
1945 if (tcon->handle_timeout != ctx->handle_timeout)
1947 if (tcon->no_lease != ctx->no_lease)
1949 if (tcon->nodelete != ctx->nodelete)
1954 static struct cifs_tcon *
1955 cifs_find_tcon(struct cifs_ses *ses, struct smb3_fs_context *ctx)
1957 struct list_head *tmp;
1958 struct cifs_tcon *tcon;
1960 spin_lock(&cifs_tcp_ses_lock);
1961 list_for_each(tmp, &ses->tcon_list) {
1962 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
1963 #ifdef CONFIG_CIFS_DFS_UPCALL
1967 if (!match_tcon(tcon, ctx))
1970 spin_unlock(&cifs_tcp_ses_lock);
1973 spin_unlock(&cifs_tcp_ses_lock);
1978 cifs_put_tcon(struct cifs_tcon *tcon)
1981 struct cifs_ses *ses;
1984 * IPC tcon share the lifetime of their session and are
1985 * destroyed in the session put function
1987 if (tcon == NULL || tcon->ipc)
1991 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
1992 spin_lock(&cifs_tcp_ses_lock);
1993 if (--tcon->tc_count > 0) {
1994 spin_unlock(&cifs_tcp_ses_lock);
1998 if (tcon->use_witness) {
2001 rc = cifs_swn_unregister(tcon);
2003 cifs_dbg(VFS, "%s: Failed to unregister for witness notifications: %d\n",
2008 list_del_init(&tcon->tcon_list);
2009 spin_unlock(&cifs_tcp_ses_lock);
2012 if (ses->server->ops->tree_disconnect)
2013 ses->server->ops->tree_disconnect(xid, tcon);
2016 cifs_fscache_release_super_cookie(tcon);
2018 cifs_put_smb_ses(ses);
2022 * cifs_get_tcon - get a tcon matching @ctx data from @ses
2024 * - tcon refcount is the number of mount points using the tcon.
2025 * - ses refcount is the number of tcon using the session.
2027 * 1. This function assumes it is being called from cifs_mount() where
2028 * we already got a session reference (ses refcount +1).
2030 * 2. Since we're in the context of adding a mount point, the end
2031 * result should be either:
2033 * a) a new tcon already allocated with refcount=1 (1 mount point) and
2034 * its session refcount incremented (1 new tcon). This +1 was
2035 * already done in (1).
2037 * b) an existing tcon with refcount+1 (add a mount point to it) and
2038 * identical ses refcount (no new tcon). Because of (1) we need to
2039 * decrement the ses refcount.
2041 static struct cifs_tcon *
2042 cifs_get_tcon(struct cifs_ses *ses, struct smb3_fs_context *ctx)
2045 struct cifs_tcon *tcon;
2047 tcon = cifs_find_tcon(ses, ctx);
2050 * tcon has refcount already incremented but we need to
2051 * decrement extra ses reference gotten by caller (case b)
2053 cifs_dbg(FYI, "Found match on UNC path\n");
2054 cifs_put_smb_ses(ses);
2058 if (!ses->server->ops->tree_connect) {
2063 tcon = tconInfoAlloc();
2069 if (ctx->snapshot_time) {
2070 if (ses->server->vals->protocol_id == 0) {
2072 "Use SMB2 or later for snapshot mount option\n");
2076 tcon->snapshot_time = ctx->snapshot_time;
2079 if (ctx->handle_timeout) {
2080 if (ses->server->vals->protocol_id == 0) {
2082 "Use SMB2.1 or later for handle timeout option\n");
2086 tcon->handle_timeout = ctx->handle_timeout;
2090 if (ctx->password) {
2091 tcon->password = kstrdup(ctx->password, GFP_KERNEL);
2092 if (!tcon->password) {
2099 if (ses->server->vals->protocol_id == 0) {
2101 "SMB3 or later required for encryption\n");
2104 } else if (tcon->ses->server->capabilities &
2105 SMB2_GLOBAL_CAP_ENCRYPTION)
2108 cifs_dbg(VFS, "Encryption is not supported on share\n");
2114 if (ctx->linux_ext) {
2115 if (ses->server->posix_ext_supported) {
2116 tcon->posix_extensions = true;
2117 pr_warn_once("SMB3.11 POSIX Extensions are experimental\n");
2119 cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions\n");
2126 * BB Do we need to wrap session_mutex around this TCon call and Unix
2127 * SetFS as we do on SessSetup and reconnect?
2130 rc = ses->server->ops->tree_connect(xid, ses, ctx->UNC, tcon,
2133 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
2137 tcon->use_persistent = false;
2138 /* check if SMB2 or later, CIFS does not support persistent handles */
2139 if (ctx->persistent) {
2140 if (ses->server->vals->protocol_id == 0) {
2142 "SMB3 or later required for persistent handles\n");
2145 } else if (ses->server->capabilities &
2146 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
2147 tcon->use_persistent = true;
2148 else /* persistent handles requested but not supported */ {
2150 "Persistent handles not supported on share\n");
2154 } else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
2155 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
2156 && (ctx->nopersistent == false)) {
2157 cifs_dbg(FYI, "enabling persistent handles\n");
2158 tcon->use_persistent = true;
2159 } else if (ctx->resilient) {
2160 if (ses->server->vals->protocol_id == 0) {
2162 "SMB2.1 or later required for resilient handles\n");
2166 tcon->use_resilient = true;
2169 tcon->use_witness = false;
2170 if (IS_ENABLED(CONFIG_CIFS_SWN_UPCALL) && ctx->witness) {
2171 if (ses->server->vals->protocol_id >= SMB30_PROT_ID) {
2172 if (tcon->capabilities & SMB2_SHARE_CAP_CLUSTER) {
2174 * Set witness in use flag in first place
2175 * to retry registration in the echo task
2177 tcon->use_witness = true;
2178 /* And try to register immediately */
2179 rc = cifs_swn_register(tcon);
2181 cifs_dbg(VFS, "Failed to register for witness notifications: %d\n", rc);
2185 /* TODO: try to extend for non-cluster uses (eg multichannel) */
2186 cifs_dbg(VFS, "witness requested on mount but no CLUSTER capability on share\n");
2191 cifs_dbg(VFS, "SMB3 or later required for witness option\n");
2197 /* If the user really knows what they are doing they can override */
2198 if (tcon->share_flags & SMB2_SHAREFLAG_NO_CACHING) {
2200 cifs_dbg(VFS, "cache=ro requested on mount but NO_CACHING flag set on share\n");
2201 else if (ctx->cache_rw)
2202 cifs_dbg(VFS, "cache=singleclient requested on mount but NO_CACHING flag set on share\n");
2205 if (ctx->no_lease) {
2206 if (ses->server->vals->protocol_id == 0) {
2208 "SMB2 or later required for nolease option\n");
2212 tcon->no_lease = ctx->no_lease;
2216 * We can have only one retry value for a connection to a share so for
2217 * resources mounted more than once to the same server share the last
2218 * value passed in for the retry flag is used.
2220 tcon->retry = ctx->retry;
2221 tcon->nocase = ctx->nocase;
2222 if (ses->server->capabilities & SMB2_GLOBAL_CAP_DIRECTORY_LEASING)
2223 tcon->nohandlecache = ctx->nohandlecache;
2225 tcon->nohandlecache = true;
2226 tcon->nodelete = ctx->nodelete;
2227 tcon->local_lease = ctx->local_lease;
2228 INIT_LIST_HEAD(&tcon->pending_opens);
2230 spin_lock(&cifs_tcp_ses_lock);
2231 list_add(&tcon->tcon_list, &ses->tcon_list);
2232 spin_unlock(&cifs_tcp_ses_lock);
2234 cifs_fscache_get_super_cookie(tcon);
2244 cifs_put_tlink(struct tcon_link *tlink)
2246 if (!tlink || IS_ERR(tlink))
2249 if (!atomic_dec_and_test(&tlink->tl_count) ||
2250 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
2251 tlink->tl_time = jiffies;
2255 if (!IS_ERR(tlink_tcon(tlink)))
2256 cifs_put_tcon(tlink_tcon(tlink));
2262 compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2264 struct cifs_sb_info *old = CIFS_SB(sb);
2265 struct cifs_sb_info *new = mnt_data->cifs_sb;
2266 unsigned int oldflags = old->mnt_cifs_flags & CIFS_MOUNT_MASK;
2267 unsigned int newflags = new->mnt_cifs_flags & CIFS_MOUNT_MASK;
2269 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
2272 if (old->mnt_cifs_serverino_autodisabled)
2273 newflags &= ~CIFS_MOUNT_SERVER_INUM;
2275 if (oldflags != newflags)
2279 * We want to share sb only if we don't specify an r/wsize or
2280 * specified r/wsize is greater than or equal to existing one.
2282 if (new->ctx->wsize && new->ctx->wsize < old->ctx->wsize)
2285 if (new->ctx->rsize && new->ctx->rsize < old->ctx->rsize)
2288 if (!uid_eq(old->ctx->linux_uid, new->ctx->linux_uid) ||
2289 !gid_eq(old->ctx->linux_gid, new->ctx->linux_gid))
2292 if (old->ctx->file_mode != new->ctx->file_mode ||
2293 old->ctx->dir_mode != new->ctx->dir_mode)
2296 if (strcmp(old->local_nls->charset, new->local_nls->charset))
2299 if (old->ctx->acregmax != new->ctx->acregmax)
2301 if (old->ctx->acdirmax != new->ctx->acdirmax)
2308 match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2310 struct cifs_sb_info *old = CIFS_SB(sb);
2311 struct cifs_sb_info *new = mnt_data->cifs_sb;
2312 bool old_set = (old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
2314 bool new_set = (new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
2317 if (old_set && new_set && !strcmp(new->prepath, old->prepath))
2319 else if (!old_set && !new_set)
2326 cifs_match_super(struct super_block *sb, void *data)
2328 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
2329 struct smb3_fs_context *ctx;
2330 struct cifs_sb_info *cifs_sb;
2331 struct TCP_Server_Info *tcp_srv;
2332 struct cifs_ses *ses;
2333 struct cifs_tcon *tcon;
2334 struct tcon_link *tlink;
2337 spin_lock(&cifs_tcp_ses_lock);
2338 cifs_sb = CIFS_SB(sb);
2339 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
2340 if (IS_ERR(tlink)) {
2341 spin_unlock(&cifs_tcp_ses_lock);
2344 tcon = tlink_tcon(tlink);
2346 tcp_srv = ses->server;
2348 ctx = mnt_data->ctx;
2350 if (!match_server(tcp_srv, ctx) ||
2351 !match_session(ses, ctx) ||
2352 !match_tcon(tcon, ctx) ||
2353 !match_prepath(sb, mnt_data)) {
2358 rc = compare_mount_options(sb, mnt_data);
2360 spin_unlock(&cifs_tcp_ses_lock);
2361 cifs_put_tlink(tlink);
2365 #ifdef CONFIG_DEBUG_LOCK_ALLOC
2366 static struct lock_class_key cifs_key[2];
2367 static struct lock_class_key cifs_slock_key[2];
2370 cifs_reclassify_socket4(struct socket *sock)
2372 struct sock *sk = sock->sk;
2373 BUG_ON(!sock_allow_reclassification(sk));
2374 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
2375 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
2379 cifs_reclassify_socket6(struct socket *sock)
2381 struct sock *sk = sock->sk;
2382 BUG_ON(!sock_allow_reclassification(sk));
2383 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
2384 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
2388 cifs_reclassify_socket4(struct socket *sock)
2393 cifs_reclassify_socket6(struct socket *sock)
2398 /* See RFC1001 section 14 on representation of Netbios names */
2399 static void rfc1002mangle(char *target, char *source, unsigned int length)
2403 for (i = 0, j = 0; i < (length); i++) {
2404 /* mask a nibble at a time and encode */
2405 target[j] = 'A' + (0x0F & (source[i] >> 4));
2406 target[j+1] = 'A' + (0x0F & source[i]);
2413 bind_socket(struct TCP_Server_Info *server)
2416 if (server->srcaddr.ss_family != AF_UNSPEC) {
2417 /* Bind to the specified local IP address */
2418 struct socket *socket = server->ssocket;
2419 rc = socket->ops->bind(socket,
2420 (struct sockaddr *) &server->srcaddr,
2421 sizeof(server->srcaddr));
2423 struct sockaddr_in *saddr4;
2424 struct sockaddr_in6 *saddr6;
2425 saddr4 = (struct sockaddr_in *)&server->srcaddr;
2426 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
2427 if (saddr6->sin6_family == AF_INET6)
2428 cifs_server_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
2429 &saddr6->sin6_addr, rc);
2431 cifs_server_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
2432 &saddr4->sin_addr.s_addr, rc);
2439 ip_rfc1001_connect(struct TCP_Server_Info *server)
2443 * some servers require RFC1001 sessinit before sending
2444 * negprot - BB check reconnection in case where second
2445 * sessinit is sent but no second negprot
2447 struct rfc1002_session_packet *ses_init_buf;
2448 struct smb_hdr *smb_buf;
2449 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
2452 ses_init_buf->trailer.session_req.called_len = 32;
2454 if (server->server_RFC1001_name[0] != 0)
2455 rfc1002mangle(ses_init_buf->trailer.
2456 session_req.called_name,
2457 server->server_RFC1001_name,
2458 RFC1001_NAME_LEN_WITH_NULL);
2460 rfc1002mangle(ses_init_buf->trailer.
2461 session_req.called_name,
2462 DEFAULT_CIFS_CALLED_NAME,
2463 RFC1001_NAME_LEN_WITH_NULL);
2465 ses_init_buf->trailer.session_req.calling_len = 32;
2468 * calling name ends in null (byte 16) from old smb
2471 if (server->workstation_RFC1001_name[0] != 0)
2472 rfc1002mangle(ses_init_buf->trailer.
2473 session_req.calling_name,
2474 server->workstation_RFC1001_name,
2475 RFC1001_NAME_LEN_WITH_NULL);
2477 rfc1002mangle(ses_init_buf->trailer.
2478 session_req.calling_name,
2480 RFC1001_NAME_LEN_WITH_NULL);
2482 ses_init_buf->trailer.session_req.scope1 = 0;
2483 ses_init_buf->trailer.session_req.scope2 = 0;
2484 smb_buf = (struct smb_hdr *)ses_init_buf;
2486 /* sizeof RFC1002_SESSION_REQUEST with no scope */
2487 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
2488 rc = smb_send(server, smb_buf, 0x44);
2489 kfree(ses_init_buf);
2491 * RFC1001 layer in at least one server
2492 * requires very short break before negprot
2493 * presumably because not expecting negprot
2494 * to follow so fast. This is a simple
2495 * solution that works without
2496 * complicating the code and causes no
2497 * significant slowing down on mount
2500 usleep_range(1000, 2000);
2503 * else the negprot may still work without this
2504 * even though malloc failed
2511 generic_ip_connect(struct TCP_Server_Info *server)
2516 struct socket *socket = server->ssocket;
2517 struct sockaddr *saddr;
2519 saddr = (struct sockaddr *) &server->dstaddr;
2521 if (server->dstaddr.ss_family == AF_INET6) {
2522 struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)&server->dstaddr;
2524 sport = ipv6->sin6_port;
2525 slen = sizeof(struct sockaddr_in6);
2527 cifs_dbg(FYI, "%s: connecting to [%pI6]:%d\n", __func__, &ipv6->sin6_addr,
2530 struct sockaddr_in *ipv4 = (struct sockaddr_in *)&server->dstaddr;
2532 sport = ipv4->sin_port;
2533 slen = sizeof(struct sockaddr_in);
2535 cifs_dbg(FYI, "%s: connecting to %pI4:%d\n", __func__, &ipv4->sin_addr,
2539 if (socket == NULL) {
2540 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
2541 IPPROTO_TCP, &socket, 1);
2543 cifs_server_dbg(VFS, "Error %d creating socket\n", rc);
2544 server->ssocket = NULL;
2548 /* BB other socket options to set KEEPALIVE, NODELAY? */
2549 cifs_dbg(FYI, "Socket created\n");
2550 server->ssocket = socket;
2551 socket->sk->sk_allocation = GFP_NOFS;
2552 if (sfamily == AF_INET6)
2553 cifs_reclassify_socket6(socket);
2555 cifs_reclassify_socket4(socket);
2558 rc = bind_socket(server);
2563 * Eventually check for other socket options to change from
2564 * the default. sock_setsockopt not used because it expects
2567 socket->sk->sk_rcvtimeo = 7 * HZ;
2568 socket->sk->sk_sndtimeo = 5 * HZ;
2570 /* make the bufsizes depend on wsize/rsize and max requests */
2571 if (server->noautotune) {
2572 if (socket->sk->sk_sndbuf < (200 * 1024))
2573 socket->sk->sk_sndbuf = 200 * 1024;
2574 if (socket->sk->sk_rcvbuf < (140 * 1024))
2575 socket->sk->sk_rcvbuf = 140 * 1024;
2578 if (server->tcp_nodelay)
2579 tcp_sock_set_nodelay(socket->sk);
2581 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
2582 socket->sk->sk_sndbuf,
2583 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
2585 rc = socket->ops->connect(socket, saddr, slen,
2586 server->noblockcnt ? O_NONBLOCK : 0);
2588 * When mounting SMB root file systems, we do not want to block in
2589 * connect. Otherwise bail out and then let cifs_reconnect() perform
2590 * reconnect failover - if possible.
2592 if (server->noblockcnt && rc == -EINPROGRESS)
2595 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
2596 sock_release(socket);
2597 server->ssocket = NULL;
2601 if (sport == htons(RFC1001_PORT))
2602 rc = ip_rfc1001_connect(server);
2608 ip_connect(struct TCP_Server_Info *server)
2611 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2612 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2614 if (server->dstaddr.ss_family == AF_INET6)
2615 sport = &addr6->sin6_port;
2617 sport = &addr->sin_port;
2622 /* try with 445 port at first */
2623 *sport = htons(CIFS_PORT);
2625 rc = generic_ip_connect(server);
2629 /* if it failed, try with 139 port */
2630 *sport = htons(RFC1001_PORT);
2633 return generic_ip_connect(server);
2636 void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
2637 struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
2640 * If we are reconnecting then should we check to see if
2641 * any requested capabilities changed locally e.g. via
2642 * remount but we can not do much about it here
2643 * if they have (even if we could detect it by the following)
2644 * Perhaps we could add a backpointer to array of sb from tcon
2645 * or if we change to make all sb to same share the same
2646 * sb as NFS - then we only have one backpointer to sb.
2647 * What if we wanted to mount the server share twice once with
2648 * and once without posixacls or posix paths?
2650 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
2652 if (ctx && ctx->no_linux_ext) {
2653 tcon->fsUnixInfo.Capability = 0;
2654 tcon->unix_ext = 0; /* Unix Extensions disabled */
2655 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
2658 tcon->unix_ext = 1; /* Unix Extensions supported */
2660 if (!tcon->unix_ext) {
2661 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
2665 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
2666 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
2667 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
2669 * check for reconnect case in which we do not
2670 * want to change the mount behavior if we can avoid it
2674 * turn off POSIX ACL and PATHNAMES if not set
2675 * originally at mount time
2677 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
2678 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
2679 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
2680 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
2681 cifs_dbg(VFS, "POSIXPATH support change\n");
2682 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
2683 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
2684 cifs_dbg(VFS, "possible reconnect error\n");
2685 cifs_dbg(VFS, "server disabled POSIX path support\n");
2689 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
2690 cifs_dbg(VFS, "per-share encryption not supported yet\n");
2692 cap &= CIFS_UNIX_CAP_MASK;
2693 if (ctx && ctx->no_psx_acl)
2694 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
2695 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
2696 cifs_dbg(FYI, "negotiated posix acl support\n");
2698 cifs_sb->mnt_cifs_flags |=
2699 CIFS_MOUNT_POSIXACL;
2702 if (ctx && ctx->posix_paths == 0)
2703 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
2704 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
2705 cifs_dbg(FYI, "negotiate posix pathnames\n");
2707 cifs_sb->mnt_cifs_flags |=
2708 CIFS_MOUNT_POSIX_PATHS;
2711 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
2712 #ifdef CONFIG_CIFS_DEBUG2
2713 if (cap & CIFS_UNIX_FCNTL_CAP)
2714 cifs_dbg(FYI, "FCNTL cap\n");
2715 if (cap & CIFS_UNIX_EXTATTR_CAP)
2716 cifs_dbg(FYI, "EXTATTR cap\n");
2717 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
2718 cifs_dbg(FYI, "POSIX path cap\n");
2719 if (cap & CIFS_UNIX_XATTR_CAP)
2720 cifs_dbg(FYI, "XATTR cap\n");
2721 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
2722 cifs_dbg(FYI, "POSIX ACL cap\n");
2723 if (cap & CIFS_UNIX_LARGE_READ_CAP)
2724 cifs_dbg(FYI, "very large read cap\n");
2725 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
2726 cifs_dbg(FYI, "very large write cap\n");
2727 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
2728 cifs_dbg(FYI, "transport encryption cap\n");
2729 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
2730 cifs_dbg(FYI, "mandatory transport encryption cap\n");
2731 #endif /* CIFS_DEBUG2 */
2732 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
2734 cifs_dbg(FYI, "resetting capabilities failed\n");
2736 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");
2742 int cifs_setup_cifs_sb(struct cifs_sb_info *cifs_sb)
2744 struct smb3_fs_context *ctx = cifs_sb->ctx;
2746 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
2748 spin_lock_init(&cifs_sb->tlink_tree_lock);
2749 cifs_sb->tlink_tree = RB_ROOT;
2751 cifs_dbg(FYI, "file mode: %04ho dir mode: %04ho\n",
2752 ctx->file_mode, ctx->dir_mode);
2754 /* this is needed for ASCII cp to Unicode converts */
2755 if (ctx->iocharset == NULL) {
2756 /* load_nls_default cannot return null */
2757 cifs_sb->local_nls = load_nls_default();
2759 cifs_sb->local_nls = load_nls(ctx->iocharset);
2760 if (cifs_sb->local_nls == NULL) {
2761 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
2766 ctx->local_nls = cifs_sb->local_nls;
2768 smb3_update_mnt_flags(cifs_sb);
2771 cifs_dbg(FYI, "mounting share using direct i/o\n");
2772 if (ctx->cache_ro) {
2773 cifs_dbg(VFS, "mounting share with read only caching. Ensure that the share will not be modified while in use.\n");
2774 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RO_CACHE;
2775 } else if (ctx->cache_rw) {
2776 cifs_dbg(VFS, "mounting share in single client RW caching mode. Ensure that no other systems will be accessing the share.\n");
2777 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_RO_CACHE |
2778 CIFS_MOUNT_RW_CACHE);
2781 if ((ctx->cifs_acl) && (ctx->dynperm))
2782 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
2785 cifs_sb->prepath = kstrdup(ctx->prepath, GFP_KERNEL);
2786 if (cifs_sb->prepath == NULL)
2788 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
2794 /* Release all succeed connections */
2795 static inline void mount_put_conns(struct cifs_sb_info *cifs_sb,
2797 struct TCP_Server_Info *server,
2798 struct cifs_ses *ses, struct cifs_tcon *tcon)
2803 cifs_put_tcon(tcon);
2805 cifs_put_smb_ses(ses);
2807 cifs_put_tcp_session(server, 0);
2808 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
2812 /* Get connections for tcp, ses and tcon */
2813 static int mount_get_conns(struct smb3_fs_context *ctx, struct cifs_sb_info *cifs_sb,
2815 struct TCP_Server_Info **nserver,
2816 struct cifs_ses **nses, struct cifs_tcon **ntcon)
2819 struct TCP_Server_Info *server;
2820 struct cifs_ses *ses;
2821 struct cifs_tcon *tcon;
2829 /* get a reference to a tcp session */
2830 server = cifs_get_tcp_session(ctx);
2831 if (IS_ERR(server)) {
2832 rc = PTR_ERR(server);
2838 /* get a reference to a SMB session */
2839 ses = cifs_get_smb_ses(server, ctx);
2847 if ((ctx->persistent == true) && (!(ses->server->capabilities &
2848 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES))) {
2849 cifs_server_dbg(VFS, "persistent handles not supported by server\n");
2853 /* search for existing tcon to this server share */
2854 tcon = cifs_get_tcon(ses, ctx);
2862 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
2863 if (tcon->posix_extensions)
2864 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
2866 /* tell server which Unix caps we support */
2867 if (cap_unix(tcon->ses)) {
2869 * reset of caps checks mount to see if unix extensions disabled
2870 * for just this mount.
2872 reset_cifs_unix_caps(*xid, tcon, cifs_sb, ctx);
2873 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
2874 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
2875 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP))
2878 tcon->unix_ext = 0; /* server does not support them */
2880 /* do not care if a following call succeed - informational */
2881 if (!tcon->pipe && server->ops->qfs_tcon) {
2882 server->ops->qfs_tcon(*xid, tcon, cifs_sb);
2883 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE) {
2884 if (tcon->fsDevInfo.DeviceCharacteristics &
2885 cpu_to_le32(FILE_READ_ONLY_DEVICE))
2886 cifs_dbg(VFS, "mounted to read only share\n");
2887 else if ((cifs_sb->mnt_cifs_flags &
2888 CIFS_MOUNT_RW_CACHE) == 0)
2889 cifs_dbg(VFS, "read only mount of RW share\n");
2890 /* no need to log a RW mount of a typical RW share */
2895 * Clamp the rsize/wsize mount arguments if they are too big for the server
2896 * and set the rsize/wsize to the negotiated values if not passed in by
2899 if ((cifs_sb->ctx->wsize == 0) ||
2900 (cifs_sb->ctx->wsize > server->ops->negotiate_wsize(tcon, ctx)))
2901 cifs_sb->ctx->wsize = server->ops->negotiate_wsize(tcon, ctx);
2902 if ((cifs_sb->ctx->rsize == 0) ||
2903 (cifs_sb->ctx->rsize > server->ops->negotiate_rsize(tcon, ctx)))
2904 cifs_sb->ctx->rsize = server->ops->negotiate_rsize(tcon, ctx);
2909 static int mount_setup_tlink(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
2910 struct cifs_tcon *tcon)
2912 struct tcon_link *tlink;
2914 /* hang the tcon off of the superblock */
2915 tlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
2919 tlink->tl_uid = ses->linux_uid;
2920 tlink->tl_tcon = tcon;
2921 tlink->tl_time = jiffies;
2922 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
2923 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
2925 cifs_sb->master_tlink = tlink;
2926 spin_lock(&cifs_sb->tlink_tree_lock);
2927 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
2928 spin_unlock(&cifs_sb->tlink_tree_lock);
2930 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
2935 #ifdef CONFIG_CIFS_DFS_UPCALL
2937 * cifs_build_path_to_root returns full path to root when we do not have an
2938 * existing connection (tcon)
2941 build_unc_path_to_root(const struct smb3_fs_context *ctx,
2942 const struct cifs_sb_info *cifs_sb, bool useppath)
2944 char *full_path, *pos;
2945 unsigned int pplen = useppath && ctx->prepath ?
2946 strlen(ctx->prepath) + 1 : 0;
2947 unsigned int unc_len = strnlen(ctx->UNC, MAX_TREE_SIZE + 1);
2949 if (unc_len > MAX_TREE_SIZE)
2950 return ERR_PTR(-EINVAL);
2952 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
2953 if (full_path == NULL)
2954 return ERR_PTR(-ENOMEM);
2956 memcpy(full_path, ctx->UNC, unc_len);
2957 pos = full_path + unc_len;
2960 *pos = CIFS_DIR_SEP(cifs_sb);
2961 memcpy(pos + 1, ctx->prepath, pplen);
2965 *pos = '\0'; /* add trailing null */
2966 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
2967 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
2972 * expand_dfs_referral - Perform a dfs referral query and update the cifs_sb
2974 * If a referral is found, cifs_sb->ctx->mount_options will be (re-)allocated
2975 * to a string containing updated options for the submount. Otherwise it
2976 * will be left untouched.
2978 * Returns the rc from get_dfs_path to the caller, which can be used to
2979 * determine whether there were referrals.
2982 expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
2983 struct smb3_fs_context *ctx, struct cifs_sb_info *cifs_sb,
2987 struct dfs_info3_param referral = {0};
2988 char *full_path = NULL, *mdata = NULL;
2990 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
2993 full_path = build_unc_path_to_root(ctx, cifs_sb, true);
2994 if (IS_ERR(full_path))
2995 return PTR_ERR(full_path);
2997 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
2998 ref_path, &referral, NULL);
3000 char *fake_devname = NULL;
3002 mdata = cifs_compose_mount_options(cifs_sb->ctx->mount_options,
3003 full_path + 1, &referral,
3005 free_dfs_info_param(&referral);
3007 if (IS_ERR(mdata)) {
3008 rc = PTR_ERR(mdata);
3012 * We can not clear out the whole structure since we
3013 * no longer have an explicit function to parse
3014 * a mount-string. Instead we need to clear out the
3015 * individual fields that are no longer valid.
3017 kfree(ctx->prepath);
3018 ctx->prepath = NULL;
3019 rc = cifs_setup_volume_info(ctx, mdata, fake_devname);
3021 kfree(fake_devname);
3022 kfree(cifs_sb->ctx->mount_options);
3023 cifs_sb->ctx->mount_options = mdata;
3029 static inline int get_next_dfs_tgt(const char *path,
3030 struct dfs_cache_tgt_list *tgt_list,
3031 struct dfs_cache_tgt_iterator **tgt_it)
3034 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
3036 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
3037 return !*tgt_it ? -EHOSTDOWN : 0;
3040 static int update_vol_info(const struct dfs_cache_tgt_iterator *tgt_it,
3041 struct smb3_fs_context *fake_ctx, struct smb3_fs_context *ctx)
3043 const char *tgt = dfs_cache_get_tgt_name(tgt_it);
3044 int len = strlen(tgt) + 2;
3047 new_unc = kmalloc(len, GFP_KERNEL);
3050 scnprintf(new_unc, len, "\\%s", tgt);
3055 if (fake_ctx->prepath) {
3056 kfree(ctx->prepath);
3057 ctx->prepath = fake_ctx->prepath;
3058 fake_ctx->prepath = NULL;
3060 memcpy(&ctx->dstaddr, &fake_ctx->dstaddr, sizeof(ctx->dstaddr));
3065 static int do_dfs_failover(const char *path, const char *full_path, struct cifs_sb_info *cifs_sb,
3066 struct smb3_fs_context *ctx, struct cifs_ses *root_ses,
3067 unsigned int *xid, struct TCP_Server_Info **server,
3068 struct cifs_ses **ses, struct cifs_tcon **tcon)
3071 struct dfs_cache_tgt_list tgt_list = {0};
3072 struct dfs_cache_tgt_iterator *tgt_it = NULL;
3073 struct smb3_fs_context tmp_ctx = {NULL};
3075 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
3078 cifs_dbg(FYI, "%s: path=%s full_path=%s\n", __func__, path, full_path);
3080 rc = dfs_cache_noreq_find(path, NULL, &tgt_list);
3084 * We use a 'tmp_ctx' here because we need pass it down to the mount_{get,put} functions to
3085 * test connection against new DFS targets.
3087 rc = smb3_fs_context_dup(&tmp_ctx, ctx);
3092 struct dfs_info3_param ref = {0};
3093 char *fake_devname = NULL, *mdata = NULL;
3095 /* Get next DFS target server - if any */
3096 rc = get_next_dfs_tgt(path, &tgt_list, &tgt_it);
3100 rc = dfs_cache_get_tgt_referral(path, tgt_it, &ref);
3104 cifs_dbg(FYI, "%s: old ctx: UNC=%s prepath=%s\n", __func__, tmp_ctx.UNC,
3107 mdata = cifs_compose_mount_options(cifs_sb->ctx->mount_options, full_path + 1, &ref,
3109 free_dfs_info_param(&ref);
3111 if (IS_ERR(mdata)) {
3112 rc = PTR_ERR(mdata);
3115 rc = cifs_setup_volume_info(&tmp_ctx, mdata, fake_devname);
3118 kfree(fake_devname);
3123 cifs_dbg(FYI, "%s: new ctx: UNC=%s prepath=%s\n", __func__, tmp_ctx.UNC,
3126 mount_put_conns(cifs_sb, *xid, *server, *ses, *tcon);
3127 rc = mount_get_conns(&tmp_ctx, cifs_sb, xid, server, ses, tcon);
3128 if (!rc || (*server && *ses)) {
3130 * We were able to connect to new target server. Update current context with
3131 * new target server.
3133 rc = update_vol_info(tgt_it, &tmp_ctx, ctx);
3138 cifs_dbg(FYI, "%s: final ctx: UNC=%s prepath=%s\n", __func__, tmp_ctx.UNC,
3141 * Update DFS target hint in DFS referral cache with the target server we
3142 * successfully reconnected to.
3144 rc = dfs_cache_update_tgthint(*xid, root_ses ? root_ses : *ses, cifs_sb->local_nls,
3145 cifs_remap(cifs_sb), path, tgt_it);
3149 smb3_cleanup_fs_context_contents(&tmp_ctx);
3150 dfs_cache_free_tgts(&tgt_list);
3155 /* TODO: all callers to this are broken. We are not parsing mount_options here
3156 * we should pass a clone of the original context?
3159 cifs_setup_volume_info(struct smb3_fs_context *ctx, const char *mntopts, const char *devname)
3163 smb3_parse_devname(devname, ctx);
3168 cifs_dbg(FYI, "%s: mntopts=%s\n", __func__, mntopts);
3169 rc = smb3_parse_opt(mntopts, "ip", &ip);
3170 if (!rc && !cifs_convert_address((struct sockaddr *)&ctx->dstaddr, ip,
3172 cifs_dbg(VFS, "%s: failed to convert ip address\n", __func__);
3177 if (ctx->nullauth) {
3178 cifs_dbg(FYI, "Anonymous login\n");
3179 kfree(ctx->username);
3180 ctx->username = NULL;
3181 } else if (ctx->username) {
3182 /* BB fixme parse for domain name here */
3183 cifs_dbg(FYI, "Username: %s\n", ctx->username);
3185 cifs_dbg(VFS, "No username specified\n");
3186 /* In userspace mount helper we can get user name from alternate
3187 locations such as env variables and files on disk */
3195 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
3197 struct cifs_tcon *tcon,
3198 struct cifs_sb_info *cifs_sb,
3205 int skip = added_treename ? 1 : 0;
3207 sep = CIFS_DIR_SEP(cifs_sb);
3210 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
3212 /* skip separators */
3217 /* next separator */
3218 while (*s && *s != sep)
3221 * if the treename is added, we then have to skip the first
3222 * part within the separators
3229 * temporarily null-terminate the path at the end of
3230 * the current component
3234 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3242 * Check if path is remote (e.g. a DFS share). Return -EREMOTE if it is,
3245 static int is_path_remote(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx,
3246 const unsigned int xid,
3247 struct TCP_Server_Info *server,
3248 struct cifs_tcon *tcon)
3253 if (!server->ops->is_path_accessible)
3257 * cifs_build_path_to_root works only when we have a valid tcon
3259 full_path = cifs_build_path_to_root(ctx, cifs_sb, tcon,
3260 tcon->Flags & SMB_SHARE_IS_IN_DFS);
3261 if (full_path == NULL)
3264 cifs_dbg(FYI, "%s: full_path: %s\n", __func__, full_path);
3266 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3268 if (rc != 0 && rc != -EREMOTE) {
3273 if (rc != -EREMOTE) {
3274 rc = cifs_are_all_path_components_accessible(server, xid, tcon,
3275 cifs_sb, full_path, tcon->Flags & SMB_SHARE_IS_IN_DFS);
3277 cifs_server_dbg(VFS, "cannot query dirs between root and final path, enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
3278 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
3287 #ifdef CONFIG_CIFS_DFS_UPCALL
3288 static void set_root_ses(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
3289 struct cifs_ses **root_ses)
3292 spin_lock(&cifs_tcp_ses_lock);
3295 ses->tcon_ipc->remap = cifs_remap(cifs_sb);
3296 spin_unlock(&cifs_tcp_ses_lock);
3301 static void put_root_ses(struct cifs_ses *ses)
3304 cifs_put_smb_ses(ses);
3307 /* Set up next dfs prefix path in @dfs_path */
3308 static int next_dfs_prepath(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx,
3309 const unsigned int xid, struct TCP_Server_Info *server,
3310 struct cifs_tcon *tcon, char **dfs_path)
3313 int added_treename = is_tcon_dfs(tcon);
3316 path = cifs_build_path_to_root(ctx, cifs_sb, tcon, added_treename);
3320 rc = is_path_remote(cifs_sb, ctx, xid, server, tcon);
3321 if (rc == -EREMOTE) {
3322 struct smb3_fs_context v = {NULL};
3323 /* if @path contains a tree name, skip it in the prefix path */
3324 if (added_treename) {
3325 rc = smb3_parse_devname(path, &v);
3328 npath = build_unc_path_to_root(&v, cifs_sb, true);
3329 smb3_cleanup_fs_context_contents(&v);
3332 v.prepath = path + 1;
3333 npath = build_unc_path_to_root(&v, cifs_sb, true);
3336 if (IS_ERR(npath)) {
3337 rc = PTR_ERR(npath);
3351 /* Check if resolved targets can handle any DFS referrals */
3352 static int is_referral_server(const char *ref_path, struct cifs_tcon *tcon, bool *ref_server)
3355 struct dfs_info3_param ref = {0};
3357 if (is_tcon_dfs(tcon)) {
3360 cifs_dbg(FYI, "%s: ref_path=%s\n", __func__, ref_path);
3362 rc = dfs_cache_noreq_find(ref_path, &ref, NULL);
3364 cifs_dbg(VFS, "%s: dfs_cache_noreq_find: failed (rc=%d)\n", __func__, rc);
3367 cifs_dbg(FYI, "%s: ref.flags=0x%x\n", __func__, ref.flags);
3369 * Check if all targets are capable of handling DFS referrals as per
3370 * MS-DFSC 2.2.4 RESP_GET_DFS_REFERRAL.
3372 *ref_server = !!(ref.flags & DFSREF_REFERRAL_SERVER);
3373 free_dfs_info_param(&ref);
3378 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
3382 struct TCP_Server_Info *server = NULL;
3383 struct cifs_ses *ses = NULL, *root_ses = NULL;
3384 struct cifs_tcon *tcon = NULL;
3386 char *ref_path = NULL, *full_path = NULL;
3387 char *oldmnt = NULL;
3388 char *mntdata = NULL;
3389 bool ref_server = false;
3391 rc = mount_get_conns(ctx, cifs_sb, &xid, &server, &ses, &tcon);
3393 * If called with 'nodfs' mount option, then skip DFS resolving. Otherwise unconditionally
3394 * try to get an DFS referral (even cached) to determine whether it is an DFS mount.
3396 * Skip prefix path to provide support for DFS referrals from w2k8 servers which don't seem
3397 * to respond with PATH_NOT_COVERED to requests that include the prefix.
3399 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS) ||
3400 dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb), ctx->UNC + 1, NULL,
3404 /* Check if it is fully accessible and then mount it */
3405 rc = is_path_remote(cifs_sb, ctx, xid, server, tcon);
3411 /* Save mount options */
3412 mntdata = kstrdup(cifs_sb->ctx->mount_options, GFP_KERNEL);
3417 /* Get path of DFS root */
3418 ref_path = build_unc_path_to_root(ctx, cifs_sb, false);
3419 if (IS_ERR(ref_path)) {
3420 rc = PTR_ERR(ref_path);
3425 set_root_ses(cifs_sb, ses, &root_ses);
3427 /* Save full path of last DFS path we used to resolve final target server */
3429 full_path = build_unc_path_to_root(ctx, cifs_sb, !!count);
3430 if (IS_ERR(full_path)) {
3431 rc = PTR_ERR(full_path);
3435 /* Chase referral */
3436 oldmnt = cifs_sb->ctx->mount_options;
3437 rc = expand_dfs_referral(xid, root_ses, ctx, cifs_sb, ref_path + 1);
3440 /* Connect to new DFS target only if we were redirected */
3441 if (oldmnt != cifs_sb->ctx->mount_options) {
3442 mount_put_conns(cifs_sb, xid, server, ses, tcon);
3443 rc = mount_get_conns(ctx, cifs_sb, &xid, &server, &ses, &tcon);
3445 if (rc && !server && !ses) {
3446 /* Failed to connect. Try to connect to other targets in the referral. */
3447 rc = do_dfs_failover(ref_path + 1, full_path, cifs_sb, ctx, root_ses, &xid,
3448 &server, &ses, &tcon);
3450 if (rc == -EACCES || rc == -EOPNOTSUPP || !server || !ses)
3455 /* Make sure that requests go through new root servers */
3456 rc = is_referral_server(ref_path + 1, tcon, &ref_server);
3460 put_root_ses(root_ses);
3461 set_root_ses(cifs_sb, ses, &root_ses);
3464 /* Get next dfs path and then continue chasing them if -EREMOTE */
3465 rc = next_dfs_prepath(cifs_sb, ctx, xid, server, tcon, &ref_path);
3466 /* Prevent recursion on broken link referrals */
3467 if (rc == -EREMOTE && ++count > MAX_NESTED_LINKS)
3469 } while (rc == -EREMOTE);
3473 put_root_ses(root_ses);
3478 * Store DFS full path in both superblock and tree connect structures.
3480 * For DFS root mounts, the prefix path (cifs_sb->prepath) is preserved during reconnect so
3481 * only the root path is set in cifs_sb->origin_fullpath and tcon->dfs_path. And for DFS
3482 * links, the prefix path is included in both and may be changed during reconnect. See
3483 * cifs_tree_connect().
3485 cifs_sb->origin_fullpath = kstrdup(full_path, GFP_KERNEL);
3486 if (!cifs_sb->origin_fullpath) {
3490 spin_lock(&cifs_tcp_ses_lock);
3491 tcon->dfs_path = full_path;
3493 tcon->remap = cifs_remap(cifs_sb);
3494 spin_unlock(&cifs_tcp_ses_lock);
3496 /* Add original context for DFS cache to be used when refreshing referrals */
3497 rc = dfs_cache_add_vol(mntdata, ctx, cifs_sb->origin_fullpath);
3501 * After reconnecting to a different server, unique ids won't
3502 * match anymore, so we disable serverino. This prevents
3503 * dentry revalidation to think the dentry are stale (ESTALE).
3505 cifs_autodisable_serverino(cifs_sb);
3507 * Force the use of prefix path to support failover on DFS paths that
3508 * resolve to targets that have different prefix paths.
3510 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
3511 kfree(cifs_sb->prepath);
3512 cifs_sb->prepath = ctx->prepath;
3513 ctx->prepath = NULL;
3517 cifs_try_adding_channels(cifs_sb, ses);
3518 return mount_setup_tlink(cifs_sb, ses, tcon);
3524 kfree(cifs_sb->origin_fullpath);
3525 put_root_ses(root_ses);
3526 mount_put_conns(cifs_sb, xid, server, ses, tcon);
3530 int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
3534 struct cifs_ses *ses;
3535 struct cifs_tcon *tcon;
3536 struct TCP_Server_Info *server;
3538 rc = mount_get_conns(ctx, cifs_sb, &xid, &server, &ses, &tcon);
3543 rc = is_path_remote(cifs_sb, ctx, xid, server, tcon);
3552 return mount_setup_tlink(cifs_sb, ses, tcon);
3555 mount_put_conns(cifs_sb, xid, server, ses, tcon);
3561 * Issue a TREE_CONNECT request.
3564 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
3565 const char *tree, struct cifs_tcon *tcon,
3566 const struct nls_table *nls_codepage)
3568 struct smb_hdr *smb_buffer;
3569 struct smb_hdr *smb_buffer_response;
3572 unsigned char *bcc_ptr;
3575 __u16 bytes_left, count;
3580 smb_buffer = cifs_buf_get();
3581 if (smb_buffer == NULL)
3584 smb_buffer_response = smb_buffer;
3586 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
3587 NULL /*no tid */ , 4 /*wct */ );
3589 smb_buffer->Mid = get_next_mid(ses->server);
3590 smb_buffer->Uid = ses->Suid;
3591 pSMB = (TCONX_REQ *) smb_buffer;
3592 pSMBr = (TCONX_RSP *) smb_buffer_response;
3594 pSMB->AndXCommand = 0xFF;
3595 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
3596 bcc_ptr = &pSMB->Password[0];
3597 if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
3598 pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
3599 *bcc_ptr = 0; /* password is null byte */
3600 bcc_ptr++; /* skip password */
3601 /* already aligned so no need to do it below */
3603 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
3604 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3605 specified as required (when that support is added to
3606 the vfs in the future) as only NTLM or the much
3607 weaker LANMAN (which we do not send by default) is accepted
3608 by Samba (not sure whether other servers allow
3609 NTLMv2 password here) */
3610 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3611 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
3612 (ses->sectype == LANMAN))
3613 calc_lanman_hash(tcon->password, ses->server->cryptkey,
3614 ses->server->sec_mode &
3615 SECMODE_PW_ENCRYPT ? true : false,
3618 #endif /* CIFS_WEAK_PW_HASH */
3619 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
3620 bcc_ptr, nls_codepage);
3622 cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
3624 cifs_buf_release(smb_buffer);
3628 bcc_ptr += CIFS_AUTH_RESP_SIZE;
3629 if (ses->capabilities & CAP_UNICODE) {
3630 /* must align unicode strings */
3631 *bcc_ptr = 0; /* null byte password */
3636 if (ses->server->sign)
3637 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
3639 if (ses->capabilities & CAP_STATUS32) {
3640 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
3642 if (ses->capabilities & CAP_DFS) {
3643 smb_buffer->Flags2 |= SMBFLG2_DFS;
3645 if (ses->capabilities & CAP_UNICODE) {
3646 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
3648 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
3649 6 /* max utf8 char length in bytes */ *
3650 (/* server len*/ + 256 /* share len */), nls_codepage);
3651 bcc_ptr += 2 * length; /* convert num 16 bit words to bytes */
3652 bcc_ptr += 2; /* skip trailing null */
3653 } else { /* ASCII */
3654 strcpy(bcc_ptr, tree);
3655 bcc_ptr += strlen(tree) + 1;
3657 strcpy(bcc_ptr, "?????");
3658 bcc_ptr += strlen("?????");
3660 count = bcc_ptr - &pSMB->Password[0];
3661 be32_add_cpu(&pSMB->hdr.smb_buf_length, count);
3662 pSMB->ByteCount = cpu_to_le16(count);
3664 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
3667 /* above now done in SendReceive */
3671 tcon->tidStatus = CifsGood;
3672 tcon->need_reconnect = false;
3673 tcon->tid = smb_buffer_response->Tid;
3674 bcc_ptr = pByteArea(smb_buffer_response);
3675 bytes_left = get_bcc(smb_buffer_response);
3676 length = strnlen(bcc_ptr, bytes_left - 2);
3677 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
3683 /* skip service field (NB: this field is always ASCII) */
3685 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
3686 (bcc_ptr[2] == 'C')) {
3687 cifs_dbg(FYI, "IPC connection\n");
3691 } else if (length == 2) {
3692 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
3693 /* the most common case */
3694 cifs_dbg(FYI, "disk share connection\n");
3697 bcc_ptr += length + 1;
3698 bytes_left -= (length + 1);
3699 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
3701 /* mostly informational -- no need to fail on error here */
3702 kfree(tcon->nativeFileSystem);
3703 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
3704 bytes_left, is_unicode,
3707 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
3709 if ((smb_buffer_response->WordCount == 3) ||
3710 (smb_buffer_response->WordCount == 7))
3711 /* field is in same location */
3712 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
3715 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
3718 cifs_buf_release(smb_buffer);
3722 static void delayed_free(struct rcu_head *p)
3724 struct cifs_sb_info *cifs_sb = container_of(p, struct cifs_sb_info, rcu);
3726 unload_nls(cifs_sb->local_nls);
3727 smb3_cleanup_fs_context(cifs_sb->ctx);
3732 cifs_umount(struct cifs_sb_info *cifs_sb)
3734 struct rb_root *root = &cifs_sb->tlink_tree;
3735 struct rb_node *node;
3736 struct tcon_link *tlink;
3738 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
3740 spin_lock(&cifs_sb->tlink_tree_lock);
3741 while ((node = rb_first(root))) {
3742 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3743 cifs_get_tlink(tlink);
3744 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3745 rb_erase(node, root);
3747 spin_unlock(&cifs_sb->tlink_tree_lock);
3748 cifs_put_tlink(tlink);
3749 spin_lock(&cifs_sb->tlink_tree_lock);
3751 spin_unlock(&cifs_sb->tlink_tree_lock);
3753 kfree(cifs_sb->prepath);
3754 #ifdef CONFIG_CIFS_DFS_UPCALL
3755 dfs_cache_del_vol(cifs_sb->origin_fullpath);
3756 kfree(cifs_sb->origin_fullpath);
3758 call_rcu(&cifs_sb->rcu, delayed_free);
3762 cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
3765 struct TCP_Server_Info *server = cifs_ses_server(ses);
3767 if (!server->ops->need_neg || !server->ops->negotiate)
3770 /* only send once per connect */
3771 if (!server->ops->need_neg(server))
3774 rc = server->ops->negotiate(xid, ses);
3776 spin_lock(&GlobalMid_Lock);
3777 if (server->tcpStatus == CifsNeedNegotiate)
3778 server->tcpStatus = CifsGood;
3781 spin_unlock(&GlobalMid_Lock);
3788 cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
3789 struct nls_table *nls_info)
3792 struct TCP_Server_Info *server = cifs_ses_server(ses);
3794 if (!ses->binding) {
3795 ses->capabilities = server->capabilities;
3796 if (!linuxExtEnabled)
3797 ses->capabilities &= (~server->vals->cap_unix);
3799 if (ses->auth_key.response) {
3800 cifs_dbg(FYI, "Free previous auth_key.response = %p\n",
3801 ses->auth_key.response);
3802 kfree(ses->auth_key.response);
3803 ses->auth_key.response = NULL;
3804 ses->auth_key.len = 0;
3808 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
3809 server->sec_mode, server->capabilities, server->timeAdj);
3811 if (server->ops->sess_setup)
3812 rc = server->ops->sess_setup(xid, ses, nls_info);
3815 cifs_server_dbg(VFS, "Send error in SessSetup = %d\n", rc);
3821 cifs_set_vol_auth(struct smb3_fs_context *ctx, struct cifs_ses *ses)
3823 ctx->sectype = ses->sectype;
3825 /* krb5 is special, since we don't need username or pw */
3826 if (ctx->sectype == Kerberos)
3829 return cifs_set_cifscreds(ctx, ses);
3832 static struct cifs_tcon *
3833 cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
3836 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
3837 struct cifs_ses *ses;
3838 struct cifs_tcon *tcon = NULL;
3839 struct smb3_fs_context *ctx;
3841 ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
3843 return ERR_PTR(-ENOMEM);
3845 ctx->local_nls = cifs_sb->local_nls;
3846 ctx->linux_uid = fsuid;
3847 ctx->cred_uid = fsuid;
3848 ctx->UNC = master_tcon->treeName;
3849 ctx->retry = master_tcon->retry;
3850 ctx->nocase = master_tcon->nocase;
3851 ctx->nohandlecache = master_tcon->nohandlecache;
3852 ctx->local_lease = master_tcon->local_lease;
3853 ctx->no_lease = master_tcon->no_lease;
3854 ctx->resilient = master_tcon->use_resilient;
3855 ctx->persistent = master_tcon->use_persistent;
3856 ctx->handle_timeout = master_tcon->handle_timeout;
3857 ctx->no_linux_ext = !master_tcon->unix_ext;
3858 ctx->linux_ext = master_tcon->posix_extensions;
3859 ctx->sectype = master_tcon->ses->sectype;
3860 ctx->sign = master_tcon->ses->sign;
3861 ctx->seal = master_tcon->seal;
3862 ctx->witness = master_tcon->use_witness;
3864 rc = cifs_set_vol_auth(ctx, master_tcon->ses);
3870 /* get a reference for the same TCP session */
3871 spin_lock(&cifs_tcp_ses_lock);
3872 ++master_tcon->ses->server->srv_count;
3873 spin_unlock(&cifs_tcp_ses_lock);
3875 ses = cifs_get_smb_ses(master_tcon->ses->server, ctx);
3877 tcon = (struct cifs_tcon *)ses;
3878 cifs_put_tcp_session(master_tcon->ses->server, 0);
3882 tcon = cifs_get_tcon(ses, ctx);
3884 cifs_put_smb_ses(ses);
3889 reset_cifs_unix_caps(0, tcon, NULL, ctx);
3892 kfree(ctx->username);
3893 kfree_sensitive(ctx->password);
3900 cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
3902 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
3905 /* find and return a tlink with given uid */
3906 static struct tcon_link *
3907 tlink_rb_search(struct rb_root *root, kuid_t uid)
3909 struct rb_node *node = root->rb_node;
3910 struct tcon_link *tlink;
3913 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3915 if (uid_gt(tlink->tl_uid, uid))
3916 node = node->rb_left;
3917 else if (uid_lt(tlink->tl_uid, uid))
3918 node = node->rb_right;
3925 /* insert a tcon_link into the tree */
3927 tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
3929 struct rb_node **new = &(root->rb_node), *parent = NULL;
3930 struct tcon_link *tlink;
3933 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
3936 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
3937 new = &((*new)->rb_left);
3939 new = &((*new)->rb_right);
3942 rb_link_node(&new_tlink->tl_rbnode, parent, new);
3943 rb_insert_color(&new_tlink->tl_rbnode, root);
3947 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
3950 * If the superblock doesn't refer to a multiuser mount, then just return
3951 * the master tcon for the mount.
3953 * First, search the rbtree for an existing tcon for this fsuid. If one
3954 * exists, then check to see if it's pending construction. If it is then wait
3955 * for construction to complete. Once it's no longer pending, check to see if
3956 * it failed and either return an error or retry construction, depending on
3959 * If one doesn't exist then insert a new tcon_link struct into the tree and
3960 * try to construct a new one.
3963 cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
3966 kuid_t fsuid = current_fsuid();
3967 struct tcon_link *tlink, *newtlink;
3969 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
3970 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3972 spin_lock(&cifs_sb->tlink_tree_lock);
3973 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
3975 cifs_get_tlink(tlink);
3976 spin_unlock(&cifs_sb->tlink_tree_lock);
3978 if (tlink == NULL) {
3979 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
3980 if (newtlink == NULL)
3981 return ERR_PTR(-ENOMEM);
3982 newtlink->tl_uid = fsuid;
3983 newtlink->tl_tcon = ERR_PTR(-EACCES);
3984 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
3985 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
3986 cifs_get_tlink(newtlink);
3988 spin_lock(&cifs_sb->tlink_tree_lock);
3989 /* was one inserted after previous search? */
3990 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
3992 cifs_get_tlink(tlink);
3993 spin_unlock(&cifs_sb->tlink_tree_lock);
3995 goto wait_for_construction;
3998 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
3999 spin_unlock(&cifs_sb->tlink_tree_lock);
4001 wait_for_construction:
4002 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
4003 TASK_INTERRUPTIBLE);
4005 cifs_put_tlink(tlink);
4006 return ERR_PTR(-ERESTARTSYS);
4009 /* if it's good, return it */
4010 if (!IS_ERR(tlink->tl_tcon))
4013 /* return error if we tried this already recently */
4014 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
4015 cifs_put_tlink(tlink);
4016 return ERR_PTR(-EACCES);
4019 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
4020 goto wait_for_construction;
4023 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
4024 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
4025 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
4027 if (IS_ERR(tlink->tl_tcon)) {
4028 cifs_put_tlink(tlink);
4029 return ERR_PTR(-EACCES);
4036 * periodic workqueue job that scans tcon_tree for a superblock and closes
4040 cifs_prune_tlinks(struct work_struct *work)
4042 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
4044 struct rb_root *root = &cifs_sb->tlink_tree;
4045 struct rb_node *node;
4046 struct rb_node *tmp;
4047 struct tcon_link *tlink;
4050 * Because we drop the spinlock in the loop in order to put the tlink
4051 * it's not guarded against removal of links from the tree. The only
4052 * places that remove entries from the tree are this function and
4053 * umounts. Because this function is non-reentrant and is canceled
4054 * before umount can proceed, this is safe.
4056 spin_lock(&cifs_sb->tlink_tree_lock);
4057 node = rb_first(root);
4058 while (node != NULL) {
4060 node = rb_next(tmp);
4061 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
4063 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
4064 atomic_read(&tlink->tl_count) != 0 ||
4065 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
4068 cifs_get_tlink(tlink);
4069 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4070 rb_erase(tmp, root);
4072 spin_unlock(&cifs_sb->tlink_tree_lock);
4073 cifs_put_tlink(tlink);
4074 spin_lock(&cifs_sb->tlink_tree_lock);
4076 spin_unlock(&cifs_sb->tlink_tree_lock);
4078 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4082 #ifdef CONFIG_CIFS_DFS_UPCALL
4083 int cifs_tree_connect(const unsigned int xid, struct cifs_tcon *tcon, const struct nls_table *nlsc)
4086 struct TCP_Server_Info *server = tcon->ses->server;
4087 const struct smb_version_operations *ops = server->ops;
4088 struct dfs_cache_tgt_list tl;
4089 struct dfs_cache_tgt_iterator *it = NULL;
4091 const char *tcp_host;
4092 size_t tcp_host_len;
4093 const char *dfs_host;
4094 size_t dfs_host_len;
4095 char *share = NULL, *prefix = NULL;
4096 struct dfs_info3_param ref = {0};
4099 tree = kzalloc(MAX_TREE_SIZE, GFP_KERNEL);
4103 if (!tcon->dfs_path) {
4105 scnprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$", server->hostname);
4106 rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
4108 rc = ops->tree_connect(xid, tcon->ses, tcon->treeName, tcon, nlsc);
4113 rc = dfs_cache_noreq_find(tcon->dfs_path + 1, &ref, &tl);
4116 isroot = ref.server_type == DFS_TYPE_ROOT;
4117 free_dfs_info_param(&ref);
4119 extract_unc_hostname(server->hostname, &tcp_host, &tcp_host_len);
4121 for (it = dfs_cache_get_tgt_iterator(&tl); it; it = dfs_cache_get_next_tgt(&tl, it)) {
4129 rc = dfs_cache_get_tgt_share(tcon->dfs_path + 1, it, &share, &prefix);
4131 cifs_dbg(VFS, "%s: failed to parse target share %d\n",
4136 extract_unc_hostname(share, &dfs_host, &dfs_host_len);
4138 if (dfs_host_len != tcp_host_len
4139 || strncasecmp(dfs_host, tcp_host, dfs_host_len) != 0) {
4140 cifs_dbg(FYI, "%s: %.*s doesn't match %.*s\n", __func__, (int)dfs_host_len,
4141 dfs_host, (int)tcp_host_len, tcp_host);
4143 rc = match_target_ip(server, dfs_host, dfs_host_len, &target_match);
4145 cifs_dbg(VFS, "%s: failed to match target ip: %d\n", __func__, rc);
4149 if (!target_match) {
4150 cifs_dbg(FYI, "%s: skipping target\n", __func__);
4156 scnprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$", share);
4157 rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
4159 scnprintf(tree, MAX_TREE_SIZE, "\\%s", share);
4160 rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
4161 /* Only handle prefix paths of DFS link targets */
4162 if (!rc && !isroot) {
4163 rc = update_super_prepath(tcon, prefix);
4176 rc = dfs_cache_noreq_update_tgthint(tcon->dfs_path + 1, it);
4180 dfs_cache_free_tgts(&tl);
4186 int cifs_tree_connect(const unsigned int xid, struct cifs_tcon *tcon, const struct nls_table *nlsc)
4188 const struct smb_version_operations *ops = tcon->ses->server->ops;
4190 return ops->tree_connect(xid, tcon->ses, tcon->treeName, tcon, nlsc);