1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#include <linux/fs.h>
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>
45#include <net/ipv6.h>
46#include <linux/parser.h>
47#include <linux/bvec.h>
48#include "cifspdu.h"
49#include "cifsglob.h"
50#include "cifsproto.h"
51#include "cifs_unicode.h"
52#include "cifs_debug.h"
53#include "cifs_fs_sb.h"
54#include "ntlmssp.h"
55#include "nterr.h"
56#include "rfc1002pdu.h"
57#include "fscache.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"
63#endif
64#include "fs_context.h"
65#include "cifs_swn.h"
66
67extern mempool_t *cifs_req_poolp;
68extern bool disable_legacy_dialects;
69
70
71#define TLINK_ERROR_EXPIRE (1 * HZ)
72#define TLINK_IDLE_EXPIRE (600 * HZ)
73
74
75#define NUM_STATUS_IO_TIMEOUT 5
76
77static int ip_connect(struct TCP_Server_Info *server);
78static int generic_ip_connect(struct TCP_Server_Info *server);
79static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
80static void cifs_prune_tlinks(struct work_struct *work);
81
82
83
84
85
86
87
88static int reconn_set_ipaddr_from_hostname(struct TCP_Server_Info *server)
89{
90 int rc;
91 int len;
92 char *unc, *ipaddr = NULL;
93
94 if (!server->hostname)
95 return -EINVAL;
96
97 len = strlen(server->hostname) + 3;
98
99 unc = kmalloc(len, GFP_KERNEL);
100 if (!unc) {
101 cifs_dbg(FYI, "%s: failed to create UNC path\n", __func__);
102 return -ENOMEM;
103 }
104 scnprintf(unc, len, "\\\\%s", server->hostname);
105
106 rc = dns_resolve_server_name_to_ip(unc, &ipaddr);
107 kfree(unc);
108
109 if (rc < 0) {
110 cifs_dbg(FYI, "%s: failed to resolve server part of %s to IP: %d\n",
111 __func__, server->hostname, rc);
112 return rc;
113 }
114
115 spin_lock(&cifs_tcp_ses_lock);
116 rc = cifs_convert_address((struct sockaddr *)&server->dstaddr, ipaddr,
117 strlen(ipaddr));
118 spin_unlock(&cifs_tcp_ses_lock);
119 kfree(ipaddr);
120
121 return !rc ? -1 : 0;
122}
123
124#ifdef CONFIG_CIFS_DFS_UPCALL
125
126static void reconn_set_next_dfs_target(struct TCP_Server_Info *server,
127 struct cifs_sb_info *cifs_sb,
128 struct dfs_cache_tgt_list *tgt_list,
129 struct dfs_cache_tgt_iterator **tgt_it)
130{
131 const char *name;
132 int rc;
133
134 if (!cifs_sb || !cifs_sb->origin_fullpath)
135 return;
136
137 if (!*tgt_it) {
138 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
139 } else {
140 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
141 if (!*tgt_it)
142 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
143 }
144
145 cifs_dbg(FYI, "%s: UNC: %s\n", __func__, cifs_sb->origin_fullpath);
146
147 name = dfs_cache_get_tgt_name(*tgt_it);
148
149 kfree(server->hostname);
150
151 server->hostname = extract_hostname(name);
152 if (IS_ERR(server->hostname)) {
153 cifs_dbg(FYI,
154 "%s: failed to extract hostname from target: %ld\n",
155 __func__, PTR_ERR(server->hostname));
156 return;
157 }
158
159 rc = reconn_set_ipaddr_from_hostname(server);
160 if (rc) {
161 cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
162 __func__, rc);
163 }
164}
165
166static inline int reconn_setup_dfs_targets(struct cifs_sb_info *cifs_sb,
167 struct dfs_cache_tgt_list *tl)
168{
169 if (!cifs_sb->origin_fullpath)
170 return -EOPNOTSUPP;
171 return dfs_cache_noreq_find(cifs_sb->origin_fullpath + 1, NULL, tl);
172}
173#endif
174
175
176
177
178
179
180
181
182
183int
184cifs_reconnect(struct TCP_Server_Info *server)
185{
186 int rc = 0;
187 struct list_head *tmp, *tmp2;
188 struct cifs_ses *ses;
189 struct cifs_tcon *tcon;
190 struct mid_q_entry *mid_entry;
191 struct list_head retry_list;
192#ifdef CONFIG_CIFS_DFS_UPCALL
193 struct super_block *sb = NULL;
194 struct cifs_sb_info *cifs_sb = NULL;
195 struct dfs_cache_tgt_list tgt_list = {0};
196 struct dfs_cache_tgt_iterator *tgt_it = NULL;
197#endif
198
199 spin_lock(&GlobalMid_Lock);
200 server->nr_targets = 1;
201#ifdef CONFIG_CIFS_DFS_UPCALL
202 spin_unlock(&GlobalMid_Lock);
203 sb = cifs_get_tcp_super(server);
204 if (IS_ERR(sb)) {
205 rc = PTR_ERR(sb);
206 cifs_dbg(FYI, "%s: will not do DFS failover: rc = %d\n",
207 __func__, rc);
208 sb = NULL;
209 } else {
210 cifs_sb = CIFS_SB(sb);
211 rc = reconn_setup_dfs_targets(cifs_sb, &tgt_list);
212 if (rc) {
213 cifs_sb = NULL;
214 if (rc != -EOPNOTSUPP) {
215 cifs_server_dbg(VFS, "%s: no target servers for DFS failover\n",
216 __func__);
217 }
218 } else {
219 server->nr_targets = dfs_cache_get_nr_tgts(&tgt_list);
220 }
221 }
222 cifs_dbg(FYI, "%s: will retry %d target(s)\n", __func__,
223 server->nr_targets);
224 spin_lock(&GlobalMid_Lock);
225#endif
226 if (server->tcpStatus == CifsExiting) {
227
228
229 spin_unlock(&GlobalMid_Lock);
230#ifdef CONFIG_CIFS_DFS_UPCALL
231 dfs_cache_free_tgts(&tgt_list);
232 cifs_put_tcp_super(sb);
233#endif
234 wake_up(&server->response_q);
235 return rc;
236 } else
237 server->tcpStatus = CifsNeedReconnect;
238 spin_unlock(&GlobalMid_Lock);
239 server->maxBuf = 0;
240 server->max_read = 0;
241
242 cifs_dbg(FYI, "Mark tcp session as need reconnect\n");
243 trace_smb3_reconnect(server->CurrentMid, server->conn_id, server->hostname);
244
245
246
247 cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
248 __func__);
249 spin_lock(&cifs_tcp_ses_lock);
250 list_for_each(tmp, &server->smb_ses_list) {
251 ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
252 ses->need_reconnect = true;
253 list_for_each(tmp2, &ses->tcon_list) {
254 tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
255 tcon->need_reconnect = true;
256 }
257 if (ses->tcon_ipc)
258 ses->tcon_ipc->need_reconnect = true;
259 }
260 spin_unlock(&cifs_tcp_ses_lock);
261
262
263 cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
264 mutex_lock(&server->srv_mutex);
265 if (server->ssocket) {
266 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
267 server->ssocket->state, server->ssocket->flags);
268 kernel_sock_shutdown(server->ssocket, SHUT_WR);
269 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n",
270 server->ssocket->state, server->ssocket->flags);
271 sock_release(server->ssocket);
272 server->ssocket = NULL;
273 }
274 server->sequence_number = 0;
275 server->session_estab = false;
276 kfree(server->session_key.response);
277 server->session_key.response = NULL;
278 server->session_key.len = 0;
279 server->lstrp = jiffies;
280
281
282 INIT_LIST_HEAD(&retry_list);
283 cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
284 spin_lock(&GlobalMid_Lock);
285 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
286 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
287 kref_get(&mid_entry->refcount);
288 if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
289 mid_entry->mid_state = MID_RETRY_NEEDED;
290 list_move(&mid_entry->qhead, &retry_list);
291 mid_entry->mid_flags |= MID_DELETED;
292 }
293 spin_unlock(&GlobalMid_Lock);
294 mutex_unlock(&server->srv_mutex);
295
296 cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
297 list_for_each_safe(tmp, tmp2, &retry_list) {
298 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
299 list_del_init(&mid_entry->qhead);
300 mid_entry->callback(mid_entry);
301 cifs_mid_q_entry_release(mid_entry);
302 }
303
304 if (cifs_rdma_enabled(server)) {
305 mutex_lock(&server->srv_mutex);
306 smbd_destroy(server);
307 mutex_unlock(&server->srv_mutex);
308 }
309
310 do {
311 try_to_freeze();
312
313 mutex_lock(&server->srv_mutex);
314
315
316 if (!cifs_swn_set_server_dstaddr(server)) {
317#ifdef CONFIG_CIFS_DFS_UPCALL
318 if (cifs_sb && cifs_sb->origin_fullpath)
319
320
321
322
323
324 reconn_set_next_dfs_target(server, cifs_sb, &tgt_list, &tgt_it);
325 else {
326#endif
327
328
329
330 rc = reconn_set_ipaddr_from_hostname(server);
331 if (rc) {
332 cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
333 __func__, rc);
334 }
335
336#ifdef CONFIG_CIFS_DFS_UPCALL
337 }
338#endif
339
340
341 }
342
343 if (cifs_rdma_enabled(server))
344 rc = smbd_reconnect(server);
345 else
346 rc = generic_ip_connect(server);
347 if (rc) {
348 cifs_dbg(FYI, "reconnect error %d\n", rc);
349 mutex_unlock(&server->srv_mutex);
350 msleep(3000);
351 } else {
352 atomic_inc(&tcpSesReconnectCount);
353 set_credits(server, 1);
354 spin_lock(&GlobalMid_Lock);
355 if (server->tcpStatus != CifsExiting)
356 server->tcpStatus = CifsNeedNegotiate;
357 spin_unlock(&GlobalMid_Lock);
358 cifs_swn_reset_server_dstaddr(server);
359 mutex_unlock(&server->srv_mutex);
360 }
361 } while (server->tcpStatus == CifsNeedReconnect);
362
363#ifdef CONFIG_CIFS_DFS_UPCALL
364 if (tgt_it) {
365 rc = dfs_cache_noreq_update_tgthint(cifs_sb->origin_fullpath + 1,
366 tgt_it);
367 if (rc) {
368 cifs_server_dbg(VFS, "%s: failed to update DFS target hint: rc = %d\n",
369 __func__, rc);
370 }
371 rc = dfs_cache_update_vol(cifs_sb->origin_fullpath, server);
372 if (rc) {
373 cifs_server_dbg(VFS, "%s: failed to update vol info in DFS cache: rc = %d\n",
374 __func__, rc);
375 }
376 dfs_cache_free_tgts(&tgt_list);
377
378 }
379
380 cifs_put_tcp_super(sb);
381#endif
382 if (server->tcpStatus == CifsNeedNegotiate)
383 mod_delayed_work(cifsiod_wq, &server->echo, 0);
384
385 wake_up(&server->response_q);
386 return rc;
387}
388
389static void
390cifs_echo_request(struct work_struct *work)
391{
392 int rc;
393 struct TCP_Server_Info *server = container_of(work,
394 struct TCP_Server_Info, echo.work);
395
396
397
398
399
400
401 if (server->tcpStatus == CifsNeedReconnect ||
402 server->tcpStatus == CifsExiting ||
403 server->tcpStatus == CifsNew ||
404 (server->ops->can_echo && !server->ops->can_echo(server)) ||
405 time_before(jiffies, server->lstrp + server->echo_interval - HZ))
406 goto requeue_echo;
407
408 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
409 if (rc)
410 cifs_dbg(FYI, "Unable to send echo request to server: %s\n",
411 server->hostname);
412
413
414 cifs_swn_check();
415
416requeue_echo:
417 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
418}
419
420static bool
421allocate_buffers(struct TCP_Server_Info *server)
422{
423 if (!server->bigbuf) {
424 server->bigbuf = (char *)cifs_buf_get();
425 if (!server->bigbuf) {
426 cifs_server_dbg(VFS, "No memory for large SMB response\n");
427 msleep(3000);
428
429 return false;
430 }
431 } else if (server->large_buf) {
432
433 memset(server->bigbuf, 0, HEADER_SIZE(server));
434 }
435
436 if (!server->smallbuf) {
437 server->smallbuf = (char *)cifs_small_buf_get();
438 if (!server->smallbuf) {
439 cifs_server_dbg(VFS, "No memory for SMB response\n");
440 msleep(1000);
441
442 return false;
443 }
444
445 } else {
446
447 memset(server->smallbuf, 0, HEADER_SIZE(server));
448 }
449
450 return true;
451}
452
453static bool
454server_unresponsive(struct TCP_Server_Info *server)
455{
456
457
458
459
460
461
462
463
464
465
466
467 if ((server->tcpStatus == CifsGood ||
468 server->tcpStatus == CifsNeedNegotiate) &&
469 (!server->ops->can_echo || server->ops->can_echo(server)) &&
470 time_after(jiffies, server->lstrp + 3 * server->echo_interval)) {
471 cifs_server_dbg(VFS, "has not responded in %lu seconds. Reconnecting...\n",
472 (3 * server->echo_interval) / HZ);
473 cifs_reconnect(server);
474 return true;
475 }
476
477 return false;
478}
479
480static inline bool
481zero_credits(struct TCP_Server_Info *server)
482{
483 int val;
484
485 spin_lock(&server->req_lock);
486 val = server->credits + server->echo_credits + server->oplock_credits;
487 if (server->in_flight == 0 && val == 0) {
488 spin_unlock(&server->req_lock);
489 return true;
490 }
491 spin_unlock(&server->req_lock);
492 return false;
493}
494
495static int
496cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
497{
498 int length = 0;
499 int total_read;
500
501 smb_msg->msg_control = NULL;
502 smb_msg->msg_controllen = 0;
503
504 for (total_read = 0; msg_data_left(smb_msg); total_read += length) {
505 try_to_freeze();
506
507
508 if (zero_credits(server)) {
509 cifs_reconnect(server);
510 return -ECONNABORTED;
511 }
512
513 if (server_unresponsive(server))
514 return -ECONNABORTED;
515 if (cifs_rdma_enabled(server) && server->smbd_conn)
516 length = smbd_recv(server->smbd_conn, smb_msg);
517 else
518 length = sock_recvmsg(server->ssocket, smb_msg, 0);
519
520 if (server->tcpStatus == CifsExiting)
521 return -ESHUTDOWN;
522
523 if (server->tcpStatus == CifsNeedReconnect) {
524 cifs_reconnect(server);
525 return -ECONNABORTED;
526 }
527
528 if (length == -ERESTARTSYS ||
529 length == -EAGAIN ||
530 length == -EINTR) {
531
532
533
534
535
536 usleep_range(1000, 2000);
537 length = 0;
538 continue;
539 }
540
541 if (length <= 0) {
542 cifs_dbg(FYI, "Received no data or error: %d\n", length);
543 cifs_reconnect(server);
544 return -ECONNABORTED;
545 }
546 }
547 return total_read;
548}
549
550int
551cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
552 unsigned int to_read)
553{
554 struct msghdr smb_msg;
555 struct kvec iov = {.iov_base = buf, .iov_len = to_read};
556 iov_iter_kvec(&smb_msg.msg_iter, READ, &iov, 1, to_read);
557
558 return cifs_readv_from_socket(server, &smb_msg);
559}
560
561ssize_t
562cifs_discard_from_socket(struct TCP_Server_Info *server, size_t to_read)
563{
564 struct msghdr smb_msg;
565
566
567
568
569
570
571 smb_msg.msg_name = NULL;
572 smb_msg.msg_namelen = 0;
573 iov_iter_discard(&smb_msg.msg_iter, READ, to_read);
574
575 return cifs_readv_from_socket(server, &smb_msg);
576}
577
578int
579cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
580 unsigned int page_offset, unsigned int to_read)
581{
582 struct msghdr smb_msg;
583 struct bio_vec bv = {
584 .bv_page = page, .bv_len = to_read, .bv_offset = page_offset};
585 iov_iter_bvec(&smb_msg.msg_iter, READ, &bv, 1, to_read);
586 return cifs_readv_from_socket(server, &smb_msg);
587}
588
589static bool
590is_smb_response(struct TCP_Server_Info *server, unsigned char type)
591{
592
593
594
595
596
597 switch (type) {
598 case RFC1002_SESSION_MESSAGE:
599
600 return true;
601 case RFC1002_SESSION_KEEP_ALIVE:
602 cifs_dbg(FYI, "RFC 1002 session keep alive\n");
603 break;
604 case RFC1002_POSITIVE_SESSION_RESPONSE:
605 cifs_dbg(FYI, "RFC 1002 positive session response\n");
606 break;
607 case RFC1002_NEGATIVE_SESSION_RESPONSE:
608
609
610
611
612 cifs_dbg(FYI, "RFC 1002 negative session response\n");
613
614 msleep(1000);
615
616
617
618
619
620
621 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
622 cifs_reconnect(server);
623 break;
624 default:
625 cifs_server_dbg(VFS, "RFC 1002 unknown response type 0x%x\n", type);
626 cifs_reconnect(server);
627 }
628
629 return false;
630}
631
632void
633dequeue_mid(struct mid_q_entry *mid, bool malformed)
634{
635#ifdef CONFIG_CIFS_STATS2
636 mid->when_received = jiffies;
637#endif
638 spin_lock(&GlobalMid_Lock);
639 if (!malformed)
640 mid->mid_state = MID_RESPONSE_RECEIVED;
641 else
642 mid->mid_state = MID_RESPONSE_MALFORMED;
643
644
645
646
647 if (mid->mid_flags & MID_DELETED)
648 pr_warn_once("trying to dequeue a deleted mid\n");
649 else {
650 list_del_init(&mid->qhead);
651 mid->mid_flags |= MID_DELETED;
652 }
653 spin_unlock(&GlobalMid_Lock);
654}
655
656static unsigned int
657smb2_get_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
658{
659 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
660
661
662
663
664 if (server->vals->header_preamble_size)
665 return 0;
666
667 return le16_to_cpu(shdr->CreditRequest);
668}
669
670static void
671handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
672 char *buf, int malformed)
673{
674 if (server->ops->check_trans2 &&
675 server->ops->check_trans2(mid, server, buf, malformed))
676 return;
677 mid->credits_received = smb2_get_credits_from_hdr(buf, server);
678 mid->resp_buf = buf;
679 mid->large_buf = server->large_buf;
680
681 if (!mid->multiRsp) {
682
683 if (server->large_buf)
684 server->bigbuf = NULL;
685 else
686 server->smallbuf = NULL;
687 }
688 dequeue_mid(mid, malformed);
689}
690
691static void clean_demultiplex_info(struct TCP_Server_Info *server)
692{
693 int length;
694
695
696 spin_lock(&cifs_tcp_ses_lock);
697 list_del_init(&server->tcp_ses_list);
698 spin_unlock(&cifs_tcp_ses_lock);
699
700 cancel_delayed_work_sync(&server->echo);
701
702 spin_lock(&GlobalMid_Lock);
703 server->tcpStatus = CifsExiting;
704 spin_unlock(&GlobalMid_Lock);
705 wake_up_all(&server->response_q);
706
707
708 spin_lock(&server->req_lock);
709 if (server->credits <= 0)
710 server->credits = 1;
711 spin_unlock(&server->req_lock);
712
713
714
715
716
717
718
719 wake_up_all(&server->request_q);
720
721 msleep(125);
722 if (cifs_rdma_enabled(server))
723 smbd_destroy(server);
724 if (server->ssocket) {
725 sock_release(server->ssocket);
726 server->ssocket = NULL;
727 }
728
729 if (!list_empty(&server->pending_mid_q)) {
730 struct list_head dispose_list;
731 struct mid_q_entry *mid_entry;
732 struct list_head *tmp, *tmp2;
733
734 INIT_LIST_HEAD(&dispose_list);
735 spin_lock(&GlobalMid_Lock);
736 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
737 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
738 cifs_dbg(FYI, "Clearing mid %llu\n", mid_entry->mid);
739 kref_get(&mid_entry->refcount);
740 mid_entry->mid_state = MID_SHUTDOWN;
741 list_move(&mid_entry->qhead, &dispose_list);
742 mid_entry->mid_flags |= MID_DELETED;
743 }
744 spin_unlock(&GlobalMid_Lock);
745
746
747 list_for_each_safe(tmp, tmp2, &dispose_list) {
748 mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
749 cifs_dbg(FYI, "Callback mid %llu\n", mid_entry->mid);
750 list_del_init(&mid_entry->qhead);
751 mid_entry->callback(mid_entry);
752 cifs_mid_q_entry_release(mid_entry);
753 }
754
755 msleep(125);
756 }
757
758 if (!list_empty(&server->pending_mid_q)) {
759
760
761
762
763
764
765
766
767 cifs_dbg(FYI, "Wait for exit from demultiplex thread\n");
768 msleep(46000);
769
770
771
772
773 }
774
775 kfree(server->hostname);
776 kfree(server);
777
778 length = atomic_dec_return(&tcpSesAllocCount);
779 if (length > 0)
780 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
781}
782
783static int
784standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
785{
786 int length;
787 char *buf = server->smallbuf;
788 unsigned int pdu_length = server->pdu_size;
789
790
791 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
792 server->vals->header_preamble_size) {
793 cifs_server_dbg(VFS, "SMB response too long (%u bytes)\n", pdu_length);
794 cifs_reconnect(server);
795 return -ECONNABORTED;
796 }
797
798
799 if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE - 4) {
800 server->large_buf = true;
801 memcpy(server->bigbuf, buf, server->total_read);
802 buf = server->bigbuf;
803 }
804
805
806 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
807 pdu_length - HEADER_SIZE(server) + 1
808 + server->vals->header_preamble_size);
809
810 if (length < 0)
811 return length;
812 server->total_read += length;
813
814 dump_smb(buf, server->total_read);
815
816 return cifs_handle_standard(server, mid);
817}
818
819int
820cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
821{
822 char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
823 int length;
824
825
826
827
828
829
830
831
832
833
834 length = server->ops->check_message(buf, server->total_read, server);
835 if (length != 0)
836 cifs_dump_mem("Bad SMB: ", buf,
837 min_t(unsigned int, server->total_read, 48));
838
839 if (server->ops->is_session_expired &&
840 server->ops->is_session_expired(buf)) {
841 cifs_reconnect(server);
842 return -1;
843 }
844
845 if (server->ops->is_status_pending &&
846 server->ops->is_status_pending(buf, server))
847 return -1;
848
849 if (!mid)
850 return length;
851
852 handle_mid(mid, server, buf, length);
853 return 0;
854}
855
856static void
857smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
858{
859 struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
860 int scredits, in_flight;
861
862
863
864
865 if (server->vals->header_preamble_size)
866 return;
867
868 if (shdr->CreditRequest) {
869 spin_lock(&server->req_lock);
870 server->credits += le16_to_cpu(shdr->CreditRequest);
871 scredits = server->credits;
872 in_flight = server->in_flight;
873 spin_unlock(&server->req_lock);
874 wake_up(&server->request_q);
875
876 trace_smb3_add_credits(server->CurrentMid,
877 server->conn_id, server->hostname, scredits,
878 le16_to_cpu(shdr->CreditRequest), in_flight);
879 cifs_server_dbg(FYI, "%s: added %u credits total=%d\n",
880 __func__, le16_to_cpu(shdr->CreditRequest),
881 scredits);
882 }
883}
884
885
886static int
887cifs_demultiplex_thread(void *p)
888{
889 int i, num_mids, length;
890 struct TCP_Server_Info *server = p;
891 unsigned int pdu_length;
892 unsigned int next_offset;
893 char *buf = NULL;
894 struct task_struct *task_to_wake = NULL;
895 struct mid_q_entry *mids[MAX_COMPOUND];
896 char *bufs[MAX_COMPOUND];
897 unsigned int noreclaim_flag, num_io_timeout = 0;
898
899 noreclaim_flag = memalloc_noreclaim_save();
900 cifs_dbg(FYI, "Demultiplex PID: %d\n", task_pid_nr(current));
901
902 length = atomic_inc_return(&tcpSesAllocCount);
903 if (length > 1)
904 mempool_resize(cifs_req_poolp, length + cifs_min_rcv);
905
906 set_freezable();
907 allow_kernel_signal(SIGKILL);
908 while (server->tcpStatus != CifsExiting) {
909 if (try_to_freeze())
910 continue;
911
912 if (!allocate_buffers(server))
913 continue;
914
915 server->large_buf = false;
916 buf = server->smallbuf;
917 pdu_length = 4;
918
919 length = cifs_read_from_socket(server, buf, pdu_length);
920 if (length < 0)
921 continue;
922
923 if (server->vals->header_preamble_size == 0)
924 server->total_read = 0;
925 else
926 server->total_read = length;
927
928
929
930
931
932 pdu_length = get_rfc1002_length(buf);
933
934 cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
935 if (!is_smb_response(server, buf[0]))
936 continue;
937next_pdu:
938 server->pdu_size = pdu_length;
939
940
941 if (server->pdu_size < HEADER_SIZE(server) - 1 -
942 server->vals->header_preamble_size) {
943 cifs_server_dbg(VFS, "SMB response too short (%u bytes)\n",
944 server->pdu_size);
945 cifs_reconnect(server);
946 continue;
947 }
948
949
950 length = cifs_read_from_socket(server,
951 buf + server->vals->header_preamble_size,
952 HEADER_SIZE(server) - 1
953 - server->vals->header_preamble_size);
954 if (length < 0)
955 continue;
956 server->total_read += length;
957
958 if (server->ops->next_header) {
959 next_offset = server->ops->next_header(buf);
960 if (next_offset)
961 server->pdu_size = next_offset;
962 }
963
964 memset(mids, 0, sizeof(mids));
965 memset(bufs, 0, sizeof(bufs));
966 num_mids = 0;
967
968 if (server->ops->is_transform_hdr &&
969 server->ops->receive_transform &&
970 server->ops->is_transform_hdr(buf)) {
971 length = server->ops->receive_transform(server,
972 mids,
973 bufs,
974 &num_mids);
975 } else {
976 mids[0] = server->ops->find_mid(server, buf);
977 bufs[0] = buf;
978 num_mids = 1;
979
980 if (!mids[0] || !mids[0]->receive)
981 length = standard_receive3(server, mids[0]);
982 else
983 length = mids[0]->receive(server, mids[0]);
984 }
985
986 if (length < 0) {
987 for (i = 0; i < num_mids; i++)
988 if (mids[i])
989 cifs_mid_q_entry_release(mids[i]);
990 continue;
991 }
992
993 if (server->ops->is_status_io_timeout &&
994 server->ops->is_status_io_timeout(buf)) {
995 num_io_timeout++;
996 if (num_io_timeout > NUM_STATUS_IO_TIMEOUT) {
997 cifs_reconnect(server);
998 num_io_timeout = 0;
999 continue;
1000 }
1001 }
1002
1003 server->lstrp = jiffies;
1004
1005 for (i = 0; i < num_mids; i++) {
1006 if (mids[i] != NULL) {
1007 mids[i]->resp_buf_size = server->pdu_size;
1008
1009 if (bufs[i] && server->ops->is_network_name_deleted)
1010 server->ops->is_network_name_deleted(bufs[i],
1011 server);
1012
1013 if (!mids[i]->multiRsp || mids[i]->multiEnd)
1014 mids[i]->callback(mids[i]);
1015
1016 cifs_mid_q_entry_release(mids[i]);
1017 } else if (server->ops->is_oplock_break &&
1018 server->ops->is_oplock_break(bufs[i],
1019 server)) {
1020 smb2_add_credits_from_hdr(bufs[i], server);
1021 cifs_dbg(FYI, "Received oplock break\n");
1022 } else {
1023 cifs_server_dbg(VFS, "No task to wake, unknown frame received! NumMids %d\n",
1024 atomic_read(&midCount));
1025 cifs_dump_mem("Received Data is: ", bufs[i],
1026 HEADER_SIZE(server));
1027 smb2_add_credits_from_hdr(bufs[i], server);
1028#ifdef CONFIG_CIFS_DEBUG2
1029 if (server->ops->dump_detail)
1030 server->ops->dump_detail(bufs[i],
1031 server);
1032 cifs_dump_mids(server);
1033#endif
1034 }
1035 }
1036
1037 if (pdu_length > server->pdu_size) {
1038 if (!allocate_buffers(server))
1039 continue;
1040 pdu_length -= server->pdu_size;
1041 server->total_read = 0;
1042 server->large_buf = false;
1043 buf = server->smallbuf;
1044 goto next_pdu;
1045 }
1046 }
1047
1048
1049 cifs_buf_release(server->bigbuf);
1050 if (server->smallbuf)
1051 cifs_small_buf_release(server->smallbuf);
1052
1053 task_to_wake = xchg(&server->tsk, NULL);
1054 clean_demultiplex_info(server);
1055
1056
1057 if (!task_to_wake) {
1058 set_current_state(TASK_INTERRUPTIBLE);
1059 while (!signal_pending(current)) {
1060 schedule();
1061 set_current_state(TASK_INTERRUPTIBLE);
1062 }
1063 set_current_state(TASK_RUNNING);
1064 }
1065
1066 memalloc_noreclaim_restore(noreclaim_flag);
1067 module_put_and_exit(0);
1068}
1069
1070
1071
1072
1073
1074bool
1075cifs_match_ipaddr(struct sockaddr *srcaddr, struct sockaddr *rhs)
1076{
1077 switch (srcaddr->sa_family) {
1078 case AF_UNSPEC:
1079 return (rhs->sa_family == AF_UNSPEC);
1080 case AF_INET: {
1081 struct sockaddr_in *saddr4 = (struct sockaddr_in *)srcaddr;
1082 struct sockaddr_in *vaddr4 = (struct sockaddr_in *)rhs;
1083 return (saddr4->sin_addr.s_addr == vaddr4->sin_addr.s_addr);
1084 }
1085 case AF_INET6: {
1086 struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)srcaddr;
1087 struct sockaddr_in6 *vaddr6 = (struct sockaddr_in6 *)rhs;
1088 return ipv6_addr_equal(&saddr6->sin6_addr, &vaddr6->sin6_addr);
1089 }
1090 default:
1091 WARN_ON(1);
1092 return false;
1093 }
1094}
1095
1096
1097
1098
1099
1100
1101static bool
1102match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
1103{
1104 __be16 port, *sport;
1105
1106
1107 if (server->rdma)
1108 return true;
1109
1110 switch (addr->sa_family) {
1111 case AF_INET:
1112 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
1113 port = ((struct sockaddr_in *) addr)->sin_port;
1114 break;
1115 case AF_INET6:
1116 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
1117 port = ((struct sockaddr_in6 *) addr)->sin6_port;
1118 break;
1119 default:
1120 WARN_ON(1);
1121 return false;
1122 }
1123
1124 if (!port) {
1125 port = htons(CIFS_PORT);
1126 if (port == *sport)
1127 return true;
1128
1129 port = htons(RFC1001_PORT);
1130 }
1131
1132 return port == *sport;
1133}
1134
1135static bool
1136match_address(struct TCP_Server_Info *server, struct sockaddr *addr,
1137 struct sockaddr *srcaddr)
1138{
1139 switch (addr->sa_family) {
1140 case AF_INET: {
1141 struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
1142 struct sockaddr_in *srv_addr4 =
1143 (struct sockaddr_in *)&server->dstaddr;
1144
1145 if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr)
1146 return false;
1147 break;
1148 }
1149 case AF_INET6: {
1150 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
1151 struct sockaddr_in6 *srv_addr6 =
1152 (struct sockaddr_in6 *)&server->dstaddr;
1153
1154 if (!ipv6_addr_equal(&addr6->sin6_addr,
1155 &srv_addr6->sin6_addr))
1156 return false;
1157 if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id)
1158 return false;
1159 break;
1160 }
1161 default:
1162 WARN_ON(1);
1163 return false;
1164 }
1165
1166 if (!cifs_match_ipaddr(srcaddr, (struct sockaddr *)&server->srcaddr))
1167 return false;
1168
1169 return true;
1170}
1171
1172static bool
1173match_security(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1174{
1175
1176
1177
1178
1179
1180 if (server->ops->select_sectype(server, ctx->sectype)
1181 == Unspecified)
1182 return false;
1183
1184
1185
1186
1187
1188
1189 if (ctx->sign && !server->sign)
1190 return false;
1191
1192 return true;
1193}
1194
1195static int match_server(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1196{
1197 struct sockaddr *addr = (struct sockaddr *)&ctx->dstaddr;
1198
1199 if (ctx->nosharesock)
1200 return 0;
1201
1202
1203 if (strcmp(ctx->vals->version_string, SMB3ANY_VERSION_STRING) == 0) {
1204 if (server->vals->protocol_id < SMB30_PROT_ID)
1205 return 0;
1206 } else if (strcmp(ctx->vals->version_string,
1207 SMBDEFAULT_VERSION_STRING) == 0) {
1208 if (server->vals->protocol_id < SMB21_PROT_ID)
1209 return 0;
1210 } else if ((server->vals != ctx->vals) || (server->ops != ctx->ops))
1211 return 0;
1212
1213 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
1214 return 0;
1215
1216 if (!match_address(server, addr,
1217 (struct sockaddr *)&ctx->srcaddr))
1218 return 0;
1219
1220 if (!match_port(server, addr))
1221 return 0;
1222
1223 if (!match_security(server, ctx))
1224 return 0;
1225
1226 if (server->echo_interval != ctx->echo_interval * HZ)
1227 return 0;
1228
1229 if (server->rdma != ctx->rdma)
1230 return 0;
1231
1232 if (server->ignore_signature != ctx->ignore_signature)
1233 return 0;
1234
1235 if (server->min_offload != ctx->min_offload)
1236 return 0;
1237
1238 return 1;
1239}
1240
1241struct TCP_Server_Info *
1242cifs_find_tcp_session(struct smb3_fs_context *ctx)
1243{
1244 struct TCP_Server_Info *server;
1245
1246 spin_lock(&cifs_tcp_ses_lock);
1247 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
1248
1249
1250
1251
1252 if (server->is_channel || !match_server(server, ctx))
1253 continue;
1254
1255 ++server->srv_count;
1256 spin_unlock(&cifs_tcp_ses_lock);
1257 cifs_dbg(FYI, "Existing tcp session with server found\n");
1258 return server;
1259 }
1260 spin_unlock(&cifs_tcp_ses_lock);
1261 return NULL;
1262}
1263
1264void
1265cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
1266{
1267 struct task_struct *task;
1268
1269 spin_lock(&cifs_tcp_ses_lock);
1270 if (--server->srv_count > 0) {
1271 spin_unlock(&cifs_tcp_ses_lock);
1272 return;
1273 }
1274
1275 put_net(cifs_net_ns(server));
1276
1277 list_del_init(&server->tcp_ses_list);
1278 spin_unlock(&cifs_tcp_ses_lock);
1279
1280 cancel_delayed_work_sync(&server->echo);
1281
1282 if (from_reconnect)
1283
1284
1285
1286
1287
1288
1289 cancel_delayed_work(&server->reconnect);
1290 else
1291 cancel_delayed_work_sync(&server->reconnect);
1292
1293 spin_lock(&GlobalMid_Lock);
1294 server->tcpStatus = CifsExiting;
1295 spin_unlock(&GlobalMid_Lock);
1296
1297 cifs_crypto_secmech_release(server);
1298 cifs_fscache_release_client_cookie(server);
1299
1300 kfree(server->session_key.response);
1301 server->session_key.response = NULL;
1302 server->session_key.len = 0;
1303
1304 task = xchg(&server->tsk, NULL);
1305 if (task)
1306 send_sig(SIGKILL, task, 1);
1307}
1308
1309struct TCP_Server_Info *
1310cifs_get_tcp_session(struct smb3_fs_context *ctx)
1311{
1312 struct TCP_Server_Info *tcp_ses = NULL;
1313 int rc;
1314
1315 cifs_dbg(FYI, "UNC: %s\n", ctx->UNC);
1316
1317
1318 tcp_ses = cifs_find_tcp_session(ctx);
1319 if (tcp_ses)
1320 return tcp_ses;
1321
1322 tcp_ses = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL);
1323 if (!tcp_ses) {
1324 rc = -ENOMEM;
1325 goto out_err;
1326 }
1327
1328 tcp_ses->ops = ctx->ops;
1329 tcp_ses->vals = ctx->vals;
1330 cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns));
1331 tcp_ses->hostname = extract_hostname(ctx->UNC);
1332 if (IS_ERR(tcp_ses->hostname)) {
1333 rc = PTR_ERR(tcp_ses->hostname);
1334 goto out_err_crypto_release;
1335 }
1336
1337 tcp_ses->conn_id = atomic_inc_return(&tcpSesNextId);
1338 tcp_ses->noblockcnt = ctx->rootfs;
1339 tcp_ses->noblocksnd = ctx->noblocksnd || ctx->rootfs;
1340 tcp_ses->noautotune = ctx->noautotune;
1341 tcp_ses->tcp_nodelay = ctx->sockopt_tcp_nodelay;
1342 tcp_ses->rdma = ctx->rdma;
1343 tcp_ses->in_flight = 0;
1344 tcp_ses->max_in_flight = 0;
1345 tcp_ses->credits = 1;
1346 init_waitqueue_head(&tcp_ses->response_q);
1347 init_waitqueue_head(&tcp_ses->request_q);
1348 INIT_LIST_HEAD(&tcp_ses->pending_mid_q);
1349 mutex_init(&tcp_ses->srv_mutex);
1350 memcpy(tcp_ses->workstation_RFC1001_name,
1351 ctx->source_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
1352 memcpy(tcp_ses->server_RFC1001_name,
1353 ctx->target_rfc1001_name, RFC1001_NAME_LEN_WITH_NULL);
1354 tcp_ses->session_estab = false;
1355 tcp_ses->sequence_number = 0;
1356 tcp_ses->reconnect_instance = 1;
1357 tcp_ses->lstrp = jiffies;
1358 tcp_ses->compress_algorithm = cpu_to_le16(ctx->compression);
1359 spin_lock_init(&tcp_ses->req_lock);
1360 INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
1361 INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
1362 INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
1363 INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
1364 mutex_init(&tcp_ses->reconnect_mutex);
1365 memcpy(&tcp_ses->srcaddr, &ctx->srcaddr,
1366 sizeof(tcp_ses->srcaddr));
1367 memcpy(&tcp_ses->dstaddr, &ctx->dstaddr,
1368 sizeof(tcp_ses->dstaddr));
1369 if (ctx->use_client_guid)
1370 memcpy(tcp_ses->client_guid, ctx->client_guid,
1371 SMB2_CLIENT_GUID_SIZE);
1372 else
1373 generate_random_uuid(tcp_ses->client_guid);
1374
1375
1376
1377
1378
1379 tcp_ses->tcpStatus = CifsNew;
1380 ++tcp_ses->srv_count;
1381
1382 if (ctx->echo_interval >= SMB_ECHO_INTERVAL_MIN &&
1383 ctx->echo_interval <= SMB_ECHO_INTERVAL_MAX)
1384 tcp_ses->echo_interval = ctx->echo_interval * HZ;
1385 else
1386 tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
1387 if (tcp_ses->rdma) {
1388#ifndef CONFIG_CIFS_SMB_DIRECT
1389 cifs_dbg(VFS, "CONFIG_CIFS_SMB_DIRECT is not enabled\n");
1390 rc = -ENOENT;
1391 goto out_err_crypto_release;
1392#endif
1393 tcp_ses->smbd_conn = smbd_get_connection(
1394 tcp_ses, (struct sockaddr *)&ctx->dstaddr);
1395 if (tcp_ses->smbd_conn) {
1396 cifs_dbg(VFS, "RDMA transport established\n");
1397 rc = 0;
1398 goto smbd_connected;
1399 } else {
1400 rc = -ENOENT;
1401 goto out_err_crypto_release;
1402 }
1403 }
1404 rc = ip_connect(tcp_ses);
1405 if (rc < 0) {
1406 cifs_dbg(VFS, "Error connecting to socket. Aborting operation.\n");
1407 goto out_err_crypto_release;
1408 }
1409smbd_connected:
1410
1411
1412
1413
1414 __module_get(THIS_MODULE);
1415 tcp_ses->tsk = kthread_run(cifs_demultiplex_thread,
1416 tcp_ses, "cifsd");
1417 if (IS_ERR(tcp_ses->tsk)) {
1418 rc = PTR_ERR(tcp_ses->tsk);
1419 cifs_dbg(VFS, "error %d create cifsd thread\n", rc);
1420 module_put(THIS_MODULE);
1421 goto out_err_crypto_release;
1422 }
1423 tcp_ses->min_offload = ctx->min_offload;
1424 tcp_ses->tcpStatus = CifsNeedNegotiate;
1425
1426 if ((ctx->max_credits < 20) || (ctx->max_credits > 60000))
1427 tcp_ses->max_credits = SMB2_MAX_CREDITS_AVAILABLE;
1428 else
1429 tcp_ses->max_credits = ctx->max_credits;
1430
1431 tcp_ses->nr_targets = 1;
1432 tcp_ses->ignore_signature = ctx->ignore_signature;
1433
1434 spin_lock(&cifs_tcp_ses_lock);
1435 list_add(&tcp_ses->tcp_ses_list, &cifs_tcp_ses_list);
1436 spin_unlock(&cifs_tcp_ses_lock);
1437
1438 cifs_fscache_get_client_cookie(tcp_ses);
1439
1440
1441 queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
1442
1443 return tcp_ses;
1444
1445out_err_crypto_release:
1446 cifs_crypto_secmech_release(tcp_ses);
1447
1448 put_net(cifs_net_ns(tcp_ses));
1449
1450out_err:
1451 if (tcp_ses) {
1452 if (!IS_ERR(tcp_ses->hostname))
1453 kfree(tcp_ses->hostname);
1454 if (tcp_ses->ssocket)
1455 sock_release(tcp_ses->ssocket);
1456 kfree(tcp_ses);
1457 }
1458 return ERR_PTR(rc);
1459}
1460
1461static int match_session(struct cifs_ses *ses, struct smb3_fs_context *ctx)
1462{
1463 if (ctx->sectype != Unspecified &&
1464 ctx->sectype != ses->sectype)
1465 return 0;
1466
1467
1468
1469
1470
1471 if (ses->chan_max < ctx->max_channels)
1472 return 0;
1473
1474 switch (ses->sectype) {
1475 case Kerberos:
1476 if (!uid_eq(ctx->cred_uid, ses->cred_uid))
1477 return 0;
1478 break;
1479 default:
1480
1481 if (ses->user_name == NULL) {
1482 if (!ctx->nullauth)
1483 return 0;
1484 break;
1485 }
1486
1487
1488 if (strncmp(ses->user_name,
1489 ctx->username ? ctx->username : "",
1490 CIFS_MAX_USERNAME_LEN))
1491 return 0;
1492 if ((ctx->username && strlen(ctx->username) != 0) &&
1493 ses->password != NULL &&
1494 strncmp(ses->password,
1495 ctx->password ? ctx->password : "",
1496 CIFS_MAX_PASSWORD_LEN))
1497 return 0;
1498 }
1499 return 1;
1500}
1501
1502
1503
1504
1505
1506
1507
1508static int
1509cifs_setup_ipc(struct cifs_ses *ses, struct smb3_fs_context *ctx)
1510{
1511 int rc = 0, xid;
1512 struct cifs_tcon *tcon;
1513 char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0};
1514 bool seal = false;
1515 struct TCP_Server_Info *server = ses->server;
1516
1517
1518
1519
1520
1521 if (ctx->seal) {
1522 if (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
1523 seal = true;
1524 else {
1525 cifs_server_dbg(VFS,
1526 "IPC: server doesn't support encryption\n");
1527 return -EOPNOTSUPP;
1528 }
1529 }
1530
1531 tcon = tconInfoAlloc();
1532 if (tcon == NULL)
1533 return -ENOMEM;
1534
1535 scnprintf(unc, sizeof(unc), "\\\\%s\\IPC$", server->hostname);
1536
1537 xid = get_xid();
1538 tcon->ses = ses;
1539 tcon->ipc = true;
1540 tcon->seal = seal;
1541 rc = server->ops->tree_connect(xid, ses, unc, tcon, ctx->local_nls);
1542 free_xid(xid);
1543
1544 if (rc) {
1545 cifs_server_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
1546 tconInfoFree(tcon);
1547 goto out;
1548 }
1549
1550 cifs_dbg(FYI, "IPC tcon rc = %d ipc tid = %d\n", rc, tcon->tid);
1551
1552 ses->tcon_ipc = tcon;
1553out:
1554 return rc;
1555}
1556
1557
1558
1559
1560
1561
1562static int
1563cifs_free_ipc(struct cifs_ses *ses)
1564{
1565 int rc = 0, xid;
1566 struct cifs_tcon *tcon = ses->tcon_ipc;
1567
1568 if (tcon == NULL)
1569 return 0;
1570
1571 if (ses->server->ops->tree_disconnect) {
1572 xid = get_xid();
1573 rc = ses->server->ops->tree_disconnect(xid, tcon);
1574 free_xid(xid);
1575 }
1576
1577 if (rc)
1578 cifs_dbg(FYI, "failed to disconnect IPC tcon (rc=%d)\n", rc);
1579
1580 tconInfoFree(tcon);
1581 ses->tcon_ipc = NULL;
1582 return rc;
1583}
1584
1585static struct cifs_ses *
1586cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1587{
1588 struct cifs_ses *ses;
1589
1590 spin_lock(&cifs_tcp_ses_lock);
1591 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
1592 if (ses->status == CifsExiting)
1593 continue;
1594 if (!match_session(ses, ctx))
1595 continue;
1596 ++ses->ses_count;
1597 spin_unlock(&cifs_tcp_ses_lock);
1598 return ses;
1599 }
1600 spin_unlock(&cifs_tcp_ses_lock);
1601 return NULL;
1602}
1603
1604void cifs_put_smb_ses(struct cifs_ses *ses)
1605{
1606 unsigned int rc, xid;
1607 struct TCP_Server_Info *server = ses->server;
1608
1609 cifs_dbg(FYI, "%s: ses_count=%d\n", __func__, ses->ses_count);
1610
1611 spin_lock(&cifs_tcp_ses_lock);
1612 if (ses->status == CifsExiting) {
1613 spin_unlock(&cifs_tcp_ses_lock);
1614 return;
1615 }
1616 if (--ses->ses_count > 0) {
1617 spin_unlock(&cifs_tcp_ses_lock);
1618 return;
1619 }
1620 if (ses->status == CifsGood)
1621 ses->status = CifsExiting;
1622 spin_unlock(&cifs_tcp_ses_lock);
1623
1624 cifs_free_ipc(ses);
1625
1626 if (ses->status == CifsExiting && server->ops->logoff) {
1627 xid = get_xid();
1628 rc = server->ops->logoff(xid, ses);
1629 if (rc)
1630 cifs_server_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
1631 __func__, rc);
1632 _free_xid(xid);
1633 }
1634
1635 spin_lock(&cifs_tcp_ses_lock);
1636 list_del_init(&ses->smb_ses_list);
1637 spin_unlock(&cifs_tcp_ses_lock);
1638
1639
1640 if (ses->chan_count > 1) {
1641 int i;
1642
1643 for (i = 1; i < ses->chan_count; i++)
1644 cifs_put_tcp_session(ses->chans[i].server, 0);
1645 }
1646
1647 sesInfoFree(ses);
1648 cifs_put_tcp_session(server, 0);
1649}
1650
1651#ifdef CONFIG_KEYS
1652
1653
1654#define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
1655
1656
1657static int
1658cifs_set_cifscreds(struct smb3_fs_context *ctx, struct cifs_ses *ses)
1659{
1660 int rc = 0;
1661 int is_domain = 0;
1662 const char *delim, *payload;
1663 char *desc;
1664 ssize_t len;
1665 struct key *key;
1666 struct TCP_Server_Info *server = ses->server;
1667 struct sockaddr_in *sa;
1668 struct sockaddr_in6 *sa6;
1669 const struct user_key_payload *upayload;
1670
1671 desc = kmalloc(CIFSCREDS_DESC_SIZE, GFP_KERNEL);
1672 if (!desc)
1673 return -ENOMEM;
1674
1675
1676 switch (server->dstaddr.ss_family) {
1677 case AF_INET:
1678 sa = (struct sockaddr_in *)&server->dstaddr;
1679 sprintf(desc, "cifs:a:%pI4", &sa->sin_addr.s_addr);
1680 break;
1681 case AF_INET6:
1682 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
1683 sprintf(desc, "cifs:a:%pI6c", &sa6->sin6_addr.s6_addr);
1684 break;
1685 default:
1686 cifs_dbg(FYI, "Bad ss_family (%hu)\n",
1687 server->dstaddr.ss_family);
1688 rc = -EINVAL;
1689 goto out_err;
1690 }
1691
1692 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
1693 key = request_key(&key_type_logon, desc, "");
1694 if (IS_ERR(key)) {
1695 if (!ses->domainName) {
1696 cifs_dbg(FYI, "domainName is NULL\n");
1697 rc = PTR_ERR(key);
1698 goto out_err;
1699 }
1700
1701
1702 sprintf(desc, "cifs:d:%s", ses->domainName);
1703 cifs_dbg(FYI, "%s: desc=%s\n", __func__, desc);
1704 key = request_key(&key_type_logon, desc, "");
1705 if (IS_ERR(key)) {
1706 rc = PTR_ERR(key);
1707 goto out_err;
1708 }
1709 is_domain = 1;
1710 }
1711
1712 down_read(&key->sem);
1713 upayload = user_key_payload_locked(key);
1714 if (IS_ERR_OR_NULL(upayload)) {
1715 rc = upayload ? PTR_ERR(upayload) : -EINVAL;
1716 goto out_key_put;
1717 }
1718
1719
1720 payload = upayload->data;
1721 delim = strnchr(payload, upayload->datalen, ':');
1722 cifs_dbg(FYI, "payload=%s\n", payload);
1723 if (!delim) {
1724 cifs_dbg(FYI, "Unable to find ':' in payload (datalen=%d)\n",
1725 upayload->datalen);
1726 rc = -EINVAL;
1727 goto out_key_put;
1728 }
1729
1730 len = delim - payload;
1731 if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
1732 cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
1733 len);
1734 rc = -EINVAL;
1735 goto out_key_put;
1736 }
1737
1738 ctx->username = kstrndup(payload, len, GFP_KERNEL);
1739 if (!ctx->username) {
1740 cifs_dbg(FYI, "Unable to allocate %zd bytes for username\n",
1741 len);
1742 rc = -ENOMEM;
1743 goto out_key_put;
1744 }
1745 cifs_dbg(FYI, "%s: username=%s\n", __func__, ctx->username);
1746
1747 len = key->datalen - (len + 1);
1748 if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
1749 cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
1750 rc = -EINVAL;
1751 kfree(ctx->username);
1752 ctx->username = NULL;
1753 goto out_key_put;
1754 }
1755
1756 ++delim;
1757 ctx->password = kstrndup(delim, len, GFP_KERNEL);
1758 if (!ctx->password) {
1759 cifs_dbg(FYI, "Unable to allocate %zd bytes for password\n",
1760 len);
1761 rc = -ENOMEM;
1762 kfree(ctx->username);
1763 ctx->username = NULL;
1764 goto out_key_put;
1765 }
1766
1767
1768
1769
1770
1771 if (is_domain && ses->domainName) {
1772 ctx->domainname = kstrdup(ses->domainName, GFP_KERNEL);
1773 if (!ctx->domainname) {
1774 cifs_dbg(FYI, "Unable to allocate %zd bytes for domain\n",
1775 len);
1776 rc = -ENOMEM;
1777 kfree(ctx->username);
1778 ctx->username = NULL;
1779 kfree_sensitive(ctx->password);
1780 ctx->password = NULL;
1781 goto out_key_put;
1782 }
1783 }
1784
1785out_key_put:
1786 up_read(&key->sem);
1787 key_put(key);
1788out_err:
1789 kfree(desc);
1790 cifs_dbg(FYI, "%s: returning %d\n", __func__, rc);
1791 return rc;
1792}
1793#else
1794static inline int
1795cifs_set_cifscreds(struct smb3_fs_context *ctx __attribute__((unused)),
1796 struct cifs_ses *ses __attribute__((unused)))
1797{
1798 return -ENOSYS;
1799}
1800#endif
1801
1802
1803
1804
1805
1806
1807
1808
1809struct cifs_ses *
1810cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1811{
1812 int rc = -ENOMEM;
1813 unsigned int xid;
1814 struct cifs_ses *ses;
1815 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
1816 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
1817
1818 xid = get_xid();
1819
1820 ses = cifs_find_smb_ses(server, ctx);
1821 if (ses) {
1822 cifs_dbg(FYI, "Existing smb sess found (status=%d)\n",
1823 ses->status);
1824
1825 mutex_lock(&ses->session_mutex);
1826 rc = cifs_negotiate_protocol(xid, ses);
1827 if (rc) {
1828 mutex_unlock(&ses->session_mutex);
1829
1830 cifs_put_smb_ses(ses);
1831 free_xid(xid);
1832 return ERR_PTR(rc);
1833 }
1834 if (ses->need_reconnect) {
1835 cifs_dbg(FYI, "Session needs reconnect\n");
1836 rc = cifs_setup_session(xid, ses,
1837 ctx->local_nls);
1838 if (rc) {
1839 mutex_unlock(&ses->session_mutex);
1840
1841 cifs_put_smb_ses(ses);
1842 free_xid(xid);
1843 return ERR_PTR(rc);
1844 }
1845 }
1846 mutex_unlock(&ses->session_mutex);
1847
1848
1849 cifs_put_tcp_session(server, 0);
1850 free_xid(xid);
1851 return ses;
1852 }
1853
1854 cifs_dbg(FYI, "Existing smb sess not found\n");
1855 ses = sesInfoAlloc();
1856 if (ses == NULL)
1857 goto get_ses_fail;
1858
1859
1860 ses->server = server;
1861 if (server->dstaddr.ss_family == AF_INET6)
1862 sprintf(ses->ip_addr, "%pI6", &addr6->sin6_addr);
1863 else
1864 sprintf(ses->ip_addr, "%pI4", &addr->sin_addr);
1865
1866 if (ctx->username) {
1867 ses->user_name = kstrdup(ctx->username, GFP_KERNEL);
1868 if (!ses->user_name)
1869 goto get_ses_fail;
1870 }
1871
1872
1873 if (ctx->password) {
1874 ses->password = kstrdup(ctx->password, GFP_KERNEL);
1875 if (!ses->password)
1876 goto get_ses_fail;
1877 }
1878 if (ctx->domainname) {
1879 ses->domainName = kstrdup(ctx->domainname, GFP_KERNEL);
1880 if (!ses->domainName)
1881 goto get_ses_fail;
1882 }
1883 if (ctx->domainauto)
1884 ses->domainAuto = ctx->domainauto;
1885 ses->cred_uid = ctx->cred_uid;
1886 ses->linux_uid = ctx->linux_uid;
1887
1888 ses->sectype = ctx->sectype;
1889 ses->sign = ctx->sign;
1890 mutex_lock(&ses->session_mutex);
1891
1892
1893 ses->chans[0].server = server;
1894 ses->chan_count = 1;
1895 ses->chan_max = ctx->multichannel ? ctx->max_channels:1;
1896
1897 rc = cifs_negotiate_protocol(xid, ses);
1898 if (!rc)
1899 rc = cifs_setup_session(xid, ses, ctx->local_nls);
1900
1901
1902 memcpy(ses->chans[0].signkey, ses->smb3signingkey,
1903 sizeof(ses->smb3signingkey));
1904
1905 mutex_unlock(&ses->session_mutex);
1906 if (rc)
1907 goto get_ses_fail;
1908
1909
1910 spin_lock(&cifs_tcp_ses_lock);
1911 list_add(&ses->smb_ses_list, &server->smb_ses_list);
1912 spin_unlock(&cifs_tcp_ses_lock);
1913
1914 free_xid(xid);
1915
1916 cifs_setup_ipc(ses, ctx);
1917
1918 return ses;
1919
1920get_ses_fail:
1921 sesInfoFree(ses);
1922 free_xid(xid);
1923 return ERR_PTR(rc);
1924}
1925
1926static int match_tcon(struct cifs_tcon *tcon, struct smb3_fs_context *ctx)
1927{
1928 if (tcon->tidStatus == CifsExiting)
1929 return 0;
1930 if (strncmp(tcon->treeName, ctx->UNC, MAX_TREE_SIZE))
1931 return 0;
1932 if (tcon->seal != ctx->seal)
1933 return 0;
1934 if (tcon->snapshot_time != ctx->snapshot_time)
1935 return 0;
1936 if (tcon->handle_timeout != ctx->handle_timeout)
1937 return 0;
1938 if (tcon->no_lease != ctx->no_lease)
1939 return 0;
1940 if (tcon->nodelete != ctx->nodelete)
1941 return 0;
1942 return 1;
1943}
1944
1945static struct cifs_tcon *
1946cifs_find_tcon(struct cifs_ses *ses, struct smb3_fs_context *ctx)
1947{
1948 struct list_head *tmp;
1949 struct cifs_tcon *tcon;
1950
1951 spin_lock(&cifs_tcp_ses_lock);
1952 list_for_each(tmp, &ses->tcon_list) {
1953 tcon = list_entry(tmp, struct cifs_tcon, tcon_list);
1954#ifdef CONFIG_CIFS_DFS_UPCALL
1955 if (tcon->dfs_path)
1956 continue;
1957#endif
1958 if (!match_tcon(tcon, ctx))
1959 continue;
1960 ++tcon->tc_count;
1961 spin_unlock(&cifs_tcp_ses_lock);
1962 return tcon;
1963 }
1964 spin_unlock(&cifs_tcp_ses_lock);
1965 return NULL;
1966}
1967
1968void
1969cifs_put_tcon(struct cifs_tcon *tcon)
1970{
1971 unsigned int xid;
1972 struct cifs_ses *ses;
1973
1974
1975
1976
1977
1978 if (tcon == NULL || tcon->ipc)
1979 return;
1980
1981 ses = tcon->ses;
1982 cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
1983 spin_lock(&cifs_tcp_ses_lock);
1984 if (--tcon->tc_count > 0) {
1985 spin_unlock(&cifs_tcp_ses_lock);
1986 return;
1987 }
1988
1989 if (tcon->use_witness) {
1990 int rc;
1991
1992 rc = cifs_swn_unregister(tcon);
1993 if (rc < 0) {
1994 cifs_dbg(VFS, "%s: Failed to unregister for witness notifications: %d\n",
1995 __func__, rc);
1996 }
1997 }
1998
1999 list_del_init(&tcon->tcon_list);
2000 spin_unlock(&cifs_tcp_ses_lock);
2001
2002 xid = get_xid();
2003 if (ses->server->ops->tree_disconnect)
2004 ses->server->ops->tree_disconnect(xid, tcon);
2005 _free_xid(xid);
2006
2007 cifs_fscache_release_super_cookie(tcon);
2008 tconInfoFree(tcon);
2009 cifs_put_smb_ses(ses);
2010}
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032static struct cifs_tcon *
2033cifs_get_tcon(struct cifs_ses *ses, struct smb3_fs_context *ctx)
2034{
2035 int rc, xid;
2036 struct cifs_tcon *tcon;
2037
2038 tcon = cifs_find_tcon(ses, ctx);
2039 if (tcon) {
2040
2041
2042
2043
2044 cifs_dbg(FYI, "Found match on UNC path\n");
2045 cifs_put_smb_ses(ses);
2046 return tcon;
2047 }
2048
2049 if (!ses->server->ops->tree_connect) {
2050 rc = -ENOSYS;
2051 goto out_fail;
2052 }
2053
2054 tcon = tconInfoAlloc();
2055 if (tcon == NULL) {
2056 rc = -ENOMEM;
2057 goto out_fail;
2058 }
2059
2060 if (ctx->snapshot_time) {
2061 if (ses->server->vals->protocol_id == 0) {
2062 cifs_dbg(VFS,
2063 "Use SMB2 or later for snapshot mount option\n");
2064 rc = -EOPNOTSUPP;
2065 goto out_fail;
2066 } else
2067 tcon->snapshot_time = ctx->snapshot_time;
2068 }
2069
2070 if (ctx->handle_timeout) {
2071 if (ses->server->vals->protocol_id == 0) {
2072 cifs_dbg(VFS,
2073 "Use SMB2.1 or later for handle timeout option\n");
2074 rc = -EOPNOTSUPP;
2075 goto out_fail;
2076 } else
2077 tcon->handle_timeout = ctx->handle_timeout;
2078 }
2079
2080 tcon->ses = ses;
2081 if (ctx->password) {
2082 tcon->password = kstrdup(ctx->password, GFP_KERNEL);
2083 if (!tcon->password) {
2084 rc = -ENOMEM;
2085 goto out_fail;
2086 }
2087 }
2088
2089 if (ctx->seal) {
2090 if (ses->server->vals->protocol_id == 0) {
2091 cifs_dbg(VFS,
2092 "SMB3 or later required for encryption\n");
2093 rc = -EOPNOTSUPP;
2094 goto out_fail;
2095 } else if (tcon->ses->server->capabilities &
2096 SMB2_GLOBAL_CAP_ENCRYPTION)
2097 tcon->seal = true;
2098 else {
2099 cifs_dbg(VFS, "Encryption is not supported on share\n");
2100 rc = -EOPNOTSUPP;
2101 goto out_fail;
2102 }
2103 }
2104
2105 if (ctx->linux_ext) {
2106 if (ses->server->posix_ext_supported) {
2107 tcon->posix_extensions = true;
2108 pr_warn_once("SMB3.11 POSIX Extensions are experimental\n");
2109 } else {
2110 cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions\n");
2111 rc = -EOPNOTSUPP;
2112 goto out_fail;
2113 }
2114 }
2115
2116
2117
2118
2119
2120 xid = get_xid();
2121 rc = ses->server->ops->tree_connect(xid, ses, ctx->UNC, tcon,
2122 ctx->local_nls);
2123 free_xid(xid);
2124 cifs_dbg(FYI, "Tcon rc = %d\n", rc);
2125 if (rc)
2126 goto out_fail;
2127
2128 tcon->use_persistent = false;
2129
2130 if (ctx->persistent) {
2131 if (ses->server->vals->protocol_id == 0) {
2132 cifs_dbg(VFS,
2133 "SMB3 or later required for persistent handles\n");
2134 rc = -EOPNOTSUPP;
2135 goto out_fail;
2136 } else if (ses->server->capabilities &
2137 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
2138 tcon->use_persistent = true;
2139 else {
2140 cifs_dbg(VFS,
2141 "Persistent handles not supported on share\n");
2142 rc = -EOPNOTSUPP;
2143 goto out_fail;
2144 }
2145 } else if ((tcon->capabilities & SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY)
2146 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
2147 && (ctx->nopersistent == false)) {
2148 cifs_dbg(FYI, "enabling persistent handles\n");
2149 tcon->use_persistent = true;
2150 } else if (ctx->resilient) {
2151 if (ses->server->vals->protocol_id == 0) {
2152 cifs_dbg(VFS,
2153 "SMB2.1 or later required for resilient handles\n");
2154 rc = -EOPNOTSUPP;
2155 goto out_fail;
2156 }
2157 tcon->use_resilient = true;
2158 }
2159
2160 tcon->use_witness = false;
2161 if (IS_ENABLED(CONFIG_CIFS_SWN_UPCALL) && ctx->witness) {
2162 if (ses->server->vals->protocol_id >= SMB30_PROT_ID) {
2163 if (tcon->capabilities & SMB2_SHARE_CAP_CLUSTER) {
2164
2165
2166
2167
2168 tcon->use_witness = true;
2169
2170 rc = cifs_swn_register(tcon);
2171 if (rc < 0) {
2172 cifs_dbg(VFS, "Failed to register for witness notifications: %d\n", rc);
2173 goto out_fail;
2174 }
2175 } else {
2176
2177 cifs_dbg(VFS, "witness requested on mount but no CLUSTER capability on share\n");
2178 rc = -EOPNOTSUPP;
2179 goto out_fail;
2180 }
2181 } else {
2182 cifs_dbg(VFS, "SMB3 or later required for witness option\n");
2183 rc = -EOPNOTSUPP;
2184 goto out_fail;
2185 }
2186 }
2187
2188
2189 if (tcon->share_flags & SMB2_SHAREFLAG_NO_CACHING) {
2190 if (ctx->cache_ro)
2191 cifs_dbg(VFS, "cache=ro requested on mount but NO_CACHING flag set on share\n");
2192 else if (ctx->cache_rw)
2193 cifs_dbg(VFS, "cache=singleclient requested on mount but NO_CACHING flag set on share\n");
2194 }
2195
2196 if (ctx->no_lease) {
2197 if (ses->server->vals->protocol_id == 0) {
2198 cifs_dbg(VFS,
2199 "SMB2 or later required for nolease option\n");
2200 rc = -EOPNOTSUPP;
2201 goto out_fail;
2202 } else
2203 tcon->no_lease = ctx->no_lease;
2204 }
2205
2206
2207
2208
2209
2210
2211 tcon->retry = ctx->retry;
2212 tcon->nocase = ctx->nocase;
2213 if (ses->server->capabilities & SMB2_GLOBAL_CAP_DIRECTORY_LEASING)
2214 tcon->nohandlecache = ctx->nohandlecache;
2215 else
2216 tcon->nohandlecache = true;
2217 tcon->nodelete = ctx->nodelete;
2218 tcon->local_lease = ctx->local_lease;
2219 INIT_LIST_HEAD(&tcon->pending_opens);
2220
2221 spin_lock(&cifs_tcp_ses_lock);
2222 list_add(&tcon->tcon_list, &ses->tcon_list);
2223 spin_unlock(&cifs_tcp_ses_lock);
2224
2225 cifs_fscache_get_super_cookie(tcon);
2226
2227 return tcon;
2228
2229out_fail:
2230 tconInfoFree(tcon);
2231 return ERR_PTR(rc);
2232}
2233
2234void
2235cifs_put_tlink(struct tcon_link *tlink)
2236{
2237 if (!tlink || IS_ERR(tlink))
2238 return;
2239
2240 if (!atomic_dec_and_test(&tlink->tl_count) ||
2241 test_bit(TCON_LINK_IN_TREE, &tlink->tl_flags)) {
2242 tlink->tl_time = jiffies;
2243 return;
2244 }
2245
2246 if (!IS_ERR(tlink_tcon(tlink)))
2247 cifs_put_tcon(tlink_tcon(tlink));
2248 kfree(tlink);
2249 return;
2250}
2251
2252static int
2253compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2254{
2255 struct cifs_sb_info *old = CIFS_SB(sb);
2256 struct cifs_sb_info *new = mnt_data->cifs_sb;
2257 unsigned int oldflags = old->mnt_cifs_flags & CIFS_MOUNT_MASK;
2258 unsigned int newflags = new->mnt_cifs_flags & CIFS_MOUNT_MASK;
2259
2260 if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK))
2261 return 0;
2262
2263 if (old->mnt_cifs_serverino_autodisabled)
2264 newflags &= ~CIFS_MOUNT_SERVER_INUM;
2265
2266 if (oldflags != newflags)
2267 return 0;
2268
2269
2270
2271
2272
2273 if (new->ctx->wsize && new->ctx->wsize < old->ctx->wsize)
2274 return 0;
2275
2276 if (new->ctx->rsize && new->ctx->rsize < old->ctx->rsize)
2277 return 0;
2278
2279 if (!uid_eq(old->ctx->linux_uid, new->ctx->linux_uid) ||
2280 !gid_eq(old->ctx->linux_gid, new->ctx->linux_gid))
2281 return 0;
2282
2283 if (old->ctx->file_mode != new->ctx->file_mode ||
2284 old->ctx->dir_mode != new->ctx->dir_mode)
2285 return 0;
2286
2287 if (strcmp(old->local_nls->charset, new->local_nls->charset))
2288 return 0;
2289
2290 if (old->ctx->acregmax != new->ctx->acregmax)
2291 return 0;
2292 if (old->ctx->acdirmax != new->ctx->acdirmax)
2293 return 0;
2294
2295 return 1;
2296}
2297
2298static int
2299match_prepath(struct super_block *sb, struct cifs_mnt_data *mnt_data)
2300{
2301 struct cifs_sb_info *old = CIFS_SB(sb);
2302 struct cifs_sb_info *new = mnt_data->cifs_sb;
2303 bool old_set = (old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
2304 old->prepath;
2305 bool new_set = (new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) &&
2306 new->prepath;
2307
2308 if (old_set && new_set && !strcmp(new->prepath, old->prepath))
2309 return 1;
2310 else if (!old_set && !new_set)
2311 return 1;
2312
2313 return 0;
2314}
2315
2316int
2317cifs_match_super(struct super_block *sb, void *data)
2318{
2319 struct cifs_mnt_data *mnt_data = (struct cifs_mnt_data *)data;
2320 struct smb3_fs_context *ctx;
2321 struct cifs_sb_info *cifs_sb;
2322 struct TCP_Server_Info *tcp_srv;
2323 struct cifs_ses *ses;
2324 struct cifs_tcon *tcon;
2325 struct tcon_link *tlink;
2326 int rc = 0;
2327
2328 spin_lock(&cifs_tcp_ses_lock);
2329 cifs_sb = CIFS_SB(sb);
2330 tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
2331 if (IS_ERR(tlink)) {
2332 spin_unlock(&cifs_tcp_ses_lock);
2333 return rc;
2334 }
2335 tcon = tlink_tcon(tlink);
2336 ses = tcon->ses;
2337 tcp_srv = ses->server;
2338
2339 ctx = mnt_data->ctx;
2340
2341 if (!match_server(tcp_srv, ctx) ||
2342 !match_session(ses, ctx) ||
2343 !match_tcon(tcon, ctx) ||
2344 !match_prepath(sb, mnt_data)) {
2345 rc = 0;
2346 goto out;
2347 }
2348
2349 rc = compare_mount_options(sb, mnt_data);
2350out:
2351 spin_unlock(&cifs_tcp_ses_lock);
2352 cifs_put_tlink(tlink);
2353 return rc;
2354}
2355
2356#ifdef CONFIG_DEBUG_LOCK_ALLOC
2357static struct lock_class_key cifs_key[2];
2358static struct lock_class_key cifs_slock_key[2];
2359
2360static inline void
2361cifs_reclassify_socket4(struct socket *sock)
2362{
2363 struct sock *sk = sock->sk;
2364 BUG_ON(!sock_allow_reclassification(sk));
2365 sock_lock_init_class_and_name(sk, "slock-AF_INET-CIFS",
2366 &cifs_slock_key[0], "sk_lock-AF_INET-CIFS", &cifs_key[0]);
2367}
2368
2369static inline void
2370cifs_reclassify_socket6(struct socket *sock)
2371{
2372 struct sock *sk = sock->sk;
2373 BUG_ON(!sock_allow_reclassification(sk));
2374 sock_lock_init_class_and_name(sk, "slock-AF_INET6-CIFS",
2375 &cifs_slock_key[1], "sk_lock-AF_INET6-CIFS", &cifs_key[1]);
2376}
2377#else
2378static inline void
2379cifs_reclassify_socket4(struct socket *sock)
2380{
2381}
2382
2383static inline void
2384cifs_reclassify_socket6(struct socket *sock)
2385{
2386}
2387#endif
2388
2389
2390static void rfc1002mangle(char *target, char *source, unsigned int length)
2391{
2392 unsigned int i, j;
2393
2394 for (i = 0, j = 0; i < (length); i++) {
2395
2396 target[j] = 'A' + (0x0F & (source[i] >> 4));
2397 target[j+1] = 'A' + (0x0F & source[i]);
2398 j += 2;
2399 }
2400
2401}
2402
2403static int
2404bind_socket(struct TCP_Server_Info *server)
2405{
2406 int rc = 0;
2407 if (server->srcaddr.ss_family != AF_UNSPEC) {
2408
2409 struct socket *socket = server->ssocket;
2410 rc = socket->ops->bind(socket,
2411 (struct sockaddr *) &server->srcaddr,
2412 sizeof(server->srcaddr));
2413 if (rc < 0) {
2414 struct sockaddr_in *saddr4;
2415 struct sockaddr_in6 *saddr6;
2416 saddr4 = (struct sockaddr_in *)&server->srcaddr;
2417 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
2418 if (saddr6->sin6_family == AF_INET6)
2419 cifs_server_dbg(VFS, "Failed to bind to: %pI6c, error: %d\n",
2420 &saddr6->sin6_addr, rc);
2421 else
2422 cifs_server_dbg(VFS, "Failed to bind to: %pI4, error: %d\n",
2423 &saddr4->sin_addr.s_addr, rc);
2424 }
2425 }
2426 return rc;
2427}
2428
2429static int
2430ip_rfc1001_connect(struct TCP_Server_Info *server)
2431{
2432 int rc = 0;
2433
2434
2435
2436
2437
2438 struct rfc1002_session_packet *ses_init_buf;
2439 struct smb_hdr *smb_buf;
2440 ses_init_buf = kzalloc(sizeof(struct rfc1002_session_packet),
2441 GFP_KERNEL);
2442 if (ses_init_buf) {
2443 ses_init_buf->trailer.session_req.called_len = 32;
2444
2445 if (server->server_RFC1001_name[0] != 0)
2446 rfc1002mangle(ses_init_buf->trailer.
2447 session_req.called_name,
2448 server->server_RFC1001_name,
2449 RFC1001_NAME_LEN_WITH_NULL);
2450 else
2451 rfc1002mangle(ses_init_buf->trailer.
2452 session_req.called_name,
2453 DEFAULT_CIFS_CALLED_NAME,
2454 RFC1001_NAME_LEN_WITH_NULL);
2455
2456 ses_init_buf->trailer.session_req.calling_len = 32;
2457
2458
2459
2460
2461
2462 if (server->workstation_RFC1001_name[0] != 0)
2463 rfc1002mangle(ses_init_buf->trailer.
2464 session_req.calling_name,
2465 server->workstation_RFC1001_name,
2466 RFC1001_NAME_LEN_WITH_NULL);
2467 else
2468 rfc1002mangle(ses_init_buf->trailer.
2469 session_req.calling_name,
2470 "LINUX_CIFS_CLNT",
2471 RFC1001_NAME_LEN_WITH_NULL);
2472
2473 ses_init_buf->trailer.session_req.scope1 = 0;
2474 ses_init_buf->trailer.session_req.scope2 = 0;
2475 smb_buf = (struct smb_hdr *)ses_init_buf;
2476
2477
2478 smb_buf->smb_buf_length = cpu_to_be32(0x81000044);
2479 rc = smb_send(server, smb_buf, 0x44);
2480 kfree(ses_init_buf);
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491 usleep_range(1000, 2000);
2492 }
2493
2494
2495
2496
2497
2498 return rc;
2499}
2500
2501static int
2502generic_ip_connect(struct TCP_Server_Info *server)
2503{
2504 int rc = 0;
2505 __be16 sport;
2506 int slen, sfamily;
2507 struct socket *socket = server->ssocket;
2508 struct sockaddr *saddr;
2509
2510 saddr = (struct sockaddr *) &server->dstaddr;
2511
2512 if (server->dstaddr.ss_family == AF_INET6) {
2513 struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)&server->dstaddr;
2514
2515 sport = ipv6->sin6_port;
2516 slen = sizeof(struct sockaddr_in6);
2517 sfamily = AF_INET6;
2518 cifs_dbg(FYI, "%s: connecting to [%pI6]:%d\n", __func__, &ipv6->sin6_addr,
2519 ntohs(sport));
2520 } else {
2521 struct sockaddr_in *ipv4 = (struct sockaddr_in *)&server->dstaddr;
2522
2523 sport = ipv4->sin_port;
2524 slen = sizeof(struct sockaddr_in);
2525 sfamily = AF_INET;
2526 cifs_dbg(FYI, "%s: connecting to %pI4:%d\n", __func__, &ipv4->sin_addr,
2527 ntohs(sport));
2528 }
2529
2530 if (socket == NULL) {
2531 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
2532 IPPROTO_TCP, &socket, 1);
2533 if (rc < 0) {
2534 cifs_server_dbg(VFS, "Error %d creating socket\n", rc);
2535 server->ssocket = NULL;
2536 return rc;
2537 }
2538
2539
2540 cifs_dbg(FYI, "Socket created\n");
2541 server->ssocket = socket;
2542 socket->sk->sk_allocation = GFP_NOFS;
2543 if (sfamily == AF_INET6)
2544 cifs_reclassify_socket6(socket);
2545 else
2546 cifs_reclassify_socket4(socket);
2547 }
2548
2549 rc = bind_socket(server);
2550 if (rc < 0)
2551 return rc;
2552
2553
2554
2555
2556
2557
2558 socket->sk->sk_rcvtimeo = 7 * HZ;
2559 socket->sk->sk_sndtimeo = 5 * HZ;
2560
2561
2562 if (server->noautotune) {
2563 if (socket->sk->sk_sndbuf < (200 * 1024))
2564 socket->sk->sk_sndbuf = 200 * 1024;
2565 if (socket->sk->sk_rcvbuf < (140 * 1024))
2566 socket->sk->sk_rcvbuf = 140 * 1024;
2567 }
2568
2569 if (server->tcp_nodelay)
2570 tcp_sock_set_nodelay(socket->sk);
2571
2572 cifs_dbg(FYI, "sndbuf %d rcvbuf %d rcvtimeo 0x%lx\n",
2573 socket->sk->sk_sndbuf,
2574 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
2575
2576 rc = socket->ops->connect(socket, saddr, slen,
2577 server->noblockcnt ? O_NONBLOCK : 0);
2578
2579
2580
2581
2582
2583 if (server->noblockcnt && rc == -EINPROGRESS)
2584 rc = 0;
2585 if (rc < 0) {
2586 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
2587 sock_release(socket);
2588 server->ssocket = NULL;
2589 return rc;
2590 }
2591
2592 if (sport == htons(RFC1001_PORT))
2593 rc = ip_rfc1001_connect(server);
2594
2595 return rc;
2596}
2597
2598static int
2599ip_connect(struct TCP_Server_Info *server)
2600{
2601 __be16 *sport;
2602 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2603 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2604
2605 if (server->dstaddr.ss_family == AF_INET6)
2606 sport = &addr6->sin6_port;
2607 else
2608 sport = &addr->sin_port;
2609
2610 if (*sport == 0) {
2611 int rc;
2612
2613
2614 *sport = htons(CIFS_PORT);
2615
2616 rc = generic_ip_connect(server);
2617 if (rc >= 0)
2618 return rc;
2619
2620
2621 *sport = htons(RFC1001_PORT);
2622 }
2623
2624 return generic_ip_connect(server);
2625}
2626
2627void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
2628 struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
2629{
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641 __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
2642
2643 if (ctx && ctx->no_linux_ext) {
2644 tcon->fsUnixInfo.Capability = 0;
2645 tcon->unix_ext = 0;
2646 cifs_dbg(FYI, "Linux protocol extensions disabled\n");
2647 return;
2648 } else if (ctx)
2649 tcon->unix_ext = 1;
2650
2651 if (!tcon->unix_ext) {
2652 cifs_dbg(FYI, "Unix extensions disabled so not set on reconnect\n");
2653 return;
2654 }
2655
2656 if (!CIFSSMBQFSUnixInfo(xid, tcon)) {
2657 __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
2658 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
2659
2660
2661
2662
2663 if (ctx == NULL) {
2664
2665
2666
2667
2668 if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
2669 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
2670 if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
2671 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
2672 cifs_dbg(VFS, "POSIXPATH support change\n");
2673 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
2674 } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) {
2675 cifs_dbg(VFS, "possible reconnect error\n");
2676 cifs_dbg(VFS, "server disabled POSIX path support\n");
2677 }
2678 }
2679
2680 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
2681 cifs_dbg(VFS, "per-share encryption not supported yet\n");
2682
2683 cap &= CIFS_UNIX_CAP_MASK;
2684 if (ctx && ctx->no_psx_acl)
2685 cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
2686 else if (CIFS_UNIX_POSIX_ACL_CAP & cap) {
2687 cifs_dbg(FYI, "negotiated posix acl support\n");
2688 if (cifs_sb)
2689 cifs_sb->mnt_cifs_flags |=
2690 CIFS_MOUNT_POSIXACL;
2691 }
2692
2693 if (ctx && ctx->posix_paths == 0)
2694 cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
2695 else if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
2696 cifs_dbg(FYI, "negotiate posix pathnames\n");
2697 if (cifs_sb)
2698 cifs_sb->mnt_cifs_flags |=
2699 CIFS_MOUNT_POSIX_PATHS;
2700 }
2701
2702 cifs_dbg(FYI, "Negotiate caps 0x%x\n", (int)cap);
2703#ifdef CONFIG_CIFS_DEBUG2
2704 if (cap & CIFS_UNIX_FCNTL_CAP)
2705 cifs_dbg(FYI, "FCNTL cap\n");
2706 if (cap & CIFS_UNIX_EXTATTR_CAP)
2707 cifs_dbg(FYI, "EXTATTR cap\n");
2708 if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
2709 cifs_dbg(FYI, "POSIX path cap\n");
2710 if (cap & CIFS_UNIX_XATTR_CAP)
2711 cifs_dbg(FYI, "XATTR cap\n");
2712 if (cap & CIFS_UNIX_POSIX_ACL_CAP)
2713 cifs_dbg(FYI, "POSIX ACL cap\n");
2714 if (cap & CIFS_UNIX_LARGE_READ_CAP)
2715 cifs_dbg(FYI, "very large read cap\n");
2716 if (cap & CIFS_UNIX_LARGE_WRITE_CAP)
2717 cifs_dbg(FYI, "very large write cap\n");
2718 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP)
2719 cifs_dbg(FYI, "transport encryption cap\n");
2720 if (cap & CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP)
2721 cifs_dbg(FYI, "mandatory transport encryption cap\n");
2722#endif
2723 if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
2724 if (ctx == NULL)
2725 cifs_dbg(FYI, "resetting capabilities failed\n");
2726 else
2727 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");
2728
2729 }
2730 }
2731}
2732
2733int cifs_setup_cifs_sb(struct cifs_sb_info *cifs_sb)
2734{
2735 struct smb3_fs_context *ctx = cifs_sb->ctx;
2736
2737 INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
2738
2739 spin_lock_init(&cifs_sb->tlink_tree_lock);
2740 cifs_sb->tlink_tree = RB_ROOT;
2741
2742 cifs_dbg(FYI, "file mode: %04ho dir mode: %04ho\n",
2743 ctx->file_mode, ctx->dir_mode);
2744
2745
2746 if (ctx->iocharset == NULL) {
2747
2748 cifs_sb->local_nls = load_nls_default();
2749 } else {
2750 cifs_sb->local_nls = load_nls(ctx->iocharset);
2751 if (cifs_sb->local_nls == NULL) {
2752 cifs_dbg(VFS, "CIFS mount error: iocharset %s not found\n",
2753 ctx->iocharset);
2754 return -ELIBACC;
2755 }
2756 }
2757 ctx->local_nls = cifs_sb->local_nls;
2758
2759 smb3_update_mnt_flags(cifs_sb);
2760
2761 if (ctx->direct_io)
2762 cifs_dbg(FYI, "mounting share using direct i/o\n");
2763 if (ctx->cache_ro) {
2764 cifs_dbg(VFS, "mounting share with read only caching. Ensure that the share will not be modified while in use.\n");
2765 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RO_CACHE;
2766 } else if (ctx->cache_rw) {
2767 cifs_dbg(VFS, "mounting share in single client RW caching mode. Ensure that no other systems will be accessing the share.\n");
2768 cifs_sb->mnt_cifs_flags |= (CIFS_MOUNT_RO_CACHE |
2769 CIFS_MOUNT_RW_CACHE);
2770 }
2771
2772 if ((ctx->cifs_acl) && (ctx->dynperm))
2773 cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
2774
2775 if (ctx->prepath) {
2776 cifs_sb->prepath = kstrdup(ctx->prepath, GFP_KERNEL);
2777 if (cifs_sb->prepath == NULL)
2778 return -ENOMEM;
2779 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
2780 }
2781
2782 return 0;
2783}
2784
2785
2786static inline void mount_put_conns(struct cifs_sb_info *cifs_sb,
2787 unsigned int xid,
2788 struct TCP_Server_Info *server,
2789 struct cifs_ses *ses, struct cifs_tcon *tcon)
2790{
2791 int rc = 0;
2792
2793 if (tcon)
2794 cifs_put_tcon(tcon);
2795 else if (ses)
2796 cifs_put_smb_ses(ses);
2797 else if (server)
2798 cifs_put_tcp_session(server, 0);
2799 cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_POSIX_PATHS;
2800 free_xid(xid);
2801}
2802
2803
2804static int mount_get_conns(struct smb3_fs_context *ctx, struct cifs_sb_info *cifs_sb,
2805 unsigned int *xid,
2806 struct TCP_Server_Info **nserver,
2807 struct cifs_ses **nses, struct cifs_tcon **ntcon)
2808{
2809 int rc = 0;
2810 struct TCP_Server_Info *server;
2811 struct cifs_ses *ses;
2812 struct cifs_tcon *tcon;
2813
2814 *nserver = NULL;
2815 *nses = NULL;
2816 *ntcon = NULL;
2817
2818 *xid = get_xid();
2819
2820
2821 server = cifs_get_tcp_session(ctx);
2822 if (IS_ERR(server)) {
2823 rc = PTR_ERR(server);
2824 return rc;
2825 }
2826
2827 *nserver = server;
2828
2829
2830 ses = cifs_get_smb_ses(server, ctx);
2831 if (IS_ERR(ses)) {
2832 rc = PTR_ERR(ses);
2833 return rc;
2834 }
2835
2836 *nses = ses;
2837
2838 if ((ctx->persistent == true) && (!(ses->server->capabilities &
2839 SMB2_GLOBAL_CAP_PERSISTENT_HANDLES))) {
2840 cifs_server_dbg(VFS, "persistent handles not supported by server\n");
2841 return -EOPNOTSUPP;
2842 }
2843
2844
2845 tcon = cifs_get_tcon(ses, ctx);
2846 if (IS_ERR(tcon)) {
2847 rc = PTR_ERR(tcon);
2848 return rc;
2849 }
2850
2851 *ntcon = tcon;
2852
2853
2854 if (tcon->posix_extensions)
2855 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_POSIX_PATHS;
2856
2857
2858 if (cap_unix(tcon->ses)) {
2859
2860
2861
2862
2863 reset_cifs_unix_caps(*xid, tcon, cifs_sb, ctx);
2864 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
2865 (le64_to_cpu(tcon->fsUnixInfo.Capability) &
2866 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP))
2867 return -EACCES;
2868 } else
2869 tcon->unix_ext = 0;
2870
2871
2872 if (!tcon->pipe && server->ops->qfs_tcon) {
2873 server->ops->qfs_tcon(*xid, tcon, cifs_sb);
2874 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE) {
2875 if (tcon->fsDevInfo.DeviceCharacteristics &
2876 cpu_to_le32(FILE_READ_ONLY_DEVICE))
2877 cifs_dbg(VFS, "mounted to read only share\n");
2878 else if ((cifs_sb->mnt_cifs_flags &
2879 CIFS_MOUNT_RW_CACHE) == 0)
2880 cifs_dbg(VFS, "read only mount of RW share\n");
2881
2882 }
2883 }
2884
2885
2886
2887
2888
2889
2890 if ((cifs_sb->ctx->wsize == 0) ||
2891 (cifs_sb->ctx->wsize > server->ops->negotiate_wsize(tcon, ctx)))
2892 cifs_sb->ctx->wsize = server->ops->negotiate_wsize(tcon, ctx);
2893 if ((cifs_sb->ctx->rsize == 0) ||
2894 (cifs_sb->ctx->rsize > server->ops->negotiate_rsize(tcon, ctx)))
2895 cifs_sb->ctx->rsize = server->ops->negotiate_rsize(tcon, ctx);
2896
2897 return 0;
2898}
2899
2900static int mount_setup_tlink(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
2901 struct cifs_tcon *tcon)
2902{
2903 struct tcon_link *tlink;
2904
2905
2906 tlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
2907 if (tlink == NULL)
2908 return -ENOMEM;
2909
2910 tlink->tl_uid = ses->linux_uid;
2911 tlink->tl_tcon = tcon;
2912 tlink->tl_time = jiffies;
2913 set_bit(TCON_LINK_MASTER, &tlink->tl_flags);
2914 set_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
2915
2916 cifs_sb->master_tlink = tlink;
2917 spin_lock(&cifs_sb->tlink_tree_lock);
2918 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
2919 spin_unlock(&cifs_sb->tlink_tree_lock);
2920
2921 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
2922 TLINK_IDLE_EXPIRE);
2923 return 0;
2924}
2925
2926#ifdef CONFIG_CIFS_DFS_UPCALL
2927
2928
2929
2930
2931static char *
2932build_unc_path_to_root(const struct smb3_fs_context *ctx,
2933 const struct cifs_sb_info *cifs_sb, bool useppath)
2934{
2935 char *full_path, *pos;
2936 unsigned int pplen = useppath && ctx->prepath ?
2937 strlen(ctx->prepath) + 1 : 0;
2938 unsigned int unc_len = strnlen(ctx->UNC, MAX_TREE_SIZE + 1);
2939
2940 if (unc_len > MAX_TREE_SIZE)
2941 return ERR_PTR(-EINVAL);
2942
2943 full_path = kmalloc(unc_len + pplen + 1, GFP_KERNEL);
2944 if (full_path == NULL)
2945 return ERR_PTR(-ENOMEM);
2946
2947 memcpy(full_path, ctx->UNC, unc_len);
2948 pos = full_path + unc_len;
2949
2950 if (pplen) {
2951 *pos = CIFS_DIR_SEP(cifs_sb);
2952 memcpy(pos + 1, ctx->prepath, pplen);
2953 pos += pplen;
2954 }
2955
2956 *pos = '\0';
2957 convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb));
2958 cifs_dbg(FYI, "%s: full_path=%s\n", __func__, full_path);
2959 return full_path;
2960}
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972static int
2973expand_dfs_referral(const unsigned int xid, struct cifs_ses *ses,
2974 struct smb3_fs_context *ctx, struct cifs_sb_info *cifs_sb,
2975 char *ref_path)
2976{
2977 int rc;
2978 struct dfs_info3_param referral = {0};
2979 char *full_path = NULL, *mdata = NULL;
2980
2981 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
2982 return -EREMOTE;
2983
2984 full_path = build_unc_path_to_root(ctx, cifs_sb, true);
2985 if (IS_ERR(full_path))
2986 return PTR_ERR(full_path);
2987
2988 rc = dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb),
2989 ref_path, &referral, NULL);
2990 if (!rc) {
2991 char *fake_devname = NULL;
2992
2993 mdata = cifs_compose_mount_options(cifs_sb->ctx->mount_options,
2994 full_path + 1, &referral,
2995 &fake_devname);
2996 free_dfs_info_param(&referral);
2997
2998 if (IS_ERR(mdata)) {
2999 rc = PTR_ERR(mdata);
3000 mdata = NULL;
3001 } else {
3002
3003
3004
3005
3006
3007
3008 kfree(ctx->prepath);
3009 ctx->prepath = NULL;
3010 rc = cifs_setup_volume_info(ctx, mdata, fake_devname);
3011 }
3012 kfree(fake_devname);
3013 kfree(cifs_sb->ctx->mount_options);
3014 cifs_sb->ctx->mount_options = mdata;
3015 }
3016 kfree(full_path);
3017 return rc;
3018}
3019
3020static inline int get_next_dfs_tgt(const char *path,
3021 struct dfs_cache_tgt_list *tgt_list,
3022 struct dfs_cache_tgt_iterator **tgt_it)
3023{
3024 if (!*tgt_it)
3025 *tgt_it = dfs_cache_get_tgt_iterator(tgt_list);
3026 else
3027 *tgt_it = dfs_cache_get_next_tgt(tgt_list, *tgt_it);
3028 return !*tgt_it ? -EHOSTDOWN : 0;
3029}
3030
3031static int update_vol_info(const struct dfs_cache_tgt_iterator *tgt_it,
3032 struct smb3_fs_context *fake_ctx, struct smb3_fs_context *ctx)
3033{
3034 const char *tgt = dfs_cache_get_tgt_name(tgt_it);
3035 int len = strlen(tgt) + 2;
3036 char *new_unc;
3037
3038 new_unc = kmalloc(len, GFP_KERNEL);
3039 if (!new_unc)
3040 return -ENOMEM;
3041 scnprintf(new_unc, len, "\\%s", tgt);
3042
3043 kfree(ctx->UNC);
3044 ctx->UNC = new_unc;
3045
3046 if (fake_ctx->prepath) {
3047 kfree(ctx->prepath);
3048 ctx->prepath = fake_ctx->prepath;
3049 fake_ctx->prepath = NULL;
3050 }
3051 memcpy(&ctx->dstaddr, &fake_ctx->dstaddr, sizeof(ctx->dstaddr));
3052
3053 return 0;
3054}
3055
3056static int do_dfs_failover(const char *path, const char *full_path, struct cifs_sb_info *cifs_sb,
3057 struct smb3_fs_context *ctx, struct cifs_ses *root_ses,
3058 unsigned int *xid, struct TCP_Server_Info **server,
3059 struct cifs_ses **ses, struct cifs_tcon **tcon)
3060{
3061 int rc;
3062 struct dfs_cache_tgt_list tgt_list = {0};
3063 struct dfs_cache_tgt_iterator *tgt_it = NULL;
3064 struct smb3_fs_context tmp_ctx = {NULL};
3065
3066 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS)
3067 return -EOPNOTSUPP;
3068
3069 cifs_dbg(FYI, "%s: path=%s full_path=%s\n", __func__, path, full_path);
3070
3071 rc = dfs_cache_noreq_find(path, NULL, &tgt_list);
3072 if (rc)
3073 return rc;
3074
3075
3076
3077
3078 rc = smb3_fs_context_dup(&tmp_ctx, ctx);
3079 if (rc)
3080 goto out;
3081
3082 for (;;) {
3083 struct dfs_info3_param ref = {0};
3084 char *fake_devname = NULL, *mdata = NULL;
3085
3086
3087 rc = get_next_dfs_tgt(path, &tgt_list, &tgt_it);
3088 if (rc)
3089 break;
3090
3091 rc = dfs_cache_get_tgt_referral(path, tgt_it, &ref);
3092 if (rc)
3093 break;
3094
3095 cifs_dbg(FYI, "%s: old ctx: UNC=%s prepath=%s\n", __func__, tmp_ctx.UNC,
3096 tmp_ctx.prepath);
3097
3098 mdata = cifs_compose_mount_options(cifs_sb->ctx->mount_options, full_path + 1, &ref,
3099 &fake_devname);
3100 free_dfs_info_param(&ref);
3101
3102 if (IS_ERR(mdata)) {
3103 rc = PTR_ERR(mdata);
3104 mdata = NULL;
3105 } else
3106 rc = cifs_setup_volume_info(&tmp_ctx, mdata, fake_devname);
3107
3108 kfree(mdata);
3109 kfree(fake_devname);
3110
3111 if (rc)
3112 break;
3113
3114 cifs_dbg(FYI, "%s: new ctx: UNC=%s prepath=%s\n", __func__, tmp_ctx.UNC,
3115 tmp_ctx.prepath);
3116
3117 mount_put_conns(cifs_sb, *xid, *server, *ses, *tcon);
3118 rc = mount_get_conns(&tmp_ctx, cifs_sb, xid, server, ses, tcon);
3119 if (!rc || (*server && *ses)) {
3120
3121
3122
3123
3124 rc = update_vol_info(tgt_it, &tmp_ctx, ctx);
3125 break;
3126 }
3127 }
3128 if (!rc) {
3129 cifs_dbg(FYI, "%s: final ctx: UNC=%s prepath=%s\n", __func__, tmp_ctx.UNC,
3130 tmp_ctx.prepath);
3131
3132
3133
3134
3135 rc = dfs_cache_update_tgthint(*xid, root_ses ? root_ses : *ses, cifs_sb->local_nls,
3136 cifs_remap(cifs_sb), path, tgt_it);
3137 }
3138
3139out:
3140 smb3_cleanup_fs_context_contents(&tmp_ctx);
3141 dfs_cache_free_tgts(&tgt_list);
3142 return rc;
3143}
3144#endif
3145
3146
3147
3148
3149int
3150cifs_setup_volume_info(struct smb3_fs_context *ctx, const char *mntopts, const char *devname)
3151{
3152 int rc;
3153
3154 if (devname) {
3155 cifs_dbg(FYI, "%s: devname=%s\n", __func__, devname);
3156 rc = smb3_parse_devname(devname, ctx);
3157 if (rc) {
3158 cifs_dbg(VFS, "%s: failed to parse %s: %d\n", __func__, devname, rc);
3159 return rc;
3160 }
3161 }
3162
3163 if (mntopts) {
3164 char *ip;
3165
3166 rc = smb3_parse_opt(mntopts, "ip", &ip);
3167 if (rc) {
3168 cifs_dbg(VFS, "%s: failed to parse ip options: %d\n", __func__, rc);
3169 return rc;
3170 }
3171
3172 rc = cifs_convert_address((struct sockaddr *)&ctx->dstaddr, ip, strlen(ip));
3173 kfree(ip);
3174 if (!rc) {
3175 cifs_dbg(VFS, "%s: failed to convert ip address\n", __func__);
3176 return -EINVAL;
3177 }
3178 }
3179
3180 if (ctx->nullauth) {
3181 cifs_dbg(FYI, "Anonymous login\n");
3182 kfree(ctx->username);
3183 ctx->username = NULL;
3184 } else if (ctx->username) {
3185
3186 cifs_dbg(FYI, "Username: %s\n", ctx->username);
3187 } else {
3188 cifs_dbg(VFS, "No username specified\n");
3189
3190
3191 return -EINVAL;
3192 }
3193
3194 return 0;
3195}
3196
3197static int
3198cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
3199 unsigned int xid,
3200 struct cifs_tcon *tcon,
3201 struct cifs_sb_info *cifs_sb,
3202 char *full_path,
3203 int added_treename)
3204{
3205 int rc;
3206 char *s;
3207 char sep, tmp;
3208 int skip = added_treename ? 1 : 0;
3209
3210 sep = CIFS_DIR_SEP(cifs_sb);
3211 s = full_path;
3212
3213 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
3214 while (rc == 0) {
3215
3216 while (*s == sep)
3217 s++;
3218 if (!*s)
3219 break;
3220
3221 while (*s && *s != sep)
3222 s++;
3223
3224
3225
3226
3227 if (skip) {
3228 skip = 0;
3229 continue;
3230 }
3231
3232
3233
3234
3235 tmp = *s;
3236 *s = 0;
3237 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3238 full_path);
3239 *s = tmp;
3240 }
3241 return rc;
3242}
3243
3244
3245
3246
3247
3248static int is_path_remote(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx,
3249 const unsigned int xid,
3250 struct TCP_Server_Info *server,
3251 struct cifs_tcon *tcon)
3252{
3253 int rc;
3254 char *full_path;
3255
3256 if (!server->ops->is_path_accessible)
3257 return -EOPNOTSUPP;
3258
3259
3260
3261
3262 full_path = cifs_build_path_to_root(ctx, cifs_sb, tcon,
3263 tcon->Flags & SMB_SHARE_IS_IN_DFS);
3264 if (full_path == NULL)
3265 return -ENOMEM;
3266
3267 cifs_dbg(FYI, "%s: full_path: %s\n", __func__, full_path);
3268
3269 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3270 full_path);
3271 if (rc != 0 && rc != -EREMOTE) {
3272 kfree(full_path);
3273 return rc;
3274 }
3275
3276 if (rc != -EREMOTE) {
3277 rc = cifs_are_all_path_components_accessible(server, xid, tcon,
3278 cifs_sb, full_path, tcon->Flags & SMB_SHARE_IS_IN_DFS);
3279 if (rc != 0) {
3280 cifs_server_dbg(VFS, "cannot query dirs between root and final path, enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
3281 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
3282 rc = 0;
3283 }
3284 }
3285
3286 kfree(full_path);
3287 return rc;
3288}
3289
3290#ifdef CONFIG_CIFS_DFS_UPCALL
3291static void set_root_ses(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
3292 struct cifs_ses **root_ses)
3293{
3294 if (ses) {
3295 spin_lock(&cifs_tcp_ses_lock);
3296 ses->ses_count++;
3297 if (ses->tcon_ipc)
3298 ses->tcon_ipc->remap = cifs_remap(cifs_sb);
3299 spin_unlock(&cifs_tcp_ses_lock);
3300 }
3301 *root_ses = ses;
3302}
3303
3304static void put_root_ses(struct cifs_ses *ses)
3305{
3306 if (ses)
3307 cifs_put_smb_ses(ses);
3308}
3309
3310
3311static int next_dfs_prepath(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx,
3312 const unsigned int xid, struct TCP_Server_Info *server,
3313 struct cifs_tcon *tcon, char **dfs_path)
3314{
3315 char *path, *npath;
3316 int added_treename = is_tcon_dfs(tcon);
3317 int rc;
3318
3319 path = cifs_build_path_to_root(ctx, cifs_sb, tcon, added_treename);
3320 if (!path)
3321 return -ENOMEM;
3322
3323 rc = is_path_remote(cifs_sb, ctx, xid, server, tcon);
3324 if (rc == -EREMOTE) {
3325 struct smb3_fs_context v = {NULL};
3326
3327 if (added_treename) {
3328 rc = smb3_parse_devname(path, &v);
3329 if (rc)
3330 goto out;
3331 npath = build_unc_path_to_root(&v, cifs_sb, true);
3332 smb3_cleanup_fs_context_contents(&v);
3333 } else {
3334 v.UNC = ctx->UNC;
3335 v.prepath = path + 1;
3336 npath = build_unc_path_to_root(&v, cifs_sb, true);
3337 }
3338
3339 if (IS_ERR(npath)) {
3340 rc = PTR_ERR(npath);
3341 goto out;
3342 }
3343
3344 kfree(*dfs_path);
3345 *dfs_path = npath;
3346 rc = -EREMOTE;
3347 }
3348
3349out:
3350 kfree(path);
3351 return rc;
3352}
3353
3354
3355static int is_referral_server(const char *ref_path, struct cifs_tcon *tcon, bool *ref_server)
3356{
3357 int rc;
3358 struct dfs_info3_param ref = {0};
3359
3360 if (is_tcon_dfs(tcon)) {
3361 *ref_server = true;
3362 } else {
3363 cifs_dbg(FYI, "%s: ref_path=%s\n", __func__, ref_path);
3364
3365 rc = dfs_cache_noreq_find(ref_path, &ref, NULL);
3366 if (rc) {
3367 cifs_dbg(VFS, "%s: dfs_cache_noreq_find: failed (rc=%d)\n", __func__, rc);
3368 return rc;
3369 }
3370 cifs_dbg(FYI, "%s: ref.flags=0x%x\n", __func__, ref.flags);
3371
3372
3373
3374
3375 *ref_server = !!(ref.flags & DFSREF_REFERRAL_SERVER);
3376 free_dfs_info_param(&ref);
3377 }
3378 return 0;
3379}
3380
3381int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
3382{
3383 int rc = 0;
3384 unsigned int xid;
3385 struct TCP_Server_Info *server = NULL;
3386 struct cifs_ses *ses = NULL, *root_ses = NULL;
3387 struct cifs_tcon *tcon = NULL;
3388 int count = 0;
3389 char *ref_path = NULL, *full_path = NULL;
3390 char *oldmnt = NULL;
3391 char *mntdata = NULL;
3392 bool ref_server = false;
3393
3394 rc = mount_get_conns(ctx, cifs_sb, &xid, &server, &ses, &tcon);
3395
3396
3397
3398
3399
3400
3401
3402 if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS) ||
3403 dfs_cache_find(xid, ses, cifs_sb->local_nls, cifs_remap(cifs_sb), ctx->UNC + 1, NULL,
3404 NULL)) {
3405 if (rc)
3406 goto error;
3407
3408 rc = is_path_remote(cifs_sb, ctx, xid, server, tcon);
3409 if (!rc)
3410 goto out;
3411 if (rc != -EREMOTE)
3412 goto error;
3413 }
3414
3415 mntdata = kstrdup(cifs_sb->ctx->mount_options, GFP_KERNEL);
3416 if (!mntdata) {
3417 rc = -ENOMEM;
3418 goto error;
3419 }
3420
3421 ref_path = build_unc_path_to_root(ctx, cifs_sb, false);
3422 if (IS_ERR(ref_path)) {
3423 rc = PTR_ERR(ref_path);
3424 ref_path = NULL;
3425 goto error;
3426 }
3427
3428 set_root_ses(cifs_sb, ses, &root_ses);
3429 do {
3430
3431 kfree(full_path);
3432 full_path = build_unc_path_to_root(ctx, cifs_sb, !!count);
3433 if (IS_ERR(full_path)) {
3434 rc = PTR_ERR(full_path);
3435 full_path = NULL;
3436 break;
3437 }
3438
3439 oldmnt = cifs_sb->ctx->mount_options;
3440 rc = expand_dfs_referral(xid, root_ses, ctx, cifs_sb, ref_path + 1);
3441 if (rc)
3442 break;
3443
3444 if (oldmnt != cifs_sb->ctx->mount_options) {
3445 mount_put_conns(cifs_sb, xid, server, ses, tcon);
3446 rc = mount_get_conns(ctx, cifs_sb, &xid, &server, &ses, &tcon);
3447 }
3448 if (rc && !server && !ses) {
3449
3450 rc = do_dfs_failover(ref_path + 1, full_path, cifs_sb, ctx, root_ses, &xid,
3451 &server, &ses, &tcon);
3452 }
3453 if (rc == -EACCES || rc == -EOPNOTSUPP || !server || !ses)
3454 break;
3455 if (!tcon)
3456 continue;
3457
3458
3459 rc = is_referral_server(ref_path + 1, tcon, &ref_server);
3460 if (rc)
3461 break;
3462 if (ref_server) {
3463 put_root_ses(root_ses);
3464 set_root_ses(cifs_sb, ses, &root_ses);
3465 }
3466
3467
3468 rc = next_dfs_prepath(cifs_sb, ctx, xid, server, tcon, &ref_path);
3469
3470 if (rc == -EREMOTE && ++count > MAX_NESTED_LINKS)
3471 rc = -ELOOP;
3472 } while (rc == -EREMOTE);
3473
3474 if (rc)
3475 goto error;
3476 put_root_ses(root_ses);
3477 root_ses = NULL;
3478 kfree(ref_path);
3479 ref_path = NULL;
3480
3481
3482
3483
3484
3485
3486
3487
3488 cifs_sb->origin_fullpath = kstrdup(full_path, GFP_KERNEL);
3489 if (!cifs_sb->origin_fullpath) {
3490 rc = -ENOMEM;
3491 goto error;
3492 }
3493 spin_lock(&cifs_tcp_ses_lock);
3494 tcon->dfs_path = full_path;
3495 full_path = NULL;
3496 tcon->remap = cifs_remap(cifs_sb);
3497 spin_unlock(&cifs_tcp_ses_lock);
3498
3499
3500 rc = dfs_cache_add_vol(mntdata, ctx, cifs_sb->origin_fullpath);
3501 if (rc)
3502 goto error;
3503
3504
3505
3506
3507
3508 cifs_autodisable_serverino(cifs_sb);
3509
3510
3511
3512
3513 cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
3514 kfree(cifs_sb->prepath);
3515 cifs_sb->prepath = ctx->prepath;
3516 ctx->prepath = NULL;
3517
3518out:
3519 free_xid(xid);
3520 cifs_try_adding_channels(cifs_sb, ses);
3521 return mount_setup_tlink(cifs_sb, ses, tcon);
3522
3523error:
3524 kfree(ref_path);
3525 kfree(full_path);
3526 kfree(mntdata);
3527 kfree(cifs_sb->origin_fullpath);
3528 put_root_ses(root_ses);
3529 mount_put_conns(cifs_sb, xid, server, ses, tcon);
3530 return rc;
3531}
3532#else
3533int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
3534{
3535 int rc = 0;
3536 unsigned int xid;
3537 struct cifs_ses *ses;
3538 struct cifs_tcon *tcon;
3539 struct TCP_Server_Info *server;
3540
3541 rc = mount_get_conns(ctx, cifs_sb, &xid, &server, &ses, &tcon);
3542 if (rc)
3543 goto error;
3544
3545 if (tcon) {
3546 rc = is_path_remote(cifs_sb, ctx, xid, server, tcon);
3547 if (rc == -EREMOTE)
3548 rc = -EOPNOTSUPP;
3549 if (rc)
3550 goto error;
3551 }
3552
3553 free_xid(xid);
3554
3555 return mount_setup_tlink(cifs_sb, ses, tcon);
3556
3557error:
3558 mount_put_conns(cifs_sb, xid, server, ses, tcon);
3559 return rc;
3560}
3561#endif
3562
3563
3564
3565
3566int
3567CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
3568 const char *tree, struct cifs_tcon *tcon,
3569 const struct nls_table *nls_codepage)
3570{
3571 struct smb_hdr *smb_buffer;
3572 struct smb_hdr *smb_buffer_response;
3573 TCONX_REQ *pSMB;
3574 TCONX_RSP *pSMBr;
3575 unsigned char *bcc_ptr;
3576 int rc = 0;
3577 int length;
3578 __u16 bytes_left, count;
3579
3580 if (ses == NULL)
3581 return -EIO;
3582
3583 smb_buffer = cifs_buf_get();
3584 if (smb_buffer == NULL)
3585 return -ENOMEM;
3586
3587 smb_buffer_response = smb_buffer;
3588
3589 header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX,
3590 NULL , 4 );
3591
3592 smb_buffer->Mid = get_next_mid(ses->server);
3593 smb_buffer->Uid = ses->Suid;
3594 pSMB = (TCONX_REQ *) smb_buffer;
3595 pSMBr = (TCONX_RSP *) smb_buffer_response;
3596
3597 pSMB->AndXCommand = 0xFF;
3598 pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
3599 bcc_ptr = &pSMB->Password[0];
3600 if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
3601 pSMB->PasswordLength = cpu_to_le16(1);
3602 *bcc_ptr = 0;
3603 bcc_ptr++;
3604
3605 } else {
3606 pSMB->PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
3607
3608
3609
3610
3611
3612
3613#ifdef CONFIG_CIFS_WEAK_PW_HASH
3614 if ((global_secflags & CIFSSEC_MAY_LANMAN) &&
3615 (ses->sectype == LANMAN))
3616 calc_lanman_hash(tcon->password, ses->server->cryptkey,
3617 ses->server->sec_mode &
3618 SECMODE_PW_ENCRYPT ? true : false,
3619 bcc_ptr);
3620 else
3621#endif
3622 rc = SMBNTencrypt(tcon->password, ses->server->cryptkey,
3623 bcc_ptr, nls_codepage);
3624 if (rc) {
3625 cifs_dbg(FYI, "%s Can't generate NTLM rsp. Error: %d\n",
3626 __func__, rc);
3627 cifs_buf_release(smb_buffer);
3628 return rc;
3629 }
3630
3631 bcc_ptr += CIFS_AUTH_RESP_SIZE;
3632 if (ses->capabilities & CAP_UNICODE) {
3633
3634 *bcc_ptr = 0;
3635 bcc_ptr++;
3636 }
3637 }
3638
3639 if (ses->server->sign)
3640 smb_buffer->Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
3641
3642 if (ses->capabilities & CAP_STATUS32) {
3643 smb_buffer->Flags2 |= SMBFLG2_ERR_STATUS;
3644 }
3645 if (ses->capabilities & CAP_DFS) {
3646 smb_buffer->Flags2 |= SMBFLG2_DFS;
3647 }
3648 if (ses->capabilities & CAP_UNICODE) {
3649 smb_buffer->Flags2 |= SMBFLG2_UNICODE;
3650 length =
3651 cifs_strtoUTF16((__le16 *) bcc_ptr, tree,
3652 6 *
3653 ( + 256 ), nls_codepage);
3654 bcc_ptr += 2 * length;
3655 bcc_ptr += 2;
3656 } else {
3657 strcpy(bcc_ptr, tree);
3658 bcc_ptr += strlen(tree) + 1;
3659 }
3660 strcpy(bcc_ptr, "?????");
3661 bcc_ptr += strlen("?????");
3662 bcc_ptr += 1;
3663 count = bcc_ptr - &pSMB->Password[0];
3664 be32_add_cpu(&pSMB->hdr.smb_buf_length, count);
3665 pSMB->ByteCount = cpu_to_le16(count);
3666
3667 rc = SendReceive(xid, ses, smb_buffer, smb_buffer_response, &length,
3668 0);
3669
3670
3671 if (rc == 0) {
3672 bool is_unicode;
3673
3674 tcon->tidStatus = CifsGood;
3675 tcon->need_reconnect = false;
3676 tcon->tid = smb_buffer_response->Tid;
3677 bcc_ptr = pByteArea(smb_buffer_response);
3678 bytes_left = get_bcc(smb_buffer_response);
3679 length = strnlen(bcc_ptr, bytes_left - 2);
3680 if (smb_buffer->Flags2 & SMBFLG2_UNICODE)
3681 is_unicode = true;
3682 else
3683 is_unicode = false;
3684
3685
3686
3687 if (length == 3) {
3688 if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
3689 (bcc_ptr[2] == 'C')) {
3690 cifs_dbg(FYI, "IPC connection\n");
3691 tcon->ipc = true;
3692 tcon->pipe = true;
3693 }
3694 } else if (length == 2) {
3695 if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
3696
3697 cifs_dbg(FYI, "disk share connection\n");
3698 }
3699 }
3700 bcc_ptr += length + 1;
3701 bytes_left -= (length + 1);
3702 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
3703
3704
3705 kfree(tcon->nativeFileSystem);
3706 tcon->nativeFileSystem = cifs_strndup_from_utf16(bcc_ptr,
3707 bytes_left, is_unicode,
3708 nls_codepage);
3709
3710 cifs_dbg(FYI, "nativeFileSystem=%s\n", tcon->nativeFileSystem);
3711
3712 if ((smb_buffer_response->WordCount == 3) ||
3713 (smb_buffer_response->WordCount == 7))
3714
3715 tcon->Flags = le16_to_cpu(pSMBr->OptionalSupport);
3716 else
3717 tcon->Flags = 0;
3718 cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
3719 }
3720
3721 cifs_buf_release(smb_buffer);
3722 return rc;
3723}
3724
3725static void delayed_free(struct rcu_head *p)
3726{
3727 struct cifs_sb_info *cifs_sb = container_of(p, struct cifs_sb_info, rcu);
3728
3729 unload_nls(cifs_sb->local_nls);
3730 smb3_cleanup_fs_context(cifs_sb->ctx);
3731 kfree(cifs_sb);
3732}
3733
3734void
3735cifs_umount(struct cifs_sb_info *cifs_sb)
3736{
3737 struct rb_root *root = &cifs_sb->tlink_tree;
3738 struct rb_node *node;
3739 struct tcon_link *tlink;
3740
3741 cancel_delayed_work_sync(&cifs_sb->prune_tlinks);
3742
3743 spin_lock(&cifs_sb->tlink_tree_lock);
3744 while ((node = rb_first(root))) {
3745 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3746 cifs_get_tlink(tlink);
3747 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
3748 rb_erase(node, root);
3749
3750 spin_unlock(&cifs_sb->tlink_tree_lock);
3751 cifs_put_tlink(tlink);
3752 spin_lock(&cifs_sb->tlink_tree_lock);
3753 }
3754 spin_unlock(&cifs_sb->tlink_tree_lock);
3755
3756 kfree(cifs_sb->prepath);
3757#ifdef CONFIG_CIFS_DFS_UPCALL
3758 dfs_cache_del_vol(cifs_sb->origin_fullpath);
3759 kfree(cifs_sb->origin_fullpath);
3760#endif
3761 call_rcu(&cifs_sb->rcu, delayed_free);
3762}
3763
3764int
3765cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses)
3766{
3767 int rc = 0;
3768 struct TCP_Server_Info *server = cifs_ses_server(ses);
3769
3770 if (!server->ops->need_neg || !server->ops->negotiate)
3771 return -ENOSYS;
3772
3773
3774 if (!server->ops->need_neg(server))
3775 return 0;
3776
3777 rc = server->ops->negotiate(xid, ses);
3778 if (rc == 0) {
3779 spin_lock(&GlobalMid_Lock);
3780 if (server->tcpStatus == CifsNeedNegotiate)
3781 server->tcpStatus = CifsGood;
3782 else
3783 rc = -EHOSTDOWN;
3784 spin_unlock(&GlobalMid_Lock);
3785 }
3786
3787 return rc;
3788}
3789
3790int
3791cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
3792 struct nls_table *nls_info)
3793{
3794 int rc = -ENOSYS;
3795 struct TCP_Server_Info *server = cifs_ses_server(ses);
3796
3797 if (!ses->binding) {
3798 ses->capabilities = server->capabilities;
3799 if (!linuxExtEnabled)
3800 ses->capabilities &= (~server->vals->cap_unix);
3801
3802 if (ses->auth_key.response) {
3803 cifs_dbg(FYI, "Free previous auth_key.response = %p\n",
3804 ses->auth_key.response);
3805 kfree(ses->auth_key.response);
3806 ses->auth_key.response = NULL;
3807 ses->auth_key.len = 0;
3808 }
3809 }
3810
3811 cifs_dbg(FYI, "Security Mode: 0x%x Capabilities: 0x%x TimeAdjust: %d\n",
3812 server->sec_mode, server->capabilities, server->timeAdj);
3813
3814 if (server->ops->sess_setup)
3815 rc = server->ops->sess_setup(xid, ses, nls_info);
3816
3817 if (rc)
3818 cifs_server_dbg(VFS, "Send error in SessSetup = %d\n", rc);
3819
3820 return rc;
3821}
3822
3823static int
3824cifs_set_vol_auth(struct smb3_fs_context *ctx, struct cifs_ses *ses)
3825{
3826 ctx->sectype = ses->sectype;
3827
3828
3829 if (ctx->sectype == Kerberos)
3830 return 0;
3831
3832 return cifs_set_cifscreds(ctx, ses);
3833}
3834
3835static struct cifs_tcon *
3836cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
3837{
3838 int rc;
3839 struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
3840 struct cifs_ses *ses;
3841 struct cifs_tcon *tcon = NULL;
3842 struct smb3_fs_context *ctx;
3843
3844 ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
3845 if (ctx == NULL)
3846 return ERR_PTR(-ENOMEM);
3847
3848 ctx->local_nls = cifs_sb->local_nls;
3849 ctx->linux_uid = fsuid;
3850 ctx->cred_uid = fsuid;
3851 ctx->UNC = master_tcon->treeName;
3852 ctx->retry = master_tcon->retry;
3853 ctx->nocase = master_tcon->nocase;
3854 ctx->nohandlecache = master_tcon->nohandlecache;
3855 ctx->local_lease = master_tcon->local_lease;
3856 ctx->no_lease = master_tcon->no_lease;
3857 ctx->resilient = master_tcon->use_resilient;
3858 ctx->persistent = master_tcon->use_persistent;
3859 ctx->handle_timeout = master_tcon->handle_timeout;
3860 ctx->no_linux_ext = !master_tcon->unix_ext;
3861 ctx->linux_ext = master_tcon->posix_extensions;
3862 ctx->sectype = master_tcon->ses->sectype;
3863 ctx->sign = master_tcon->ses->sign;
3864 ctx->seal = master_tcon->seal;
3865 ctx->witness = master_tcon->use_witness;
3866
3867 rc = cifs_set_vol_auth(ctx, master_tcon->ses);
3868 if (rc) {
3869 tcon = ERR_PTR(rc);
3870 goto out;
3871 }
3872
3873
3874 spin_lock(&cifs_tcp_ses_lock);
3875 ++master_tcon->ses->server->srv_count;
3876 spin_unlock(&cifs_tcp_ses_lock);
3877
3878 ses = cifs_get_smb_ses(master_tcon->ses->server, ctx);
3879 if (IS_ERR(ses)) {
3880 tcon = (struct cifs_tcon *)ses;
3881 cifs_put_tcp_session(master_tcon->ses->server, 0);
3882 goto out;
3883 }
3884
3885 tcon = cifs_get_tcon(ses, ctx);
3886 if (IS_ERR(tcon)) {
3887 cifs_put_smb_ses(ses);
3888 goto out;
3889 }
3890
3891 if (cap_unix(ses))
3892 reset_cifs_unix_caps(0, tcon, NULL, ctx);
3893
3894out:
3895 kfree(ctx->username);
3896 kfree_sensitive(ctx->password);
3897 kfree(ctx);
3898
3899 return tcon;
3900}
3901
3902struct cifs_tcon *
3903cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
3904{
3905 return tlink_tcon(cifs_sb_master_tlink(cifs_sb));
3906}
3907
3908
3909static struct tcon_link *
3910tlink_rb_search(struct rb_root *root, kuid_t uid)
3911{
3912 struct rb_node *node = root->rb_node;
3913 struct tcon_link *tlink;
3914
3915 while (node) {
3916 tlink = rb_entry(node, struct tcon_link, tl_rbnode);
3917
3918 if (uid_gt(tlink->tl_uid, uid))
3919 node = node->rb_left;
3920 else if (uid_lt(tlink->tl_uid, uid))
3921 node = node->rb_right;
3922 else
3923 return tlink;
3924 }
3925 return NULL;
3926}
3927
3928
3929static void
3930tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink)
3931{
3932 struct rb_node **new = &(root->rb_node), *parent = NULL;
3933 struct tcon_link *tlink;
3934
3935 while (*new) {
3936 tlink = rb_entry(*new, struct tcon_link, tl_rbnode);
3937 parent = *new;
3938
3939 if (uid_gt(tlink->tl_uid, new_tlink->tl_uid))
3940 new = &((*new)->rb_left);
3941 else
3942 new = &((*new)->rb_right);
3943 }
3944
3945 rb_link_node(&new_tlink->tl_rbnode, parent, new);
3946 rb_insert_color(&new_tlink->tl_rbnode, root);
3947}
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965struct tcon_link *
3966cifs_sb_tlink(struct cifs_sb_info *cifs_sb)
3967{
3968 int ret;
3969 kuid_t fsuid = current_fsuid();
3970 struct tcon_link *tlink, *newtlink;
3971
3972 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
3973 return cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
3974
3975 spin_lock(&cifs_sb->tlink_tree_lock);
3976 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
3977 if (tlink)
3978 cifs_get_tlink(tlink);
3979 spin_unlock(&cifs_sb->tlink_tree_lock);
3980
3981 if (tlink == NULL) {
3982 newtlink = kzalloc(sizeof(*tlink), GFP_KERNEL);
3983 if (newtlink == NULL)
3984 return ERR_PTR(-ENOMEM);
3985 newtlink->tl_uid = fsuid;
3986 newtlink->tl_tcon = ERR_PTR(-EACCES);
3987 set_bit(TCON_LINK_PENDING, &newtlink->tl_flags);
3988 set_bit(TCON_LINK_IN_TREE, &newtlink->tl_flags);
3989 cifs_get_tlink(newtlink);
3990
3991 spin_lock(&cifs_sb->tlink_tree_lock);
3992
3993 tlink = tlink_rb_search(&cifs_sb->tlink_tree, fsuid);
3994 if (tlink) {
3995 cifs_get_tlink(tlink);
3996 spin_unlock(&cifs_sb->tlink_tree_lock);
3997 kfree(newtlink);
3998 goto wait_for_construction;
3999 }
4000 tlink = newtlink;
4001 tlink_rb_insert(&cifs_sb->tlink_tree, tlink);
4002 spin_unlock(&cifs_sb->tlink_tree_lock);
4003 } else {
4004wait_for_construction:
4005 ret = wait_on_bit(&tlink->tl_flags, TCON_LINK_PENDING,
4006 TASK_INTERRUPTIBLE);
4007 if (ret) {
4008 cifs_put_tlink(tlink);
4009 return ERR_PTR(-ERESTARTSYS);
4010 }
4011
4012
4013 if (!IS_ERR(tlink->tl_tcon))
4014 return tlink;
4015
4016
4017 if (time_before(jiffies, tlink->tl_time + TLINK_ERROR_EXPIRE)) {
4018 cifs_put_tlink(tlink);
4019 return ERR_PTR(-EACCES);
4020 }
4021
4022 if (test_and_set_bit(TCON_LINK_PENDING, &tlink->tl_flags))
4023 goto wait_for_construction;
4024 }
4025
4026 tlink->tl_tcon = cifs_construct_tcon(cifs_sb, fsuid);
4027 clear_bit(TCON_LINK_PENDING, &tlink->tl_flags);
4028 wake_up_bit(&tlink->tl_flags, TCON_LINK_PENDING);
4029
4030 if (IS_ERR(tlink->tl_tcon)) {
4031 cifs_put_tlink(tlink);
4032 return ERR_PTR(-EACCES);
4033 }
4034
4035 return tlink;
4036}
4037
4038
4039
4040
4041
4042static void
4043cifs_prune_tlinks(struct work_struct *work)
4044{
4045 struct cifs_sb_info *cifs_sb = container_of(work, struct cifs_sb_info,
4046 prune_tlinks.work);
4047 struct rb_root *root = &cifs_sb->tlink_tree;
4048 struct rb_node *node;
4049 struct rb_node *tmp;
4050 struct tcon_link *tlink;
4051
4052
4053
4054
4055
4056
4057
4058
4059 spin_lock(&cifs_sb->tlink_tree_lock);
4060 node = rb_first(root);
4061 while (node != NULL) {
4062 tmp = node;
4063 node = rb_next(tmp);
4064 tlink = rb_entry(tmp, struct tcon_link, tl_rbnode);
4065
4066 if (test_bit(TCON_LINK_MASTER, &tlink->tl_flags) ||
4067 atomic_read(&tlink->tl_count) != 0 ||
4068 time_after(tlink->tl_time + TLINK_IDLE_EXPIRE, jiffies))
4069 continue;
4070
4071 cifs_get_tlink(tlink);
4072 clear_bit(TCON_LINK_IN_TREE, &tlink->tl_flags);
4073 rb_erase(tmp, root);
4074
4075 spin_unlock(&cifs_sb->tlink_tree_lock);
4076 cifs_put_tlink(tlink);
4077 spin_lock(&cifs_sb->tlink_tree_lock);
4078 }
4079 spin_unlock(&cifs_sb->tlink_tree_lock);
4080
4081 queue_delayed_work(cifsiod_wq, &cifs_sb->prune_tlinks,
4082 TLINK_IDLE_EXPIRE);
4083}
4084
4085#ifdef CONFIG_CIFS_DFS_UPCALL
4086int cifs_tree_connect(const unsigned int xid, struct cifs_tcon *tcon, const struct nls_table *nlsc)
4087{
4088 int rc;
4089 struct TCP_Server_Info *server = tcon->ses->server;
4090 const struct smb_version_operations *ops = server->ops;
4091 struct dfs_cache_tgt_list tl;
4092 struct dfs_cache_tgt_iterator *it = NULL;
4093 char *tree;
4094 const char *tcp_host;
4095 size_t tcp_host_len;
4096 const char *dfs_host;
4097 size_t dfs_host_len;
4098 char *share = NULL, *prefix = NULL;
4099 struct dfs_info3_param ref = {0};
4100 bool isroot;
4101
4102 tree = kzalloc(MAX_TREE_SIZE, GFP_KERNEL);
4103 if (!tree)
4104 return -ENOMEM;
4105
4106 if (!tcon->dfs_path) {
4107 if (tcon->ipc) {
4108 scnprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$", server->hostname);
4109 rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
4110 } else {
4111 rc = ops->tree_connect(xid, tcon->ses, tcon->treeName, tcon, nlsc);
4112 }
4113 goto out;
4114 }
4115
4116 rc = dfs_cache_noreq_find(tcon->dfs_path + 1, &ref, &tl);
4117 if (rc)
4118 goto out;
4119 isroot = ref.server_type == DFS_TYPE_ROOT;
4120 free_dfs_info_param(&ref);
4121
4122 extract_unc_hostname(server->hostname, &tcp_host, &tcp_host_len);
4123
4124 for (it = dfs_cache_get_tgt_iterator(&tl); it; it = dfs_cache_get_next_tgt(&tl, it)) {
4125 bool target_match;
4126
4127 kfree(share);
4128 kfree(prefix);
4129 share = NULL;
4130 prefix = NULL;
4131
4132 rc = dfs_cache_get_tgt_share(tcon->dfs_path + 1, it, &share, &prefix);
4133 if (rc) {
4134 cifs_dbg(VFS, "%s: failed to parse target share %d\n",
4135 __func__, rc);
4136 continue;
4137 }
4138
4139 extract_unc_hostname(share, &dfs_host, &dfs_host_len);
4140
4141 if (dfs_host_len != tcp_host_len
4142 || strncasecmp(dfs_host, tcp_host, dfs_host_len) != 0) {
4143 cifs_dbg(FYI, "%s: %.*s doesn't match %.*s\n", __func__, (int)dfs_host_len,
4144 dfs_host, (int)tcp_host_len, tcp_host);
4145
4146 rc = match_target_ip(server, dfs_host, dfs_host_len, &target_match);
4147 if (rc) {
4148 cifs_dbg(VFS, "%s: failed to match target ip: %d\n", __func__, rc);
4149 break;
4150 }
4151
4152 if (!target_match) {
4153 cifs_dbg(FYI, "%s: skipping target\n", __func__);
4154 continue;
4155 }
4156 }
4157
4158 if (tcon->ipc) {
4159 scnprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$", share);
4160 rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
4161 } else {
4162 scnprintf(tree, MAX_TREE_SIZE, "\\%s", share);
4163 rc = ops->tree_connect(xid, tcon->ses, tree, tcon, nlsc);
4164
4165 if (!rc && !isroot) {
4166 rc = update_super_prepath(tcon, prefix);
4167 break;
4168 }
4169 }
4170 if (rc == -EREMOTE)
4171 break;
4172 }
4173
4174 kfree(share);
4175 kfree(prefix);
4176
4177 if (!rc) {
4178 if (it)
4179 rc = dfs_cache_noreq_update_tgthint(tcon->dfs_path + 1, it);
4180 else
4181 rc = -ENOENT;
4182 }
4183 dfs_cache_free_tgts(&tl);
4184out:
4185 kfree(tree);
4186 return rc;
4187}
4188#else
4189int cifs_tree_connect(const unsigned int xid, struct cifs_tcon *tcon, const struct nls_table *nlsc)
4190{
4191 const struct smb_version_operations *ops = tcon->ses->server->ops;
4192
4193 return ops->tree_connect(xid, tcon->ses, tcon->treeName, tcon, nlsc);
4194}
4195#endif
4196