4 * Copyright (C) International Business Machines Corp., 2002,2011
5 * Author(s): Steve French (sfrench@us.ibm.com)
7 * This library is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser General Public License as published
9 * by the Free Software Foundation; either version 2.1 of the License, or
10 * (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
15 * the GNU Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include <linux/net.h>
23 #include <linux/string.h>
24 #include <linux/sched/mm.h>
25 #include <linux/sched/signal.h>
26 #include <linux/list.h>
27 #include <linux/wait.h>
28 #include <linux/slab.h>
29 #include <linux/pagemap.h>
30 #include <linux/ctype.h>
31 #include <linux/utsname.h>
32 #include <linux/mempool.h>
33 #include <linux/delay.h>
34 #include <linux/completion.h>
35 #include <linux/kthread.h>
36 #include <linux/pagevec.h>
37 #include <linux/freezer.h>
38 #include <linux/namei.h>
39 #include <linux/uuid.h>
40 #include <linux/uaccess.h>
41 #include <asm/processor.h>
42 #include <linux/inet.h>
43 #include <linux/module.h>
44 #include <keys/user-type.h>
46 #include <linux/parser.h>
47 #include <linux/bvec.h>
50 #include "cifsproto.h"
51 #include "cifs_unicode.h"
52 #include "cifs_debug.h"
53 #include "cifs_fs_sb.h"
56 #include "rfc1002pdu.h"
58 #include "smb2proto.h"
59 #include "smbdirect.h"
60 #include "dns_resolve.h"
61 #ifdef CONFIG_CIFS_DFS_UPCALL
62 #include "dfs_cache.h"
64 #include "fs_context.h"
65 #ifdef CONFIG_CIFS_SWN_UPCALL
69 extern mempool_t
*cifs_req_poolp
;
70 extern bool disable_legacy_dialects
;
72 /* FIXME: should these be tunable? */
73 #define TLINK_ERROR_EXPIRE (1 * HZ)
74 #define TLINK_IDLE_EXPIRE (600 * HZ)
76 /* Drop the connection to not overload the server */
77 #define NUM_STATUS_IO_TIMEOUT 5
79 static int ip_connect(struct TCP_Server_Info
*server
);
80 static int generic_ip_connect(struct TCP_Server_Info
*server
);
81 static void tlink_rb_insert(struct rb_root
*root
, struct tcon_link
*new_tlink
);
82 static void cifs_prune_tlinks(struct work_struct
*work
);
85 * Resolve hostname and set ip addr in tcp ses. Useful for hostnames that may
86 * get their ip addresses changed at some point.
88 * This should be called with server->srv_mutex held.
90 #ifdef CONFIG_CIFS_DFS_UPCALL
91 static int reconn_set_ipaddr_from_hostname(struct TCP_Server_Info
*server
)
95 char *unc
, *ipaddr
= NULL
;
97 if (!server
->hostname
)
100 len
= strlen(server
->hostname
) + 3;
102 unc
= kmalloc(len
, GFP_KERNEL
);
104 cifs_dbg(FYI
, "%s: failed to create UNC path\n", __func__
);
107 scnprintf(unc
, len
, "\\\\%s", server
->hostname
);
109 rc
= dns_resolve_server_name_to_ip(unc
, &ipaddr
);
113 cifs_dbg(FYI
, "%s: failed to resolve server part of %s to IP: %d\n",
114 __func__
, server
->hostname
, rc
);
118 spin_lock(&cifs_tcp_ses_lock
);
119 rc
= cifs_convert_address((struct sockaddr
*)&server
->dstaddr
, ipaddr
,
121 spin_unlock(&cifs_tcp_ses_lock
);
127 /* These functions must be called with server->srv_mutex held */
128 static void reconn_set_next_dfs_target(struct TCP_Server_Info
*server
,
129 struct cifs_sb_info
*cifs_sb
,
130 struct dfs_cache_tgt_list
*tgt_list
,
131 struct dfs_cache_tgt_iterator
**tgt_it
)
136 if (!cifs_sb
|| !cifs_sb
->origin_fullpath
)
140 *tgt_it
= dfs_cache_get_tgt_iterator(tgt_list
);
142 *tgt_it
= dfs_cache_get_next_tgt(tgt_list
, *tgt_it
);
144 *tgt_it
= dfs_cache_get_tgt_iterator(tgt_list
);
147 cifs_dbg(FYI
, "%s: UNC: %s\n", __func__
, cifs_sb
->origin_fullpath
);
149 name
= dfs_cache_get_tgt_name(*tgt_it
);
151 kfree(server
->hostname
);
153 server
->hostname
= extract_hostname(name
);
154 if (IS_ERR(server
->hostname
)) {
156 "%s: failed to extract hostname from target: %ld\n",
157 __func__
, PTR_ERR(server
->hostname
));
161 rc
= reconn_set_ipaddr_from_hostname(server
);
163 cifs_dbg(FYI
, "%s: failed to resolve hostname: %d\n",
168 static inline int reconn_setup_dfs_targets(struct cifs_sb_info
*cifs_sb
,
169 struct dfs_cache_tgt_list
*tl
)
171 if (!cifs_sb
->origin_fullpath
)
173 return dfs_cache_noreq_find(cifs_sb
->origin_fullpath
+ 1, NULL
, tl
);
178 * cifs tcp session reconnection
180 * mark tcp session as reconnecting so temporarily locked
181 * mark all smb sessions as reconnecting for tcp session
182 * reconnect tcp session
183 * wake up waiters on reconnection? - (not needed currently)
186 cifs_reconnect(struct TCP_Server_Info
*server
)
189 struct list_head
*tmp
, *tmp2
;
190 struct cifs_ses
*ses
;
191 struct cifs_tcon
*tcon
;
192 struct mid_q_entry
*mid_entry
;
193 struct list_head retry_list
;
194 #ifdef CONFIG_CIFS_DFS_UPCALL
195 struct super_block
*sb
= NULL
;
196 struct cifs_sb_info
*cifs_sb
= NULL
;
197 struct dfs_cache_tgt_list tgt_list
= {0};
198 struct dfs_cache_tgt_iterator
*tgt_it
= NULL
;
201 spin_lock(&GlobalMid_Lock
);
202 server
->nr_targets
= 1;
203 #ifdef CONFIG_CIFS_DFS_UPCALL
204 spin_unlock(&GlobalMid_Lock
);
205 sb
= cifs_get_tcp_super(server
);
208 cifs_dbg(FYI
, "%s: will not do DFS failover: rc = %d\n",
212 cifs_sb
= CIFS_SB(sb
);
213 rc
= reconn_setup_dfs_targets(cifs_sb
, &tgt_list
);
216 if (rc
!= -EOPNOTSUPP
) {
217 cifs_server_dbg(VFS
, "%s: no target servers for DFS failover\n",
221 server
->nr_targets
= dfs_cache_get_nr_tgts(&tgt_list
);
224 cifs_dbg(FYI
, "%s: will retry %d target(s)\n", __func__
,
226 spin_lock(&GlobalMid_Lock
);
228 if (server
->tcpStatus
== CifsExiting
) {
229 /* the demux thread will exit normally
230 next time through the loop */
231 spin_unlock(&GlobalMid_Lock
);
232 #ifdef CONFIG_CIFS_DFS_UPCALL
233 dfs_cache_free_tgts(&tgt_list
);
234 cifs_put_tcp_super(sb
);
236 wake_up(&server
->response_q
);
239 server
->tcpStatus
= CifsNeedReconnect
;
240 spin_unlock(&GlobalMid_Lock
);
242 server
->max_read
= 0;
244 cifs_dbg(FYI
, "Mark tcp session as need reconnect\n");
245 trace_smb3_reconnect(server
->CurrentMid
, server
->hostname
);
247 /* before reconnecting the tcp session, mark the smb session (uid)
248 and the tid bad so they are not used until reconnected */
249 cifs_dbg(FYI
, "%s: marking sessions and tcons for reconnect\n",
251 spin_lock(&cifs_tcp_ses_lock
);
252 list_for_each(tmp
, &server
->smb_ses_list
) {
253 ses
= list_entry(tmp
, struct cifs_ses
, smb_ses_list
);
254 ses
->need_reconnect
= true;
255 list_for_each(tmp2
, &ses
->tcon_list
) {
256 tcon
= list_entry(tmp2
, struct cifs_tcon
, tcon_list
);
257 tcon
->need_reconnect
= true;
260 ses
->tcon_ipc
->need_reconnect
= true;
262 spin_unlock(&cifs_tcp_ses_lock
);
264 /* do not want to be sending data on a socket we are freeing */
265 cifs_dbg(FYI
, "%s: tearing down socket\n", __func__
);
266 mutex_lock(&server
->srv_mutex
);
267 if (server
->ssocket
) {
268 cifs_dbg(FYI
, "State: 0x%x Flags: 0x%lx\n",
269 server
->ssocket
->state
, server
->ssocket
->flags
);
270 kernel_sock_shutdown(server
->ssocket
, SHUT_WR
);
271 cifs_dbg(FYI
, "Post shutdown state: 0x%x Flags: 0x%lx\n",
272 server
->ssocket
->state
, server
->ssocket
->flags
);
273 sock_release(server
->ssocket
);
274 server
->ssocket
= NULL
;
276 server
->sequence_number
= 0;
277 server
->session_estab
= false;
278 kfree(server
->session_key
.response
);
279 server
->session_key
.response
= NULL
;
280 server
->session_key
.len
= 0;
281 server
->lstrp
= jiffies
;
283 /* mark submitted MIDs for retry and issue callback */
284 INIT_LIST_HEAD(&retry_list
);
285 cifs_dbg(FYI
, "%s: moving mids to private list\n", __func__
);
286 spin_lock(&GlobalMid_Lock
);
287 list_for_each_safe(tmp
, tmp2
, &server
->pending_mid_q
) {
288 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
289 kref_get(&mid_entry
->refcount
);
290 if (mid_entry
->mid_state
== MID_REQUEST_SUBMITTED
)
291 mid_entry
->mid_state
= MID_RETRY_NEEDED
;
292 list_move(&mid_entry
->qhead
, &retry_list
);
293 mid_entry
->mid_flags
|= MID_DELETED
;
295 spin_unlock(&GlobalMid_Lock
);
296 mutex_unlock(&server
->srv_mutex
);
298 cifs_dbg(FYI
, "%s: issuing mid callbacks\n", __func__
);
299 list_for_each_safe(tmp
, tmp2
, &retry_list
) {
300 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
301 list_del_init(&mid_entry
->qhead
);
302 mid_entry
->callback(mid_entry
);
303 cifs_mid_q_entry_release(mid_entry
);
306 if (cifs_rdma_enabled(server
)) {
307 mutex_lock(&server
->srv_mutex
);
308 smbd_destroy(server
);
309 mutex_unlock(&server
->srv_mutex
);
315 mutex_lock(&server
->srv_mutex
);
317 #ifdef CONFIG_CIFS_SWN_UPCALL
318 if (server
->use_swn_dstaddr
) {
319 server
->dstaddr
= server
->swn_dstaddr
;
323 #ifdef CONFIG_CIFS_DFS_UPCALL
325 * Set up next DFS target server (if any) for reconnect. If DFS
326 * feature is disabled, then we will retry last server we
327 * connected to before.
329 reconn_set_next_dfs_target(server
, cifs_sb
, &tgt_list
, &tgt_it
);
332 #ifdef CONFIG_CIFS_SWN_UPCALL
336 if (cifs_rdma_enabled(server
))
337 rc
= smbd_reconnect(server
);
339 rc
= generic_ip_connect(server
);
341 cifs_dbg(FYI
, "reconnect error %d\n", rc
);
342 mutex_unlock(&server
->srv_mutex
);
345 atomic_inc(&tcpSesReconnectCount
);
346 set_credits(server
, 1);
347 spin_lock(&GlobalMid_Lock
);
348 if (server
->tcpStatus
!= CifsExiting
)
349 server
->tcpStatus
= CifsNeedNegotiate
;
350 spin_unlock(&GlobalMid_Lock
);
351 #ifdef CONFIG_CIFS_SWN_UPCALL
352 server
->use_swn_dstaddr
= false;
354 mutex_unlock(&server
->srv_mutex
);
356 } while (server
->tcpStatus
== CifsNeedReconnect
);
358 #ifdef CONFIG_CIFS_DFS_UPCALL
360 rc
= dfs_cache_noreq_update_tgthint(cifs_sb
->origin_fullpath
+ 1,
363 cifs_server_dbg(VFS
, "%s: failed to update DFS target hint: rc = %d\n",
366 rc
= dfs_cache_update_vol(cifs_sb
->origin_fullpath
, server
);
368 cifs_server_dbg(VFS
, "%s: failed to update vol info in DFS cache: rc = %d\n",
371 dfs_cache_free_tgts(&tgt_list
);
375 cifs_put_tcp_super(sb
);
377 if (server
->tcpStatus
== CifsNeedNegotiate
)
378 mod_delayed_work(cifsiod_wq
, &server
->echo
, 0);
380 wake_up(&server
->response_q
);
385 cifs_echo_request(struct work_struct
*work
)
388 struct TCP_Server_Info
*server
= container_of(work
,
389 struct TCP_Server_Info
, echo
.work
);
390 unsigned long echo_interval
;
393 * If we need to renegotiate, set echo interval to zero to
394 * immediately call echo service where we can renegotiate.
396 if (server
->tcpStatus
== CifsNeedNegotiate
)
399 echo_interval
= server
->echo_interval
;
402 * We cannot send an echo if it is disabled.
403 * Also, no need to ping if we got a response recently.
406 if (server
->tcpStatus
== CifsNeedReconnect
||
407 server
->tcpStatus
== CifsExiting
||
408 server
->tcpStatus
== CifsNew
||
409 (server
->ops
->can_echo
&& !server
->ops
->can_echo(server
)) ||
410 time_before(jiffies
, server
->lstrp
+ echo_interval
- HZ
))
413 rc
= server
->ops
->echo
? server
->ops
->echo(server
) : -ENOSYS
;
415 cifs_dbg(FYI
, "Unable to send echo request to server: %s\n",
418 #ifdef CONFIG_CIFS_SWN_UPCALL
419 /* Check witness registrations */
424 queue_delayed_work(cifsiod_wq
, &server
->echo
, server
->echo_interval
);
428 allocate_buffers(struct TCP_Server_Info
*server
)
430 if (!server
->bigbuf
) {
431 server
->bigbuf
= (char *)cifs_buf_get();
432 if (!server
->bigbuf
) {
433 cifs_server_dbg(VFS
, "No memory for large SMB response\n");
435 /* retry will check if exiting */
438 } else if (server
->large_buf
) {
439 /* we are reusing a dirty large buf, clear its start */
440 memset(server
->bigbuf
, 0, HEADER_SIZE(server
));
443 if (!server
->smallbuf
) {
444 server
->smallbuf
= (char *)cifs_small_buf_get();
445 if (!server
->smallbuf
) {
446 cifs_server_dbg(VFS
, "No memory for SMB response\n");
448 /* retry will check if exiting */
451 /* beginning of smb buffer is cleared in our buf_get */
453 /* if existing small buf clear beginning */
454 memset(server
->smallbuf
, 0, HEADER_SIZE(server
));
461 server_unresponsive(struct TCP_Server_Info
*server
)
464 * We need to wait 3 echo intervals to make sure we handle such
466 * 1s client sends a normal SMB request
467 * 2s client gets a response
468 * 30s echo workqueue job pops, and decides we got a response recently
469 * and don't need to send another
471 * 65s kernel_recvmsg times out, and we see that we haven't gotten
472 * a response in >60s.
474 if ((server
->tcpStatus
== CifsGood
||
475 server
->tcpStatus
== CifsNeedNegotiate
) &&
476 time_after(jiffies
, server
->lstrp
+ 3 * server
->echo_interval
)) {
477 cifs_server_dbg(VFS
, "has not responded in %lu seconds. Reconnecting...\n",
478 (3 * server
->echo_interval
) / HZ
);
479 cifs_reconnect(server
);
487 zero_credits(struct TCP_Server_Info
*server
)
491 spin_lock(&server
->req_lock
);
492 val
= server
->credits
+ server
->echo_credits
+ server
->oplock_credits
;
493 if (server
->in_flight
== 0 && val
== 0) {
494 spin_unlock(&server
->req_lock
);
497 spin_unlock(&server
->req_lock
);
502 cifs_readv_from_socket(struct TCP_Server_Info
*server
, struct msghdr
*smb_msg
)
507 smb_msg
->msg_control
= NULL
;
508 smb_msg
->msg_controllen
= 0;
510 for (total_read
= 0; msg_data_left(smb_msg
); total_read
+= length
) {
513 /* reconnect if no credits and no requests in flight */
514 if (zero_credits(server
)) {
515 cifs_reconnect(server
);
516 return -ECONNABORTED
;
519 if (server_unresponsive(server
))
520 return -ECONNABORTED
;
521 if (cifs_rdma_enabled(server
) && server
->smbd_conn
)
522 length
= smbd_recv(server
->smbd_conn
, smb_msg
);
524 length
= sock_recvmsg(server
->ssocket
, smb_msg
, 0);
526 if (server
->tcpStatus
== CifsExiting
)
529 if (server
->tcpStatus
== CifsNeedReconnect
) {
530 cifs_reconnect(server
);
531 return -ECONNABORTED
;
534 if (length
== -ERESTARTSYS
||
538 * Minimum sleep to prevent looping, allowing socket
539 * to clear and app threads to set tcpStatus
540 * CifsNeedReconnect if server hung.
542 usleep_range(1000, 2000);
548 cifs_dbg(FYI
, "Received no data or error: %d\n", length
);
549 cifs_reconnect(server
);
550 return -ECONNABORTED
;
557 cifs_read_from_socket(struct TCP_Server_Info
*server
, char *buf
,
558 unsigned int to_read
)
560 struct msghdr smb_msg
;
561 struct kvec iov
= {.iov_base
= buf
, .iov_len
= to_read
};
562 iov_iter_kvec(&smb_msg
.msg_iter
, READ
, &iov
, 1, to_read
);
564 return cifs_readv_from_socket(server
, &smb_msg
);
568 cifs_read_page_from_socket(struct TCP_Server_Info
*server
, struct page
*page
,
569 unsigned int page_offset
, unsigned int to_read
)
571 struct msghdr smb_msg
;
572 struct bio_vec bv
= {
573 .bv_page
= page
, .bv_len
= to_read
, .bv_offset
= page_offset
};
574 iov_iter_bvec(&smb_msg
.msg_iter
, READ
, &bv
, 1, to_read
);
575 return cifs_readv_from_socket(server
, &smb_msg
);
579 is_smb_response(struct TCP_Server_Info
*server
, unsigned char type
)
582 * The first byte big endian of the length field,
583 * is actually not part of the length but the type
584 * with the most common, zero, as regular data.
587 case RFC1002_SESSION_MESSAGE
:
588 /* Regular SMB response */
590 case RFC1002_SESSION_KEEP_ALIVE
:
591 cifs_dbg(FYI
, "RFC 1002 session keep alive\n");
593 case RFC1002_POSITIVE_SESSION_RESPONSE
:
594 cifs_dbg(FYI
, "RFC 1002 positive session response\n");
596 case RFC1002_NEGATIVE_SESSION_RESPONSE
:
598 * We get this from Windows 98 instead of an error on
599 * SMB negprot response.
601 cifs_dbg(FYI
, "RFC 1002 negative session response\n");
602 /* give server a second to clean up */
605 * Always try 445 first on reconnect since we get NACK
606 * on some if we ever connected to port 139 (the NACK
607 * is since we do not begin with RFC1001 session
610 cifs_set_port((struct sockaddr
*)&server
->dstaddr
, CIFS_PORT
);
611 cifs_reconnect(server
);
614 cifs_server_dbg(VFS
, "RFC 1002 unknown response type 0x%x\n", type
);
615 cifs_reconnect(server
);
622 dequeue_mid(struct mid_q_entry
*mid
, bool malformed
)
624 #ifdef CONFIG_CIFS_STATS2
625 mid
->when_received
= jiffies
;
627 spin_lock(&GlobalMid_Lock
);
629 mid
->mid_state
= MID_RESPONSE_RECEIVED
;
631 mid
->mid_state
= MID_RESPONSE_MALFORMED
;
633 * Trying to handle/dequeue a mid after the send_recv()
634 * function has finished processing it is a bug.
636 if (mid
->mid_flags
& MID_DELETED
)
637 pr_warn_once("trying to dequeue a deleted mid\n");
639 list_del_init(&mid
->qhead
);
640 mid
->mid_flags
|= MID_DELETED
;
642 spin_unlock(&GlobalMid_Lock
);
646 smb2_get_credits_from_hdr(char *buffer
, struct TCP_Server_Info
*server
)
648 struct smb2_sync_hdr
*shdr
= (struct smb2_sync_hdr
*)buffer
;
651 * SMB1 does not use credits.
653 if (server
->vals
->header_preamble_size
)
656 return le16_to_cpu(shdr
->CreditRequest
);
660 handle_mid(struct mid_q_entry
*mid
, struct TCP_Server_Info
*server
,
661 char *buf
, int malformed
)
663 if (server
->ops
->check_trans2
&&
664 server
->ops
->check_trans2(mid
, server
, buf
, malformed
))
666 mid
->credits_received
= smb2_get_credits_from_hdr(buf
, server
);
668 mid
->large_buf
= server
->large_buf
;
669 /* Was previous buf put in mpx struct for multi-rsp? */
670 if (!mid
->multiRsp
) {
671 /* smb buffer will be freed by user thread */
672 if (server
->large_buf
)
673 server
->bigbuf
= NULL
;
675 server
->smallbuf
= NULL
;
677 dequeue_mid(mid
, malformed
);
680 static void clean_demultiplex_info(struct TCP_Server_Info
*server
)
684 /* take it off the list, if it's not already */
685 spin_lock(&cifs_tcp_ses_lock
);
686 list_del_init(&server
->tcp_ses_list
);
687 spin_unlock(&cifs_tcp_ses_lock
);
689 cancel_delayed_work_sync(&server
->echo
);
691 spin_lock(&GlobalMid_Lock
);
692 server
->tcpStatus
= CifsExiting
;
693 spin_unlock(&GlobalMid_Lock
);
694 wake_up_all(&server
->response_q
);
696 /* check if we have blocked requests that need to free */
697 spin_lock(&server
->req_lock
);
698 if (server
->credits
<= 0)
700 spin_unlock(&server
->req_lock
);
702 * Although there should not be any requests blocked on this queue it
703 * can not hurt to be paranoid and try to wake up requests that may
704 * haven been blocked when more than 50 at time were on the wire to the
705 * same server - they now will see the session is in exit state and get
706 * out of SendReceive.
708 wake_up_all(&server
->request_q
);
709 /* give those requests time to exit */
711 if (cifs_rdma_enabled(server
))
712 smbd_destroy(server
);
713 if (server
->ssocket
) {
714 sock_release(server
->ssocket
);
715 server
->ssocket
= NULL
;
718 if (!list_empty(&server
->pending_mid_q
)) {
719 struct list_head dispose_list
;
720 struct mid_q_entry
*mid_entry
;
721 struct list_head
*tmp
, *tmp2
;
723 INIT_LIST_HEAD(&dispose_list
);
724 spin_lock(&GlobalMid_Lock
);
725 list_for_each_safe(tmp
, tmp2
, &server
->pending_mid_q
) {
726 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
727 cifs_dbg(FYI
, "Clearing mid 0x%llx\n", mid_entry
->mid
);
728 kref_get(&mid_entry
->refcount
);
729 mid_entry
->mid_state
= MID_SHUTDOWN
;
730 list_move(&mid_entry
->qhead
, &dispose_list
);
731 mid_entry
->mid_flags
|= MID_DELETED
;
733 spin_unlock(&GlobalMid_Lock
);
735 /* now walk dispose list and issue callbacks */
736 list_for_each_safe(tmp
, tmp2
, &dispose_list
) {
737 mid_entry
= list_entry(tmp
, struct mid_q_entry
, qhead
);
738 cifs_dbg(FYI
, "Callback mid 0x%llx\n", mid_entry
->mid
);
739 list_del_init(&mid_entry
->qhead
);
740 mid_entry
->callback(mid_entry
);
741 cifs_mid_q_entry_release(mid_entry
);
743 /* 1/8th of sec is more than enough time for them to exit */
747 if (!list_empty(&server
->pending_mid_q
)) {
749 * mpx threads have not exited yet give them at least the smb
750 * send timeout time for long ops.
752 * Due to delays on oplock break requests, we need to wait at
753 * least 45 seconds before giving up on a request getting a
754 * response and going ahead and killing cifsd.
756 cifs_dbg(FYI
, "Wait for exit from demultiplex thread\n");
759 * If threads still have not exited they are probably never
760 * coming home not much else we can do but free the memory.
764 kfree(server
->hostname
);
767 length
= atomic_dec_return(&tcpSesAllocCount
);
769 mempool_resize(cifs_req_poolp
, length
+ cifs_min_rcv
);
773 standard_receive3(struct TCP_Server_Info
*server
, struct mid_q_entry
*mid
)
776 char *buf
= server
->smallbuf
;
777 unsigned int pdu_length
= server
->pdu_size
;
779 /* make sure this will fit in a large buffer */
780 if (pdu_length
> CIFSMaxBufSize
+ MAX_HEADER_SIZE(server
) -
781 server
->vals
->header_preamble_size
) {
782 cifs_server_dbg(VFS
, "SMB response too long (%u bytes)\n", pdu_length
);
783 cifs_reconnect(server
);
784 return -ECONNABORTED
;
787 /* switch to large buffer if too big for a small one */
788 if (pdu_length
> MAX_CIFS_SMALL_BUFFER_SIZE
- 4) {
789 server
->large_buf
= true;
790 memcpy(server
->bigbuf
, buf
, server
->total_read
);
791 buf
= server
->bigbuf
;
794 /* now read the rest */
795 length
= cifs_read_from_socket(server
, buf
+ HEADER_SIZE(server
) - 1,
796 pdu_length
- HEADER_SIZE(server
) + 1
797 + server
->vals
->header_preamble_size
);
801 server
->total_read
+= length
;
803 dump_smb(buf
, server
->total_read
);
805 return cifs_handle_standard(server
, mid
);
809 cifs_handle_standard(struct TCP_Server_Info
*server
, struct mid_q_entry
*mid
)
811 char *buf
= server
->large_buf
? server
->bigbuf
: server
->smallbuf
;
815 * We know that we received enough to get to the MID as we
816 * checked the pdu_length earlier. Now check to see
817 * if the rest of the header is OK. We borrow the length
818 * var for the rest of the loop to avoid a new stack var.
820 * 48 bytes is enough to display the header and a little bit
821 * into the payload for debugging purposes.
823 length
= server
->ops
->check_message(buf
, server
->total_read
, server
);
825 cifs_dump_mem("Bad SMB: ", buf
,
826 min_t(unsigned int, server
->total_read
, 48));
828 if (server
->ops
->is_session_expired
&&
829 server
->ops
->is_session_expired(buf
)) {
830 cifs_reconnect(server
);
834 if (server
->ops
->is_status_pending
&&
835 server
->ops
->is_status_pending(buf
, server
))
841 handle_mid(mid
, server
, buf
, length
);
846 smb2_add_credits_from_hdr(char *buffer
, struct TCP_Server_Info
*server
)
848 struct smb2_sync_hdr
*shdr
= (struct smb2_sync_hdr
*)buffer
;
849 int scredits
= server
->credits
;
852 * SMB1 does not use credits.
854 if (server
->vals
->header_preamble_size
)
857 if (shdr
->CreditRequest
) {
858 spin_lock(&server
->req_lock
);
859 server
->credits
+= le16_to_cpu(shdr
->CreditRequest
);
860 spin_unlock(&server
->req_lock
);
861 wake_up(&server
->request_q
);
863 trace_smb3_add_credits(server
->CurrentMid
,
864 server
->hostname
, scredits
,
865 le16_to_cpu(shdr
->CreditRequest
));
866 cifs_server_dbg(FYI
, "%s: added %u credits total=%d\n",
867 __func__
, le16_to_cpu(shdr
->CreditRequest
),
874 cifs_demultiplex_thread(void *p
)
876 int i
, num_mids
, length
;
877 struct TCP_Server_Info
*server
= p
;
878 unsigned int pdu_length
;
879 unsigned int next_offset
;
881 struct task_struct
*task_to_wake
= NULL
;
882 struct mid_q_entry
*mids
[MAX_COMPOUND
];
883 char *bufs
[MAX_COMPOUND
];
884 unsigned int noreclaim_flag
, num_io_timeout
= 0;
886 noreclaim_flag
= memalloc_noreclaim_save();
887 cifs_dbg(FYI
, "Demultiplex PID: %d\n", task_pid_nr(current
));
889 length
= atomic_inc_return(&tcpSesAllocCount
);
891 mempool_resize(cifs_req_poolp
, length
+ cifs_min_rcv
);
894 allow_kernel_signal(SIGKILL
);
895 while (server
->tcpStatus
!= CifsExiting
) {
899 if (!allocate_buffers(server
))
902 server
->large_buf
= false;
903 buf
= server
->smallbuf
;
904 pdu_length
= 4; /* enough to get RFC1001 header */
906 length
= cifs_read_from_socket(server
, buf
, pdu_length
);
910 if (server
->vals
->header_preamble_size
== 0)
911 server
->total_read
= 0;
913 server
->total_read
= length
;
916 * The right amount was read from socket - 4 bytes,
917 * so we can now interpret the length field.
919 pdu_length
= get_rfc1002_length(buf
);
921 cifs_dbg(FYI
, "RFC1002 header 0x%x\n", pdu_length
);
922 if (!is_smb_response(server
, buf
[0]))
925 server
->pdu_size
= pdu_length
;
927 /* make sure we have enough to get to the MID */
928 if (server
->pdu_size
< HEADER_SIZE(server
) - 1 -
929 server
->vals
->header_preamble_size
) {
930 cifs_server_dbg(VFS
, "SMB response too short (%u bytes)\n",
932 cifs_reconnect(server
);
936 /* read down to the MID */
937 length
= cifs_read_from_socket(server
,
938 buf
+ server
->vals
->header_preamble_size
,
939 HEADER_SIZE(server
) - 1
940 - server
->vals
->header_preamble_size
);
943 server
->total_read
+= length
;
945 if (server
->ops
->next_header
) {
946 next_offset
= server
->ops
->next_header(buf
);
948 server
->pdu_size
= next_offset
;
951 memset(mids
, 0, sizeof(mids
));
952 memset(bufs
, 0, sizeof(bufs
));
955 if (server
->ops
->is_transform_hdr
&&
956 server
->ops
->receive_transform
&&
957 server
->ops
->is_transform_hdr(buf
)) {
958 length
= server
->ops
->receive_transform(server
,
963 mids
[0] = server
->ops
->find_mid(server
, buf
);
967 if (!mids
[0] || !mids
[0]->receive
)
968 length
= standard_receive3(server
, mids
[0]);
970 length
= mids
[0]->receive(server
, mids
[0]);
974 for (i
= 0; i
< num_mids
; i
++)
976 cifs_mid_q_entry_release(mids
[i
]);
980 if (server
->ops
->is_status_io_timeout
&&
981 server
->ops
->is_status_io_timeout(buf
)) {
983 if (num_io_timeout
> NUM_STATUS_IO_TIMEOUT
) {
984 cifs_reconnect(server
);
990 server
->lstrp
= jiffies
;
992 for (i
= 0; i
< num_mids
; i
++) {
993 if (mids
[i
] != NULL
) {
994 mids
[i
]->resp_buf_size
= server
->pdu_size
;
996 if (!mids
[i
]->multiRsp
|| mids
[i
]->multiEnd
)
997 mids
[i
]->callback(mids
[i
]);
999 cifs_mid_q_entry_release(mids
[i
]);
1000 } else if (server
->ops
->is_oplock_break
&&
1001 server
->ops
->is_oplock_break(bufs
[i
],
1003 smb2_add_credits_from_hdr(bufs
[i
], server
);
1004 cifs_dbg(FYI
, "Received oplock break\n");
1006 cifs_server_dbg(VFS
, "No task to wake, unknown frame received! NumMids %d\n",
1007 atomic_read(&midCount
));
1008 cifs_dump_mem("Received Data is: ", bufs
[i
],
1009 HEADER_SIZE(server
));
1010 smb2_add_credits_from_hdr(bufs
[i
], server
);
1011 #ifdef CONFIG_CIFS_DEBUG2
1012 if (server
->ops
->dump_detail
)
1013 server
->ops
->dump_detail(bufs
[i
],
1015 cifs_dump_mids(server
);
1016 #endif /* CIFS_DEBUG2 */
1020 if (pdu_length
> server
->pdu_size
) {
1021 if (!allocate_buffers(server
))
1023 pdu_length
-= server
->pdu_size
;
1024 server
->total_read
= 0;
1025 server
->large_buf
= false;
1026 buf
= server
->smallbuf
;
1029 } /* end while !EXITING */
1031 /* buffer usually freed in free_mid - need to free it here on exit */
1032 cifs_buf_release(server
->bigbuf
);
1033 if (server
->smallbuf
) /* no sense logging a debug message if NULL */
1034 cifs_small_buf_release(server
->smallbuf
);
1036 task_to_wake
= xchg(&server
->tsk
, NULL
);
1037 clean_demultiplex_info(server
);
1039 /* if server->tsk was NULL then wait for a signal before exiting */
1040 if (!task_to_wake
) {
1041 set_current_state(TASK_INTERRUPTIBLE
);
1042 while (!signal_pending(current
)) {
1044 set_current_state(TASK_INTERRUPTIBLE
);
1046 set_current_state(TASK_RUNNING
);
1049 memalloc_noreclaim_restore(noreclaim_flag
);
1050 module_put_and_exit(0);
1054 * Returns true if srcaddr isn't specified and rhs isn't specified, or
1055 * if srcaddr is specified and matches the IP address of the rhs argument
1058 cifs_match_ipaddr(struct sockaddr
*srcaddr
, struct sockaddr
*rhs
)
1060 switch (srcaddr
->sa_family
) {
1062 return (rhs
->sa_family
== AF_UNSPEC
);
1064 struct sockaddr_in
*saddr4
= (struct sockaddr_in
*)srcaddr
;
1065 struct sockaddr_in
*vaddr4
= (struct sockaddr_in
*)rhs
;
1066 return (saddr4
->sin_addr
.s_addr
== vaddr4
->sin_addr
.s_addr
);
1069 struct sockaddr_in6
*saddr6
= (struct sockaddr_in6
*)srcaddr
;
1070 struct sockaddr_in6
*vaddr6
= (struct sockaddr_in6
*)rhs
;
1071 return ipv6_addr_equal(&saddr6
->sin6_addr
, &vaddr6
->sin6_addr
);
1075 return false; /* don't expect to be here */
1080 * If no port is specified in addr structure, we try to match with 445 port
1081 * and if it fails - with 139 ports. It should be called only if address
1082 * families of server and addr are equal.
1085 match_port(struct TCP_Server_Info
*server
, struct sockaddr
*addr
)
1087 __be16 port
, *sport
;
1089 /* SMBDirect manages its own ports, don't match it here */
1093 switch (addr
->sa_family
) {
1095 sport
= &((struct sockaddr_in
*) &server
->dstaddr
)->sin_port
;
1096 port
= ((struct sockaddr_in
*) addr
)->sin_port
;
1099 sport
= &((struct sockaddr_in6
*) &server
->dstaddr
)->sin6_port
;
1100 port
= ((struct sockaddr_in6
*) addr
)->sin6_port
;
1108 port
= htons(CIFS_PORT
);
1112 port
= htons(RFC1001_PORT
);
1115 return port
== *sport
;
1119 match_address(struct TCP_Server_Info
*server
, struct sockaddr
*addr
,
1120 struct sockaddr
*srcaddr
)
1122 switch (addr
->sa_family
) {
1124 struct sockaddr_in
*addr4
= (struct sockaddr_in
*)addr
;
1125 struct sockaddr_in
*srv_addr4
=
1126 (struct sockaddr_in
*)&server
->dstaddr
;
1128 if (addr4
->sin_addr
.s_addr
!= srv_addr4
->sin_addr
.s_addr
)
1133 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)addr
;
1134 struct sockaddr_in6
*srv_addr6
=
1135 (struct sockaddr_in6
*)&server
->dstaddr
;
1137 if (!ipv6_addr_equal(&addr6
->sin6_addr
,
1138 &srv_addr6
->sin6_addr
))
1140 if (addr6
->sin6_scope_id
!= srv_addr6
->sin6_scope_id
)
1146 return false; /* don't expect to be here */
1149 if (!cifs_match_ipaddr(srcaddr
, (struct sockaddr
*)&server
->srcaddr
))
1156 match_security(struct TCP_Server_Info
*server
, struct smb3_fs_context
*ctx
)
1159 * The select_sectype function should either return the ctx->sectype
1160 * that was specified, or "Unspecified" if that sectype was not
1161 * compatible with the given NEGOTIATE request.
1163 if (server
->ops
->select_sectype(server
, ctx
->sectype
)
1168 * Now check if signing mode is acceptable. No need to check
1169 * global_secflags at this point since if MUST_SIGN is set then
1170 * the server->sign had better be too.
1172 if (ctx
->sign
&& !server
->sign
)
1178 static int match_server(struct TCP_Server_Info
*server
, struct smb3_fs_context
*ctx
)
1180 struct sockaddr
*addr
= (struct sockaddr
*)&ctx
->dstaddr
;
1182 if (ctx
->nosharesock
)
1185 /* If multidialect negotiation see if existing sessions match one */
1186 if (strcmp(ctx
->vals
->version_string
, SMB3ANY_VERSION_STRING
) == 0) {
1187 if (server
->vals
->protocol_id
< SMB30_PROT_ID
)
1189 } else if (strcmp(ctx
->vals
->version_string
,
1190 SMBDEFAULT_VERSION_STRING
) == 0) {
1191 if (server
->vals
->protocol_id
< SMB21_PROT_ID
)
1193 } else if ((server
->vals
!= ctx
->vals
) || (server
->ops
!= ctx
->ops
))
1196 if (!net_eq(cifs_net_ns(server
), current
->nsproxy
->net_ns
))
1199 if (!match_address(server
, addr
,
1200 (struct sockaddr
*)&ctx
->srcaddr
))
1203 if (!match_port(server
, addr
))
1206 if (!match_security(server
, ctx
))
1209 if (server
->echo_interval
!= ctx
->echo_interval
* HZ
)
1212 if (server
->rdma
!= ctx
->rdma
)
1215 if (server
->ignore_signature
!= ctx
->ignore_signature
)
1218 if (server
->min_offload
!= ctx
->min_offload
)
1224 struct TCP_Server_Info
*
1225 cifs_find_tcp_session(struct smb3_fs_context
*ctx
)
1227 struct TCP_Server_Info
*server
;
1229 spin_lock(&cifs_tcp_ses_lock
);
1230 list_for_each_entry(server
, &cifs_tcp_ses_list
, tcp_ses_list
) {
1232 * Skip ses channels since they're only handled in lower layers
1233 * (e.g. cifs_send_recv).
1235 if (server
->is_channel
|| !match_server(server
, ctx
))
1238 ++server
->srv_count
;
1239 spin_unlock(&cifs_tcp_ses_lock
);
1240 cifs_dbg(FYI
, "Existing tcp session with server found\n");
1243 spin_unlock(&cifs_tcp_ses_lock
);
1248 cifs_put_tcp_session(struct TCP_Server_Info
*server
, int from_reconnect
)
1250 struct task_struct
*task
;
1252 spin_lock(&cifs_tcp_ses_lock
);
1253 if (--server
->srv_count
> 0) {
1254 spin_unlock(&cifs_tcp_ses_lock
);
1258 put_net(cifs_net_ns(server
));
1260 list_del_init(&server
->tcp_ses_list
);
1261 spin_unlock(&cifs_tcp_ses_lock
);
1263 cancel_delayed_work_sync(&server
->echo
);
1267 * Avoid deadlock here: reconnect work calls
1268 * cifs_put_tcp_session() at its end. Need to be sure
1269 * that reconnect work does nothing with server pointer after
1272 cancel_delayed_work(&server
->reconnect
);
1274 cancel_delayed_work_sync(&server
->reconnect
);
1276 spin_lock(&GlobalMid_Lock
);
1277 server
->tcpStatus
= CifsExiting
;
1278 spin_unlock(&GlobalMid_Lock
);
1280 cifs_crypto_secmech_release(server
);
1281 cifs_fscache_release_client_cookie(server
);
1283 kfree(server
->session_key
.response
);
1284 server
->session_key
.response
= NULL
;
1285 server
->session_key
.len
= 0;
1287 task
= xchg(&server
->tsk
, NULL
);
1289 send_sig(SIGKILL
, task
, 1);
1292 struct TCP_Server_Info
*
1293 cifs_get_tcp_session(struct smb3_fs_context
*ctx
)
1295 struct TCP_Server_Info
*tcp_ses
= NULL
;
1298 cifs_dbg(FYI
, "UNC: %s\n", ctx
->UNC
);
1300 /* see if we already have a matching tcp_ses */
1301 tcp_ses
= cifs_find_tcp_session(ctx
);
1305 tcp_ses
= kzalloc(sizeof(struct TCP_Server_Info
), GFP_KERNEL
);
1311 tcp_ses
->ops
= ctx
->ops
;
1312 tcp_ses
->vals
= ctx
->vals
;
1313 cifs_set_net_ns(tcp_ses
, get_net(current
->nsproxy
->net_ns
));
1314 tcp_ses
->hostname
= extract_hostname(ctx
->UNC
);
1315 if (IS_ERR(tcp_ses
->hostname
)) {
1316 rc
= PTR_ERR(tcp_ses
->hostname
);
1317 goto out_err_crypto_release
;
1320 tcp_ses
->noblockcnt
= ctx
->rootfs
;
1321 tcp_ses
->noblocksnd
= ctx
->noblocksnd
|| ctx
->rootfs
;
1322 tcp_ses
->noautotune
= ctx
->noautotune
;
1323 tcp_ses
->tcp_nodelay
= ctx
->sockopt_tcp_nodelay
;
1324 tcp_ses
->rdma
= ctx
->rdma
;
1325 tcp_ses
->in_flight
= 0;
1326 tcp_ses
->max_in_flight
= 0;
1327 tcp_ses
->credits
= 1;
1328 init_waitqueue_head(&tcp_ses
->response_q
);
1329 init_waitqueue_head(&tcp_ses
->request_q
);
1330 INIT_LIST_HEAD(&tcp_ses
->pending_mid_q
);
1331 mutex_init(&tcp_ses
->srv_mutex
);
1332 memcpy(tcp_ses
->workstation_RFC1001_name
,
1333 ctx
->source_rfc1001_name
, RFC1001_NAME_LEN_WITH_NULL
);
1334 memcpy(tcp_ses
->server_RFC1001_name
,
1335 ctx
->target_rfc1001_name
, RFC1001_NAME_LEN_WITH_NULL
);
1336 tcp_ses
->session_estab
= false;
1337 tcp_ses
->sequence_number
= 0;
1338 tcp_ses
->reconnect_instance
= 1;
1339 tcp_ses
->lstrp
= jiffies
;
1340 tcp_ses
->compress_algorithm
= cpu_to_le16(ctx
->compression
);
1341 spin_lock_init(&tcp_ses
->req_lock
);
1342 INIT_LIST_HEAD(&tcp_ses
->tcp_ses_list
);
1343 INIT_LIST_HEAD(&tcp_ses
->smb_ses_list
);
1344 INIT_DELAYED_WORK(&tcp_ses
->echo
, cifs_echo_request
);
1345 INIT_DELAYED_WORK(&tcp_ses
->reconnect
, smb2_reconnect_server
);
1346 mutex_init(&tcp_ses
->reconnect_mutex
);
1347 memcpy(&tcp_ses
->srcaddr
, &ctx
->srcaddr
,
1348 sizeof(tcp_ses
->srcaddr
));
1349 memcpy(&tcp_ses
->dstaddr
, &ctx
->dstaddr
,
1350 sizeof(tcp_ses
->dstaddr
));
1351 if (ctx
->use_client_guid
)
1352 memcpy(tcp_ses
->client_guid
, ctx
->client_guid
,
1353 SMB2_CLIENT_GUID_SIZE
);
1355 generate_random_uuid(tcp_ses
->client_guid
);
1357 * at this point we are the only ones with the pointer
1358 * to the struct since the kernel thread not created yet
1359 * no need to spinlock this init of tcpStatus or srv_count
1361 tcp_ses
->tcpStatus
= CifsNew
;
1362 ++tcp_ses
->srv_count
;
1364 if (ctx
->echo_interval
>= SMB_ECHO_INTERVAL_MIN
&&
1365 ctx
->echo_interval
<= SMB_ECHO_INTERVAL_MAX
)
1366 tcp_ses
->echo_interval
= ctx
->echo_interval
* HZ
;
1368 tcp_ses
->echo_interval
= SMB_ECHO_INTERVAL_DEFAULT
* HZ
;
1369 if (tcp_ses
->rdma
) {
1370 #ifndef CONFIG_CIFS_SMB_DIRECT
1371 cifs_dbg(VFS
, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
1373 goto out_err_crypto_release
;
1375 tcp_ses
->smbd_conn
= smbd_get_connection(
1376 tcp_ses
, (struct sockaddr
*)&ctx
->dstaddr
);
1377 if (tcp_ses
->smbd_conn
) {
1378 cifs_dbg(VFS
, "RDMA transport established\n");
1380 goto smbd_connected
;
1383 goto out_err_crypto_release
;
1386 rc
= ip_connect(tcp_ses
);
1388 cifs_dbg(VFS
, "Error connecting to socket. Aborting operation.\n");
1389 goto out_err_crypto_release
;
1393 * since we're in a cifs function already, we know that
1394 * this will succeed. No need for try_module_get().
1396 __module_get(THIS_MODULE
);
1397 tcp_ses
->tsk
= kthread_run(cifs_demultiplex_thread
,
1399 if (IS_ERR(tcp_ses
->tsk
)) {
1400 rc
= PTR_ERR(tcp_ses
->tsk
);
1401 cifs_dbg(VFS
, "error %d create cifsd thread\n", rc
);
1402 module_put(THIS_MODULE
);
1403 goto out_err_crypto_release
;
1405 tcp_ses
->min_offload
= ctx
->min_offload
;
1406 tcp_ses
->tcpStatus
= CifsNeedNegotiate
;
1408 tcp_ses
->nr_targets
= 1;
1409 tcp_ses
->ignore_signature
= ctx
->ignore_signature
;
1410 /* thread spawned, put it on the list */
1411 spin_lock(&cifs_tcp_ses_lock
);
1412 list_add(&tcp_ses
->tcp_ses_list
, &cifs_tcp_ses_list
);
1413 spin_unlock(&cifs_tcp_ses_lock
);
1415 cifs_fscache_get_client_cookie(tcp_ses
);
1417 /* queue echo request delayed work */
1418 queue_delayed_work(cifsiod_wq
, &tcp_ses
->echo
, tcp_ses
->echo_interval
);
1422 out_err_crypto_release
:
1423 cifs_crypto_secmech_release(tcp_ses
);
1425 put_net(cifs_net_ns(tcp_ses
));
1429 if (!IS_ERR(tcp_ses
->hostname
))
1430 kfree(tcp_ses
->hostname
);
1431 if (tcp_ses
->ssocket
)
1432 sock_release(tcp_ses
->ssocket
);
1438 static int match_session(struct cifs_ses
*ses
, struct smb3_fs_context
*ctx
)
1440 if (ctx
->sectype
!= Unspecified
&&
1441 ctx
->sectype
!= ses
->sectype
)
1445 * If an existing session is limited to less channels than
1446 * requested, it should not be reused
1448 if (ses
->chan_max
< ctx
->max_channels
)
1451 switch (ses
->sectype
) {
1453 if (!uid_eq(ctx
->cred_uid
, ses
->cred_uid
))
1457 /* NULL username means anonymous session */
1458 if (ses
->user_name
== NULL
) {
1464 /* anything else takes username/password */
1465 if (strncmp(ses
->user_name
,
1466 ctx
->username
? ctx
->username
: "",
1467 CIFS_MAX_USERNAME_LEN
))
1469 if ((ctx
->username
&& strlen(ctx
->username
) != 0) &&
1470 ses
->password
!= NULL
&&
1471 strncmp(ses
->password
,
1472 ctx
->password
? ctx
->password
: "",
1473 CIFS_MAX_PASSWORD_LEN
))
1480 * cifs_setup_ipc - helper to setup the IPC tcon for the session
1482 * A new IPC connection is made and stored in the session
1483 * tcon_ipc. The IPC tcon has the same lifetime as the session.
1486 cifs_setup_ipc(struct cifs_ses
*ses
, struct smb3_fs_context
*ctx
)
1489 struct cifs_tcon
*tcon
;
1490 char unc
[SERVER_NAME_LENGTH
+ sizeof("//x/IPC$")] = {0};
1492 struct TCP_Server_Info
*server
= ses
->server
;
1495 * If the mount request that resulted in the creation of the
1496 * session requires encryption, force IPC to be encrypted too.
1499 if (server
->capabilities
& SMB2_GLOBAL_CAP_ENCRYPTION
)
1502 cifs_server_dbg(VFS
,
1503 "IPC: server doesn't support encryption\n");
1508 tcon
= tconInfoAlloc();
1512 scnprintf(unc
, sizeof(unc
), "\\\\%s\\IPC$", server
->hostname
);
1518 rc
= server
->ops
->tree_connect(xid
, ses
, unc
, tcon
, ctx
->local_nls
);
1522 cifs_server_dbg(VFS
, "failed to connect to IPC (rc=%d)\n", rc
);
1527 cifs_dbg(FYI
, "IPC tcon rc = %d ipc tid = %d\n", rc
, tcon
->tid
);
1529 ses
->tcon_ipc
= tcon
;
1535 * cifs_free_ipc - helper to release the session IPC tcon
1537 * Needs to be called everytime a session is destroyed
1540 cifs_free_ipc(struct cifs_ses
*ses
)
1543 struct cifs_tcon
*tcon
= ses
->tcon_ipc
;
1548 if (ses
->server
->ops
->tree_disconnect
) {
1550 rc
= ses
->server
->ops
->tree_disconnect(xid
, tcon
);
1555 cifs_dbg(FYI
, "failed to disconnect IPC tcon (rc=%d)\n", rc
);
1558 ses
->tcon_ipc
= NULL
;
1562 static struct cifs_ses
*
1563 cifs_find_smb_ses(struct TCP_Server_Info
*server
, struct smb3_fs_context
*ctx
)
1565 struct cifs_ses
*ses
;
1567 spin_lock(&cifs_tcp_ses_lock
);
1568 list_for_each_entry(ses
, &server
->smb_ses_list
, smb_ses_list
) {
1569 if (ses
->status
== CifsExiting
)
1571 if (!match_session(ses
, ctx
))
1574 spin_unlock(&cifs_tcp_ses_lock
);
1577 spin_unlock(&cifs_tcp_ses_lock
);
1581 void cifs_put_smb_ses(struct cifs_ses
*ses
)
1583 unsigned int rc
, xid
;
1584 struct TCP_Server_Info
*server
= ses
->server
;
1586 cifs_dbg(FYI
, "%s: ses_count=%d\n", __func__
, ses
->ses_count
);
1588 spin_lock(&cifs_tcp_ses_lock
);
1589 if (ses
->status
== CifsExiting
) {
1590 spin_unlock(&cifs_tcp_ses_lock
);
1593 if (--ses
->ses_count
> 0) {
1594 spin_unlock(&cifs_tcp_ses_lock
);
1597 if (ses
->status
== CifsGood
)
1598 ses
->status
= CifsExiting
;
1599 spin_unlock(&cifs_tcp_ses_lock
);
1603 if (ses
->status
== CifsExiting
&& server
->ops
->logoff
) {
1605 rc
= server
->ops
->logoff(xid
, ses
);
1607 cifs_server_dbg(VFS
, "%s: Session Logoff failure rc=%d\n",
1612 spin_lock(&cifs_tcp_ses_lock
);
1613 list_del_init(&ses
->smb_ses_list
);
1614 spin_unlock(&cifs_tcp_ses_lock
);
1616 /* close any extra channels */
1617 if (ses
->chan_count
> 1) {
1620 for (i
= 1; i
< ses
->chan_count
; i
++)
1621 cifs_put_tcp_session(ses
->chans
[i
].server
, 0);
1625 cifs_put_tcp_session(server
, 0);
1630 /* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
1631 #define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
1633 /* Populate username and pw fields from keyring if possible */
1635 cifs_set_cifscreds(struct smb3_fs_context
*ctx
, struct cifs_ses
*ses
)
1639 const char *delim
, *payload
;
1643 struct TCP_Server_Info
*server
= ses
->server
;
1644 struct sockaddr_in
*sa
;
1645 struct sockaddr_in6
*sa6
;
1646 const struct user_key_payload
*upayload
;
1648 desc
= kmalloc(CIFSCREDS_DESC_SIZE
, GFP_KERNEL
);
1652 /* try to find an address key first */
1653 switch (server
->dstaddr
.ss_family
) {
1655 sa
= (struct sockaddr_in
*)&server
->dstaddr
;
1656 sprintf(desc
, "cifs:a:%pI4", &sa
->sin_addr
.s_addr
);
1659 sa6
= (struct sockaddr_in6
*)&server
->dstaddr
;
1660 sprintf(desc
, "cifs:a:%pI6c", &sa6
->sin6_addr
.s6_addr
);
1663 cifs_dbg(FYI
, "Bad ss_family (%hu)\n",
1664 server
->dstaddr
.ss_family
);
1669 cifs_dbg(FYI
, "%s: desc=%s\n", __func__
, desc
);
1670 key
= request_key(&key_type_logon
, desc
, "");
1672 if (!ses
->domainName
) {
1673 cifs_dbg(FYI
, "domainName is NULL\n");
1678 /* didn't work, try to find a domain key */
1679 sprintf(desc
, "cifs:d:%s", ses
->domainName
);
1680 cifs_dbg(FYI
, "%s: desc=%s\n", __func__
, desc
);
1681 key
= request_key(&key_type_logon
, desc
, "");
1689 down_read(&key
->sem
);
1690 upayload
= user_key_payload_locked(key
);
1691 if (IS_ERR_OR_NULL(upayload
)) {
1692 rc
= upayload
? PTR_ERR(upayload
) : -EINVAL
;
1696 /* find first : in payload */
1697 payload
= upayload
->data
;
1698 delim
= strnchr(payload
, upayload
->datalen
, ':');
1699 cifs_dbg(FYI
, "payload=%s\n", payload
);
1701 cifs_dbg(FYI
, "Unable to find ':' in payload (datalen=%d)\n",
1707 len
= delim
- payload
;
1708 if (len
> CIFS_MAX_USERNAME_LEN
|| len
<= 0) {
1709 cifs_dbg(FYI
, "Bad value from username search (len=%zd)\n",
1715 ctx
->username
= kstrndup(payload
, len
, GFP_KERNEL
);
1716 if (!ctx
->username
) {
1717 cifs_dbg(FYI
, "Unable to allocate %zd bytes for username\n",
1722 cifs_dbg(FYI
, "%s: username=%s\n", __func__
, ctx
->username
);
1724 len
= key
->datalen
- (len
+ 1);
1725 if (len
> CIFS_MAX_PASSWORD_LEN
|| len
<= 0) {
1726 cifs_dbg(FYI
, "Bad len for password search (len=%zd)\n", len
);
1728 kfree(ctx
->username
);
1729 ctx
->username
= NULL
;
1734 ctx
->password
= kstrndup(delim
, len
, GFP_KERNEL
);
1735 if (!ctx
->password
) {
1736 cifs_dbg(FYI
, "Unable to allocate %zd bytes for password\n",
1739 kfree(ctx
->username
);
1740 ctx
->username
= NULL
;
1745 * If we have a domain key then we must set the domainName in the
1748 if (is_domain
&& ses
->domainName
) {
1749 ctx
->domainname
= kstrndup(ses
->domainName
,
1750 strlen(ses
->domainName
),
1752 if (!ctx
->domainname
) {
1753 cifs_dbg(FYI
, "Unable to allocate %zd bytes for domain\n",
1756 kfree(ctx
->username
);
1757 ctx
->username
= NULL
;
1758 kfree_sensitive(ctx
->password
);
1759 ctx
->password
= NULL
;
1769 cifs_dbg(FYI
, "%s: returning %d\n", __func__
, rc
);
1772 #else /* ! CONFIG_KEYS */
1774 cifs_set_cifscreds(struct smb3_fs_context
*ctx
__attribute__((unused
)),
1775 struct cifs_ses
*ses
__attribute__((unused
)))
1779 #endif /* CONFIG_KEYS */
1782 * cifs_get_smb_ses - get a session matching @ctx data from @server
1784 * This function assumes it is being called from cifs_mount() where we
1785 * already got a server reference (server refcount +1). See
1786 * cifs_get_tcon() for refcount explanations.
1789 cifs_get_smb_ses(struct TCP_Server_Info
*server
, struct smb3_fs_context
*ctx
)
1793 struct cifs_ses
*ses
;
1794 struct sockaddr_in
*addr
= (struct sockaddr_in
*)&server
->dstaddr
;
1795 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)&server
->dstaddr
;
1799 ses
= cifs_find_smb_ses(server
, ctx
);
1801 cifs_dbg(FYI
, "Existing smb sess found (status=%d)\n",
1804 mutex_lock(&ses
->session_mutex
);
1805 rc
= cifs_negotiate_protocol(xid
, ses
);
1807 mutex_unlock(&ses
->session_mutex
);
1808 /* problem -- put our ses reference */
1809 cifs_put_smb_ses(ses
);
1813 if (ses
->need_reconnect
) {
1814 cifs_dbg(FYI
, "Session needs reconnect\n");
1815 rc
= cifs_setup_session(xid
, ses
,
1818 mutex_unlock(&ses
->session_mutex
);
1819 /* problem -- put our reference */
1820 cifs_put_smb_ses(ses
);
1825 mutex_unlock(&ses
->session_mutex
);
1827 /* existing SMB ses has a server reference already */
1828 cifs_put_tcp_session(server
, 0);
1833 cifs_dbg(FYI
, "Existing smb sess not found\n");
1834 ses
= sesInfoAlloc();
1838 /* new SMB session uses our server ref */
1839 ses
->server
= server
;
1840 if (server
->dstaddr
.ss_family
== AF_INET6
)
1841 sprintf(ses
->serverName
, "%pI6", &addr6
->sin6_addr
);
1843 sprintf(ses
->serverName
, "%pI4", &addr
->sin_addr
);
1845 if (ctx
->username
) {
1846 ses
->user_name
= kstrdup(ctx
->username
, GFP_KERNEL
);
1847 if (!ses
->user_name
)
1851 /* ctx->password freed at unmount */
1852 if (ctx
->password
) {
1853 ses
->password
= kstrdup(ctx
->password
, GFP_KERNEL
);
1857 if (ctx
->domainname
) {
1858 ses
->domainName
= kstrdup(ctx
->domainname
, GFP_KERNEL
);
1859 if (!ses
->domainName
)
1862 if (ctx
->domainauto
)
1863 ses
->domainAuto
= ctx
->domainauto
;
1864 ses
->cred_uid
= ctx
->cred_uid
;
1865 ses
->linux_uid
= ctx
->linux_uid
;
1867 ses
->sectype
= ctx
->sectype
;
1868 ses
->sign
= ctx
->sign
;
1869 mutex_lock(&ses
->session_mutex
);
1871 /* add server as first channel */
1872 ses
->chans
[0].server
= server
;
1873 ses
->chan_count
= 1;
1874 ses
->chan_max
= ctx
->multichannel
? ctx
->max_channels
:1;
1876 rc
= cifs_negotiate_protocol(xid
, ses
);
1878 rc
= cifs_setup_session(xid
, ses
, ctx
->local_nls
);
1880 /* each channel uses a different signing key */
1881 memcpy(ses
->chans
[0].signkey
, ses
->smb3signingkey
,
1882 sizeof(ses
->smb3signingkey
));
1884 mutex_unlock(&ses
->session_mutex
);
1888 /* success, put it on the list and add it as first channel */
1889 spin_lock(&cifs_tcp_ses_lock
);
1890 list_add(&ses
->smb_ses_list
, &server
->smb_ses_list
);
1891 spin_unlock(&cifs_tcp_ses_lock
);
1895 cifs_setup_ipc(ses
, ctx
);
1905 static int match_tcon(struct cifs_tcon
*tcon
, struct smb3_fs_context
*ctx
)
1907 if (tcon
->tidStatus
== CifsExiting
)
1909 if (strncmp(tcon
->treeName
, ctx
->UNC
, MAX_TREE_SIZE
))
1911 if (tcon
->seal
!= ctx
->seal
)
1913 if (tcon
->snapshot_time
!= ctx
->snapshot_time
)
1915 if (tcon
->handle_timeout
!= ctx
->handle_timeout
)
1917 if (tcon
->no_lease
!= ctx
->no_lease
)
1919 if (tcon
->nodelete
!= ctx
->nodelete
)
1924 static struct cifs_tcon
*
1925 cifs_find_tcon(struct cifs_ses
*ses
, struct smb3_fs_context
*ctx
)
1927 struct list_head
*tmp
;
1928 struct cifs_tcon
*tcon
;
1930 spin_lock(&cifs_tcp_ses_lock
);
1931 list_for_each(tmp
, &ses
->tcon_list
) {
1932 tcon
= list_entry(tmp
, struct cifs_tcon
, tcon_list
);
1933 #ifdef CONFIG_CIFS_DFS_UPCALL
1937 if (!match_tcon(tcon
, ctx
))
1940 spin_unlock(&cifs_tcp_ses_lock
);
1943 spin_unlock(&cifs_tcp_ses_lock
);
1948 cifs_put_tcon(struct cifs_tcon
*tcon
)
1951 struct cifs_ses
*ses
;
1954 * IPC tcon share the lifetime of their session and are
1955 * destroyed in the session put function
1957 if (tcon
== NULL
|| tcon
->ipc
)
1961 cifs_dbg(FYI
, "%s: tc_count=%d\n", __func__
, tcon
->tc_count
);
1962 spin_lock(&cifs_tcp_ses_lock
);
1963 if (--tcon
->tc_count
> 0) {
1964 spin_unlock(&cifs_tcp_ses_lock
);
1968 #ifdef CONFIG_CIFS_SWN_UPCALL
1969 if (tcon
->use_witness
) {
1972 rc
= cifs_swn_unregister(tcon
);
1974 cifs_dbg(VFS
, "%s: Failed to unregister for witness notifications: %d\n",
1980 list_del_init(&tcon
->tcon_list
);
1981 spin_unlock(&cifs_tcp_ses_lock
);
1984 if (ses
->server
->ops
->tree_disconnect
)
1985 ses
->server
->ops
->tree_disconnect(xid
, tcon
);
1988 cifs_fscache_release_super_cookie(tcon
);
1990 cifs_put_smb_ses(ses
);
1994 * cifs_get_tcon - get a tcon matching @ctx data from @ses
1996 * - tcon refcount is the number of mount points using the tcon.
1997 * - ses refcount is the number of tcon using the session.
1999 * 1. This function assumes it is being called from cifs_mount() where
2000 * we already got a session reference (ses refcount +1).
2002 * 2. Since we're in the context of adding a mount point, the end
2003 * result should be either:
2005 * a) a new tcon already allocated with refcount=1 (1 mount point) and
2006 * its session refcount incremented (1 new tcon). This +1 was
2007 * already done in (1).
2009 * b) an existing tcon with refcount+1 (add a mount point to it) and
2010 * identical ses refcount (no new tcon). Because of (1) we need to
2011 * decrement the ses refcount.
2013 static struct cifs_tcon
*
2014 cifs_get_tcon(struct cifs_ses
*ses
, struct smb3_fs_context
*ctx
)
2017 struct cifs_tcon
*tcon
;
2019 tcon
= cifs_find_tcon(ses
, ctx
);
2022 * tcon has refcount already incremented but we need to
2023 * decrement extra ses reference gotten by caller (case b)
2025 cifs_dbg(FYI
, "Found match on UNC path\n");
2026 cifs_put_smb_ses(ses
);
2030 if (!ses
->server
->ops
->tree_connect
) {
2035 tcon
= tconInfoAlloc();
2041 if (ctx
->snapshot_time
) {
2042 if (ses
->server
->vals
->protocol_id
== 0) {
2044 "Use SMB2 or later for snapshot mount option\n");
2048 tcon
->snapshot_time
= ctx
->snapshot_time
;
2051 if (ctx
->handle_timeout
) {
2052 if (ses
->server
->vals
->protocol_id
== 0) {
2054 "Use SMB2.1 or later for handle timeout option\n");
2058 tcon
->handle_timeout
= ctx
->handle_timeout
;
2062 if (ctx
->password
) {
2063 tcon
->password
= kstrdup(ctx
->password
, GFP_KERNEL
);
2064 if (!tcon
->password
) {
2071 if (ses
->server
->vals
->protocol_id
== 0) {
2073 "SMB3 or later required for encryption\n");
2076 } else if (tcon
->ses
->server
->capabilities
&
2077 SMB2_GLOBAL_CAP_ENCRYPTION
)
2080 cifs_dbg(VFS
, "Encryption is not supported on share\n");
2086 if (ctx
->linux_ext
) {
2087 if (ses
->server
->posix_ext_supported
) {
2088 tcon
->posix_extensions
= true;
2089 pr_warn_once("SMB3.11 POSIX Extensions are experimental\n");
2091 cifs_dbg(VFS
, "Server does not support mounting with posix SMB3.11 extensions\n");
2098 * BB Do we need to wrap session_mutex around this TCon call and Unix
2099 * SetFS as we do on SessSetup and reconnect?
2102 rc
= ses
->server
->ops
->tree_connect(xid
, ses
, ctx
->UNC
, tcon
,
2105 cifs_dbg(FYI
, "Tcon rc = %d\n", rc
);
2109 tcon
->use_persistent
= false;
2110 /* check if SMB2 or later, CIFS does not support persistent handles */
2111 if (ctx
->persistent
) {
2112 if (ses
->server
->vals
->protocol_id
== 0) {
2114 "SMB3 or later required for persistent handles\n");
2117 } else if (ses
->server
->capabilities
&
2118 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES
)
2119 tcon
->use_persistent
= true;
2120 else /* persistent handles requested but not supported */ {
2122 "Persistent handles not supported on share\n");
2126 } else if ((tcon
->capabilities
& SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY
)
2127 && (ses
->server
->capabilities
& SMB2_GLOBAL_CAP_PERSISTENT_HANDLES
)
2128 && (ctx
->nopersistent
== false)) {
2129 cifs_dbg(FYI
, "enabling persistent handles\n");
2130 tcon
->use_persistent
= true;
2131 } else if (ctx
->resilient
) {
2132 if (ses
->server
->vals
->protocol_id
== 0) {
2134 "SMB2.1 or later required for resilient handles\n");
2138 tcon
->use_resilient
= true;
2140 #ifdef CONFIG_CIFS_SWN_UPCALL
2141 tcon
->use_witness
= false;
2143 if (ses
->server
->vals
->protocol_id
>= SMB30_PROT_ID
) {
2144 if (tcon
->capabilities
& SMB2_SHARE_CAP_CLUSTER
) {
2146 * Set witness in use flag in first place
2147 * to retry registration in the echo task
2149 tcon
->use_witness
= true;
2150 /* And try to register immediately */
2151 rc
= cifs_swn_register(tcon
);
2153 cifs_dbg(VFS
, "Failed to register for witness notifications: %d\n", rc
);
2157 /* TODO: try to extend for non-cluster uses (eg multichannel) */
2158 cifs_dbg(VFS
, "witness requested on mount but no CLUSTER capability on share\n");
2163 cifs_dbg(VFS
, "SMB3 or later required for witness option\n");
2170 /* If the user really knows what they are doing they can override */
2171 if (tcon
->share_flags
& SMB2_SHAREFLAG_NO_CACHING
) {
2173 cifs_dbg(VFS
, "cache=ro requested on mount but NO_CACHING flag set on share\n");
2174 else if (ctx
->cache_rw
)
2175 cifs_dbg(VFS
, "cache=singleclient requested on mount but NO_CACHING flag set on share\n");
2178 if (ctx
->no_lease
) {
2179 if (ses
->server
->vals
->protocol_id
== 0) {
2181 "SMB2 or later required for nolease option\n");
2185 tcon
->no_lease
= ctx
->no_lease
;
2189 * We can have only one retry value for a connection to a share so for
2190 * resources mounted more than once to the same server share the last
2191 * value passed in for the retry flag is used.
2193 tcon
->retry
= ctx
->retry
;
2194 tcon
->nocase
= ctx
->nocase
;
2195 if (ses
->server
->capabilities
& SMB2_GLOBAL_CAP_DIRECTORY_LEASING
)
2196 tcon
->nohandlecache
= ctx
->nohandlecache
;
2198 tcon
->nohandlecache
= 1;
2199 tcon
->nodelete
= ctx
->nodelete
;
2200 tcon
->local_lease
= ctx
->local_lease
;
2201 INIT_LIST_HEAD(&tcon
->pending_opens
);
2203 spin_lock(&cifs_tcp_ses_lock
);
2204 list_add(&tcon
->tcon_list
, &ses
->tcon_list
);
2205 spin_unlock(&cifs_tcp_ses_lock
);
2207 cifs_fscache_get_super_cookie(tcon
);
2217 cifs_put_tlink(struct tcon_link
*tlink
)
2219 if (!tlink
|| IS_ERR(tlink
))
2222 if (!atomic_dec_and_test(&tlink
->tl_count
) ||
2223 test_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
)) {
2224 tlink
->tl_time
= jiffies
;
2228 if (!IS_ERR(tlink_tcon(tlink
)))
2229 cifs_put_tcon(tlink_tcon(tlink
));
2235 compare_mount_options(struct super_block
*sb
, struct cifs_mnt_data
*mnt_data
)
2237 struct cifs_sb_info
*old
= CIFS_SB(sb
);
2238 struct cifs_sb_info
*new = mnt_data
->cifs_sb
;
2239 unsigned int oldflags
= old
->mnt_cifs_flags
& CIFS_MOUNT_MASK
;
2240 unsigned int newflags
= new->mnt_cifs_flags
& CIFS_MOUNT_MASK
;
2242 if ((sb
->s_flags
& CIFS_MS_MASK
) != (mnt_data
->flags
& CIFS_MS_MASK
))
2245 if (old
->mnt_cifs_serverino_autodisabled
)
2246 newflags
&= ~CIFS_MOUNT_SERVER_INUM
;
2248 if (oldflags
!= newflags
)
2252 * We want to share sb only if we don't specify an r/wsize or
2253 * specified r/wsize is greater than or equal to existing one.
2255 if (new->ctx
->wsize
&& new->ctx
->wsize
< old
->ctx
->wsize
)
2258 if (new->ctx
->rsize
&& new->ctx
->rsize
< old
->ctx
->rsize
)
2261 if (!uid_eq(old
->ctx
->linux_uid
, new->ctx
->linux_uid
) ||
2262 !gid_eq(old
->ctx
->linux_gid
, new->ctx
->linux_gid
))
2265 if (old
->ctx
->file_mode
!= new->ctx
->file_mode
||
2266 old
->ctx
->dir_mode
!= new->ctx
->dir_mode
)
2269 if (strcmp(old
->local_nls
->charset
, new->local_nls
->charset
))
2272 if (old
->ctx
->actimeo
!= new->ctx
->actimeo
)
2279 match_prepath(struct super_block
*sb
, struct cifs_mnt_data
*mnt_data
)
2281 struct cifs_sb_info
*old
= CIFS_SB(sb
);
2282 struct cifs_sb_info
*new = mnt_data
->cifs_sb
;
2283 bool old_set
= (old
->mnt_cifs_flags
& CIFS_MOUNT_USE_PREFIX_PATH
) &&
2285 bool new_set
= (new->mnt_cifs_flags
& CIFS_MOUNT_USE_PREFIX_PATH
) &&
2288 if (old_set
&& new_set
&& !strcmp(new->prepath
, old
->prepath
))
2290 else if (!old_set
&& !new_set
)
2297 cifs_match_super(struct super_block
*sb
, void *data
)
2299 struct cifs_mnt_data
*mnt_data
= (struct cifs_mnt_data
*)data
;
2300 struct smb3_fs_context
*ctx
;
2301 struct cifs_sb_info
*cifs_sb
;
2302 struct TCP_Server_Info
*tcp_srv
;
2303 struct cifs_ses
*ses
;
2304 struct cifs_tcon
*tcon
;
2305 struct tcon_link
*tlink
;
2308 spin_lock(&cifs_tcp_ses_lock
);
2309 cifs_sb
= CIFS_SB(sb
);
2310 tlink
= cifs_get_tlink(cifs_sb_master_tlink(cifs_sb
));
2311 if (IS_ERR(tlink
)) {
2312 spin_unlock(&cifs_tcp_ses_lock
);
2315 tcon
= tlink_tcon(tlink
);
2317 tcp_srv
= ses
->server
;
2319 ctx
= mnt_data
->ctx
;
2321 if (!match_server(tcp_srv
, ctx
) ||
2322 !match_session(ses
, ctx
) ||
2323 !match_tcon(tcon
, ctx
) ||
2324 !match_prepath(sb
, mnt_data
)) {
2329 rc
= compare_mount_options(sb
, mnt_data
);
2331 spin_unlock(&cifs_tcp_ses_lock
);
2332 cifs_put_tlink(tlink
);
2336 #ifdef CONFIG_DEBUG_LOCK_ALLOC
2337 static struct lock_class_key cifs_key
[2];
2338 static struct lock_class_key cifs_slock_key
[2];
2341 cifs_reclassify_socket4(struct socket
*sock
)
2343 struct sock
*sk
= sock
->sk
;
2344 BUG_ON(!sock_allow_reclassification(sk
));
2345 sock_lock_init_class_and_name(sk
, "slock-AF_INET-CIFS",
2346 &cifs_slock_key
[0], "sk_lock-AF_INET-CIFS", &cifs_key
[0]);
2350 cifs_reclassify_socket6(struct socket
*sock
)
2352 struct sock
*sk
= sock
->sk
;
2353 BUG_ON(!sock_allow_reclassification(sk
));
2354 sock_lock_init_class_and_name(sk
, "slock-AF_INET6-CIFS",
2355 &cifs_slock_key
[1], "sk_lock-AF_INET6-CIFS", &cifs_key
[1]);
2359 cifs_reclassify_socket4(struct socket
*sock
)
2364 cifs_reclassify_socket6(struct socket
*sock
)
2369 /* See RFC1001 section 14 on representation of Netbios names */
2370 static void rfc1002mangle(char *target
, char *source
, unsigned int length
)
2374 for (i
= 0, j
= 0; i
< (length
); i
++) {
2375 /* mask a nibble at a time and encode */
2376 target
[j
] = 'A' + (0x0F & (source
[i
] >> 4));
2377 target
[j
+1] = 'A' + (0x0F & source
[i
]);
2384 bind_socket(struct TCP_Server_Info
*server
)
2387 if (server
->srcaddr
.ss_family
!= AF_UNSPEC
) {
2388 /* Bind to the specified local IP address */
2389 struct socket
*socket
= server
->ssocket
;
2390 rc
= socket
->ops
->bind(socket
,
2391 (struct sockaddr
*) &server
->srcaddr
,
2392 sizeof(server
->srcaddr
));
2394 struct sockaddr_in
*saddr4
;
2395 struct sockaddr_in6
*saddr6
;
2396 saddr4
= (struct sockaddr_in
*)&server
->srcaddr
;
2397 saddr6
= (struct sockaddr_in6
*)&server
->srcaddr
;
2398 if (saddr6
->sin6_family
== AF_INET6
)
2399 cifs_server_dbg(VFS
, "Failed to bind to: %pI6c, error: %d\n",
2400 &saddr6
->sin6_addr
, rc
);
2402 cifs_server_dbg(VFS
, "Failed to bind to: %pI4, error: %d\n",
2403 &saddr4
->sin_addr
.s_addr
, rc
);
2410 ip_rfc1001_connect(struct TCP_Server_Info
*server
)
2414 * some servers require RFC1001 sessinit before sending
2415 * negprot - BB check reconnection in case where second
2416 * sessinit is sent but no second negprot
2418 struct rfc1002_session_packet
*ses_init_buf
;
2419 struct smb_hdr
*smb_buf
;
2420 ses_init_buf
= kzalloc(sizeof(struct rfc1002_session_packet
),
2423 ses_init_buf
->trailer
.session_req
.called_len
= 32;
2425 if (server
->server_RFC1001_name
[0] != 0)
2426 rfc1002mangle(ses_init_buf
->trailer
.
2427 session_req
.called_name
,
2428 server
->server_RFC1001_name
,
2429 RFC1001_NAME_LEN_WITH_NULL
);
2431 rfc1002mangle(ses_init_buf
->trailer
.
2432 session_req
.called_name
,
2433 DEFAULT_CIFS_CALLED_NAME
,
2434 RFC1001_NAME_LEN_WITH_NULL
);
2436 ses_init_buf
->trailer
.session_req
.calling_len
= 32;
2439 * calling name ends in null (byte 16) from old smb
2442 if (server
->workstation_RFC1001_name
[0] != 0)
2443 rfc1002mangle(ses_init_buf
->trailer
.
2444 session_req
.calling_name
,
2445 server
->workstation_RFC1001_name
,
2446 RFC1001_NAME_LEN_WITH_NULL
);
2448 rfc1002mangle(ses_init_buf
->trailer
.
2449 session_req
.calling_name
,
2451 RFC1001_NAME_LEN_WITH_NULL
);
2453 ses_init_buf
->trailer
.session_req
.scope1
= 0;
2454 ses_init_buf
->trailer
.session_req
.scope2
= 0;
2455 smb_buf
= (struct smb_hdr
*)ses_init_buf
;
2457 /* sizeof RFC1002_SESSION_REQUEST with no scope */
2458 smb_buf
->smb_buf_length
= cpu_to_be32(0x81000044);
2459 rc
= smb_send(server
, smb_buf
, 0x44);
2460 kfree(ses_init_buf
);
2462 * RFC1001 layer in at least one server
2463 * requires very short break before negprot
2464 * presumably because not expecting negprot
2465 * to follow so fast. This is a simple
2466 * solution that works without
2467 * complicating the code and causes no
2468 * significant slowing down on mount
2471 usleep_range(1000, 2000);
2474 * else the negprot may still work without this
2475 * even though malloc failed
2482 generic_ip_connect(struct TCP_Server_Info
*server
)
2487 struct socket
*socket
= server
->ssocket
;
2488 struct sockaddr
*saddr
;
2490 saddr
= (struct sockaddr
*) &server
->dstaddr
;
2492 if (server
->dstaddr
.ss_family
== AF_INET6
) {
2493 struct sockaddr_in6
*ipv6
= (struct sockaddr_in6
*)&server
->dstaddr
;
2495 sport
= ipv6
->sin6_port
;
2496 slen
= sizeof(struct sockaddr_in6
);
2498 cifs_dbg(FYI
, "%s: connecting to [%pI6]:%d\n", __func__
, &ipv6
->sin6_addr
,
2501 struct sockaddr_in
*ipv4
= (struct sockaddr_in
*)&server
->dstaddr
;
2503 sport
= ipv4
->sin_port
;
2504 slen
= sizeof(struct sockaddr_in
);
2506 cifs_dbg(FYI
, "%s: connecting to %pI4:%d\n", __func__
, &ipv4
->sin_addr
,
2510 if (socket
== NULL
) {
2511 rc
= __sock_create(cifs_net_ns(server
), sfamily
, SOCK_STREAM
,
2512 IPPROTO_TCP
, &socket
, 1);
2514 cifs_server_dbg(VFS
, "Error %d creating socket\n", rc
);
2515 server
->ssocket
= NULL
;
2519 /* BB other socket options to set KEEPALIVE, NODELAY? */
2520 cifs_dbg(FYI
, "Socket created\n");
2521 server
->ssocket
= socket
;
2522 socket
->sk
->sk_allocation
= GFP_NOFS
;
2523 if (sfamily
== AF_INET6
)
2524 cifs_reclassify_socket6(socket
);
2526 cifs_reclassify_socket4(socket
);
2529 rc
= bind_socket(server
);
2534 * Eventually check for other socket options to change from
2535 * the default. sock_setsockopt not used because it expects
2538 socket
->sk
->sk_rcvtimeo
= 7 * HZ
;
2539 socket
->sk
->sk_sndtimeo
= 5 * HZ
;
2541 /* make the bufsizes depend on wsize/rsize and max requests */
2542 if (server
->noautotune
) {
2543 if (socket
->sk
->sk_sndbuf
< (200 * 1024))
2544 socket
->sk
->sk_sndbuf
= 200 * 1024;
2545 if (socket
->sk
->sk_rcvbuf
< (140 * 1024))
2546 socket
->sk
->sk_rcvbuf
= 140 * 1024;
2549 if (server
->tcp_nodelay
)
2550 tcp_sock_set_nodelay(socket
->sk
);
2552 cifs_dbg(FYI
, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
2553 socket
->sk
->sk_sndbuf
,
2554 socket
->sk
->sk_rcvbuf
, socket
->sk
->sk_rcvtimeo
);
2556 rc
= socket
->ops
->connect(socket
, saddr
, slen
,
2557 server
->noblockcnt
? O_NONBLOCK
: 0);
2559 * When mounting SMB root file systems, we do not want to block in
2560 * connect. Otherwise bail out and then let cifs_reconnect() perform
2561 * reconnect failover - if possible.
2563 if (server
->noblockcnt
&& rc
== -EINPROGRESS
)
2566 cifs_dbg(FYI
, "Error %d connecting to server\n", rc
);
2567 sock_release(socket
);
2568 server
->ssocket
= NULL
;
2572 if (sport
== htons(RFC1001_PORT
))
2573 rc
= ip_rfc1001_connect(server
);
2579 ip_connect(struct TCP_Server_Info
*server
)
2582 struct sockaddr_in6
*addr6
= (struct sockaddr_in6
*)&server
->dstaddr
;
2583 struct sockaddr_in
*addr
= (struct sockaddr_in
*)&server
->dstaddr
;
2585 if (server
->dstaddr
.ss_family
== AF_INET6
)
2586 sport
= &addr6
->sin6_port
;
2588 sport
= &addr
->sin_port
;
2593 /* try with 445 port at first */
2594 *sport
= htons(CIFS_PORT
);
2596 rc
= generic_ip_connect(server
);
2600 /* if it failed, try with 139 port */
2601 *sport
= htons(RFC1001_PORT
);
2604 return generic_ip_connect(server
);
2607 void reset_cifs_unix_caps(unsigned int xid
, struct cifs_tcon
*tcon
,
2608 struct cifs_sb_info
*cifs_sb
, struct smb3_fs_context
*ctx
)
2611 * If we are reconnecting then should we check to see if
2612 * any requested capabilities changed locally e.g. via
2613 * remount but we can not do much about it here
2614 * if they have (even if we could detect it by the following)
2615 * Perhaps we could add a backpointer to array of sb from tcon
2616 * or if we change to make all sb to same share the same
2617 * sb as NFS - then we only have one backpointer to sb.
2618 * What if we wanted to mount the server share twice once with
2619 * and once without posixacls or posix paths?
2621 __u64 saved_cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
2623 if (ctx
&& ctx
->no_linux_ext
) {
2624 tcon
->fsUnixInfo
.Capability
= 0;
2625 tcon
->unix_ext
= 0; /* Unix Extensions disabled */
2626 cifs_dbg(FYI
, "Linux protocol extensions disabled\n");
2629 tcon
->unix_ext
= 1; /* Unix Extensions supported */
2631 if (tcon
->unix_ext
== 0) {
2632 cifs_dbg(FYI
, "Unix extensions disabled so not set on reconnect\n");
2636 if (!CIFSSMBQFSUnixInfo(xid
, tcon
)) {
2637 __u64 cap
= le64_to_cpu(tcon
->fsUnixInfo
.Capability
);
2638 cifs_dbg(FYI
, "unix caps which server supports %lld\n", cap
);
2640 * check for reconnect case in which we do not
2641 * want to change the mount behavior if we can avoid it
2645 * turn off POSIX ACL and PATHNAMES if not set
2646 * originally at mount time
2648 if ((saved_cap
& CIFS_UNIX_POSIX_ACL_CAP
) == 0)
2649 cap
&= ~CIFS_UNIX_POSIX_ACL_CAP
;
2650 if ((saved_cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) == 0) {
2651 if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
)
2652 cifs_dbg(VFS
, "POSIXPATH support change\n");
2653 cap
&= ~CIFS_UNIX_POSIX_PATHNAMES_CAP
;
2654 } else if ((cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) == 0) {
2655 cifs_dbg(VFS
, "possible reconnect error\n");
2656 cifs_dbg(VFS
, "server disabled POSIX path support\n");
2660 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)
2661 cifs_dbg(VFS
, "per-share encryption not supported yet\n");
2663 cap
&= CIFS_UNIX_CAP_MASK
;
2664 if (ctx
&& ctx
->no_psx_acl
)
2665 cap
&= ~CIFS_UNIX_POSIX_ACL_CAP
;
2666 else if (CIFS_UNIX_POSIX_ACL_CAP
& cap
) {
2667 cifs_dbg(FYI
, "negotiated posix acl support\n");
2669 cifs_sb
->mnt_cifs_flags
|=
2670 CIFS_MOUNT_POSIXACL
;
2673 if (ctx
&& ctx
->posix_paths
== 0)
2674 cap
&= ~CIFS_UNIX_POSIX_PATHNAMES_CAP
;
2675 else if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
) {
2676 cifs_dbg(FYI
, "negotiate posix pathnames\n");
2678 cifs_sb
->mnt_cifs_flags
|=
2679 CIFS_MOUNT_POSIX_PATHS
;
2682 cifs_dbg(FYI
, "Negotiate caps 0x%x\n", (int)cap
);
2683 #ifdef CONFIG_CIFS_DEBUG2
2684 if (cap
& CIFS_UNIX_FCNTL_CAP
)
2685 cifs_dbg(FYI
, "FCNTL cap\n");
2686 if (cap
& CIFS_UNIX_EXTATTR_CAP
)
2687 cifs_dbg(FYI
, "EXTATTR cap\n");
2688 if (cap
& CIFS_UNIX_POSIX_PATHNAMES_CAP
)
2689 cifs_dbg(FYI
, "POSIX path cap\n");
2690 if (cap
& CIFS_UNIX_XATTR_CAP
)
2691 cifs_dbg(FYI
, "XATTR cap\n");
2692 if (cap
& CIFS_UNIX_POSIX_ACL_CAP
)
2693 cifs_dbg(FYI
, "POSIX ACL cap\n");
2694 if (cap
& CIFS_UNIX_LARGE_READ_CAP
)
2695 cifs_dbg(FYI
, "very large read cap\n");
2696 if (cap
& CIFS_UNIX_LARGE_WRITE_CAP
)
2697 cifs_dbg(FYI
, "very large write cap\n");
2698 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP
)
2699 cifs_dbg(FYI
, "transport encryption cap\n");
2700 if (cap
& CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
)
2701 cifs_dbg(FYI
, "mandatory transport encryption cap\n");
2702 #endif /* CIFS_DEBUG2 */
2703 if (CIFSSMBSetFSUnixInfo(xid
, tcon
, cap
)) {
2705 cifs_dbg(FYI
, "resetting capabilities failed\n");
2707 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");
2713 int cifs_setup_cifs_sb(struct cifs_sb_info
*cifs_sb
)
2715 struct smb3_fs_context
*ctx
= cifs_sb
->ctx
;
2717 INIT_DELAYED_WORK(&cifs_sb
->prune_tlinks
, cifs_prune_tlinks
);
2719 spin_lock_init(&cifs_sb
->tlink_tree_lock
);
2720 cifs_sb
->tlink_tree
= RB_ROOT
;
2722 cifs_dbg(FYI
, "file mode: %04ho dir mode: %04ho\n",
2723 ctx
->file_mode
, ctx
->dir_mode
);
2725 /* this is needed for ASCII cp to Unicode converts */
2726 if (ctx
->iocharset
== NULL
) {
2727 /* load_nls_default cannot return null */
2728 cifs_sb
->local_nls
= load_nls_default();
2730 cifs_sb
->local_nls
= load_nls(ctx
->iocharset
);
2731 if (cifs_sb
->local_nls
== NULL
) {
2732 cifs_dbg(VFS
, "CIFS mount error: iocharset %s not found\n",
2737 ctx
->local_nls
= cifs_sb
->local_nls
;
2739 smb3_update_mnt_flags(cifs_sb
);
2742 cifs_dbg(FYI
, "mounting share using direct i/o\n");
2743 if (ctx
->cache_ro
) {
2744 cifs_dbg(VFS
, "mounting share with read only caching. Ensure that the share will not be modified while in use.\n");
2745 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_RO_CACHE
;
2746 } else if (ctx
->cache_rw
) {
2747 cifs_dbg(VFS
, "mounting share in single client RW caching mode. Ensure that no other systems will be accessing the share.\n");
2748 cifs_sb
->mnt_cifs_flags
|= (CIFS_MOUNT_RO_CACHE
|
2749 CIFS_MOUNT_RW_CACHE
);
2752 if ((ctx
->cifs_acl
) && (ctx
->dynperm
))
2753 cifs_dbg(VFS
, "mount option dynperm ignored if cifsacl mount option supported\n");
2756 cifs_sb
->prepath
= kstrdup(ctx
->prepath
, GFP_KERNEL
);
2757 if (cifs_sb
->prepath
== NULL
)
2764 /* Release all succeed connections */
2765 static inline void mount_put_conns(struct cifs_sb_info
*cifs_sb
,
2767 struct TCP_Server_Info
*server
,
2768 struct cifs_ses
*ses
, struct cifs_tcon
*tcon
)
2773 cifs_put_tcon(tcon
);
2775 cifs_put_smb_ses(ses
);
2777 cifs_put_tcp_session(server
, 0);
2778 cifs_sb
->mnt_cifs_flags
&= ~CIFS_MOUNT_POSIX_PATHS
;
2782 /* Get connections for tcp, ses and tcon */
2783 static int mount_get_conns(struct smb3_fs_context
*ctx
, struct cifs_sb_info
*cifs_sb
,
2785 struct TCP_Server_Info
**nserver
,
2786 struct cifs_ses
**nses
, struct cifs_tcon
**ntcon
)
2789 struct TCP_Server_Info
*server
;
2790 struct cifs_ses
*ses
;
2791 struct cifs_tcon
*tcon
;
2799 /* get a reference to a tcp session */
2800 server
= cifs_get_tcp_session(ctx
);
2801 if (IS_ERR(server
)) {
2802 rc
= PTR_ERR(server
);
2808 if ((ctx
->max_credits
< 20) || (ctx
->max_credits
> 60000))
2809 server
->max_credits
= SMB2_MAX_CREDITS_AVAILABLE
;
2811 server
->max_credits
= ctx
->max_credits
;
2813 /* get a reference to a SMB session */
2814 ses
= cifs_get_smb_ses(server
, ctx
);
2822 if ((ctx
->persistent
== true) && (!(ses
->server
->capabilities
&
2823 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES
))) {
2824 cifs_server_dbg(VFS
, "persistent handles not supported by server\n");
2828 /* search for existing tcon to this server share */
2829 tcon
= cifs_get_tcon(ses
, ctx
);
2837 /* if new SMB3.11 POSIX extensions are supported do not remap / and \ */
2838 if (tcon
->posix_extensions
)
2839 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_POSIX_PATHS
;
2841 /* tell server which Unix caps we support */
2842 if (cap_unix(tcon
->ses
)) {
2844 * reset of caps checks mount to see if unix extensions disabled
2845 * for just this mount.
2847 reset_cifs_unix_caps(*xid
, tcon
, cifs_sb
, ctx
);
2848 if ((tcon
->ses
->server
->tcpStatus
== CifsNeedReconnect
) &&
2849 (le64_to_cpu(tcon
->fsUnixInfo
.Capability
) &
2850 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP
))
2853 tcon
->unix_ext
= 0; /* server does not support them */
2855 /* do not care if a following call succeed - informational */
2856 if (!tcon
->pipe
&& server
->ops
->qfs_tcon
) {
2857 server
->ops
->qfs_tcon(*xid
, tcon
, cifs_sb
);
2858 if (cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_RO_CACHE
) {
2859 if (tcon
->fsDevInfo
.DeviceCharacteristics
&
2860 cpu_to_le32(FILE_READ_ONLY_DEVICE
))
2861 cifs_dbg(VFS
, "mounted to read only share\n");
2862 else if ((cifs_sb
->mnt_cifs_flags
&
2863 CIFS_MOUNT_RW_CACHE
) == 0)
2864 cifs_dbg(VFS
, "read only mount of RW share\n");
2865 /* no need to log a RW mount of a typical RW share */
2870 * Clamp the rsize/wsize mount arguments if they are too big for the server
2871 * and set the rsize/wsize to the negotiated values if not passed in by
2874 if ((cifs_sb
->ctx
->wsize
== 0) ||
2875 (cifs_sb
->ctx
->wsize
> server
->ops
->negotiate_wsize(tcon
, ctx
)))
2876 cifs_sb
->ctx
->wsize
= server
->ops
->negotiate_wsize(tcon
, ctx
);
2877 if ((cifs_sb
->ctx
->rsize
== 0) ||
2878 (cifs_sb
->ctx
->rsize
> server
->ops
->negotiate_rsize(tcon
, ctx
)))
2879 cifs_sb
->ctx
->rsize
= server
->ops
->negotiate_rsize(tcon
, ctx
);
2884 static int mount_setup_tlink(struct cifs_sb_info
*cifs_sb
, struct cifs_ses
*ses
,
2885 struct cifs_tcon
*tcon
)
2887 struct tcon_link
*tlink
;
2889 /* hang the tcon off of the superblock */
2890 tlink
= kzalloc(sizeof(*tlink
), GFP_KERNEL
);
2894 tlink
->tl_uid
= ses
->linux_uid
;
2895 tlink
->tl_tcon
= tcon
;
2896 tlink
->tl_time
= jiffies
;
2897 set_bit(TCON_LINK_MASTER
, &tlink
->tl_flags
);
2898 set_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
2900 cifs_sb
->master_tlink
= tlink
;
2901 spin_lock(&cifs_sb
->tlink_tree_lock
);
2902 tlink_rb_insert(&cifs_sb
->tlink_tree
, tlink
);
2903 spin_unlock(&cifs_sb
->tlink_tree_lock
);
2905 queue_delayed_work(cifsiod_wq
, &cifs_sb
->prune_tlinks
,
2910 #ifdef CONFIG_CIFS_DFS_UPCALL
2912 * cifs_build_path_to_root returns full path to root when we do not have an
2913 * exiting connection (tcon)
2916 build_unc_path_to_root(const struct smb3_fs_context
*ctx
,
2917 const struct cifs_sb_info
*cifs_sb
, bool useppath
)
2919 char *full_path
, *pos
;
2920 unsigned int pplen
= useppath
&& ctx
->prepath
?
2921 strlen(ctx
->prepath
) + 1 : 0;
2922 unsigned int unc_len
= strnlen(ctx
->UNC
, MAX_TREE_SIZE
+ 1);
2924 if (unc_len
> MAX_TREE_SIZE
)
2925 return ERR_PTR(-EINVAL
);
2927 full_path
= kmalloc(unc_len
+ pplen
+ 1, GFP_KERNEL
);
2928 if (full_path
== NULL
)
2929 return ERR_PTR(-ENOMEM
);
2931 memcpy(full_path
, ctx
->UNC
, unc_len
);
2932 pos
= full_path
+ unc_len
;
2935 *pos
= CIFS_DIR_SEP(cifs_sb
);
2936 memcpy(pos
+ 1, ctx
->prepath
, pplen
);
2940 *pos
= '\0'; /* add trailing null */
2941 convert_delimiter(full_path
, CIFS_DIR_SEP(cifs_sb
));
2942 cifs_dbg(FYI
, "%s: full_path=%s\n", __func__
, full_path
);
2947 * expand_dfs_referral - Perform a dfs referral query and update the cifs_sb
2949 * If a referral is found, cifs_sb->ctx->mount_options will be (re-)allocated
2950 * to a string containing updated options for the submount. Otherwise it
2951 * will be left untouched.
2953 * Returns the rc from get_dfs_path to the caller, which can be used to
2954 * determine whether there were referrals.
2957 expand_dfs_referral(const unsigned int xid
, struct cifs_ses
*ses
,
2958 struct smb3_fs_context
*ctx
, struct cifs_sb_info
*cifs_sb
,
2962 struct dfs_info3_param referral
= {0};
2963 char *full_path
= NULL
, *mdata
= NULL
;
2965 if (cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_NO_DFS
)
2968 full_path
= build_unc_path_to_root(ctx
, cifs_sb
, true);
2969 if (IS_ERR(full_path
))
2970 return PTR_ERR(full_path
);
2972 rc
= dfs_cache_find(xid
, ses
, cifs_sb
->local_nls
, cifs_remap(cifs_sb
),
2973 ref_path
, &referral
, NULL
);
2975 mdata
= cifs_compose_mount_options(cifs_sb
->ctx
->mount_options
,
2976 full_path
+ 1, &referral
);
2977 free_dfs_info_param(&referral
);
2979 if (IS_ERR(mdata
)) {
2980 rc
= PTR_ERR(mdata
);
2983 smb3_cleanup_fs_context_contents(ctx
);
2984 rc
= cifs_setup_volume_info(ctx
);
2986 kfree(cifs_sb
->ctx
->mount_options
);
2987 cifs_sb
->ctx
->mount_options
= mdata
;
2993 static inline int get_next_dfs_tgt(const char *path
,
2994 struct dfs_cache_tgt_list
*tgt_list
,
2995 struct dfs_cache_tgt_iterator
**tgt_it
)
2998 *tgt_it
= dfs_cache_get_tgt_iterator(tgt_list
);
3000 *tgt_it
= dfs_cache_get_next_tgt(tgt_list
, *tgt_it
);
3001 return !*tgt_it
? -EHOSTDOWN
: 0;
3004 static int update_vol_info(const struct dfs_cache_tgt_iterator
*tgt_it
,
3005 struct smb3_fs_context
*fake_ctx
, struct smb3_fs_context
*ctx
)
3007 const char *tgt
= dfs_cache_get_tgt_name(tgt_it
);
3008 int len
= strlen(tgt
) + 2;
3011 new_unc
= kmalloc(len
, GFP_KERNEL
);
3014 scnprintf(new_unc
, len
, "\\%s", tgt
);
3019 if (fake_ctx
->prepath
) {
3020 kfree(ctx
->prepath
);
3021 ctx
->prepath
= fake_ctx
->prepath
;
3022 fake_ctx
->prepath
= NULL
;
3024 memcpy(&ctx
->dstaddr
, &fake_ctx
->dstaddr
, sizeof(ctx
->dstaddr
));
3029 static int setup_dfs_tgt_conn(const char *path
, const char *full_path
,
3030 const struct dfs_cache_tgt_iterator
*tgt_it
,
3031 struct cifs_sb_info
*cifs_sb
, struct smb3_fs_context
*ctx
,
3032 unsigned int *xid
, struct TCP_Server_Info
**server
,
3033 struct cifs_ses
**ses
, struct cifs_tcon
**tcon
)
3036 struct dfs_info3_param ref
= {0};
3038 struct smb3_fs_context fake_ctx
= {NULL
};
3040 cifs_dbg(FYI
, "%s: dfs path: %s\n", __func__
, path
);
3042 rc
= dfs_cache_get_tgt_referral(path
, tgt_it
, &ref
);
3046 mdata
= cifs_compose_mount_options(cifs_sb
->ctx
->mount_options
,
3047 full_path
+ 1, &ref
);
3048 free_dfs_info_param(&ref
);
3050 if (IS_ERR(mdata
)) {
3051 rc
= PTR_ERR(mdata
);
3054 rc
= cifs_setup_volume_info(&fake_ctx
);
3060 * We use a 'fake_ctx' here because we need pass it down to the
3061 * mount_{get,put} functions to test connection against new DFS
3064 mount_put_conns(cifs_sb
, *xid
, *server
, *ses
, *tcon
);
3065 rc
= mount_get_conns(&fake_ctx
, cifs_sb
, xid
, server
, ses
,
3067 if (!rc
|| (*server
&& *ses
)) {
3069 * We were able to connect to new target server.
3070 * Update current context with new target server.
3072 rc
= update_vol_info(tgt_it
, &fake_ctx
, ctx
);
3075 smb3_cleanup_fs_context_contents(&fake_ctx
);
3079 static int do_dfs_failover(const char *path
, const char *full_path
, struct cifs_sb_info
*cifs_sb
,
3080 struct smb3_fs_context
*ctx
, struct cifs_ses
*root_ses
,
3081 unsigned int *xid
, struct TCP_Server_Info
**server
,
3082 struct cifs_ses
**ses
, struct cifs_tcon
**tcon
)
3085 struct dfs_cache_tgt_list tgt_list
;
3086 struct dfs_cache_tgt_iterator
*tgt_it
= NULL
;
3088 if (cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_NO_DFS
)
3091 rc
= dfs_cache_noreq_find(path
, NULL
, &tgt_list
);
3096 /* Get next DFS target server - if any */
3097 rc
= get_next_dfs_tgt(path
, &tgt_list
, &tgt_it
);
3100 /* Connect to next DFS target */
3101 rc
= setup_dfs_tgt_conn(path
, full_path
, tgt_it
, cifs_sb
, ctx
, xid
, server
, ses
,
3103 if (!rc
|| (*server
&& *ses
))
3108 * Update DFS target hint in DFS referral cache with the target
3109 * server we successfully reconnected to.
3111 rc
= dfs_cache_update_tgthint(*xid
, root_ses
? root_ses
: *ses
,
3113 cifs_remap(cifs_sb
), path
,
3116 dfs_cache_free_tgts(&tgt_list
);
3121 /* TODO: all callers to this are broken. We are not parsing mount_options here
3122 * we should pass a clone of the original context?
3125 cifs_setup_volume_info(struct smb3_fs_context
*ctx
)
3129 if (ctx
->nullauth
) {
3130 cifs_dbg(FYI
, "Anonymous login\n");
3131 kfree(ctx
->username
);
3132 ctx
->username
= NULL
;
3133 } else if (ctx
->username
) {
3134 /* BB fixme parse for domain name here */
3135 cifs_dbg(FYI
, "Username: %s\n", ctx
->username
);
3137 cifs_dbg(VFS
, "No username specified\n");
3138 /* In userspace mount helper we can get user name from alternate
3139 locations such as env variables and files on disk */
3147 cifs_are_all_path_components_accessible(struct TCP_Server_Info
*server
,
3149 struct cifs_tcon
*tcon
,
3150 struct cifs_sb_info
*cifs_sb
,
3157 int skip
= added_treename
? 1 : 0;
3159 sep
= CIFS_DIR_SEP(cifs_sb
);
3162 rc
= server
->ops
->is_path_accessible(xid
, tcon
, cifs_sb
, "");
3164 /* skip separators */
3169 /* next separator */
3170 while (*s
&& *s
!= sep
)
3173 * if the treename is added, we then have to skip the first
3174 * part within the separators
3181 * temporarily null-terminate the path at the end of
3182 * the current component
3186 rc
= server
->ops
->is_path_accessible(xid
, tcon
, cifs_sb
,
3194 * Check if path is remote (e.g. a DFS share). Return -EREMOTE if it is,
3197 static int is_path_remote(struct cifs_sb_info
*cifs_sb
, struct smb3_fs_context
*ctx
,
3198 const unsigned int xid
,
3199 struct TCP_Server_Info
*server
,
3200 struct cifs_tcon
*tcon
)
3205 if (!server
->ops
->is_path_accessible
)
3209 * cifs_build_path_to_root works only when we have a valid tcon
3211 full_path
= cifs_build_path_to_root(ctx
, cifs_sb
, tcon
,
3212 tcon
->Flags
& SMB_SHARE_IS_IN_DFS
);
3213 if (full_path
== NULL
)
3216 cifs_dbg(FYI
, "%s: full_path: %s\n", __func__
, full_path
);
3218 rc
= server
->ops
->is_path_accessible(xid
, tcon
, cifs_sb
,
3220 if (rc
!= 0 && rc
!= -EREMOTE
) {
3225 if (rc
!= -EREMOTE
) {
3226 rc
= cifs_are_all_path_components_accessible(server
, xid
, tcon
,
3227 cifs_sb
, full_path
, tcon
->Flags
& SMB_SHARE_IS_IN_DFS
);
3229 cifs_server_dbg(VFS
, "cannot query dirs between root and final path, enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
3230 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_USE_PREFIX_PATH
;
3239 #ifdef CONFIG_CIFS_DFS_UPCALL
3240 static void set_root_ses(struct cifs_sb_info
*cifs_sb
, struct cifs_ses
*ses
,
3241 struct cifs_ses
**root_ses
)
3244 spin_lock(&cifs_tcp_ses_lock
);
3247 ses
->tcon_ipc
->remap
= cifs_remap(cifs_sb
);
3248 spin_unlock(&cifs_tcp_ses_lock
);
3253 static void put_root_ses(struct cifs_ses
*ses
)
3256 cifs_put_smb_ses(ses
);
3259 /* Check if a path component is remote and then update @dfs_path accordingly */
3260 static int check_dfs_prepath(struct cifs_sb_info
*cifs_sb
, struct smb3_fs_context
*ctx
,
3261 const unsigned int xid
, struct TCP_Server_Info
*server
,
3262 struct cifs_tcon
*tcon
, char **dfs_path
)
3265 char sep
= CIFS_DIR_SEP(cifs_sb
), tmp
;
3268 int added_treename
= tcon
->Flags
& SMB_SHARE_IS_IN_DFS
;
3269 int skip
= added_treename
;
3271 path
= cifs_build_path_to_root(ctx
, cifs_sb
, tcon
, added_treename
);
3276 * Walk through the path components in @path and check if they're accessible. In case any of
3277 * the components is -EREMOTE, then update @dfs_path with the next DFS referral request path
3278 * (NOT including the remaining components).
3282 /* skip separators */
3283 while (*s
&& *s
== sep
)
3287 /* next separator */
3288 while (*s
&& *s
!= sep
)
3291 * if the treename is added, we then have to skip the first
3292 * part within the separators
3300 rc
= server
->ops
->is_path_accessible(xid
, tcon
, cifs_sb
, path
);
3301 if (rc
&& rc
== -EREMOTE
) {
3302 struct smb3_fs_context v
= {NULL
};
3303 /* if @path contains a tree name, skip it in the prefix path */
3304 if (added_treename
) {
3305 rc
= smb3_parse_devname(path
, &v
);
3309 npath
= build_unc_path_to_root(&v
, cifs_sb
, true);
3310 smb3_cleanup_fs_context_contents(&v
);
3313 v
.prepath
= path
+ 1;
3314 npath
= build_unc_path_to_root(&v
, cifs_sb
, true);
3316 if (IS_ERR(npath
)) {
3317 rc
= PTR_ERR(npath
);
3330 int cifs_mount(struct cifs_sb_info
*cifs_sb
, struct smb3_fs_context
*ctx
)
3334 struct TCP_Server_Info
*server
= NULL
;
3335 struct cifs_ses
*ses
= NULL
, *root_ses
= NULL
;
3336 struct cifs_tcon
*tcon
= NULL
;
3338 char *ref_path
= NULL
, *full_path
= NULL
;
3339 char *oldmnt
= NULL
;
3340 char *mntdata
= NULL
;
3342 rc
= mount_get_conns(ctx
, cifs_sb
, &xid
, &server
, &ses
, &tcon
);
3344 * Unconditionally try to get an DFS referral (even cached) to determine whether it is an
3347 * Skip prefix path to provide support for DFS referrals from w2k8 servers which don't seem
3348 * to respond with PATH_NOT_COVERED to requests that include the prefix.
3350 if (dfs_cache_find(xid
, ses
, cifs_sb
->local_nls
, cifs_remap(cifs_sb
), ctx
->UNC
+ 1, NULL
,
3352 /* No DFS referral was returned. Looks like a regular share. */
3355 /* Check if it is fully accessible and then mount it */
3356 rc
= is_path_remote(cifs_sb
, ctx
, xid
, server
, tcon
);
3362 /* Save mount options */
3363 mntdata
= kstrndup(cifs_sb
->ctx
->mount_options
,
3364 strlen(cifs_sb
->ctx
->mount_options
), GFP_KERNEL
);
3369 /* Get path of DFS root */
3370 ref_path
= build_unc_path_to_root(ctx
, cifs_sb
, false);
3371 if (IS_ERR(ref_path
)) {
3372 rc
= PTR_ERR(ref_path
);
3377 set_root_ses(cifs_sb
, ses
, &root_ses
);
3379 /* Save full path of last DFS path we used to resolve final target server */
3381 full_path
= build_unc_path_to_root(ctx
, cifs_sb
, !!count
);
3382 if (IS_ERR(full_path
)) {
3383 rc
= PTR_ERR(full_path
);
3387 /* Chase referral */
3388 oldmnt
= cifs_sb
->ctx
->mount_options
;
3389 rc
= expand_dfs_referral(xid
, root_ses
, ctx
, cifs_sb
, ref_path
+ 1);
3392 /* Connect to new DFS target only if we were redirected */
3393 if (oldmnt
!= cifs_sb
->ctx
->mount_options
) {
3394 mount_put_conns(cifs_sb
, xid
, server
, ses
, tcon
);
3395 rc
= mount_get_conns(ctx
, cifs_sb
, &xid
, &server
, &ses
, &tcon
);
3397 if (rc
&& !server
&& !ses
) {
3398 /* Failed to connect. Try to connect to other targets in the referral. */
3399 rc
= do_dfs_failover(ref_path
+ 1, full_path
, cifs_sb
, ctx
, root_ses
, &xid
,
3400 &server
, &ses
, &tcon
);
3402 if (rc
== -EACCES
|| rc
== -EOPNOTSUPP
|| !server
|| !ses
)
3406 /* Make sure that requests go through new root servers */
3407 if (is_tcon_dfs(tcon
)) {
3408 put_root_ses(root_ses
);
3409 set_root_ses(cifs_sb
, ses
, &root_ses
);
3411 /* Check for remaining path components and then continue chasing them (-EREMOTE) */
3412 rc
= check_dfs_prepath(cifs_sb
, ctx
, xid
, server
, tcon
, &ref_path
);
3413 /* Prevent recursion on broken link referrals */
3414 if (rc
== -EREMOTE
&& ++count
> MAX_NESTED_LINKS
)
3416 } while (rc
== -EREMOTE
);
3420 put_root_ses(root_ses
);
3425 * Store DFS full path in both superblock and tree connect structures.
3427 * For DFS root mounts, the prefix path (cifs_sb->prepath) is preserved during reconnect so
3428 * only the root path is set in cifs_sb->origin_fullpath and tcon->dfs_path. And for DFS
3429 * links, the prefix path is included in both and may be changed during reconnect. See
3430 * cifs_tree_connect().
3432 cifs_sb
->origin_fullpath
= kstrndup(full_path
, strlen(full_path
), GFP_KERNEL
);
3433 if (!cifs_sb
->origin_fullpath
) {
3437 spin_lock(&cifs_tcp_ses_lock
);
3438 tcon
->dfs_path
= full_path
;
3440 tcon
->remap
= cifs_remap(cifs_sb
);
3441 spin_unlock(&cifs_tcp_ses_lock
);
3443 /* Add original context for DFS cache to be used when refreshing referrals */
3444 rc
= dfs_cache_add_vol(mntdata
, ctx
, cifs_sb
->origin_fullpath
);
3448 * After reconnecting to a different server, unique ids won't
3449 * match anymore, so we disable serverino. This prevents
3450 * dentry revalidation to think the dentry are stale (ESTALE).
3452 cifs_autodisable_serverino(cifs_sb
);
3454 * Force the use of prefix path to support failover on DFS paths that
3455 * resolve to targets that have different prefix paths.
3457 cifs_sb
->mnt_cifs_flags
|= CIFS_MOUNT_USE_PREFIX_PATH
;
3458 kfree(cifs_sb
->prepath
);
3459 cifs_sb
->prepath
= ctx
->prepath
;
3460 ctx
->prepath
= NULL
;
3464 cifs_try_adding_channels(cifs_sb
, ses
);
3465 return mount_setup_tlink(cifs_sb
, ses
, tcon
);
3471 kfree(cifs_sb
->origin_fullpath
);
3472 put_root_ses(root_ses
);
3473 mount_put_conns(cifs_sb
, xid
, server
, ses
, tcon
);
3477 int cifs_mount(struct cifs_sb_info
*cifs_sb
, struct smb3_fs_context
*ctx
)
3481 struct cifs_ses
*ses
;
3482 struct cifs_tcon
*tcon
;
3483 struct TCP_Server_Info
*server
;
3485 rc
= mount_get_conns(ctx
, cifs_sb
, &xid
, &server
, &ses
, &tcon
);
3490 rc
= is_path_remote(cifs_sb
, ctx
, xid
, server
, tcon
);
3499 return mount_setup_tlink(cifs_sb
, ses
, tcon
);
3502 mount_put_conns(cifs_sb
, xid
, server
, ses
, tcon
);
3508 * Issue a TREE_CONNECT request.
3511 CIFSTCon(const unsigned int xid
, struct cifs_ses
*ses
,
3512 const char *tree
, struct cifs_tcon
*tcon
,
3513 const struct nls_table
*nls_codepage
)
3515 struct smb_hdr
*smb_buffer
;
3516 struct smb_hdr
*smb_buffer_response
;
3519 unsigned char *bcc_ptr
;
3522 __u16 bytes_left
, count
;
3527 smb_buffer
= cifs_buf_get();
3528 if (smb_buffer
== NULL
)
3531 smb_buffer_response
= smb_buffer
;
3533 header_assemble(smb_buffer
, SMB_COM_TREE_CONNECT_ANDX
,
3534 NULL
/*no tid */ , 4 /*wct */ );
3536 smb_buffer
->Mid
= get_next_mid(ses
->server
);
3537 smb_buffer
->Uid
= ses
->Suid
;
3538 pSMB
= (TCONX_REQ
*) smb_buffer
;
3539 pSMBr
= (TCONX_RSP
*) smb_buffer_response
;
3541 pSMB
->AndXCommand
= 0xFF;
3542 pSMB
->Flags
= cpu_to_le16(TCON_EXTENDED_SECINFO
);
3543 bcc_ptr
= &pSMB
->Password
[0];
3544 if (tcon
->pipe
|| (ses
->server
->sec_mode
& SECMODE_USER
)) {
3545 pSMB
->PasswordLength
= cpu_to_le16(1); /* minimum */
3546 *bcc_ptr
= 0; /* password is null byte */
3547 bcc_ptr
++; /* skip password */
3548 /* already aligned so no need to do it below */
3550 pSMB
->PasswordLength
= cpu_to_le16(CIFS_AUTH_RESP_SIZE
);
3551 /* BB FIXME add code to fail this if NTLMv2 or Kerberos
3552 specified as required (when that support is added to
3553 the vfs in the future) as only NTLM or the much
3554 weaker LANMAN (which we do not send by default) is accepted
3555 by Samba (not sure whether other servers allow
3556 NTLMv2 password here) */
3557 #ifdef CONFIG_CIFS_WEAK_PW_HASH
3558 if ((global_secflags
& CIFSSEC_MAY_LANMAN
) &&
3559 (ses
->sectype
== LANMAN
))
3560 calc_lanman_hash(tcon
->password
, ses
->server
->cryptkey
,
3561 ses
->server
->sec_mode
&
3562 SECMODE_PW_ENCRYPT
? true : false,
3565 #endif /* CIFS_WEAK_PW_HASH */
3566 rc
= SMBNTencrypt(tcon
->password
, ses
->server
->cryptkey
,
3567 bcc_ptr
, nls_codepage
);
3569 cifs_dbg(FYI
, "%s Can't generate NTLM rsp. Error: %d\n",
3571 cifs_buf_release(smb_buffer
);
3575 bcc_ptr
+= CIFS_AUTH_RESP_SIZE
;
3576 if (ses
->capabilities
& CAP_UNICODE
) {
3577 /* must align unicode strings */
3578 *bcc_ptr
= 0; /* null byte password */
3583 if (ses
->server
->sign
)
3584 smb_buffer
->Flags2
|= SMBFLG2_SECURITY_SIGNATURE
;
3586 if (ses
->capabilities
& CAP_STATUS32
) {
3587 smb_buffer
->Flags2
|= SMBFLG2_ERR_STATUS
;
3589 if (ses
->capabilities
& CAP_DFS
) {
3590 smb_buffer
->Flags2
|= SMBFLG2_DFS
;
3592 if (ses
->capabilities
& CAP_UNICODE
) {
3593 smb_buffer
->Flags2
|= SMBFLG2_UNICODE
;
3595 cifs_strtoUTF16((__le16
*) bcc_ptr
, tree
,
3596 6 /* max utf8 char length in bytes */ *
3597 (/* server len*/ + 256 /* share len */), nls_codepage
);
3598 bcc_ptr
+= 2 * length
; /* convert num 16 bit words to bytes */
3599 bcc_ptr
+= 2; /* skip trailing null */
3600 } else { /* ASCII */
3601 strcpy(bcc_ptr
, tree
);
3602 bcc_ptr
+= strlen(tree
) + 1;
3604 strcpy(bcc_ptr
, "?????");
3605 bcc_ptr
+= strlen("?????");
3607 count
= bcc_ptr
- &pSMB
->Password
[0];
3608 be32_add_cpu(&pSMB
->hdr
.smb_buf_length
, count
);
3609 pSMB
->ByteCount
= cpu_to_le16(count
);
3611 rc
= SendReceive(xid
, ses
, smb_buffer
, smb_buffer_response
, &length
,
3614 /* above now done in SendReceive */
3618 tcon
->tidStatus
= CifsGood
;
3619 tcon
->need_reconnect
= false;
3620 tcon
->tid
= smb_buffer_response
->Tid
;
3621 bcc_ptr
= pByteArea(smb_buffer_response
);
3622 bytes_left
= get_bcc(smb_buffer_response
);
3623 length
= strnlen(bcc_ptr
, bytes_left
- 2);
3624 if (smb_buffer
->Flags2
& SMBFLG2_UNICODE
)
3630 /* skip service field (NB: this field is always ASCII) */
3632 if ((bcc_ptr
[0] == 'I') && (bcc_ptr
[1] == 'P') &&
3633 (bcc_ptr
[2] == 'C')) {
3634 cifs_dbg(FYI
, "IPC connection\n");
3638 } else if (length
== 2) {
3639 if ((bcc_ptr
[0] == 'A') && (bcc_ptr
[1] == ':')) {
3640 /* the most common case */
3641 cifs_dbg(FYI
, "disk share connection\n");
3644 bcc_ptr
+= length
+ 1;
3645 bytes_left
-= (length
+ 1);
3646 strlcpy(tcon
->treeName
, tree
, sizeof(tcon
->treeName
));
3648 /* mostly informational -- no need to fail on error here */
3649 kfree(tcon
->nativeFileSystem
);
3650 tcon
->nativeFileSystem
= cifs_strndup_from_utf16(bcc_ptr
,
3651 bytes_left
, is_unicode
,
3654 cifs_dbg(FYI
, "nativeFileSystem=%s\n", tcon
->nativeFileSystem
);
3656 if ((smb_buffer_response
->WordCount
== 3) ||
3657 (smb_buffer_response
->WordCount
== 7))
3658 /* field is in same location */
3659 tcon
->Flags
= le16_to_cpu(pSMBr
->OptionalSupport
);
3662 cifs_dbg(FYI
, "Tcon flags: 0x%x\n", tcon
->Flags
);
3665 cifs_buf_release(smb_buffer
);
3669 static void delayed_free(struct rcu_head
*p
)
3671 struct cifs_sb_info
*cifs_sb
= container_of(p
, struct cifs_sb_info
, rcu
);
3673 unload_nls(cifs_sb
->local_nls
);
3674 smb3_cleanup_fs_context(cifs_sb
->ctx
);
3679 cifs_umount(struct cifs_sb_info
*cifs_sb
)
3681 struct rb_root
*root
= &cifs_sb
->tlink_tree
;
3682 struct rb_node
*node
;
3683 struct tcon_link
*tlink
;
3685 cancel_delayed_work_sync(&cifs_sb
->prune_tlinks
);
3687 spin_lock(&cifs_sb
->tlink_tree_lock
);
3688 while ((node
= rb_first(root
))) {
3689 tlink
= rb_entry(node
, struct tcon_link
, tl_rbnode
);
3690 cifs_get_tlink(tlink
);
3691 clear_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
3692 rb_erase(node
, root
);
3694 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3695 cifs_put_tlink(tlink
);
3696 spin_lock(&cifs_sb
->tlink_tree_lock
);
3698 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3700 kfree(cifs_sb
->prepath
);
3701 #ifdef CONFIG_CIFS_DFS_UPCALL
3702 dfs_cache_del_vol(cifs_sb
->origin_fullpath
);
3703 kfree(cifs_sb
->origin_fullpath
);
3705 call_rcu(&cifs_sb
->rcu
, delayed_free
);
3709 cifs_negotiate_protocol(const unsigned int xid
, struct cifs_ses
*ses
)
3712 struct TCP_Server_Info
*server
= cifs_ses_server(ses
);
3714 if (!server
->ops
->need_neg
|| !server
->ops
->negotiate
)
3717 /* only send once per connect */
3718 if (!server
->ops
->need_neg(server
))
3721 rc
= server
->ops
->negotiate(xid
, ses
);
3723 spin_lock(&GlobalMid_Lock
);
3724 if (server
->tcpStatus
== CifsNeedNegotiate
)
3725 server
->tcpStatus
= CifsGood
;
3728 spin_unlock(&GlobalMid_Lock
);
3735 cifs_setup_session(const unsigned int xid
, struct cifs_ses
*ses
,
3736 struct nls_table
*nls_info
)
3739 struct TCP_Server_Info
*server
= cifs_ses_server(ses
);
3741 if (!ses
->binding
) {
3742 ses
->capabilities
= server
->capabilities
;
3743 if (linuxExtEnabled
== 0)
3744 ses
->capabilities
&= (~server
->vals
->cap_unix
);
3746 if (ses
->auth_key
.response
) {
3747 cifs_dbg(FYI
, "Free previous auth_key.response = %p\n",
3748 ses
->auth_key
.response
);
3749 kfree(ses
->auth_key
.response
);
3750 ses
->auth_key
.response
= NULL
;
3751 ses
->auth_key
.len
= 0;
3755 cifs_dbg(FYI
, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
3756 server
->sec_mode
, server
->capabilities
, server
->timeAdj
);
3758 if (server
->ops
->sess_setup
)
3759 rc
= server
->ops
->sess_setup(xid
, ses
, nls_info
);
3762 cifs_server_dbg(VFS
, "Send error in SessSetup = %d\n", rc
);
3768 cifs_set_vol_auth(struct smb3_fs_context
*ctx
, struct cifs_ses
*ses
)
3770 ctx
->sectype
= ses
->sectype
;
3772 /* krb5 is special, since we don't need username or pw */
3773 if (ctx
->sectype
== Kerberos
)
3776 return cifs_set_cifscreds(ctx
, ses
);
3779 static struct cifs_tcon
*
3780 cifs_construct_tcon(struct cifs_sb_info
*cifs_sb
, kuid_t fsuid
)
3783 struct cifs_tcon
*master_tcon
= cifs_sb_master_tcon(cifs_sb
);
3784 struct cifs_ses
*ses
;
3785 struct cifs_tcon
*tcon
= NULL
;
3786 struct smb3_fs_context
*ctx
;
3788 ctx
= kzalloc(sizeof(*ctx
), GFP_KERNEL
);
3790 return ERR_PTR(-ENOMEM
);
3792 ctx
->local_nls
= cifs_sb
->local_nls
;
3793 ctx
->linux_uid
= fsuid
;
3794 ctx
->cred_uid
= fsuid
;
3795 ctx
->UNC
= master_tcon
->treeName
;
3796 ctx
->retry
= master_tcon
->retry
;
3797 ctx
->nocase
= master_tcon
->nocase
;
3798 ctx
->nohandlecache
= master_tcon
->nohandlecache
;
3799 ctx
->local_lease
= master_tcon
->local_lease
;
3800 ctx
->no_lease
= master_tcon
->no_lease
;
3801 ctx
->resilient
= master_tcon
->use_resilient
;
3802 ctx
->persistent
= master_tcon
->use_persistent
;
3803 ctx
->handle_timeout
= master_tcon
->handle_timeout
;
3804 ctx
->no_linux_ext
= !master_tcon
->unix_ext
;
3805 ctx
->linux_ext
= master_tcon
->posix_extensions
;
3806 ctx
->sectype
= master_tcon
->ses
->sectype
;
3807 ctx
->sign
= master_tcon
->ses
->sign
;
3808 ctx
->seal
= master_tcon
->seal
;
3809 #ifdef CONFIG_CIFS_SWN_UPCALL
3810 ctx
->witness
= master_tcon
->use_witness
;
3813 rc
= cifs_set_vol_auth(ctx
, master_tcon
->ses
);
3819 /* get a reference for the same TCP session */
3820 spin_lock(&cifs_tcp_ses_lock
);
3821 ++master_tcon
->ses
->server
->srv_count
;
3822 spin_unlock(&cifs_tcp_ses_lock
);
3824 ses
= cifs_get_smb_ses(master_tcon
->ses
->server
, ctx
);
3826 tcon
= (struct cifs_tcon
*)ses
;
3827 cifs_put_tcp_session(master_tcon
->ses
->server
, 0);
3831 tcon
= cifs_get_tcon(ses
, ctx
);
3833 cifs_put_smb_ses(ses
);
3838 reset_cifs_unix_caps(0, tcon
, NULL
, ctx
);
3841 kfree(ctx
->username
);
3842 kfree_sensitive(ctx
->password
);
3849 cifs_sb_master_tcon(struct cifs_sb_info
*cifs_sb
)
3851 return tlink_tcon(cifs_sb_master_tlink(cifs_sb
));
3854 /* find and return a tlink with given uid */
3855 static struct tcon_link
*
3856 tlink_rb_search(struct rb_root
*root
, kuid_t uid
)
3858 struct rb_node
*node
= root
->rb_node
;
3859 struct tcon_link
*tlink
;
3862 tlink
= rb_entry(node
, struct tcon_link
, tl_rbnode
);
3864 if (uid_gt(tlink
->tl_uid
, uid
))
3865 node
= node
->rb_left
;
3866 else if (uid_lt(tlink
->tl_uid
, uid
))
3867 node
= node
->rb_right
;
3874 /* insert a tcon_link into the tree */
3876 tlink_rb_insert(struct rb_root
*root
, struct tcon_link
*new_tlink
)
3878 struct rb_node
**new = &(root
->rb_node
), *parent
= NULL
;
3879 struct tcon_link
*tlink
;
3882 tlink
= rb_entry(*new, struct tcon_link
, tl_rbnode
);
3885 if (uid_gt(tlink
->tl_uid
, new_tlink
->tl_uid
))
3886 new = &((*new)->rb_left
);
3888 new = &((*new)->rb_right
);
3891 rb_link_node(&new_tlink
->tl_rbnode
, parent
, new);
3892 rb_insert_color(&new_tlink
->tl_rbnode
, root
);
3896 * Find or construct an appropriate tcon given a cifs_sb and the fsuid of the
3899 * If the superblock doesn't refer to a multiuser mount, then just return
3900 * the master tcon for the mount.
3902 * First, search the rbtree for an existing tcon for this fsuid. If one
3903 * exists, then check to see if it's pending construction. If it is then wait
3904 * for construction to complete. Once it's no longer pending, check to see if
3905 * it failed and either return an error or retry construction, depending on
3908 * If one doesn't exist then insert a new tcon_link struct into the tree and
3909 * try to construct a new one.
3912 cifs_sb_tlink(struct cifs_sb_info
*cifs_sb
)
3915 kuid_t fsuid
= current_fsuid();
3916 struct tcon_link
*tlink
, *newtlink
;
3918 if (!(cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_MULTIUSER
))
3919 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb
));
3921 spin_lock(&cifs_sb
->tlink_tree_lock
);
3922 tlink
= tlink_rb_search(&cifs_sb
->tlink_tree
, fsuid
);
3924 cifs_get_tlink(tlink
);
3925 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3927 if (tlink
== NULL
) {
3928 newtlink
= kzalloc(sizeof(*tlink
), GFP_KERNEL
);
3929 if (newtlink
== NULL
)
3930 return ERR_PTR(-ENOMEM
);
3931 newtlink
->tl_uid
= fsuid
;
3932 newtlink
->tl_tcon
= ERR_PTR(-EACCES
);
3933 set_bit(TCON_LINK_PENDING
, &newtlink
->tl_flags
);
3934 set_bit(TCON_LINK_IN_TREE
, &newtlink
->tl_flags
);
3935 cifs_get_tlink(newtlink
);
3937 spin_lock(&cifs_sb
->tlink_tree_lock
);
3938 /* was one inserted after previous search? */
3939 tlink
= tlink_rb_search(&cifs_sb
->tlink_tree
, fsuid
);
3941 cifs_get_tlink(tlink
);
3942 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3944 goto wait_for_construction
;
3947 tlink_rb_insert(&cifs_sb
->tlink_tree
, tlink
);
3948 spin_unlock(&cifs_sb
->tlink_tree_lock
);
3950 wait_for_construction
:
3951 ret
= wait_on_bit(&tlink
->tl_flags
, TCON_LINK_PENDING
,
3952 TASK_INTERRUPTIBLE
);
3954 cifs_put_tlink(tlink
);
3955 return ERR_PTR(-ERESTARTSYS
);
3958 /* if it's good, return it */
3959 if (!IS_ERR(tlink
->tl_tcon
))
3962 /* return error if we tried this already recently */
3963 if (time_before(jiffies
, tlink
->tl_time
+ TLINK_ERROR_EXPIRE
)) {
3964 cifs_put_tlink(tlink
);
3965 return ERR_PTR(-EACCES
);
3968 if (test_and_set_bit(TCON_LINK_PENDING
, &tlink
->tl_flags
))
3969 goto wait_for_construction
;
3972 tlink
->tl_tcon
= cifs_construct_tcon(cifs_sb
, fsuid
);
3973 clear_bit(TCON_LINK_PENDING
, &tlink
->tl_flags
);
3974 wake_up_bit(&tlink
->tl_flags
, TCON_LINK_PENDING
);
3976 if (IS_ERR(tlink
->tl_tcon
)) {
3977 cifs_put_tlink(tlink
);
3978 return ERR_PTR(-EACCES
);
3985 * periodic workqueue job that scans tcon_tree for a superblock and closes
3989 cifs_prune_tlinks(struct work_struct
*work
)
3991 struct cifs_sb_info
*cifs_sb
= container_of(work
, struct cifs_sb_info
,
3993 struct rb_root
*root
= &cifs_sb
->tlink_tree
;
3994 struct rb_node
*node
;
3995 struct rb_node
*tmp
;
3996 struct tcon_link
*tlink
;
3999 * Because we drop the spinlock in the loop in order to put the tlink
4000 * it's not guarded against removal of links from the tree. The only
4001 * places that remove entries from the tree are this function and
4002 * umounts. Because this function is non-reentrant and is canceled
4003 * before umount can proceed, this is safe.
4005 spin_lock(&cifs_sb
->tlink_tree_lock
);
4006 node
= rb_first(root
);
4007 while (node
!= NULL
) {
4009 node
= rb_next(tmp
);
4010 tlink
= rb_entry(tmp
, struct tcon_link
, tl_rbnode
);
4012 if (test_bit(TCON_LINK_MASTER
, &tlink
->tl_flags
) ||
4013 atomic_read(&tlink
->tl_count
) != 0 ||
4014 time_after(tlink
->tl_time
+ TLINK_IDLE_EXPIRE
, jiffies
))
4017 cifs_get_tlink(tlink
);
4018 clear_bit(TCON_LINK_IN_TREE
, &tlink
->tl_flags
);
4019 rb_erase(tmp
, root
);
4021 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4022 cifs_put_tlink(tlink
);
4023 spin_lock(&cifs_sb
->tlink_tree_lock
);
4025 spin_unlock(&cifs_sb
->tlink_tree_lock
);
4027 queue_delayed_work(cifsiod_wq
, &cifs_sb
->prune_tlinks
,
4031 #ifdef CONFIG_CIFS_DFS_UPCALL
4032 int cifs_tree_connect(const unsigned int xid
, struct cifs_tcon
*tcon
, const struct nls_table
*nlsc
)
4035 struct TCP_Server_Info
*server
= tcon
->ses
->server
;
4036 const struct smb_version_operations
*ops
= server
->ops
;
4037 struct dfs_cache_tgt_list tl
;
4038 struct dfs_cache_tgt_iterator
*it
= NULL
;
4040 const char *tcp_host
;
4041 size_t tcp_host_len
;
4042 const char *dfs_host
;
4043 size_t dfs_host_len
;
4044 char *share
= NULL
, *prefix
= NULL
;
4045 struct dfs_info3_param ref
= {0};
4048 tree
= kzalloc(MAX_TREE_SIZE
, GFP_KERNEL
);
4052 if (!tcon
->dfs_path
) {
4054 scnprintf(tree
, MAX_TREE_SIZE
, "\\\\%s\\IPC$", server
->hostname
);
4055 rc
= ops
->tree_connect(xid
, tcon
->ses
, tree
, tcon
, nlsc
);
4057 rc
= ops
->tree_connect(xid
, tcon
->ses
, tcon
->treeName
, tcon
, nlsc
);
4062 rc
= dfs_cache_noreq_find(tcon
->dfs_path
+ 1, &ref
, &tl
);
4065 isroot
= ref
.server_type
== DFS_TYPE_ROOT
;
4066 free_dfs_info_param(&ref
);
4068 extract_unc_hostname(server
->hostname
, &tcp_host
, &tcp_host_len
);
4070 for (it
= dfs_cache_get_tgt_iterator(&tl
); it
; it
= dfs_cache_get_next_tgt(&tl
, it
)) {
4078 rc
= dfs_cache_get_tgt_share(tcon
->dfs_path
+ 1, it
, &share
, &prefix
);
4080 cifs_dbg(VFS
, "%s: failed to parse target share %d\n",
4085 extract_unc_hostname(share
, &dfs_host
, &dfs_host_len
);
4087 if (dfs_host_len
!= tcp_host_len
4088 || strncasecmp(dfs_host
, tcp_host
, dfs_host_len
) != 0) {
4089 cifs_dbg(FYI
, "%s: %.*s doesn't match %.*s\n", __func__
, (int)dfs_host_len
,
4090 dfs_host
, (int)tcp_host_len
, tcp_host
);
4092 rc
= match_target_ip(server
, dfs_host
, dfs_host_len
, &target_match
);
4094 cifs_dbg(VFS
, "%s: failed to match target ip: %d\n", __func__
, rc
);
4098 if (!target_match
) {
4099 cifs_dbg(FYI
, "%s: skipping target\n", __func__
);
4105 scnprintf(tree
, MAX_TREE_SIZE
, "\\\\%s\\IPC$", share
);
4106 rc
= ops
->tree_connect(xid
, tcon
->ses
, tree
, tcon
, nlsc
);
4108 scnprintf(tree
, MAX_TREE_SIZE
, "\\%s", share
);
4109 rc
= ops
->tree_connect(xid
, tcon
->ses
, tree
, tcon
, nlsc
);
4110 /* Only handle prefix paths of DFS link targets */
4111 if (!rc
&& !isroot
) {
4112 rc
= update_super_prepath(tcon
, prefix
);
4125 rc
= dfs_cache_noreq_update_tgthint(tcon
->dfs_path
+ 1, it
);
4129 dfs_cache_free_tgts(&tl
);
4135 int cifs_tree_connect(const unsigned int xid
, struct cifs_tcon
*tcon
, const struct nls_table
*nlsc
)
4137 const struct smb_version_operations
*ops
= tcon
->ses
->server
->ops
;
4139 return ops
->tree_connect(xid
, tcon
->ses
, tcon
->treeName
, tcon
, nlsc
);