Lines Matching full:server

61 /* Drop the connection to not overload the server */
64 static int ip_connect(struct TCP_Server_Info *server);
65 static int generic_ip_connect(struct TCP_Server_Info *server);
73 * This should be called with server->srv_mutex held.
75 static int reconn_set_ipaddr_from_hostname(struct TCP_Server_Info *server) in reconn_set_ipaddr_from_hostname() argument
83 if (!server->hostname) in reconn_set_ipaddr_from_hostname()
86 len = strlen(server->hostname) + 3; in reconn_set_ipaddr_from_hostname()
93 scnprintf(unc, len, "\\\\%s", server->hostname); in reconn_set_ipaddr_from_hostname()
99 cifs_dbg(FYI, "%s: failed to resolve server part of %s to IP: %d\n", in reconn_set_ipaddr_from_hostname()
100 __func__, server->hostname, rc); in reconn_set_ipaddr_from_hostname()
105 rc = cifs_convert_address((struct sockaddr *)&server->dstaddr, ipaddr, in reconn_set_ipaddr_from_hostname()
125 mod_delayed_work(cifsiod_wq, &server->resolve, (ttl * HZ)); in reconn_set_ipaddr_from_hostname()
134 struct TCP_Server_Info *server = container_of(work, in cifs_resolve_server() local
137 mutex_lock(&server->srv_mutex); in cifs_resolve_server()
142 rc = reconn_set_ipaddr_from_hostname(server); in cifs_resolve_server()
148 mutex_unlock(&server->srv_mutex); in cifs_resolve_server()
152 /* These functions must be called with server->srv_mutex held */
153 static void reconn_set_next_dfs_target(struct TCP_Server_Info *server, in reconn_set_next_dfs_target() argument
176 kfree(server->hostname); in reconn_set_next_dfs_target()
178 server->hostname = extract_hostname(name); in reconn_set_next_dfs_target()
179 if (IS_ERR(server->hostname)) { in reconn_set_next_dfs_target()
182 __func__, PTR_ERR(server->hostname)); in reconn_set_next_dfs_target()
186 rc = reconn_set_ipaddr_from_hostname(server); in reconn_set_next_dfs_target()
211 cifs_reconnect(struct TCP_Server_Info *server) in cifs_reconnect() argument
227 server->nr_targets = 1; in cifs_reconnect()
230 sb = cifs_get_tcp_super(server); in cifs_reconnect()
246 server->nr_targets = dfs_cache_get_nr_tgts(&tgt_list); in cifs_reconnect()
250 server->nr_targets); in cifs_reconnect()
253 if (server->tcpStatus == CifsExiting) { in cifs_reconnect()
261 wake_up(&server->response_q); in cifs_reconnect()
264 server->tcpStatus = CifsNeedReconnect; in cifs_reconnect()
266 server->maxBuf = 0; in cifs_reconnect()
267 server->max_read = 0; in cifs_reconnect()
270 trace_smb3_reconnect(server->CurrentMid, server->conn_id, server->hostname); in cifs_reconnect()
277 list_for_each(tmp, &server->smb_ses_list) { in cifs_reconnect()
291 mutex_lock(&server->srv_mutex); in cifs_reconnect()
292 if (server->ssocket) { in cifs_reconnect()
294 server->ssocket->state, server->ssocket->flags); in cifs_reconnect()
295 kernel_sock_shutdown(server->ssocket, SHUT_WR); in cifs_reconnect()
297 server->ssocket->state, server->ssocket->flags); in cifs_reconnect()
298 sock_release(server->ssocket); in cifs_reconnect()
299 server->ssocket = NULL; in cifs_reconnect()
301 server->sequence_number = 0; in cifs_reconnect()
302 server->session_estab = false; in cifs_reconnect()
303 kfree(server->session_key.response); in cifs_reconnect()
304 server->session_key.response = NULL; in cifs_reconnect()
305 server->session_key.len = 0; in cifs_reconnect()
306 server->lstrp = jiffies; in cifs_reconnect()
312 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) { in cifs_reconnect()
321 mutex_unlock(&server->srv_mutex); in cifs_reconnect()
331 if (cifs_rdma_enabled(server)) { in cifs_reconnect()
332 mutex_lock(&server->srv_mutex); in cifs_reconnect()
333 smbd_destroy(server); in cifs_reconnect()
334 mutex_unlock(&server->srv_mutex); in cifs_reconnect()
340 mutex_lock(&server->srv_mutex); in cifs_reconnect()
343 if (!cifs_swn_set_server_dstaddr(server)) { in cifs_reconnect()
347 * Set up next DFS target server (if any) for reconnect. If DFS in cifs_reconnect()
348 * feature is disabled, then we will retry last server we in cifs_reconnect()
351 reconn_set_next_dfs_target(server, cifs_sb, &tgt_list, &tgt_it); in cifs_reconnect()
357 rc = reconn_set_ipaddr_from_hostname(server); in cifs_reconnect()
370 if (cifs_rdma_enabled(server)) in cifs_reconnect()
371 rc = smbd_reconnect(server); in cifs_reconnect()
373 rc = generic_ip_connect(server); in cifs_reconnect()
376 mutex_unlock(&server->srv_mutex); in cifs_reconnect()
380 set_credits(server, 1); in cifs_reconnect()
382 if (server->tcpStatus != CifsExiting) in cifs_reconnect()
383 server->tcpStatus = CifsNeedNegotiate; in cifs_reconnect()
385 cifs_swn_reset_server_dstaddr(server); in cifs_reconnect()
386 mutex_unlock(&server->srv_mutex); in cifs_reconnect()
388 } while (server->tcpStatus == CifsNeedReconnect); in cifs_reconnect()
403 if (server->tcpStatus == CifsNeedNegotiate) in cifs_reconnect()
404 mod_delayed_work(cifsiod_wq, &server->echo, 0); in cifs_reconnect()
406 wake_up(&server->response_q); in cifs_reconnect()
414 struct TCP_Server_Info *server = container_of(work, in cifs_echo_request() local
422 if (server->tcpStatus == CifsNeedReconnect || in cifs_echo_request()
423 server->tcpStatus == CifsExiting || in cifs_echo_request()
424 server->tcpStatus == CifsNew || in cifs_echo_request()
425 (server->ops->can_echo && !server->ops->can_echo(server)) || in cifs_echo_request()
426 time_before(jiffies, server->lstrp + server->echo_interval - HZ)) in cifs_echo_request()
429 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS; in cifs_echo_request()
431 cifs_dbg(FYI, "Unable to send echo request to server: %s\n", in cifs_echo_request()
432 server->hostname); in cifs_echo_request()
438 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval); in cifs_echo_request()
442 allocate_buffers(struct TCP_Server_Info *server) in allocate_buffers() argument
444 if (!server->bigbuf) { in allocate_buffers()
445 server->bigbuf = (char *)cifs_buf_get(); in allocate_buffers()
446 if (!server->bigbuf) { in allocate_buffers()
452 } else if (server->large_buf) { in allocate_buffers()
454 memset(server->bigbuf, 0, HEADER_SIZE(server)); in allocate_buffers()
457 if (!server->smallbuf) { in allocate_buffers()
458 server->smallbuf = (char *)cifs_small_buf_get(); in allocate_buffers()
459 if (!server->smallbuf) { in allocate_buffers()
468 memset(server->smallbuf, 0, HEADER_SIZE(server)); in allocate_buffers()
475 server_unresponsive(struct TCP_Server_Info *server) in server_unresponsive() argument
488 if ((server->tcpStatus == CifsGood || in server_unresponsive()
489 server->tcpStatus == CifsNeedNegotiate) && in server_unresponsive()
490 (!server->ops->can_echo || server->ops->can_echo(server)) && in server_unresponsive()
491 time_after(jiffies, server->lstrp + 3 * server->echo_interval)) { in server_unresponsive()
493 (3 * server->echo_interval) / HZ); in server_unresponsive()
494 cifs_reconnect(server); in server_unresponsive()
502 zero_credits(struct TCP_Server_Info *server) in zero_credits() argument
506 spin_lock(&server->req_lock); in zero_credits()
507 val = server->credits + server->echo_credits + server->oplock_credits; in zero_credits()
508 if (server->in_flight == 0 && val == 0) { in zero_credits()
509 spin_unlock(&server->req_lock); in zero_credits()
512 spin_unlock(&server->req_lock); in zero_credits()
517 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg) in cifs_readv_from_socket() argument
529 if (zero_credits(server)) { in cifs_readv_from_socket()
530 cifs_reconnect(server); in cifs_readv_from_socket()
534 if (server_unresponsive(server)) in cifs_readv_from_socket()
536 if (cifs_rdma_enabled(server) && server->smbd_conn) in cifs_readv_from_socket()
537 length = smbd_recv(server->smbd_conn, smb_msg); in cifs_readv_from_socket()
539 length = sock_recvmsg(server->ssocket, smb_msg, 0); in cifs_readv_from_socket()
541 if (server->tcpStatus == CifsExiting) in cifs_readv_from_socket()
544 if (server->tcpStatus == CifsNeedReconnect) { in cifs_readv_from_socket()
545 cifs_reconnect(server); in cifs_readv_from_socket()
555 * CifsNeedReconnect if server hung. in cifs_readv_from_socket()
564 cifs_reconnect(server); in cifs_readv_from_socket()
572 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf, in cifs_read_from_socket() argument
579 return cifs_readv_from_socket(server, &smb_msg); in cifs_read_from_socket()
583 cifs_discard_from_socket(struct TCP_Server_Info *server, size_t to_read) in cifs_discard_from_socket() argument
596 return cifs_readv_from_socket(server, &smb_msg); in cifs_discard_from_socket()
600 cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page, in cifs_read_page_from_socket() argument
607 return cifs_readv_from_socket(server, &smb_msg); in cifs_read_page_from_socket()
611 is_smb_response(struct TCP_Server_Info *server, unsigned char type) in is_smb_response() argument
634 /* give server a second to clean up */ in is_smb_response()
642 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT); in is_smb_response()
643 cifs_reconnect(server); in is_smb_response()
647 cifs_reconnect(server); in is_smb_response()
678 smb2_get_credits_from_hdr(char *buffer, struct TCP_Server_Info *server) in smb2_get_credits_from_hdr() argument
685 if (server->vals->header_preamble_size) in smb2_get_credits_from_hdr()
692 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server, in handle_mid() argument
695 if (server->ops->check_trans2 && in handle_mid()
696 server->ops->check_trans2(mid, server, buf, malformed)) in handle_mid()
698 mid->credits_received = smb2_get_credits_from_hdr(buf, server); in handle_mid()
700 mid->large_buf = server->large_buf; in handle_mid()
704 if (server->large_buf) in handle_mid()
705 server->bigbuf = NULL; in handle_mid()
707 server->smallbuf = NULL; in handle_mid()
712 static void clean_demultiplex_info(struct TCP_Server_Info *server) in clean_demultiplex_info() argument
718 list_del_init(&server->tcp_ses_list); in clean_demultiplex_info()
721 cancel_delayed_work_sync(&server->echo); in clean_demultiplex_info()
722 cancel_delayed_work_sync(&server->resolve); in clean_demultiplex_info()
725 server->tcpStatus = CifsExiting; in clean_demultiplex_info()
727 wake_up_all(&server->response_q); in clean_demultiplex_info()
730 spin_lock(&server->req_lock); in clean_demultiplex_info()
731 if (server->credits <= 0) in clean_demultiplex_info()
732 server->credits = 1; in clean_demultiplex_info()
733 spin_unlock(&server->req_lock); in clean_demultiplex_info()
738 * same server - they now will see the session is in exit state and get in clean_demultiplex_info()
741 wake_up_all(&server->request_q); in clean_demultiplex_info()
744 if (cifs_rdma_enabled(server)) in clean_demultiplex_info()
745 smbd_destroy(server); in clean_demultiplex_info()
746 if (server->ssocket) { in clean_demultiplex_info()
747 sock_release(server->ssocket); in clean_demultiplex_info()
748 server->ssocket = NULL; in clean_demultiplex_info()
751 if (!list_empty(&server->pending_mid_q)) { in clean_demultiplex_info()
758 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) { in clean_demultiplex_info()
780 if (!list_empty(&server->pending_mid_q)) { in clean_demultiplex_info()
797 kfree(server->hostname); in clean_demultiplex_info()
798 kfree(server); in clean_demultiplex_info()
806 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid) in standard_receive3() argument
809 char *buf = server->smallbuf; in standard_receive3()
810 unsigned int pdu_length = server->pdu_size; in standard_receive3()
813 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) - in standard_receive3()
814 server->vals->header_preamble_size) { in standard_receive3()
816 cifs_reconnect(server); in standard_receive3()
822 server->large_buf = true; in standard_receive3()
823 memcpy(server->bigbuf, buf, server->total_read); in standard_receive3()
824 buf = server->bigbuf; in standard_receive3()
828 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1, in standard_receive3()
829 pdu_length - HEADER_SIZE(server) + 1 in standard_receive3()
830 + server->vals->header_preamble_size); in standard_receive3()
834 server->total_read += length; in standard_receive3()
836 dump_smb(buf, server->total_read); in standard_receive3()
838 return cifs_handle_standard(server, mid); in standard_receive3()
842 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid) in cifs_handle_standard() argument
844 char *buf = server->large_buf ? server->bigbuf : server->smallbuf; in cifs_handle_standard()
856 length = server->ops->check_message(buf, server->total_read, server); in cifs_handle_standard()
859 min_t(unsigned int, server->total_read, 48)); in cifs_handle_standard()
861 if (server->ops->is_session_expired && in cifs_handle_standard()
862 server->ops->is_session_expired(buf)) { in cifs_handle_standard()
863 cifs_reconnect(server); in cifs_handle_standard()
867 if (server->ops->is_status_pending && in cifs_handle_standard()
868 server->ops->is_status_pending(buf, server)) in cifs_handle_standard()
874 handle_mid(mid, server, buf, length); in cifs_handle_standard()
879 smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server) in smb2_add_credits_from_hdr() argument
887 if (server->vals->header_preamble_size) in smb2_add_credits_from_hdr()
891 spin_lock(&server->req_lock); in smb2_add_credits_from_hdr()
892 server->credits += le16_to_cpu(shdr->CreditRequest); in smb2_add_credits_from_hdr()
893 scredits = server->credits; in smb2_add_credits_from_hdr()
894 in_flight = server->in_flight; in smb2_add_credits_from_hdr()
895 spin_unlock(&server->req_lock); in smb2_add_credits_from_hdr()
896 wake_up(&server->request_q); in smb2_add_credits_from_hdr()
898 trace_smb3_add_credits(server->CurrentMid, in smb2_add_credits_from_hdr()
899 server->conn_id, server->hostname, scredits, in smb2_add_credits_from_hdr()
912 struct TCP_Server_Info *server = p; in cifs_demultiplex_thread() local
930 while (server->tcpStatus != CifsExiting) { in cifs_demultiplex_thread()
934 if (!allocate_buffers(server)) in cifs_demultiplex_thread()
937 server->large_buf = false; in cifs_demultiplex_thread()
938 buf = server->smallbuf; in cifs_demultiplex_thread()
941 length = cifs_read_from_socket(server, buf, pdu_length); in cifs_demultiplex_thread()
945 if (server->vals->header_preamble_size == 0) in cifs_demultiplex_thread()
946 server->total_read = 0; in cifs_demultiplex_thread()
948 server->total_read = length; in cifs_demultiplex_thread()
957 if (!is_smb_response(server, buf[0])) in cifs_demultiplex_thread()
960 server->pdu_size = pdu_length; in cifs_demultiplex_thread()
963 if (server->pdu_size < HEADER_SIZE(server) - 1 - in cifs_demultiplex_thread()
964 server->vals->header_preamble_size) { in cifs_demultiplex_thread()
966 server->pdu_size); in cifs_demultiplex_thread()
967 cifs_reconnect(server); in cifs_demultiplex_thread()
972 length = cifs_read_from_socket(server, in cifs_demultiplex_thread()
973 buf + server->vals->header_preamble_size, in cifs_demultiplex_thread()
974 HEADER_SIZE(server) - 1 in cifs_demultiplex_thread()
975 - server->vals->header_preamble_size); in cifs_demultiplex_thread()
978 server->total_read += length; in cifs_demultiplex_thread()
980 if (server->ops->next_header) { in cifs_demultiplex_thread()
981 next_offset = server->ops->next_header(buf); in cifs_demultiplex_thread()
983 server->pdu_size = next_offset; in cifs_demultiplex_thread()
990 if (server->ops->is_transform_hdr && in cifs_demultiplex_thread()
991 server->ops->receive_transform && in cifs_demultiplex_thread()
992 server->ops->is_transform_hdr(buf)) { in cifs_demultiplex_thread()
993 length = server->ops->receive_transform(server, in cifs_demultiplex_thread()
998 mids[0] = server->ops->find_mid(server, buf); in cifs_demultiplex_thread()
1003 length = standard_receive3(server, mids[0]); in cifs_demultiplex_thread()
1005 length = mids[0]->receive(server, mids[0]); in cifs_demultiplex_thread()
1015 if (server->ops->is_status_io_timeout && in cifs_demultiplex_thread()
1016 server->ops->is_status_io_timeout(buf)) { in cifs_demultiplex_thread()
1019 cifs_reconnect(server); in cifs_demultiplex_thread()
1025 server->lstrp = jiffies; in cifs_demultiplex_thread()
1029 mids[i]->resp_buf_size = server->pdu_size; in cifs_demultiplex_thread()
1031 if (bufs[i] && server->ops->is_network_name_deleted) in cifs_demultiplex_thread()
1032 server->ops->is_network_name_deleted(bufs[i], in cifs_demultiplex_thread()
1033 server); in cifs_demultiplex_thread()
1039 } else if (server->ops->is_oplock_break && in cifs_demultiplex_thread()
1040 server->ops->is_oplock_break(bufs[i], in cifs_demultiplex_thread()
1041 server)) { in cifs_demultiplex_thread()
1042 smb2_add_credits_from_hdr(bufs[i], server); in cifs_demultiplex_thread()
1048 HEADER_SIZE(server)); in cifs_demultiplex_thread()
1049 smb2_add_credits_from_hdr(bufs[i], server); in cifs_demultiplex_thread()
1051 if (server->ops->dump_detail) in cifs_demultiplex_thread()
1052 server->ops->dump_detail(bufs[i], in cifs_demultiplex_thread()
1053 server); in cifs_demultiplex_thread()
1054 cifs_dump_mids(server); in cifs_demultiplex_thread()
1059 if (pdu_length > server->pdu_size) { in cifs_demultiplex_thread()
1060 if (!allocate_buffers(server)) in cifs_demultiplex_thread()
1062 pdu_length -= server->pdu_size; in cifs_demultiplex_thread()
1063 server->total_read = 0; in cifs_demultiplex_thread()
1064 server->large_buf = false; in cifs_demultiplex_thread()
1065 buf = server->smallbuf; in cifs_demultiplex_thread()
1071 cifs_buf_release(server->bigbuf); in cifs_demultiplex_thread()
1072 if (server->smallbuf) /* no sense logging a debug message if NULL */ in cifs_demultiplex_thread()
1073 cifs_small_buf_release(server->smallbuf); in cifs_demultiplex_thread()
1075 task_to_wake = xchg(&server->tsk, NULL); in cifs_demultiplex_thread()
1076 clean_demultiplex_info(server); in cifs_demultiplex_thread()
1078 /* if server->tsk was NULL then wait for a signal before exiting */ in cifs_demultiplex_thread()
1121 * families of server and addr are equal.
1124 match_port(struct TCP_Server_Info *server, struct sockaddr *addr) in match_port() argument
1129 if (server->rdma) in match_port()
1134 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port; in match_port()
1138 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port; in match_port()
1158 match_address(struct TCP_Server_Info *server, struct sockaddr *addr, in match_address() argument
1165 (struct sockaddr_in *)&server->dstaddr; in match_address()
1174 (struct sockaddr_in6 *)&server->dstaddr; in match_address()
1188 if (!cifs_match_ipaddr(srcaddr, (struct sockaddr *)&server->srcaddr)) in match_address()
1195 match_security(struct TCP_Server_Info *server, struct smb3_fs_context *ctx) in match_security() argument
1202 if (server->ops->select_sectype(server, ctx->sectype) in match_security()
1209 * the server->sign had better be too. in match_security()
1211 if (ctx->sign && !server->sign) in match_security()
1217 static int match_server(struct TCP_Server_Info *server, struct smb3_fs_context *ctx) in match_server() argument
1226 if (server->vals->protocol_id < SMB30_PROT_ID) in match_server()
1230 if (server->vals->protocol_id < SMB21_PROT_ID) in match_server()
1232 } else if ((server->vals != ctx->vals) || (server->ops != ctx->ops)) in match_server()
1235 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns)) in match_server()
1238 if (!match_address(server, addr, in match_server()
1242 if (!match_port(server, addr)) in match_server()
1245 if (!match_security(server, ctx)) in match_server()
1248 if (server->echo_interval != ctx->echo_interval * HZ) in match_server()
1251 if (server->rdma != ctx->rdma) in match_server()
1254 if (server->ignore_signature != ctx->ignore_signature) in match_server()
1257 if (server->min_offload != ctx->min_offload) in match_server()
1266 struct TCP_Server_Info *server; in cifs_find_tcp_session() local
1269 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) { in cifs_find_tcp_session()
1274 * shares or even links that may connect to same server but having completely in cifs_find_tcp_session()
1277 if (server->is_dfs_conn) in cifs_find_tcp_session()
1284 if (server->is_channel || !match_server(server, ctx)) in cifs_find_tcp_session()
1287 ++server->srv_count; in cifs_find_tcp_session()
1289 cifs_dbg(FYI, "Existing tcp session with server found\n"); in cifs_find_tcp_session()
1290 return server; in cifs_find_tcp_session()
1297 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect) in cifs_put_tcp_session() argument
1302 if (--server->srv_count > 0) { in cifs_put_tcp_session()
1308 WARN_ON(server->srv_count < 0); in cifs_put_tcp_session()
1310 put_net(cifs_net_ns(server)); in cifs_put_tcp_session()
1312 list_del_init(&server->tcp_ses_list); in cifs_put_tcp_session()
1315 cancel_delayed_work_sync(&server->echo); in cifs_put_tcp_session()
1316 cancel_delayed_work_sync(&server->resolve); in cifs_put_tcp_session()
1322 * that reconnect work does nothing with server pointer after in cifs_put_tcp_session()
1325 cancel_delayed_work(&server->reconnect); in cifs_put_tcp_session()
1327 cancel_delayed_work_sync(&server->reconnect); in cifs_put_tcp_session()
1330 server->tcpStatus = CifsExiting; in cifs_put_tcp_session()
1333 cifs_crypto_secmech_release(server); in cifs_put_tcp_session()
1334 cifs_fscache_release_client_cookie(server); in cifs_put_tcp_session()
1336 kfree(server->session_key.response); in cifs_put_tcp_session()
1337 server->session_key.response = NULL; in cifs_put_tcp_session()
1338 server->session_key.len = 0; in cifs_put_tcp_session()
1340 task = xchg(&server->tsk, NULL); in cifs_put_tcp_session()
1566 struct TCP_Server_Info *server = ses->server; in cifs_setup_ipc() local
1573 if (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION) in cifs_setup_ipc()
1577 "IPC: server doesn't support encryption\n"); in cifs_setup_ipc()
1586 scnprintf(unc, sizeof(unc), "\\\\%s\\IPC$", server->hostname); in cifs_setup_ipc()
1592 rc = server->ops->tree_connect(xid, ses, unc, tcon, ctx->local_nls); in cifs_setup_ipc()
1614 * On session close, the IPC is closed and the server must release all tcons of the session.
1617 * Besides, it will make the server to not close durable and resilient files on session close, as
1634 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *ctx) in cifs_find_smb_ses() argument
1639 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) { in cifs_find_smb_ses()
1655 struct TCP_Server_Info *server = ses->server; in cifs_put_smb_ses() local
1683 if (ses->status == CifsExiting && server->ops->logoff) { in cifs_put_smb_ses()
1685 rc = server->ops->logoff(xid, ses); in cifs_put_smb_ses()
1701 cifs_put_tcp_session(ses->chans[i].server, 0); in cifs_put_smb_ses()
1705 cifs_put_tcp_session(server, 0); in cifs_put_smb_ses()
1723 struct TCP_Server_Info *server = ses->server; in cifs_set_cifscreds() local
1733 switch (server->dstaddr.ss_family) { in cifs_set_cifscreds()
1735 sa = (struct sockaddr_in *)&server->dstaddr; in cifs_set_cifscreds()
1739 sa6 = (struct sockaddr_in6 *)&server->dstaddr; in cifs_set_cifscreds()
1744 server->dstaddr.ss_family); in cifs_set_cifscreds()
1860 * cifs_get_smb_ses - get a session matching @ctx data from @server
1861 * @server: server to setup the session to
1865 * already got a server reference (server refcount +1). See
1869 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *ctx) in cifs_get_smb_ses() argument
1874 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr; in cifs_get_smb_ses()
1875 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr; in cifs_get_smb_ses()
1879 ses = cifs_find_smb_ses(server, ctx); in cifs_get_smb_ses()
1907 /* existing SMB ses has a server reference already */ in cifs_get_smb_ses()
1908 cifs_put_tcp_session(server, 0); in cifs_get_smb_ses()
1918 /* new SMB session uses our server ref */ in cifs_get_smb_ses()
1919 ses->server = server; in cifs_get_smb_ses()
1920 if (server->dstaddr.ss_family == AF_INET6) in cifs_get_smb_ses()
1951 /* add server as first channel */ in cifs_get_smb_ses()
1952 ses->chans[0].server = server; in cifs_get_smb_ses()
1970 list_add(&ses->smb_ses_list, &server->smb_ses_list); in cifs_get_smb_ses()
2062 if (ses->server->ops->tree_disconnect) in cifs_put_tcon()
2063 ses->server->ops->tree_disconnect(xid, tcon); in cifs_put_tcon()
2110 if (!ses->server->ops->tree_connect) { in cifs_get_tcon()
2122 if (ses->server->vals->protocol_id == 0) { in cifs_get_tcon()
2132 if (ses->server->vals->protocol_id == 0) { in cifs_get_tcon()
2151 if (ses->server->vals->protocol_id == 0) { in cifs_get_tcon()
2156 } else if (tcon->ses->server->capabilities & in cifs_get_tcon()
2167 if (ses->server->posix_ext_supported) { in cifs_get_tcon()
2171 cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions\n"); in cifs_get_tcon()
2182 rc = ses->server->ops->tree_connect(xid, ses, ctx->UNC, tcon, in cifs_get_tcon()
2192 if (ses->server->vals->protocol_id == 0) { in cifs_get_tcon()
2197 } else if (ses->server->capabilities & in cifs_get_tcon()
2207 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES) in cifs_get_tcon()
2212 if (ses->server->vals->protocol_id == 0) { in cifs_get_tcon()
2223 if (ses->server->vals->protocol_id >= SMB30_PROT_ID) { in cifs_get_tcon()
2258 if (ses->server->vals->protocol_id == 0) { in cifs_get_tcon()
2269 * resources mounted more than once to the same server share the last in cifs_get_tcon()
2274 if (ses->server->capabilities & SMB2_GLOBAL_CAP_DIRECTORY_LEASING) in cifs_get_tcon()
2399 tcp_srv = ses->server; in cifs_match_super()
2466 bind_socket(struct TCP_Server_Info *server) in bind_socket() argument
2469 if (server->srcaddr.ss_family != AF_UNSPEC) { in bind_socket()
2471 struct socket *socket = server->ssocket; in bind_socket()
2473 (struct sockaddr *) &server->srcaddr, in bind_socket()
2474 sizeof(server->srcaddr)); in bind_socket()
2478 saddr4 = (struct sockaddr_in *)&server->srcaddr; in bind_socket()
2479 saddr6 = (struct sockaddr_in6 *)&server->srcaddr; in bind_socket()
2492 ip_rfc1001_connect(struct TCP_Server_Info *server) in ip_rfc1001_connect() argument
2507 if (server->server_RFC1001_name[0] != 0) in ip_rfc1001_connect()
2510 server->server_RFC1001_name, in ip_rfc1001_connect()
2524 if (server->workstation_RFC1001_name[0] != 0) in ip_rfc1001_connect()
2527 server->workstation_RFC1001_name, in ip_rfc1001_connect()
2541 rc = smb_send(server, smb_buf, 0x44); in ip_rfc1001_connect()
2544 * RFC1001 layer in at least one server in ip_rfc1001_connect()
2564 generic_ip_connect(struct TCP_Server_Info *server) in generic_ip_connect() argument
2569 struct socket *socket = server->ssocket; in generic_ip_connect()
2572 saddr = (struct sockaddr *) &server->dstaddr; in generic_ip_connect()
2574 if (server->dstaddr.ss_family == AF_INET6) { in generic_ip_connect()
2575 struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)&server->dstaddr; in generic_ip_connect()
2583 struct sockaddr_in *ipv4 = (struct sockaddr_in *)&server->dstaddr; in generic_ip_connect()
2593 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM, in generic_ip_connect()
2597 server->ssocket = NULL; in generic_ip_connect()
2603 server->ssocket = socket; in generic_ip_connect()
2611 rc = bind_socket(server); in generic_ip_connect()
2624 if (server->noautotune) { in generic_ip_connect()
2631 if (server->tcp_nodelay) in generic_ip_connect()
2639 server->noblockcnt ? O_NONBLOCK : 0); in generic_ip_connect()
2645 if (server->noblockcnt && rc == -EINPROGRESS) in generic_ip_connect()
2648 cifs_dbg(FYI, "Error %d connecting to server\n", rc); in generic_ip_connect()
2650 server->ssocket = NULL; in generic_ip_connect()
2655 rc = ip_rfc1001_connect(server); in generic_ip_connect()
2661 ip_connect(struct TCP_Server_Info *server) in ip_connect() argument
2664 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr; in ip_connect()
2665 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr; in ip_connect()
2667 if (server->dstaddr.ss_family == AF_INET6) in ip_connect()
2678 rc = generic_ip_connect(server); in ip_connect()
2686 return generic_ip_connect(server); in ip_connect()
2700 * What if we wanted to mount the server share twice once with in reset_cifs_unix_caps()
2720 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap); in reset_cifs_unix_caps()
2738 cifs_dbg(VFS, "server disabled POSIX path support\n"); in reset_cifs_unix_caps()
2789 …cifs_dbg(VFS, "Negotiating Unix capabilities with the server failed. Consider mounting with the Un… in reset_cifs_unix_caps()
2850 struct TCP_Server_Info *server, in mount_put_conns() argument
2859 else if (server) in mount_put_conns()
2860 cifs_put_tcp_session(server, 0); in mount_put_conns()
2872 struct TCP_Server_Info *server; in mount_get_conns() local
2883 server = cifs_get_tcp_session(ctx); in mount_get_conns()
2884 if (IS_ERR(server)) { in mount_get_conns()
2885 rc = PTR_ERR(server); in mount_get_conns()
2889 *nserver = server; in mount_get_conns()
2892 ses = cifs_get_smb_ses(server, ctx); in mount_get_conns()
2900 if ((ctx->persistent == true) && (!(ses->server->capabilities & in mount_get_conns()
2902 cifs_server_dbg(VFS, "persistent handles not supported by server\n"); in mount_get_conns()
2906 /* search for existing tcon to this server share */ in mount_get_conns()
2919 /* tell server which Unix caps we support */ in mount_get_conns()
2926 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) && in mount_get_conns()
2931 tcon->unix_ext = 0; /* server does not support them */ in mount_get_conns()
2934 if (!tcon->pipe && server->ops->qfs_tcon) { in mount_get_conns()
2935 server->ops->qfs_tcon(*xid, tcon, cifs_sb); in mount_get_conns()
2948 * Clamp the rsize/wsize mount arguments if they are too big for the server in mount_get_conns()
2953 (cifs_sb->ctx->wsize > server->ops->negotiate_wsize(tcon, ctx))) in mount_get_conns()
2954 cifs_sb->ctx->wsize = server->ops->negotiate_wsize(tcon, ctx); in mount_get_conns()
2956 (cifs_sb->ctx->rsize > server->ops->negotiate_rsize(tcon, ctx))) in mount_get_conns()
2957 cifs_sb->ctx->rsize = server->ops->negotiate_rsize(tcon, ctx); in mount_get_conns()
3136 unsigned int *xid, struct TCP_Server_Info **server, in do_dfs_failover() argument
3169 /* Get next DFS target server - if any */ in do_dfs_failover()
3200 mount_put_conns(cifs_sb, *xid, *server, *ses, *tcon); in do_dfs_failover()
3201 rc = mount_get_dfs_conns(&tmp_ctx, cifs_sb, xid, server, ses, tcon); in do_dfs_failover()
3202 if (!rc || (*server && *ses)) { in do_dfs_failover()
3204 * We were able to connect to new target server. Update current context with in do_dfs_failover()
3205 * new target server. in do_dfs_failover()
3215 * Update DFS target hint in DFS referral cache with the target server we in do_dfs_failover()
3282 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server, in cifs_are_all_path_components_accessible() argument
3297 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, ""); in cifs_are_all_path_components_accessible()
3321 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, in cifs_are_all_path_components_accessible()
3334 struct TCP_Server_Info *server, in is_path_remote() argument
3340 if (!server->ops->is_path_accessible) in is_path_remote()
3353 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, in is_path_remote()
3361 rc = cifs_are_all_path_components_accessible(server, xid, tcon, in is_path_remote()
3389 const unsigned int xid, struct TCP_Server_Info *server, in next_dfs_prepath() argument
3400 rc = is_path_remote(cifs_sb, ctx, xid, server, tcon); in next_dfs_prepath()
3470 struct TCP_Server_Info *server = NULL; in cifs_mount() local
3479 rc = mount_get_conns(ctx, cifs_sb, &xid, &server, &ses, &tcon); in cifs_mount()
3493 rc = is_path_remote(cifs_sb, ctx, xid, server, tcon); in cifs_mount()
3500 mount_put_conns(cifs_sb, xid, server, ses, tcon); in cifs_mount()
3505 (void)mount_get_dfs_conns(ctx, cifs_sb, &xid, &server, &ses, &tcon); in cifs_mount()
3518 /* Save full path of last DFS path we used to resolve final target server */ in cifs_mount()
3533 mount_put_conns(cifs_sb, xid, server, ses, tcon); in cifs_mount()
3534 rc = mount_get_dfs_conns(ctx, cifs_sb, &xid, &server, &ses, &tcon); in cifs_mount()
3536 if (rc && !server && !ses) { in cifs_mount()
3539 &server, &ses, &tcon); in cifs_mount()
3541 if (rc == -EACCES || rc == -EOPNOTSUPP || !server || !ses) in cifs_mount()
3554 rc = next_dfs_prepath(cifs_sb, ctx, xid, server, tcon, &ref_path); in cifs_mount()
3594 * After reconnecting to a different server, unique ids won't in cifs_mount()
3619 mount_put_conns(cifs_sb, xid, server, ses, tcon); in cifs_mount()
3629 struct TCP_Server_Info *server; in cifs_mount() local
3631 rc = mount_get_conns(ctx, cifs_sb, &xid, &server, &ses, &tcon); in cifs_mount()
3636 rc = is_path_remote(cifs_sb, ctx, xid, server, tcon); in cifs_mount()
3648 mount_put_conns(cifs_sb, xid, server, ses, tcon); in cifs_mount()
3682 smb_buffer->Mid = get_next_mid(ses->server); in CIFSTCon()
3690 if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) { in CIFSTCon()
3697 if (ses->server->sign) in CIFSTCon()
3711 (/* server len*/ + 256 /* share len */), nls_codepage); in CIFSTCon()
3826 struct TCP_Server_Info *server = cifs_ses_server(ses); in cifs_negotiate_protocol() local
3828 if (!server->ops->need_neg || !server->ops->negotiate) in cifs_negotiate_protocol()
3832 if (!server->ops->need_neg(server)) in cifs_negotiate_protocol()
3835 rc = server->ops->negotiate(xid, ses); in cifs_negotiate_protocol()
3838 if (server->tcpStatus == CifsNeedNegotiate) in cifs_negotiate_protocol()
3839 server->tcpStatus = CifsGood; in cifs_negotiate_protocol()
3853 struct TCP_Server_Info *server = cifs_ses_server(ses); in cifs_setup_session() local
3856 ses->capabilities = server->capabilities; in cifs_setup_session()
3858 ses->capabilities &= (~server->vals->cap_unix); in cifs_setup_session()
3870 server->sec_mode, server->capabilities, server->timeAdj); in cifs_setup_session()
3872 if (server->ops->sess_setup) in cifs_setup_session()
3873 rc = server->ops->sess_setup(xid, ses, nls_info); in cifs_setup_session()
3933 ++master_tcon->ses->server->srv_count; in cifs_construct_tcon()
3936 ses = cifs_get_smb_ses(master_tcon->ses->server, ctx); in cifs_construct_tcon()
3939 cifs_put_tcp_session(master_tcon->ses->server, 0); in cifs_construct_tcon()
4147 struct TCP_Server_Info *server = tcon->ses->server; in cifs_tree_connect() local
4148 const struct smb_version_operations *ops = server->ops; in cifs_tree_connect()
4167 scnprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$", server->hostname); in cifs_tree_connect()
4178 extract_unc_hostname(server->hostname, &tcp_host, &tcp_host_len); in cifs_tree_connect()
4202 rc = match_target_ip(server, dfs_host, dfs_host_len, &target_match); in cifs_tree_connect()
4247 const struct smb_version_operations *ops = tcon->ses->server->ops; in cifs_tree_connect()