Lines Matching full:server
59 /* Drop the connection to not overload the server */
62 static int ip_connect(struct TCP_Server_Info *server);
63 static int generic_ip_connect(struct TCP_Server_Info *server);
71 * This should be called with server->srv_mutex held.
73 static int reconn_set_ipaddr_from_hostname(struct TCP_Server_Info *server) in reconn_set_ipaddr_from_hostname() argument
78 if (!server->hostname) in reconn_set_ipaddr_from_hostname()
81 /* if server hostname isn't populated, there's nothing to do here */ in reconn_set_ipaddr_from_hostname()
82 if (server->hostname[0] == '\0') in reconn_set_ipaddr_from_hostname()
85 spin_lock(&server->srv_lock); in reconn_set_ipaddr_from_hostname()
86 ss = server->dstaddr; in reconn_set_ipaddr_from_hostname()
87 spin_unlock(&server->srv_lock); in reconn_set_ipaddr_from_hostname()
89 rc = dns_resolve_name(server->dns_dom, server->hostname, in reconn_set_ipaddr_from_hostname()
90 strlen(server->hostname), in reconn_set_ipaddr_from_hostname()
93 spin_lock(&server->srv_lock); in reconn_set_ipaddr_from_hostname()
94 memcpy(&server->dstaddr, &ss, sizeof(server->dstaddr)); in reconn_set_ipaddr_from_hostname()
95 spin_unlock(&server->srv_lock); in reconn_set_ipaddr_from_hostname()
107 struct TCP_Server_Info *server = tcon->ses->server; in smb2_query_server_interfaces() local
110 * query server network interfaces, in case they change in smb2_query_server_interfaces()
112 if (!server->ops->query_server_interfaces) in smb2_query_server_interfaces()
116 rc = server->ops->query_server_interfaces(xid, tcon, false); in smb2_query_server_interfaces()
123 cifs_dbg(FYI, "%s: failed to query server interfaces: %d\n", in smb2_query_server_interfaces()
132 * Update the tcpStatus for the server.
137 * @server: the tcp ses for which reconnect is needed
141 cifs_signal_cifsd_for_reconnect(struct TCP_Server_Info *server, in cifs_signal_cifsd_for_reconnect() argument
148 /* If server is a channel, select the primary channel */ in cifs_signal_cifsd_for_reconnect()
149 pserver = SERVER_IS_CHAN(server) ? server->primary_server : server; in cifs_signal_cifsd_for_reconnect()
153 spin_lock(&server->srv_lock); in cifs_signal_cifsd_for_reconnect()
154 if (server->tcpStatus != CifsExiting) in cifs_signal_cifsd_for_reconnect()
155 server->tcpStatus = CifsNeedReconnect; in cifs_signal_cifsd_for_reconnect()
156 spin_unlock(&server->srv_lock); in cifs_signal_cifsd_for_reconnect()
166 if (!ses->chans[i].server) in cifs_signal_cifsd_for_reconnect()
169 spin_lock(&ses->chans[i].server->srv_lock); in cifs_signal_cifsd_for_reconnect()
170 if (ses->chans[i].server->tcpStatus != CifsExiting) in cifs_signal_cifsd_for_reconnect()
171 ses->chans[i].server->tcpStatus = CifsNeedReconnect; in cifs_signal_cifsd_for_reconnect()
172 spin_unlock(&ses->chans[i].server->srv_lock); in cifs_signal_cifsd_for_reconnect()
185 * @server: the tcp ses for which reconnect is needed
186 * @server needs to be previously set to CifsNeedReconnect.
190 cifs_mark_tcp_ses_conns_for_reconnect(struct TCP_Server_Info *server, in cifs_mark_tcp_ses_conns_for_reconnect() argument
203 /* If server is a channel, select the primary channel */ in cifs_mark_tcp_ses_conns_for_reconnect()
204 pserver = SERVER_IS_CHAN(server) ? server->primary_server : server; in cifs_mark_tcp_ses_conns_for_reconnect()
207 * if the server has been marked for termination, there is a in cifs_mark_tcp_ses_conns_for_reconnect()
214 if (server->terminate) { in cifs_mark_tcp_ses_conns_for_reconnect()
216 server = pserver; in cifs_mark_tcp_ses_conns_for_reconnect()
229 if (cifs_ses_get_chan_index(ses, server) == in cifs_mark_tcp_ses_conns_for_reconnect()
235 if (!cifs_chan_is_iface_active(ses, server)) { in cifs_mark_tcp_ses_conns_for_reconnect()
237 cifs_chan_update_iface(ses, server); in cifs_mark_tcp_ses_conns_for_reconnect()
241 if (!mark_smb_session && cifs_chan_needs_reconnect(ses, server)) { in cifs_mark_tcp_ses_conns_for_reconnect()
249 cifs_chan_set_need_reconnect(ses, server); in cifs_mark_tcp_ses_conns_for_reconnect()
284 cifs_abort_connection(struct TCP_Server_Info *server) in cifs_abort_connection() argument
289 server->maxBuf = 0; in cifs_abort_connection()
290 server->max_read = 0; in cifs_abort_connection()
294 cifs_server_lock(server); in cifs_abort_connection()
295 if (server->ssocket) { in cifs_abort_connection()
296 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n", server->ssocket->state, in cifs_abort_connection()
297 server->ssocket->flags); in cifs_abort_connection()
298 kernel_sock_shutdown(server->ssocket, SHUT_WR); in cifs_abort_connection()
299 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n", server->ssocket->state, in cifs_abort_connection()
300 server->ssocket->flags); in cifs_abort_connection()
301 sock_release(server->ssocket); in cifs_abort_connection()
302 server->ssocket = NULL; in cifs_abort_connection()
304 server->sequence_number = 0; in cifs_abort_connection()
305 server->session_estab = false; in cifs_abort_connection()
306 kfree_sensitive(server->session_key.response); in cifs_abort_connection()
307 server->session_key.response = NULL; in cifs_abort_connection()
308 server->session_key.len = 0; in cifs_abort_connection()
309 server->lstrp = jiffies; in cifs_abort_connection()
314 spin_lock(&server->mid_lock); in cifs_abort_connection()
315 list_for_each_entry_safe(mid, nmid, &server->pending_mid_q, qhead) { in cifs_abort_connection()
322 spin_unlock(&server->mid_lock); in cifs_abort_connection()
323 cifs_server_unlock(server); in cifs_abort_connection()
332 if (cifs_rdma_enabled(server)) { in cifs_abort_connection()
333 cifs_server_lock(server); in cifs_abort_connection()
334 smbd_destroy(server); in cifs_abort_connection()
335 cifs_server_unlock(server); in cifs_abort_connection()
339 static bool cifs_tcp_ses_needs_reconnect(struct TCP_Server_Info *server, int num_targets) in cifs_tcp_ses_needs_reconnect() argument
341 spin_lock(&server->srv_lock); in cifs_tcp_ses_needs_reconnect()
342 server->nr_targets = num_targets; in cifs_tcp_ses_needs_reconnect()
343 if (server->tcpStatus == CifsExiting) { in cifs_tcp_ses_needs_reconnect()
345 spin_unlock(&server->srv_lock); in cifs_tcp_ses_needs_reconnect()
346 wake_up(&server->response_q); in cifs_tcp_ses_needs_reconnect()
351 trace_smb3_reconnect(server->CurrentMid, server->conn_id, in cifs_tcp_ses_needs_reconnect()
352 server->hostname); in cifs_tcp_ses_needs_reconnect()
353 server->tcpStatus = CifsNeedReconnect; in cifs_tcp_ses_needs_reconnect()
355 spin_unlock(&server->srv_lock); in cifs_tcp_ses_needs_reconnect()
372 static int __cifs_reconnect(struct TCP_Server_Info *server, in __cifs_reconnect() argument
377 if (!cifs_tcp_ses_needs_reconnect(server, 1)) in __cifs_reconnect()
380 cifs_mark_tcp_ses_conns_for_reconnect(server, mark_smb_session); in __cifs_reconnect()
382 cifs_abort_connection(server); in __cifs_reconnect()
386 cifs_server_lock(server); in __cifs_reconnect()
388 if (!cifs_swn_set_server_dstaddr(server)) { in __cifs_reconnect()
390 rc = reconn_set_ipaddr_from_hostname(server); in __cifs_reconnect()
394 if (cifs_rdma_enabled(server)) in __cifs_reconnect()
395 rc = smbd_reconnect(server); in __cifs_reconnect()
397 rc = generic_ip_connect(server); in __cifs_reconnect()
399 cifs_server_unlock(server); in __cifs_reconnect()
407 set_credits(server, 1); in __cifs_reconnect()
408 spin_lock(&server->srv_lock); in __cifs_reconnect()
409 if (server->tcpStatus != CifsExiting) in __cifs_reconnect()
410 server->tcpStatus = CifsNeedNegotiate; in __cifs_reconnect()
411 spin_unlock(&server->srv_lock); in __cifs_reconnect()
412 cifs_swn_reset_server_dstaddr(server); in __cifs_reconnect()
413 cifs_server_unlock(server); in __cifs_reconnect()
414 mod_delayed_work(cifsiod_wq, &server->reconnect, 0); in __cifs_reconnect()
416 } while (server->tcpStatus == CifsNeedReconnect); in __cifs_reconnect()
418 spin_lock(&server->srv_lock); in __cifs_reconnect()
419 if (server->tcpStatus == CifsNeedNegotiate) in __cifs_reconnect()
420 mod_delayed_work(cifsiod_wq, &server->echo, 0); in __cifs_reconnect()
421 spin_unlock(&server->srv_lock); in __cifs_reconnect()
423 wake_up(&server->response_q); in __cifs_reconnect()
428 static int __reconnect_target_locked(struct TCP_Server_Info *server, in __reconnect_target_locked() argument
434 if (!cifs_swn_set_server_dstaddr(server)) { in __reconnect_target_locked()
435 if (server->hostname != target) { in __reconnect_target_locked()
438 spin_lock(&server->srv_lock); in __reconnect_target_locked()
439 kfree(server->hostname); in __reconnect_target_locked()
440 server->hostname = hostname; in __reconnect_target_locked()
441 spin_unlock(&server->srv_lock); in __reconnect_target_locked()
445 cifs_dbg(FYI, "%s: default to last target server: %s\n", __func__, in __reconnect_target_locked()
446 server->hostname); in __reconnect_target_locked()
450 rc = reconn_set_ipaddr_from_hostname(server); in __reconnect_target_locked()
454 if (cifs_rdma_enabled(server)) in __reconnect_target_locked()
455 rc = smbd_reconnect(server); in __reconnect_target_locked()
457 rc = generic_ip_connect(server); in __reconnect_target_locked()
462 static int reconnect_target_locked(struct TCP_Server_Info *server, in reconnect_target_locked() argument
471 /* If dfs target list is empty, then reconnect to last server */ in reconnect_target_locked()
474 return __reconnect_target_locked(server, server->hostname); in reconnect_target_locked()
480 spin_lock(&server->srv_lock); in reconnect_target_locked()
481 if (server->tcpStatus != CifsNeedReconnect) { in reconnect_target_locked()
482 spin_unlock(&server->srv_lock); in reconnect_target_locked()
485 spin_unlock(&server->srv_lock); in reconnect_target_locked()
486 rc = __reconnect_target_locked(server, target); in reconnect_target_locked()
495 static int reconnect_dfs_server(struct TCP_Server_Info *server) in reconnect_dfs_server() argument
498 const char *ref_path = server->leaf_fullpath + 1; in reconnect_dfs_server()
507 * targets (server->nr_targets). It's also possible that the cached referral was cleared in reconnect_dfs_server()
508 * through /proc/fs/cifs/dfscache or the target list is empty due to server settings after in reconnect_dfs_server()
516 if (!cifs_tcp_ses_needs_reconnect(server, num_targets)) in reconnect_dfs_server()
521 * different server or share during failover. It could be improved by adding some logic to in reconnect_dfs_server()
522 * only do that in case it connects to a different server or share, though. in reconnect_dfs_server()
524 cifs_mark_tcp_ses_conns_for_reconnect(server, true); in reconnect_dfs_server()
526 cifs_abort_connection(server); in reconnect_dfs_server()
530 cifs_server_lock(server); in reconnect_dfs_server()
532 rc = reconnect_target_locked(server, &tl, &target_hint); in reconnect_dfs_server()
535 cifs_server_unlock(server); in reconnect_dfs_server()
543 * through the reconnected target server. in reconnect_dfs_server()
546 set_credits(server, 1); in reconnect_dfs_server()
547 spin_lock(&server->srv_lock); in reconnect_dfs_server()
548 if (server->tcpStatus != CifsExiting) in reconnect_dfs_server()
549 server->tcpStatus = CifsNeedNegotiate; in reconnect_dfs_server()
550 spin_unlock(&server->srv_lock); in reconnect_dfs_server()
551 cifs_swn_reset_server_dstaddr(server); in reconnect_dfs_server()
552 cifs_server_unlock(server); in reconnect_dfs_server()
553 mod_delayed_work(cifsiod_wq, &server->reconnect, 0); in reconnect_dfs_server()
554 } while (server->tcpStatus == CifsNeedReconnect); in reconnect_dfs_server()
560 spin_lock(&server->srv_lock); in reconnect_dfs_server()
561 if (server->tcpStatus == CifsNeedNegotiate) in reconnect_dfs_server()
562 mod_delayed_work(cifsiod_wq, &server->echo, 0); in reconnect_dfs_server()
563 spin_unlock(&server->srv_lock); in reconnect_dfs_server()
565 wake_up(&server->response_q); in reconnect_dfs_server()
570 _cifs_reconnect(struct TCP_Server_Info *server, bool mark_smb_session, bool once) in _cifs_reconnect() argument
572 if (!server->leaf_fullpath) in _cifs_reconnect()
573 return __cifs_reconnect(server, mark_smb_session, once); in _cifs_reconnect()
574 return reconnect_dfs_server(server); in _cifs_reconnect()
578 _cifs_reconnect(struct TCP_Server_Info *server, bool mark_smb_session, bool once) in _cifs_reconnect() argument
580 return __cifs_reconnect(server, mark_smb_session, once); in _cifs_reconnect()
585 cifs_reconnect(struct TCP_Server_Info *server, bool mark_smb_session) in cifs_reconnect() argument
587 return _cifs_reconnect(server, mark_smb_session, false); in cifs_reconnect()
591 cifs_reconnect_once(struct TCP_Server_Info *server) in cifs_reconnect_once() argument
593 return _cifs_reconnect(server, true, true); in cifs_reconnect_once()
600 struct TCP_Server_Info *server = container_of(work, in cifs_echo_request() local
608 if (server->tcpStatus == CifsNeedReconnect || in cifs_echo_request()
609 server->tcpStatus == CifsExiting || in cifs_echo_request()
610 server->tcpStatus == CifsNew || in cifs_echo_request()
611 (server->ops->can_echo && !server->ops->can_echo(server)) || in cifs_echo_request()
612 time_before(jiffies, server->lstrp + server->echo_interval - HZ)) in cifs_echo_request()
615 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS; in cifs_echo_request()
622 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval); in cifs_echo_request()
626 allocate_buffers(struct TCP_Server_Info *server) in allocate_buffers() argument
628 if (!server->bigbuf) { in allocate_buffers()
629 server->bigbuf = (char *)cifs_buf_get(); in allocate_buffers()
630 if (!server->bigbuf) { in allocate_buffers()
636 } else if (server->large_buf) { in allocate_buffers()
638 memset(server->bigbuf, 0, HEADER_SIZE(server)); in allocate_buffers()
641 if (!server->smallbuf) { in allocate_buffers()
642 server->smallbuf = (char *)cifs_small_buf_get(); in allocate_buffers()
643 if (!server->smallbuf) { in allocate_buffers()
652 memset(server->smallbuf, 0, HEADER_SIZE(server)); in allocate_buffers()
659 server_unresponsive(struct TCP_Server_Info *server) in server_unresponsive() argument
663 * and the server abruptly shut down (e.g. socket wasn't closed, packet in server_unresponsive()
667 spin_lock(&server->srv_lock); in server_unresponsive()
668 if (server->tcpStatus == CifsInNegotiate && in server_unresponsive()
669 time_after(jiffies, server->lstrp + 20 * HZ)) { in server_unresponsive()
670 spin_unlock(&server->srv_lock); in server_unresponsive()
671 cifs_reconnect(server, false); in server_unresponsive()
685 if ((server->tcpStatus == CifsGood || in server_unresponsive()
686 server->tcpStatus == CifsNeedNegotiate) && in server_unresponsive()
687 (!server->ops->can_echo || server->ops->can_echo(server)) && in server_unresponsive()
688 time_after(jiffies, server->lstrp + 3 * server->echo_interval)) { in server_unresponsive()
689 spin_unlock(&server->srv_lock); in server_unresponsive()
691 (3 * server->echo_interval) / HZ); in server_unresponsive()
692 cifs_reconnect(server, false); in server_unresponsive()
695 spin_unlock(&server->srv_lock); in server_unresponsive()
701 zero_credits(struct TCP_Server_Info *server) in zero_credits() argument
705 spin_lock(&server->req_lock); in zero_credits()
706 val = server->credits + server->echo_credits + server->oplock_credits; in zero_credits()
707 if (server->in_flight == 0 && val == 0) { in zero_credits()
708 spin_unlock(&server->req_lock); in zero_credits()
711 spin_unlock(&server->req_lock); in zero_credits()
716 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg) in cifs_readv_from_socket() argument
725 if (zero_credits(server)) { in cifs_readv_from_socket()
726 cifs_reconnect(server, false); in cifs_readv_from_socket()
730 if (server_unresponsive(server)) in cifs_readv_from_socket()
732 if (cifs_rdma_enabled(server) && server->smbd_conn) in cifs_readv_from_socket()
733 length = smbd_recv(server->smbd_conn, smb_msg); in cifs_readv_from_socket()
735 length = sock_recvmsg(server->ssocket, smb_msg, 0); in cifs_readv_from_socket()
737 spin_lock(&server->srv_lock); in cifs_readv_from_socket()
738 if (server->tcpStatus == CifsExiting) { in cifs_readv_from_socket()
739 spin_unlock(&server->srv_lock); in cifs_readv_from_socket()
743 if (server->tcpStatus == CifsNeedReconnect) { in cifs_readv_from_socket()
744 spin_unlock(&server->srv_lock); in cifs_readv_from_socket()
745 cifs_reconnect(server, false); in cifs_readv_from_socket()
748 spin_unlock(&server->srv_lock); in cifs_readv_from_socket()
756 * CifsNeedReconnect if server hung. in cifs_readv_from_socket()
765 cifs_reconnect(server, false); in cifs_readv_from_socket()
773 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf, in cifs_read_from_socket() argument
781 return cifs_readv_from_socket(server, &smb_msg); in cifs_read_from_socket()
785 cifs_discard_from_socket(struct TCP_Server_Info *server, size_t to_read) in cifs_discard_from_socket() argument
796 return cifs_readv_from_socket(server, &smb_msg); in cifs_discard_from_socket()
800 cifs_read_iter_from_socket(struct TCP_Server_Info *server, struct iov_iter *iter, in cifs_read_iter_from_socket() argument
806 return cifs_readv_from_socket(server, &smb_msg); in cifs_read_iter_from_socket()
810 is_smb_response(struct TCP_Server_Info *server, unsigned char type) in is_smb_response() argument
823 * RFC 1002 session keep alive can sent by the server only when in is_smb_response()
837 cifs_reconnect(server, true); in is_smb_response()
845 * Windows Server 2022 when connecting via port 139. in is_smb_response()
852 if (!cifs_rdma_enabled(server) && in is_smb_response()
853 server->tcpStatus == CifsInNegotiate && in is_smb_response()
854 !server->with_rfc1001 && in is_smb_response()
855 server->rfc1001_sessinit != 0) { in is_smb_response()
864 * server, so reconnect would not signal connection in is_smb_response()
866 * server there should be exactly one pending mid in is_smb_response()
869 spin_lock(&server->mid_lock); in is_smb_response()
870 list_for_each_entry_safe(mid, nmid, &server->pending_mid_q, qhead) { in is_smb_response()
875 spin_unlock(&server->mid_lock); in is_smb_response()
878 server->with_rfc1001 = true; in is_smb_response()
879 rc = cifs_reconnect_once(server); in is_smb_response()
921 cifs_reconnect(server, true); in is_smb_response()
926 cifs_reconnect(server, true); in is_smb_response()
930 cifs_reconnect(server, true); in is_smb_response()
942 spin_lock(&mid->server->mid_lock); in dequeue_mid()
952 spin_unlock(&mid->server->mid_lock); in dequeue_mid()
957 spin_unlock(&mid->server->mid_lock); in dequeue_mid()
962 smb2_get_credits_from_hdr(char *buffer, struct TCP_Server_Info *server) in smb2_get_credits_from_hdr() argument
969 if (is_smb1(server)) in smb2_get_credits_from_hdr()
976 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server, in handle_mid() argument
979 if (server->ops->check_trans2 && in handle_mid()
980 server->ops->check_trans2(mid, server, buf, malformed)) in handle_mid()
982 mid->credits_received = smb2_get_credits_from_hdr(buf, server); in handle_mid()
984 mid->large_buf = server->large_buf; in handle_mid()
988 if (server->large_buf) in handle_mid()
989 server->bigbuf = NULL; in handle_mid()
991 server->smallbuf = NULL; in handle_mid()
997 cifs_enable_signing(struct TCP_Server_Info *server, bool mnt_sign_required) in cifs_enable_signing() argument
999 bool srv_sign_required = server->sec_mode & server->vals->signing_required; in cifs_enable_signing()
1000 bool srv_sign_enabled = server->sec_mode & server->vals->signing_enabled; in cifs_enable_signing()
1018 /* If server requires signing, does client allow it? */ in cifs_enable_signing()
1021 cifs_dbg(VFS, "Server requires signing, but it's disabled in SecurityFlags!\n"); in cifs_enable_signing()
1024 server->sign = true; in cifs_enable_signing()
1027 /* If client requires signing, does server allow it? */ in cifs_enable_signing()
1030 cifs_dbg(VFS, "Server does not support signing!\n"); in cifs_enable_signing()
1033 server->sign = true; in cifs_enable_signing()
1036 if (cifs_rdma_enabled(server) && server->sign) in cifs_enable_signing()
1043 clean_demultiplex_info(struct TCP_Server_Info *server) in clean_demultiplex_info() argument
1048 spin_lock(&server->srv_lock); in clean_demultiplex_info()
1049 list_del_init(&server->tcp_ses_list); in clean_demultiplex_info()
1050 spin_unlock(&server->srv_lock); in clean_demultiplex_info()
1052 cancel_delayed_work_sync(&server->echo); in clean_demultiplex_info()
1054 spin_lock(&server->srv_lock); in clean_demultiplex_info()
1055 server->tcpStatus = CifsExiting; in clean_demultiplex_info()
1056 spin_unlock(&server->srv_lock); in clean_demultiplex_info()
1057 wake_up_all(&server->response_q); in clean_demultiplex_info()
1060 spin_lock(&server->req_lock); in clean_demultiplex_info()
1061 if (server->credits <= 0) in clean_demultiplex_info()
1062 server->credits = 1; in clean_demultiplex_info()
1063 spin_unlock(&server->req_lock); in clean_demultiplex_info()
1068 * same server - they now will see the session is in exit state and get in clean_demultiplex_info()
1071 wake_up_all(&server->request_q); in clean_demultiplex_info()
1074 if (cifs_rdma_enabled(server)) in clean_demultiplex_info()
1075 smbd_destroy(server); in clean_demultiplex_info()
1076 if (server->ssocket) { in clean_demultiplex_info()
1077 sock_release(server->ssocket); in clean_demultiplex_info()
1078 server->ssocket = NULL; in clean_demultiplex_info()
1081 if (!list_empty(&server->pending_mid_q)) { in clean_demultiplex_info()
1086 spin_lock(&server->mid_lock); in clean_demultiplex_info()
1087 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) { in clean_demultiplex_info()
1095 spin_unlock(&server->mid_lock); in clean_demultiplex_info()
1109 if (!list_empty(&server->pending_mid_q)) { in clean_demultiplex_info()
1126 put_net(cifs_net_ns(server)); in clean_demultiplex_info()
1127 kfree(server->leaf_fullpath); in clean_demultiplex_info()
1128 kfree(server->hostname); in clean_demultiplex_info()
1129 kfree(server); in clean_demultiplex_info()
1137 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid) in standard_receive3() argument
1140 char *buf = server->smallbuf; in standard_receive3()
1141 unsigned int pdu_length = server->pdu_size; in standard_receive3()
1144 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) - in standard_receive3()
1145 HEADER_PREAMBLE_SIZE(server)) { in standard_receive3()
1147 cifs_reconnect(server, true); in standard_receive3()
1153 server->large_buf = true; in standard_receive3()
1154 memcpy(server->bigbuf, buf, server->total_read); in standard_receive3()
1155 buf = server->bigbuf; in standard_receive3()
1159 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1, in standard_receive3()
1160 pdu_length - MID_HEADER_SIZE(server)); in standard_receive3()
1164 server->total_read += length; in standard_receive3()
1166 dump_smb(buf, server->total_read); in standard_receive3()
1168 return cifs_handle_standard(server, mid); in standard_receive3()
1172 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid) in cifs_handle_standard() argument
1174 char *buf = server->large_buf ? server->bigbuf : server->smallbuf; in cifs_handle_standard()
1185 rc = server->ops->check_message(buf, server->total_read, server); in cifs_handle_standard()
1188 min_t(unsigned int, server->total_read, 48)); in cifs_handle_standard()
1190 if (server->ops->is_session_expired && in cifs_handle_standard()
1191 server->ops->is_session_expired(buf)) { in cifs_handle_standard()
1192 cifs_reconnect(server, true); in cifs_handle_standard()
1196 if (server->ops->is_status_pending && in cifs_handle_standard()
1197 server->ops->is_status_pending(buf, server)) in cifs_handle_standard()
1203 handle_mid(mid, server, buf, rc); in cifs_handle_standard()
1208 smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server) in smb2_add_credits_from_hdr() argument
1216 if (is_smb1(server)) in smb2_add_credits_from_hdr()
1220 spin_lock(&server->req_lock); in smb2_add_credits_from_hdr()
1221 server->credits += le16_to_cpu(shdr->CreditRequest); in smb2_add_credits_from_hdr()
1222 scredits = server->credits; in smb2_add_credits_from_hdr()
1223 in_flight = server->in_flight; in smb2_add_credits_from_hdr()
1224 spin_unlock(&server->req_lock); in smb2_add_credits_from_hdr()
1225 wake_up(&server->request_q); in smb2_add_credits_from_hdr()
1227 trace_smb3_hdr_credits(server->CurrentMid, in smb2_add_credits_from_hdr()
1228 server->conn_id, server->hostname, scredits, in smb2_add_credits_from_hdr()
1241 struct TCP_Server_Info *server = p; in cifs_demultiplex_thread() local
1260 while (server->tcpStatus != CifsExiting) { in cifs_demultiplex_thread()
1264 if (!allocate_buffers(server)) in cifs_demultiplex_thread()
1267 server->large_buf = false; in cifs_demultiplex_thread()
1268 buf = server->smallbuf; in cifs_demultiplex_thread()
1271 length = cifs_read_from_socket(server, buf, pdu_length); in cifs_demultiplex_thread()
1275 if (is_smb1(server)) in cifs_demultiplex_thread()
1276 server->total_read = length; in cifs_demultiplex_thread()
1278 server->total_read = 0; in cifs_demultiplex_thread()
1287 if (!is_smb_response(server, buf[0])) in cifs_demultiplex_thread()
1292 server->pdu_size = pdu_length; in cifs_demultiplex_thread()
1295 if (server->pdu_size < MID_HEADER_SIZE(server)) { in cifs_demultiplex_thread()
1297 server->pdu_size); in cifs_demultiplex_thread()
1298 cifs_reconnect(server, true); in cifs_demultiplex_thread()
1303 length = cifs_read_from_socket(server, in cifs_demultiplex_thread()
1304 buf + HEADER_PREAMBLE_SIZE(server), in cifs_demultiplex_thread()
1305 MID_HEADER_SIZE(server)); in cifs_demultiplex_thread()
1308 server->total_read += length; in cifs_demultiplex_thread()
1310 if (server->ops->next_header) { in cifs_demultiplex_thread()
1311 if (server->ops->next_header(server, buf, &next_offset)) { in cifs_demultiplex_thread()
1314 cifs_reconnect(server, true); in cifs_demultiplex_thread()
1318 server->pdu_size = next_offset; in cifs_demultiplex_thread()
1325 if (server->ops->is_transform_hdr && in cifs_demultiplex_thread()
1326 server->ops->receive_transform && in cifs_demultiplex_thread()
1327 server->ops->is_transform_hdr(buf)) { in cifs_demultiplex_thread()
1328 length = server->ops->receive_transform(server, in cifs_demultiplex_thread()
1333 mids[0] = server->ops->find_mid(server, buf); in cifs_demultiplex_thread()
1338 length = standard_receive3(server, mids[0]); in cifs_demultiplex_thread()
1340 length = mids[0]->receive(server, mids[0]); in cifs_demultiplex_thread()
1350 if (server->ops->is_status_io_timeout && in cifs_demultiplex_thread()
1351 server->ops->is_status_io_timeout(buf)) { in cifs_demultiplex_thread()
1363 server->lstrp = jiffies; in cifs_demultiplex_thread()
1367 mids[i]->resp_buf_size = server->pdu_size; in cifs_demultiplex_thread()
1370 if (server->ops->is_network_name_deleted && in cifs_demultiplex_thread()
1371 server->ops->is_network_name_deleted(bufs[i], in cifs_demultiplex_thread()
1372 server)) { in cifs_demultiplex_thread()
1382 } else if (server->ops->is_oplock_break && in cifs_demultiplex_thread()
1383 server->ops->is_oplock_break(bufs[i], in cifs_demultiplex_thread()
1384 server)) { in cifs_demultiplex_thread()
1385 smb2_add_credits_from_hdr(bufs[i], server); in cifs_demultiplex_thread()
1391 HEADER_SIZE(server)); in cifs_demultiplex_thread()
1392 smb2_add_credits_from_hdr(bufs[i], server); in cifs_demultiplex_thread()
1394 if (server->ops->dump_detail) in cifs_demultiplex_thread()
1395 server->ops->dump_detail(bufs[i], in cifs_demultiplex_thread()
1396 server); in cifs_demultiplex_thread()
1397 cifs_dump_mids(server); in cifs_demultiplex_thread()
1402 if (pdu_length > server->pdu_size) { in cifs_demultiplex_thread()
1403 if (!allocate_buffers(server)) in cifs_demultiplex_thread()
1405 pdu_length -= server->pdu_size; in cifs_demultiplex_thread()
1406 server->total_read = 0; in cifs_demultiplex_thread()
1407 server->large_buf = false; in cifs_demultiplex_thread()
1408 buf = server->smallbuf; in cifs_demultiplex_thread()
1414 cifs_reconnect(server, true); in cifs_demultiplex_thread()
1419 cifs_buf_release(server->bigbuf); in cifs_demultiplex_thread()
1420 if (server->smallbuf) /* no sense logging a debug message if NULL */ in cifs_demultiplex_thread()
1421 cifs_small_buf_release(server->smallbuf); in cifs_demultiplex_thread()
1423 task_to_wake = xchg(&server->tsk, NULL); in cifs_demultiplex_thread()
1424 clean_demultiplex_info(server); in cifs_demultiplex_thread()
1426 /* if server->tsk was NULL then wait for a signal before exiting */ in cifs_demultiplex_thread()
1522 * families of server and addr are equal.
1525 match_port(struct TCP_Server_Info *server, struct sockaddr *addr) in match_port() argument
1530 if (server->rdma) in match_port()
1535 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port; in match_port()
1539 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port; in match_port()
1558 static bool match_server_address(struct TCP_Server_Info *server, struct sockaddr *addr) in match_server_address() argument
1560 if (!cifs_match_ipaddr(addr, (struct sockaddr *)&server->dstaddr)) in match_server_address()
1567 match_security(struct TCP_Server_Info *server, struct smb3_fs_context *ctx) in match_security() argument
1574 if (server->ops->select_sectype(server, ctx->sectype) in match_security()
1581 * the server->sign had better be too. in match_security()
1583 if (ctx->sign && !server->sign) in match_security()
1590 static int match_server(struct TCP_Server_Info *server, in match_server() argument
1596 lockdep_assert_held(&server->srv_lock); in match_server()
1601 /* this server does not share socket */ in match_server()
1602 if (server->nosharesock) in match_server()
1605 if (!match_super && (ctx->dfs_conn || server->dfs_conn)) in match_server()
1610 if (server->vals->protocol_id < SMB30_PROT_ID) in match_server()
1614 if (server->vals->protocol_id < SMB21_PROT_ID) in match_server()
1616 } else if ((server->vals != ctx->vals) || (server->ops != ctx->ops)) in match_server()
1619 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns)) in match_server()
1623 (struct sockaddr *)&server->srcaddr)) in match_server()
1626 if (strcasecmp(server->hostname, ctx->server_hostname) || in match_server()
1627 !match_server_address(server, addr) || in match_server()
1628 !match_port(server, addr)) in match_server()
1631 if (!match_security(server, ctx)) in match_server()
1634 if (server->echo_interval != ctx->echo_interval * HZ) in match_server()
1637 if (server->rdma != ctx->rdma) in match_server()
1640 if (server->ignore_signature != ctx->ignore_signature) in match_server()
1643 if (server->min_offload != ctx->min_offload) in match_server()
1646 if (server->retrans != ctx->retrans) in match_server()
1655 struct TCP_Server_Info *server; in cifs_find_tcp_session() local
1658 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) { in cifs_find_tcp_session()
1659 spin_lock(&server->srv_lock); in cifs_find_tcp_session()
1664 if (SERVER_IS_CHAN(server) || in cifs_find_tcp_session()
1665 !match_server(server, ctx, false)) { in cifs_find_tcp_session()
1666 spin_unlock(&server->srv_lock); in cifs_find_tcp_session()
1669 spin_unlock(&server->srv_lock); in cifs_find_tcp_session()
1671 ++server->srv_count; in cifs_find_tcp_session()
1673 cifs_dbg(FYI, "Existing tcp session with server found\n"); in cifs_find_tcp_session()
1674 return server; in cifs_find_tcp_session()
1681 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect) in cifs_put_tcp_session() argument
1686 if (--server->srv_count > 0) { in cifs_put_tcp_session()
1692 WARN_ON(server->srv_count < 0); in cifs_put_tcp_session()
1694 list_del_init(&server->tcp_ses_list); in cifs_put_tcp_session()
1697 cancel_delayed_work_sync(&server->echo); in cifs_put_tcp_session()
1703 * that reconnect work does nothing with server pointer after in cifs_put_tcp_session()
1706 cancel_delayed_work(&server->reconnect); in cifs_put_tcp_session()
1708 cancel_delayed_work_sync(&server->reconnect); in cifs_put_tcp_session()
1710 /* For secondary channels, we pick up ref-count on the primary server */ in cifs_put_tcp_session()
1711 if (SERVER_IS_CHAN(server)) in cifs_put_tcp_session()
1712 cifs_put_tcp_session(server->primary_server, from_reconnect); in cifs_put_tcp_session()
1714 spin_lock(&server->srv_lock); in cifs_put_tcp_session()
1715 server->tcpStatus = CifsExiting; in cifs_put_tcp_session()
1716 spin_unlock(&server->srv_lock); in cifs_put_tcp_session()
1718 cifs_crypto_secmech_release(server); in cifs_put_tcp_session()
1720 kfree_sensitive(server->session_key.response); in cifs_put_tcp_session()
1721 server->session_key.response = NULL; in cifs_put_tcp_session()
1722 server->session_key.len = 0; in cifs_put_tcp_session()
1724 task = xchg(&server->tsk, NULL); in cifs_put_tcp_session()
1918 struct TCP_Server_Info *server = ses->server; in match_session() local
1931 ctx_sec = server->ops->select_sectype(server, ctx->sectype); in match_session()
1932 ses_sec = server->ops->select_sectype(server, ses->sectype); in match_session()
2012 struct TCP_Server_Info *server = ses->server; in cifs_setup_ipc() local
2019 if (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION) in cifs_setup_ipc()
2023 "IPC: server doesn't support encryption\n"); in cifs_setup_ipc()
2033 spin_lock(&server->srv_lock); in cifs_setup_ipc()
2034 scnprintf(unc, sizeof(unc), "\\\\%s\\IPC$", server->hostname); in cifs_setup_ipc()
2035 spin_unlock(&server->srv_lock); in cifs_setup_ipc()
2041 rc = server->ops->tree_connect(xid, ses, unc, tcon, ctx->local_nls); in cifs_setup_ipc()
2061 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *ctx) in cifs_find_smb_ses() argument
2066 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) { in cifs_find_smb_ses()
2090 struct TCP_Server_Info *server = ses->server; in __cifs_put_smb_ses() local
2111 cifs_chan_clear_need_reconnect(ses, server); in __cifs_put_smb_ses()
2114 do_logoff = ses->ses_status == SES_GOOD && server->ops->logoff; in __cifs_put_smb_ses()
2122 * On session close, the IPC is closed and the server must release all in __cifs_put_smb_ses()
2125 * Besides, it will make the server to not close durable and resilient in __cifs_put_smb_ses()
2132 rc = server->ops->logoff(xid, ses); in __cifs_put_smb_ses()
2148 cifs_put_tcp_session(ses->chans[i].server, 0); in __cifs_put_smb_ses()
2149 ses->chans[i].server = NULL; in __cifs_put_smb_ses()
2155 ses->chans[0].server = NULL; in __cifs_put_smb_ses()
2159 cifs_put_tcp_session(server, 0); in __cifs_put_smb_ses()
2177 struct TCP_Server_Info *server = ses->server; in cifs_set_cifscreds() local
2187 switch (server->dstaddr.ss_family) { in cifs_set_cifscreds()
2189 sa = (struct sockaddr_in *)&server->dstaddr; in cifs_set_cifscreds()
2193 sa6 = (struct sockaddr_in6 *)&server->dstaddr; in cifs_set_cifscreds()
2198 server->dstaddr.ss_family); in cifs_set_cifscreds()
2318 * cifs_get_smb_ses - get a session matching @ctx data from @server
2319 * @server: server to setup the session to
2323 * already got a server reference (server refcount +1). See
2327 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *ctx) in cifs_get_smb_ses() argument
2329 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr; in cifs_get_smb_ses()
2330 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr; in cifs_get_smb_ses()
2339 ses = cifs_find_smb_ses(server, ctx); in cifs_get_smb_ses()
2345 if (cifs_chan_needs_reconnect(ses, server)) { in cifs_get_smb_ses()
2352 rc = cifs_negotiate_protocol(xid, ses, server); in cifs_get_smb_ses()
2361 rc = cifs_setup_session(xid, ses, server, in cifs_get_smb_ses()
2383 /* existing SMB ses has a server reference already */ in cifs_get_smb_ses()
2384 cifs_put_tcp_session(server, 0); in cifs_get_smb_ses()
2396 /* new SMB session uses our server ref */ in cifs_get_smb_ses()
2397 ses->server = server; in cifs_get_smb_ses()
2398 if (server->dstaddr.ss_family == AF_INET6) in cifs_get_smb_ses()
2467 /* add server as first channel */ in cifs_get_smb_ses()
2469 ses->chans[0].server = server; in cifs_get_smb_ses()
2477 rc = cifs_negotiate_protocol(xid, ses, server); in cifs_get_smb_ses()
2479 rc = cifs_setup_session(xid, ses, server, ctx->local_nls); in cifs_get_smb_ses()
2506 list_add(&ses->smb_ses_list, &server->smb_ses_list); in cifs_get_smb_ses()
2524 struct TCP_Server_Info *server = tcon->ses->server; in match_tcon() local
2534 } else if (!server->leaf_fullpath && in match_tcon()
2627 if (ses->server->ops->tree_disconnect) in cifs_put_tcon()
2628 ses->server->ops->tree_disconnect(xid, tcon); in cifs_put_tcon()
2679 if (!ses->server->ops->tree_connect) { in cifs_get_tcon()
2684 if (ses->server->dialect >= SMB20_PROT_ID && in cifs_get_tcon()
2685 (ses->server->capabilities & SMB2_GLOBAL_CAP_DIRECTORY_LEASING)) in cifs_get_tcon()
2697 if (ses->server->vals->protocol_id == 0) { in cifs_get_tcon()
2707 if (ses->server->vals->protocol_id == 0) { in cifs_get_tcon()
2726 if (ses->server->vals->protocol_id == 0) { in cifs_get_tcon()
2731 } else if (tcon->ses->server->capabilities & in cifs_get_tcon()
2742 if (ses->server->posix_ext_supported) { in cifs_get_tcon()
2745 } else if ((ses->server->vals->protocol_id == SMB311_PROT_ID) || in cifs_get_tcon()
2746 (strcmp(ses->server->vals->version_string, in cifs_get_tcon()
2748 (strcmp(ses->server->vals->version_string, in cifs_get_tcon()
2750 cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions\n"); in cifs_get_tcon()
2753 } else if (ses->server->vals->protocol_id == SMB10_PROT_ID) in cifs_get_tcon()
2757 cifs_dbg(VFS, "SMB1 Unix Extensions not supported by server\n"); in cifs_get_tcon()
2769 rc = ses->server->ops->tree_connect(xid, ses, ctx->UNC, tcon, in cifs_get_tcon()
2779 if (ses->server->vals->protocol_id == 0) { in cifs_get_tcon()
2784 } else if (ses->server->capabilities & in cifs_get_tcon()
2794 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES) in cifs_get_tcon()
2799 if (ses->server->vals->protocol_id == 0) { in cifs_get_tcon()
2810 if (ses->server->vals->protocol_id >= SMB30_PROT_ID) { in cifs_get_tcon()
2845 if (ses->server->vals->protocol_id == 0) { in cifs_get_tcon()
2856 * resources mounted more than once to the same server share the last in cifs_get_tcon()
2870 if (ses->server->dialect >= SMB30_PROT_ID && in cifs_get_tcon()
2871 (ses->server->capabilities & SMB2_GLOBAL_CAP_MULTI_CHANNEL)) { in cifs_get_tcon()
3015 tcp_srv = ses->server; in cifs_match_super()
3093 bind_socket(struct TCP_Server_Info *server) in bind_socket() argument
3097 if (server->srcaddr.ss_family != AF_UNSPEC) { in bind_socket()
3099 struct socket *socket = server->ssocket; in bind_socket()
3102 (struct sockaddr *) &server->srcaddr, in bind_socket()
3103 sizeof(server->srcaddr)); in bind_socket()
3108 saddr4 = (struct sockaddr_in *)&server->srcaddr; in bind_socket()
3109 saddr6 = (struct sockaddr_in6 *)&server->srcaddr; in bind_socket()
3122 smb_recv_kvec(struct TCP_Server_Info *server, struct msghdr *msg, size_t *recv) in smb_recv_kvec() argument
3126 int msg_flags = server->noblocksnd ? MSG_DONTWAIT : 0; in smb_recv_kvec()
3131 rc = sock_recvmsg(server->ssocket, msg, msg_flags); in smb_recv_kvec()
3135 (!server->noblocksnd && (retries > 2))) { in smb_recv_kvec()
3137 server->ssocket); in smb_recv_kvec()
3160 ip_rfc1001_connect(struct TCP_Server_Info *server) in ip_rfc1001_connect() argument
3178 if (server->server_RFC1001_name[0] != 0) in ip_rfc1001_connect()
3180 server->server_RFC1001_name, in ip_rfc1001_connect()
3190 if (server->workstation_RFC1001_name[0] != 0) in ip_rfc1001_connect()
3192 server->workstation_RFC1001_name, in ip_rfc1001_connect()
3211 rc = smb_send_kvec(server, &msg, &sent); in ip_rfc1001_connect()
3216 * RFC1001 layer in at least one server requires very short break before in ip_rfc1001_connect()
3219 * before the server sent response for SESSION_REQUEST packet. So, wait in ip_rfc1001_connect()
3221 * information (e.g. specified server name was incorrect). For example in ip_rfc1001_connect()
3222 * even the latest Windows Server 2022 SMB1 server over port 139 send in ip_rfc1001_connect()
3223 * error if its server name was in SESSION_REQUEST packet incorrect. in ip_rfc1001_connect()
3231 rc = smb_recv_kvec(server, &msg, &recv); in ip_rfc1001_connect()
3251 smb_recv_kvec(server, &msg, &recv) == 0 && in ip_rfc1001_connect()
3257 /* server does not listen for specified server name */ in ip_rfc1001_connect()
3260 /* server name is incorrect */ in ip_rfc1001_connect()
3262 cifs_dbg(VFS, "Server rejected NetBIOS servername %.15s\n", in ip_rfc1001_connect()
3263 server->server_RFC1001_name[0] ? in ip_rfc1001_connect()
3264 server->server_RFC1001_name : in ip_rfc1001_connect()
3269 /* client name was not accepted by server */ in ip_rfc1001_connect()
3271 cifs_dbg(VFS, "Server rejected NetBIOS clientname %.15s\n", in ip_rfc1001_connect()
3272 server->workstation_RFC1001_name[0] ? in ip_rfc1001_connect()
3273 server->workstation_RFC1001_name : in ip_rfc1001_connect()
3278 /* remote server resource error */ in ip_rfc1001_connect()
3299 if (smb_recv_kvec(server, &msg, &recv) == 0 && recv == len) { in ip_rfc1001_connect()
3300 cifs_dbg(VFS, "Server wants to redirect connection\n"); in ip_rfc1001_connect()
3307 /* FIXME: Should we automatically redirect to new retarget_resp server? */ in ip_rfc1001_connect()
3314 server->with_rfc1001 = true; in ip_rfc1001_connect()
3319 generic_ip_connect(struct TCP_Server_Info *server) in generic_ip_connect() argument
3327 saddr = (struct sockaddr *) &server->dstaddr; in generic_ip_connect()
3329 if (server->dstaddr.ss_family == AF_INET6) { in generic_ip_connect()
3330 struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)&server->dstaddr; in generic_ip_connect()
3338 struct sockaddr_in *ipv4 = (struct sockaddr_in *)&server->dstaddr; in generic_ip_connect()
3347 if (server->ssocket) { in generic_ip_connect()
3348 socket = server->ssocket; in generic_ip_connect()
3350 struct net *net = cifs_net_ns(server); in generic_ip_connect()
3354 IPPROTO_TCP, &server->ssocket, 1); in generic_ip_connect()
3360 sk = server->ssocket->sk; in generic_ip_connect()
3368 socket = server->ssocket; in generic_ip_connect()
3377 rc = bind_socket(server); in generic_ip_connect()
3390 if (server->noautotune) { in generic_ip_connect()
3397 if (server->tcp_nodelay) in generic_ip_connect()
3405 server->noblockcnt ? O_NONBLOCK : 0); in generic_ip_connect()
3411 if (server->noblockcnt && rc == -EINPROGRESS) in generic_ip_connect()
3414 cifs_dbg(FYI, "Error %d connecting to server\n", rc); in generic_ip_connect()
3415 trace_smb3_connect_err(server->hostname, server->conn_id, &server->dstaddr, rc); in generic_ip_connect()
3417 server->ssocket = NULL; in generic_ip_connect()
3420 trace_smb3_connect_done(server->hostname, server->conn_id, &server->dstaddr); in generic_ip_connect()
3425 * server port (139) and it was not explicitly disabled by mount option in generic_ip_connect()
3428 if (server->with_rfc1001 || in generic_ip_connect()
3429 server->rfc1001_sessinit == 1 || in generic_ip_connect()
3430 (server->rfc1001_sessinit == -1 && sport == htons(RFC1001_PORT))) in generic_ip_connect()
3431 rc = ip_rfc1001_connect(server); in generic_ip_connect()
3437 ip_connect(struct TCP_Server_Info *server) in ip_connect() argument
3440 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr; in ip_connect()
3441 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr; in ip_connect()
3443 if (server->dstaddr.ss_family == AF_INET6) in ip_connect()
3454 rc = generic_ip_connect(server); in ip_connect()
3462 return generic_ip_connect(server); in ip_connect()
3477 * What if we wanted to mount the server share twice once with in reset_cifs_unix_caps()
3498 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap); in reset_cifs_unix_caps()
3516 cifs_dbg(VFS, "server disabled POSIX path support\n"); in reset_cifs_unix_caps()
3567 …cifs_dbg(VFS, "Negotiating Unix capabilities with the server failed. Consider mounting with the Un… in reset_cifs_unix_caps()
3636 else if (mnt_ctx->server) in cifs_mount_put_conns()
3637 cifs_put_tcp_session(mnt_ctx->server, 0); in cifs_mount_put_conns()
3640 mnt_ctx->server = NULL; in cifs_mount_put_conns()
3647 struct TCP_Server_Info *server = NULL; in cifs_mount_get_session() local
3662 server = cifs_get_tcp_session(ctx, NULL); in cifs_mount_get_session()
3663 if (IS_ERR(server)) { in cifs_mount_get_session()
3664 rc = PTR_ERR(server); in cifs_mount_get_session()
3665 server = NULL; in cifs_mount_get_session()
3670 ses = cifs_get_smb_ses(server, ctx); in cifs_mount_get_session()
3677 if ((ctx->persistent == true) && (!(ses->server->capabilities & in cifs_mount_get_session()
3679 cifs_server_dbg(VFS, "persistent handles not supported by server\n"); in cifs_mount_get_session()
3685 mnt_ctx->server = server; in cifs_mount_get_session()
3694 struct TCP_Server_Info *server; in cifs_mount_get_tcon() local
3700 if (WARN_ON_ONCE(!mnt_ctx || !mnt_ctx->server || !mnt_ctx->ses || !mnt_ctx->fs_ctx || in cifs_mount_get_tcon()
3705 server = mnt_ctx->server; in cifs_mount_get_tcon()
3709 /* search for existing tcon to this server share */ in cifs_mount_get_tcon()
3722 /* tell server which Unix caps we support */ in cifs_mount_get_tcon()
3729 spin_lock(&tcon->ses->server->srv_lock); in cifs_mount_get_tcon()
3730 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) && in cifs_mount_get_tcon()
3733 spin_unlock(&tcon->ses->server->srv_lock); in cifs_mount_get_tcon()
3737 spin_unlock(&tcon->ses->server->srv_lock); in cifs_mount_get_tcon()
3740 tcon->unix_ext = 0; /* server does not support them */ in cifs_mount_get_tcon()
3743 if (!tcon->pipe && server->ops->qfs_tcon) { in cifs_mount_get_tcon()
3744 server->ops->qfs_tcon(mnt_ctx->xid, tcon, cifs_sb); in cifs_mount_get_tcon()
3756 cifs_negotiate_iosize(server, cifs_sb->ctx, tcon); in cifs_mount_get_tcon()
3801 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server, in cifs_are_all_path_components_accessible() argument
3816 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, ""); in cifs_are_all_path_components_accessible()
3840 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, in cifs_are_all_path_components_accessible()
3856 struct TCP_Server_Info *server = mnt_ctx->server; in cifs_is_path_remote() local
3862 if (!server->ops->is_path_accessible) in cifs_is_path_remote()
3875 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, in cifs_is_path_remote()
3881 rc = cifs_are_all_path_components_accessible(server, xid, tcon, in cifs_is_path_remote()
3908 * After reconnecting to a different server, unique ids won't match anymore, so we disable in cifs_mount()
3950 if (WARN_ON(!mnt_ctx.server)) in cifs_mount()
4009 smb_buffer->Mid = get_next_mid(ses->server); in CIFSTCon()
4023 if (ses->server->sign) in CIFSTCon()
4037 (/* server len*/ + 256 /* share len */), nls_codepage); in CIFSTCon()
4168 struct TCP_Server_Info *server) in cifs_negotiate_protocol() argument
4173 if (!server->ops->need_neg || !server->ops->negotiate) in cifs_negotiate_protocol()
4178 spin_lock(&server->srv_lock); in cifs_negotiate_protocol()
4179 if (server->tcpStatus != CifsGood && in cifs_negotiate_protocol()
4180 server->tcpStatus != CifsNew && in cifs_negotiate_protocol()
4181 server->tcpStatus != CifsNeedNegotiate) { in cifs_negotiate_protocol()
4182 spin_unlock(&server->srv_lock); in cifs_negotiate_protocol()
4186 if (!server->ops->need_neg(server) && in cifs_negotiate_protocol()
4187 server->tcpStatus == CifsGood) { in cifs_negotiate_protocol()
4188 spin_unlock(&server->srv_lock); in cifs_negotiate_protocol()
4192 server->tcpStatus = CifsInNegotiate; in cifs_negotiate_protocol()
4193 spin_unlock(&server->srv_lock); in cifs_negotiate_protocol()
4195 rc = server->ops->negotiate(xid, ses, server); in cifs_negotiate_protocol()
4205 spin_lock(&server->srv_lock); in cifs_negotiate_protocol()
4206 if (server->tcpStatus == CifsInNegotiate) in cifs_negotiate_protocol()
4207 server->tcpStatus = CifsGood; in cifs_negotiate_protocol()
4210 spin_unlock(&server->srv_lock); in cifs_negotiate_protocol()
4212 spin_lock(&server->srv_lock); in cifs_negotiate_protocol()
4213 if (server->tcpStatus == CifsInNegotiate) in cifs_negotiate_protocol()
4214 server->tcpStatus = CifsNeedNegotiate; in cifs_negotiate_protocol()
4215 spin_unlock(&server->srv_lock); in cifs_negotiate_protocol()
4223 struct TCP_Server_Info *server, in cifs_setup_session() argument
4227 struct TCP_Server_Info *pserver = SERVER_IS_CHAN(server) ? server->primary_server : server; in cifs_setup_session()
4253 cifs_chan_set_in_reconnect(ses, server); in cifs_setup_session()
4266 if (server == pserver) { in cifs_setup_session()
4267 if (server->dstaddr.ss_family == AF_INET6) in cifs_setup_session()
4274 ses->capabilities = server->capabilities; in cifs_setup_session()
4276 ses->capabilities &= (~server->vals->cap_unix); in cifs_setup_session()
4279 * Check if the server supports specified encoding mode. in cifs_setup_session()
4283 if (ses->unicode == 1 && server->vals->cap_unicode != 0 && in cifs_setup_session()
4284 !(server->capabilities & server->vals->cap_unicode)) { in cifs_setup_session()
4285 cifs_dbg(VFS, "Server does not support mounting in UNICODE mode\n"); in cifs_setup_session()
4287 } else if (ses->unicode == 0 && server->vals->cap_unicode == 0) { in cifs_setup_session()
4288 cifs_dbg(VFS, "Server does not support mounting in non-UNICODE mode\n"); in cifs_setup_session()
4295 ses->capabilities &= (~server->vals->cap_unicode); in cifs_setup_session()
4308 server->sec_mode, server->capabilities, server->timeAdj); in cifs_setup_session()
4311 if (server->ops->sess_setup) in cifs_setup_session()
4312 rc = server->ops->sess_setup(xid, ses, server, nls_info); in cifs_setup_session()
4323 cifs_chan_clear_in_reconnect(ses, server); in cifs_setup_session()
4331 cifs_chan_clear_in_reconnect(ses, server); in cifs_setup_session()
4332 cifs_chan_clear_need_reconnect(ses, server); in cifs_setup_session()
4395 ++master_tcon->ses->server->srv_count; in cifs_construct_tcon()
4398 ses = cifs_get_smb_ses(master_tcon->ses->server, ctx); in cifs_construct_tcon()
4401 cifs_put_tcp_session(master_tcon->ses->server, 0); in cifs_construct_tcon()
4645 const struct smb_version_operations *ops = tcon->ses->server->ops; in cifs_tree_connect()