Lines Matching refs:server
62 /* Drop the connection to not overload the server */
65 static int ip_connect(struct TCP_Server_Info *server);
66 static int generic_ip_connect(struct TCP_Server_Info *server);
74 * This should be called with server->srv_mutex held.
76 static int reconn_set_ipaddr_from_hostname(struct TCP_Server_Info *server)
83 if (!server->hostname)
86 /* if server hostname isn't populated, there's nothing to do here */
87 if (server->hostname[0] == '\0')
90 len = strlen(server->hostname) + 3;
97 scnprintf(unc, len, "\\\\%s", server->hostname);
99 spin_lock(&server->srv_lock);
100 ss = server->dstaddr;
101 spin_unlock(&server->srv_lock);
107 cifs_dbg(FYI, "%s: failed to resolve server part of %s to IP: %d\n",
108 __func__, server->hostname, rc);
110 spin_lock(&server->srv_lock);
111 memcpy(&server->dstaddr, &ss, sizeof(server->dstaddr));
112 spin_unlock(&server->srv_lock);
127 * query server network interfaces, in case they change
134 cifs_dbg(FYI, "%s: failed to query server interfaces: %d\n",
143 * Update the tcpStatus for the server.
148 * @server: the tcp ses for which reconnect is needed
152 cifs_signal_cifsd_for_reconnect(struct TCP_Server_Info *server,
159 /* If server is a channel, select the primary channel */
160 pserver = SERVER_IS_CHAN(server) ? server->primary_server : server;
164 spin_lock(&server->srv_lock);
165 if (server->tcpStatus != CifsExiting)
166 server->tcpStatus = CifsNeedReconnect;
167 spin_unlock(&server->srv_lock);
175 if (!ses->chans[i].server)
178 spin_lock(&ses->chans[i].server->srv_lock);
179 if (ses->chans[i].server->tcpStatus != CifsExiting)
180 ses->chans[i].server->tcpStatus = CifsNeedReconnect;
181 spin_unlock(&ses->chans[i].server->srv_lock);
194 * @server: the tcp ses for which reconnect is needed
195 * @server needs to be previously set to CifsNeedReconnect.
199 cifs_mark_tcp_ses_conns_for_reconnect(struct TCP_Server_Info *server,
212 /* If server is a channel, select the primary channel */
213 pserver = SERVER_IS_CHAN(server) ? server->primary_server : server;
216 * if the server has been marked for termination, there is a
223 if (server->terminate) {
225 server = pserver;
232 if (cifs_ses_get_chan_index(ses, server) ==
238 if (!cifs_chan_is_iface_active(ses, server)) {
240 cifs_chan_update_iface(ses, server);
244 if (!mark_smb_session && cifs_chan_needs_reconnect(ses, server)) {
252 cifs_chan_set_need_reconnect(ses, server);
287 cifs_abort_connection(struct TCP_Server_Info *server)
292 server->maxBuf = 0;
293 server->max_read = 0;
297 cifs_server_lock(server);
298 if (server->ssocket) {
299 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n", server->ssocket->state,
300 server->ssocket->flags);
301 kernel_sock_shutdown(server->ssocket, SHUT_WR);
302 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n", server->ssocket->state,
303 server->ssocket->flags);
304 sock_release(server->ssocket);
305 server->ssocket = NULL;
307 server->sequence_number = 0;
308 server->session_estab = false;
309 kfree_sensitive(server->session_key.response);
310 server->session_key.response = NULL;
311 server->session_key.len = 0;
312 server->lstrp = jiffies;
317 spin_lock(&server->mid_lock);
318 list_for_each_entry_safe(mid, nmid, &server->pending_mid_q, qhead) {
325 spin_unlock(&server->mid_lock);
326 cifs_server_unlock(server);
335 if (cifs_rdma_enabled(server)) {
336 cifs_server_lock(server);
337 smbd_destroy(server);
338 cifs_server_unlock(server);
342 static bool cifs_tcp_ses_needs_reconnect(struct TCP_Server_Info *server, int num_targets)
344 spin_lock(&server->srv_lock);
345 server->nr_targets = num_targets;
346 if (server->tcpStatus == CifsExiting) {
348 spin_unlock(&server->srv_lock);
349 wake_up(&server->response_q);
354 trace_smb3_reconnect(server->CurrentMid, server->conn_id,
355 server->hostname);
356 server->tcpStatus = CifsNeedReconnect;
358 spin_unlock(&server->srv_lock);
375 static int __cifs_reconnect(struct TCP_Server_Info *server,
380 if (!cifs_tcp_ses_needs_reconnect(server, 1))
383 cifs_mark_tcp_ses_conns_for_reconnect(server, mark_smb_session);
385 cifs_abort_connection(server);
389 cifs_server_lock(server);
391 if (!cifs_swn_set_server_dstaddr(server)) {
393 rc = reconn_set_ipaddr_from_hostname(server);
397 if (cifs_rdma_enabled(server))
398 rc = smbd_reconnect(server);
400 rc = generic_ip_connect(server);
402 cifs_server_unlock(server);
407 set_credits(server, 1);
408 spin_lock(&server->srv_lock);
409 if (server->tcpStatus != CifsExiting)
410 server->tcpStatus = CifsNeedNegotiate;
411 spin_unlock(&server->srv_lock);
412 cifs_swn_reset_server_dstaddr(server);
413 cifs_server_unlock(server);
414 mod_delayed_work(cifsiod_wq, &server->reconnect, 0);
416 } while (server->tcpStatus == CifsNeedReconnect);
418 spin_lock(&server->srv_lock);
419 if (server->tcpStatus == CifsNeedNegotiate)
420 mod_delayed_work(cifsiod_wq, &server->echo, 0);
421 spin_unlock(&server->srv_lock);
423 wake_up(&server->response_q);
428 static int __reconnect_target_unlocked(struct TCP_Server_Info *server, const char *target)
433 if (!cifs_swn_set_server_dstaddr(server)) {
434 if (server->hostname != target) {
437 spin_lock(&server->srv_lock);
438 kfree(server->hostname);
439 server->hostname = hostname;
440 spin_unlock(&server->srv_lock);
444 cifs_dbg(FYI, "%s: default to last target server: %s\n", __func__,
445 server->hostname);
449 rc = reconn_set_ipaddr_from_hostname(server);
453 if (cifs_rdma_enabled(server))
454 rc = smbd_reconnect(server);
456 rc = generic_ip_connect(server);
461 static int reconnect_target_unlocked(struct TCP_Server_Info *server, struct dfs_cache_tgt_list *tl,
469 /* If dfs target list is empty, then reconnect to last server */
472 return __reconnect_target_unlocked(server, server->hostname);
476 rc = __reconnect_target_unlocked(server, dfs_cache_get_tgt_name(tit));
485 static int reconnect_dfs_server(struct TCP_Server_Info *server)
496 * targets (server->nr_targets). It's also possible that the cached referral was cleared
497 * through /proc/fs/cifs/dfscache or the target list is empty due to server settings after
500 mutex_lock(&server->refpath_lock);
501 if (!dfs_cache_noreq_find(server->leaf_fullpath + 1, NULL, &tl))
503 mutex_unlock(&server->refpath_lock);
507 if (!cifs_tcp_ses_needs_reconnect(server, num_targets))
512 * different server or share during failover. It could be improved by adding some logic to
513 * only do that in case it connects to a different server or share, though.
515 cifs_mark_tcp_ses_conns_for_reconnect(server, true);
517 cifs_abort_connection(server);
521 cifs_server_lock(server);
523 rc = reconnect_target_unlocked(server, &tl, &target_hint);
526 cifs_server_unlock(server);
534 * through the reconnected target server.
537 set_credits(server, 1);
538 spin_lock(&server->srv_lock);
539 if (server->tcpStatus != CifsExiting)
540 server->tcpStatus = CifsNeedNegotiate;
541 spin_unlock(&server->srv_lock);
542 cifs_swn_reset_server_dstaddr(server);
543 cifs_server_unlock(server);
544 mod_delayed_work(cifsiod_wq, &server->reconnect, 0);
545 } while (server->tcpStatus == CifsNeedReconnect);
547 mutex_lock(&server->refpath_lock);
548 dfs_cache_noreq_update_tgthint(server->leaf_fullpath + 1, target_hint);
549 mutex_unlock(&server->refpath_lock);
553 spin_lock(&server->srv_lock);
554 if (server->tcpStatus == CifsNeedNegotiate)
555 mod_delayed_work(cifsiod_wq, &server->echo, 0);
556 spin_unlock(&server->srv_lock);
558 wake_up(&server->response_q);
562 int cifs_reconnect(struct TCP_Server_Info *server, bool mark_smb_session)
564 mutex_lock(&server->refpath_lock);
565 if (!server->leaf_fullpath) {
566 mutex_unlock(&server->refpath_lock);
567 return __cifs_reconnect(server, mark_smb_session);
569 mutex_unlock(&server->refpath_lock);
571 return reconnect_dfs_server(server);
574 int cifs_reconnect(struct TCP_Server_Info *server, bool mark_smb_session)
576 return __cifs_reconnect(server, mark_smb_session);
584 struct TCP_Server_Info *server = container_of(work,
592 if (server->tcpStatus == CifsNeedReconnect ||
593 server->tcpStatus == CifsExiting ||
594 server->tcpStatus == CifsNew ||
595 (server->ops->can_echo && !server->ops->can_echo(server)) ||
596 time_before(jiffies, server->lstrp + server->echo_interval - HZ))
599 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
606 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
610 allocate_buffers(struct TCP_Server_Info *server)
612 if (!server->bigbuf) {
613 server->bigbuf = (char *)cifs_buf_get();
614 if (!server->bigbuf) {
620 } else if (server->large_buf) {
622 memset(server->bigbuf, 0, HEADER_SIZE(server));
625 if (!server->smallbuf) {
626 server->smallbuf = (char *)cifs_small_buf_get();
627 if (!server->smallbuf) {
636 memset(server->smallbuf, 0, HEADER_SIZE(server));
643 server_unresponsive(struct TCP_Server_Info *server)
656 spin_lock(&server->srv_lock);
657 if ((server->tcpStatus == CifsGood ||
658 server->tcpStatus == CifsNeedNegotiate) &&
659 (!server->ops->can_echo || server->ops->can_echo(server)) &&
660 time_after(jiffies, server->lstrp + 3 * server->echo_interval)) {
661 spin_unlock(&server->srv_lock);
663 (3 * server->echo_interval) / HZ);
664 cifs_reconnect(server, false);
667 spin_unlock(&server->srv_lock);
673 zero_credits(struct TCP_Server_Info *server)
677 spin_lock(&server->req_lock);
678 val = server->credits + server->echo_credits + server->oplock_credits;
679 if (server->in_flight == 0 && val == 0) {
680 spin_unlock(&server->req_lock);
683 spin_unlock(&server->req_lock);
688 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
697 if (zero_credits(server)) {
698 cifs_reconnect(server, false);
702 if (server_unresponsive(server))
704 if (cifs_rdma_enabled(server) && server->smbd_conn)
705 length = smbd_recv(server->smbd_conn, smb_msg);
707 length = sock_recvmsg(server->ssocket, smb_msg, 0);
709 spin_lock(&server->srv_lock);
710 if (server->tcpStatus == CifsExiting) {
711 spin_unlock(&server->srv_lock);
715 if (server->tcpStatus == CifsNeedReconnect) {
716 spin_unlock(&server->srv_lock);
717 cifs_reconnect(server, false);
720 spin_unlock(&server->srv_lock);
728 * CifsNeedReconnect if server hung.
737 cifs_reconnect(server, false);
745 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
752 return cifs_readv_from_socket(server, &smb_msg);
756 cifs_discard_from_socket(struct TCP_Server_Info *server, size_t to_read)
767 return cifs_readv_from_socket(server, &smb_msg);
771 cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
779 return cifs_readv_from_socket(server, &smb_msg);
783 cifs_read_iter_from_socket(struct TCP_Server_Info *server, struct iov_iter *iter,
790 ret = cifs_readv_from_socket(server, &smb_msg);
797 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
820 /* give server a second to clean up */
828 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
829 cifs_reconnect(server, true);
833 cifs_reconnect(server, true);
845 spin_lock(&mid->server->mid_lock);
855 spin_unlock(&mid->server->mid_lock);
860 spin_unlock(&mid->server->mid_lock);
865 smb2_get_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
872 if (is_smb1(server))
879 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
882 if (server->ops->check_trans2 &&
883 server->ops->check_trans2(mid, server, buf, malformed))
885 mid->credits_received = smb2_get_credits_from_hdr(buf, server);
887 mid->large_buf = server->large_buf;
891 if (server->large_buf)
892 server->bigbuf = NULL;
894 server->smallbuf = NULL;
900 cifs_enable_signing(struct TCP_Server_Info *server, bool mnt_sign_required)
902 bool srv_sign_required = server->sec_mode & server->vals->signing_required;
903 bool srv_sign_enabled = server->sec_mode & server->vals->signing_enabled;
921 /* If server requires signing, does client allow it? */
927 server->sign = true;
930 /* If client requires signing, does server allow it? */
936 server->sign = true;
939 if (cifs_rdma_enabled(server) && server->sign)
946 clean_demultiplex_info(struct TCP_Server_Info *server)
951 spin_lock(&server->srv_lock);
952 list_del_init(&server->tcp_ses_list);
953 spin_unlock(&server->srv_lock);
955 cancel_delayed_work_sync(&server->echo);
957 spin_lock(&server->srv_lock);
958 server->tcpStatus = CifsExiting;
959 spin_unlock(&server->srv_lock);
960 wake_up_all(&server->response_q);
963 spin_lock(&server->req_lock);
964 if (server->credits <= 0)
965 server->credits = 1;
966 spin_unlock(&server->req_lock);
971 * same server - they now will see the session is in exit state and get
974 wake_up_all(&server->request_q);
977 if (cifs_rdma_enabled(server))
978 smbd_destroy(server);
979 if (server->ssocket) {
980 sock_release(server->ssocket);
981 server->ssocket = NULL;
984 if (!list_empty(&server->pending_mid_q)) {
990 spin_lock(&server->mid_lock);
991 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
999 spin_unlock(&server->mid_lock);
1013 if (!list_empty(&server->pending_mid_q)) {
1030 kfree(server->leaf_fullpath);
1031 kfree(server);
1039 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1042 char *buf = server->smallbuf;
1043 unsigned int pdu_length = server->pdu_size;
1046 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
1047 HEADER_PREAMBLE_SIZE(server)) {
1049 cifs_reconnect(server, true);
1055 server->large_buf = true;
1056 memcpy(server->bigbuf, buf, server->total_read);
1057 buf = server->bigbuf;
1061 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
1062 pdu_length - MID_HEADER_SIZE(server));
1066 server->total_read += length;
1068 dump_smb(buf, server->total_read);
1070 return cifs_handle_standard(server, mid);
1074 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1076 char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
1087 rc = server->ops->check_message(buf, server->total_read, server);
1090 min_t(unsigned int, server->total_read, 48));
1092 if (server->ops->is_session_expired &&
1093 server->ops->is_session_expired(buf)) {
1094 cifs_reconnect(server, true);
1098 if (server->ops->is_status_pending &&
1099 server->ops->is_status_pending(buf, server))
1105 handle_mid(mid, server, buf, rc);
1110 smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
1118 if (is_smb1(server))
1122 spin_lock(&server->req_lock);
1123 server->credits += le16_to_cpu(shdr->CreditRequest);
1124 scredits = server->credits;
1125 in_flight = server->in_flight;
1126 spin_unlock(&server->req_lock);
1127 wake_up(&server->request_q);
1129 trace_smb3_hdr_credits(server->CurrentMid,
1130 server->conn_id, server->hostname, scredits,
1143 struct TCP_Server_Info *server = p;
1162 while (server->tcpStatus != CifsExiting) {
1166 if (!allocate_buffers(server))
1169 server->large_buf = false;
1170 buf = server->smallbuf;
1173 length = cifs_read_from_socket(server, buf, pdu_length);
1177 if (is_smb1(server))
1178 server->total_read = length;
1180 server->total_read = 0;
1189 if (!is_smb_response(server, buf[0]))
1194 server->pdu_size = pdu_length;
1197 if (server->pdu_size < MID_HEADER_SIZE(server)) {
1199 server->pdu_size);
1200 cifs_reconnect(server, true);
1205 length = cifs_read_from_socket(server,
1206 buf + HEADER_PREAMBLE_SIZE(server),
1207 MID_HEADER_SIZE(server));
1210 server->total_read += length;
1212 if (server->ops->next_header) {
1213 if (server->ops->next_header(server, buf, &next_offset)) {
1216 cifs_reconnect(server, true);
1220 server->pdu_size = next_offset;
1227 if (server->ops->is_transform_hdr &&
1228 server->ops->receive_transform &&
1229 server->ops->is_transform_hdr(buf)) {
1230 length = server->ops->receive_transform(server,
1235 mids[0] = server->ops->find_mid(server, buf);
1240 length = standard_receive3(server, mids[0]);
1242 length = mids[0]->receive(server, mids[0]);
1252 if (server->ops->is_status_io_timeout &&
1253 server->ops->is_status_io_timeout(buf)) {
1265 server->lstrp = jiffies;
1269 mids[i]->resp_buf_size = server->pdu_size;
1272 if (server->ops->is_network_name_deleted &&
1273 server->ops->is_network_name_deleted(bufs[i],
1274 server)) {
1284 } else if (server->ops->is_oplock_break &&
1285 server->ops->is_oplock_break(bufs[i],
1286 server)) {
1287 smb2_add_credits_from_hdr(bufs[i], server);
1293 HEADER_SIZE(server));
1294 smb2_add_credits_from_hdr(bufs[i], server);
1296 if (server->ops->dump_detail)
1297 server->ops->dump_detail(bufs[i],
1298 server);
1299 cifs_dump_mids(server);
1304 if (pdu_length > server->pdu_size) {
1305 if (!allocate_buffers(server))
1307 pdu_length -= server->pdu_size;
1308 server->total_read = 0;
1309 server->large_buf = false;
1310 buf = server->smallbuf;
1316 cifs_reconnect(server, true);
1321 cifs_buf_release(server->bigbuf);
1322 if (server->smallbuf) /* no sense logging a debug message if NULL */
1323 cifs_small_buf_release(server->smallbuf);
1325 task_to_wake = xchg(&server->tsk, NULL);
1326 clean_demultiplex_info(server);
1328 /* if server->tsk was NULL then wait for a signal before exiting */
1422 * families of server and addr are equal.
1425 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
1430 if (server->rdma)
1435 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
1439 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
1458 static bool match_server_address(struct TCP_Server_Info *server, struct sockaddr *addr)
1460 if (!cifs_match_ipaddr(addr, (struct sockaddr *)&server->dstaddr))
1467 match_security(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1474 if (server->ops->select_sectype(server, ctx->sectype)
1481 * the server->sign had better be too.
1483 if (ctx->sign && !server->sign)
1490 static int match_server(struct TCP_Server_Info *server,
1496 lockdep_assert_held(&server->srv_lock);
1501 /* this server does not share socket */
1502 if (server->nosharesock)
1507 if (server->vals->protocol_id < SMB30_PROT_ID)
1511 if (server->vals->protocol_id < SMB21_PROT_ID)
1513 } else if ((server->vals != ctx->vals) || (server->ops != ctx->ops))
1516 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
1520 (struct sockaddr *)&server->srcaddr))
1524 * really match either @server->leaf_fullpath or @server->dstaddr
1525 * directly since this @server might belong to a completely different
1526 * server -- in case of domain-based DFS referrals or DFS links -- as
1529 * Otherwise, match the DFS referral in @server->leaf_fullpath or the
1530 * destination address in @server->dstaddr.
1537 if (server->leaf_fullpath) {
1539 strcasecmp(server->leaf_fullpath,
1545 } else if (server->leaf_fullpath) {
1554 if (!server->leaf_fullpath &&
1555 (strcasecmp(server->hostname, ctx->server_hostname) ||
1556 !match_server_address(server, addr) ||
1557 !match_port(server, addr)))
1560 if (!match_security(server, ctx))
1563 if (server->echo_interval != ctx->echo_interval * HZ)
1566 if (server->rdma != ctx->rdma)
1569 if (server->ignore_signature != ctx->ignore_signature)
1572 if (server->min_offload != ctx->min_offload)
1581 struct TCP_Server_Info *server;
1584 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
1585 spin_lock(&server->srv_lock);
1590 if (SERVER_IS_CHAN(server) ||
1591 !match_server(server, ctx, false)) {
1592 spin_unlock(&server->srv_lock);
1595 spin_unlock(&server->srv_lock);
1597 ++server->srv_count;
1599 cifs_dbg(FYI, "Existing tcp session with server found\n");
1600 return server;
1607 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
1612 if (--server->srv_count > 0) {
1618 WARN_ON(server->srv_count < 0);
1620 put_net(cifs_net_ns(server));
1622 list_del_init(&server->tcp_ses_list);
1625 cancel_delayed_work_sync(&server->echo);
1631 * that reconnect work does nothing with server pointer after
1634 cancel_delayed_work(&server->reconnect);
1636 cancel_delayed_work_sync(&server->reconnect);
1638 /* For secondary channels, we pick up ref-count on the primary server */
1639 if (SERVER_IS_CHAN(server))
1640 cifs_put_tcp_session(server->primary_server, from_reconnect);
1642 spin_lock(&server->srv_lock);
1643 server->tcpStatus = CifsExiting;
1644 spin_unlock(&server->srv_lock);
1646 cifs_crypto_secmech_release(server);
1648 kfree_sensitive(server->session_key.response);
1649 server->session_key.response = NULL;
1650 server->session_key.len = 0;
1651 kfree(server->hostname);
1652 server->hostname = NULL;
1654 task = xchg(&server->tsk, NULL);
1905 struct TCP_Server_Info *server = ses->server;
1912 if (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
1916 "IPC: server doesn't support encryption\n");
1926 spin_lock(&server->srv_lock);
1927 scnprintf(unc, sizeof(unc), "\\\\%s\\IPC$", server->hostname);
1928 spin_unlock(&server->srv_lock);
1934 rc = server->ops->tree_connect(xid, ses, unc, tcon, ctx->local_nls);
1959 * On session close, the IPC is closed and the server must release all tcons of the session.
1962 * Besides, it will make the server to not close durable and resilient files on session close, as
1979 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1984 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
2010 struct TCP_Server_Info *server = ses->server;
2038 if (ses->ses_status == SES_EXITING && server->ops->logoff) {
2042 rc = server->ops->logoff(xid, ses);
2067 cifs_put_tcp_session(ses->chans[i].server, 0);
2068 ses->chans[i].server = NULL;
2075 ses->chans[0].server = NULL;
2079 cifs_put_tcp_session(server, 0);
2097 struct TCP_Server_Info *server = ses->server;
2107 switch (server->dstaddr.ss_family) {
2109 sa = (struct sockaddr_in *)&server->dstaddr;
2113 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
2118 server->dstaddr.ss_family);
2236 * cifs_get_smb_ses - get a session matching @ctx data from @server
2237 * @server: server to setup the session to
2241 * already got a server reference (server refcount +1). See
2245 cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
2250 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
2251 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
2255 ses = cifs_find_smb_ses(server, ctx);
2261 if (cifs_chan_needs_reconnect(ses, server)) {
2266 rc = cifs_negotiate_protocol(xid, ses, server);
2275 rc = cifs_setup_session(xid, ses, server,
2290 /* existing SMB ses has a server reference already */
2291 cifs_put_tcp_session(server, 0);
2303 /* new SMB session uses our server ref */
2304 ses->server = server;
2305 if (server->dstaddr.ss_family == AF_INET6)
2339 /* add server as first channel */
2341 ses->chans[0].server = server;
2348 rc = cifs_negotiate_protocol(xid, ses, server);
2350 rc = cifs_setup_session(xid, ses, server, ctx->local_nls);
2371 list_add(&ses->smb_ses_list, &server->smb_ses_list);
2389 struct TCP_Server_Info *server = tcon->ses->server;
2399 } else if (!server->leaf_fullpath &&
2485 if (ses->server->ops->tree_disconnect)
2486 ses->server->ops->tree_disconnect(xid, tcon);
2534 if (!ses->server->ops->tree_connect) {
2539 if (ses->server->dialect >= SMB20_PROT_ID &&
2540 (ses->server->capabilities & SMB2_GLOBAL_CAP_DIRECTORY_LEASING))
2552 if (ses->server->vals->protocol_id == 0) {
2562 if (ses->server->vals->protocol_id == 0) {
2581 if (ses->server->vals->protocol_id == 0) {
2586 } else if (tcon->ses->server->capabilities &
2597 if (ses->server->posix_ext_supported) {
2600 } else if ((ses->server->vals->protocol_id == SMB311_PROT_ID) ||
2601 (strcmp(ses->server->vals->version_string,
2603 (strcmp(ses->server->vals->version_string,
2617 rc = ses->server->ops->tree_connect(xid, ses, ctx->UNC, tcon,
2627 if (ses->server->vals->protocol_id == 0) {
2632 } else if (ses->server->capabilities &
2642 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
2647 if (ses->server->vals->protocol_id == 0) {
2658 if (ses->server->vals->protocol_id >= SMB30_PROT_ID) {
2693 if (ses->server->vals->protocol_id == 0) {
2704 * resources mounted more than once to the same server share the last
2718 if (ses->server->dialect >= SMB30_PROT_ID &&
2719 (ses->server->capabilities & SMB2_GLOBAL_CAP_MULTI_CHANNEL)) {
2858 tcp_srv = ses->server;
2934 bind_socket(struct TCP_Server_Info *server)
2937 if (server->srcaddr.ss_family != AF_UNSPEC) {
2939 struct socket *socket = server->ssocket;
2941 (struct sockaddr *) &server->srcaddr,
2942 sizeof(server->srcaddr));
2946 saddr4 = (struct sockaddr_in *)&server->srcaddr;
2947 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
2960 ip_rfc1001_connect(struct TCP_Server_Info *server)
2974 if (server->server_RFC1001_name[0] != 0)
2976 server->server_RFC1001_name,
2986 if (server->workstation_RFC1001_name[0] != 0)
2988 server->workstation_RFC1001_name,
3002 rc = smb_send(server, smb_buf, len);
3004 * RFC1001 layer in at least one server requires very short break before
3015 generic_ip_connect(struct TCP_Server_Info *server)
3023 saddr = (struct sockaddr *) &server->dstaddr;
3025 if (server->dstaddr.ss_family == AF_INET6) {
3026 struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)&server->dstaddr;
3034 struct sockaddr_in *ipv4 = (struct sockaddr_in *)&server->dstaddr;
3043 if (server->ssocket) {
3044 socket = server->ssocket;
3046 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3047 IPPROTO_TCP, &server->ssocket, 1);
3055 socket = server->ssocket;
3064 rc = bind_socket(server);
3077 if (server->noautotune) {
3084 if (server->tcp_nodelay)
3092 server->noblockcnt ? O_NONBLOCK : 0);
3098 if (server->noblockcnt && rc == -EINPROGRESS)
3101 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3102 trace_smb3_connect_err(server->hostname, server->conn_id, &server->dstaddr, rc);
3104 server->ssocket = NULL;
3107 trace_smb3_connect_done(server->hostname, server->conn_id, &server->dstaddr);
3109 rc = ip_rfc1001_connect(server);
3115 ip_connect(struct TCP_Server_Info *server)
3118 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3119 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3121 if (server->dstaddr.ss_family == AF_INET6)
3132 rc = generic_ip_connect(server);
3140 return generic_ip_connect(server);
3155 * What if we wanted to mount the server share twice once with
3175 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
3193 cifs_dbg(VFS, "server disabled POSIX path support\n");
3244 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");
3312 else if (mnt_ctx->server)
3313 cifs_put_tcp_session(mnt_ctx->server, 0);
3320 struct TCP_Server_Info *server = NULL;
3335 server = cifs_get_tcp_session(ctx, NULL);
3336 if (IS_ERR(server)) {
3337 rc = PTR_ERR(server);
3338 server = NULL;
3343 ses = cifs_get_smb_ses(server, ctx);
3350 if ((ctx->persistent == true) && (!(ses->server->capabilities &
3352 cifs_server_dbg(VFS, "persistent handles not supported by server\n");
3358 mnt_ctx->server = server;
3367 struct TCP_Server_Info *server;
3373 if (WARN_ON_ONCE(!mnt_ctx || !mnt_ctx->server || !mnt_ctx->ses || !mnt_ctx->fs_ctx ||
3378 server = mnt_ctx->server;
3382 /* search for existing tcon to this server share */
3395 /* tell server which Unix caps we support */
3402 spin_lock(&tcon->ses->server->srv_lock);
3403 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
3406 spin_unlock(&tcon->ses->server->srv_lock);
3410 spin_unlock(&tcon->ses->server->srv_lock);
3413 tcon->unix_ext = 0; /* server does not support them */
3416 if (!tcon->pipe && server->ops->qfs_tcon) {
3417 server->ops->qfs_tcon(mnt_ctx->xid, tcon, cifs_sb);
3430 * Clamp the rsize/wsize mount arguments if they are too big for the server
3435 (cifs_sb->ctx->wsize > server->ops->negotiate_wsize(tcon, ctx))) {
3437 round_down(server->ops->negotiate_wsize(tcon, ctx), PAGE_SIZE);
3439 * in the very unlikely event that the server sent a max write size under PAGE_SIZE,
3448 (cifs_sb->ctx->rsize > server->ops->negotiate_rsize(tcon, ctx)))
3449 cifs_sb->ctx->rsize = server->ops->negotiate_rsize(tcon, ctx);
3491 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
3506 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
3530 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3546 struct TCP_Server_Info *server = mnt_ctx->server;
3552 if (!server->ops->is_path_accessible)
3565 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3571 rc = cifs_are_all_path_components_accessible(server, xid, tcon,
3601 * After reconnecting to a different server, unique ids won't match anymore, so we disable
3690 smb_buffer->Mid = get_next_mid(ses->server);
3704 if (ses->server->sign)
3718 (/* server len*/ + 256 /* share len */), nls_codepage);
3825 struct TCP_Server_Info *server)
3829 if (!server->ops->need_neg || !server->ops->negotiate)
3833 spin_lock(&server->srv_lock);
3834 if (server->tcpStatus != CifsGood &&
3835 server->tcpStatus != CifsNew &&
3836 server->tcpStatus != CifsNeedNegotiate) {
3837 spin_unlock(&server->srv_lock);
3841 if (!server->ops->need_neg(server) &&
3842 server->tcpStatus == CifsGood) {
3843 spin_unlock(&server->srv_lock);
3847 server->tcpStatus = CifsInNegotiate;
3848 spin_unlock(&server->srv_lock);
3850 rc = server->ops->negotiate(xid, ses, server);
3852 spin_lock(&server->srv_lock);
3853 if (server->tcpStatus == CifsInNegotiate)
3854 server->tcpStatus = CifsGood;
3857 spin_unlock(&server->srv_lock);
3859 spin_lock(&server->srv_lock);
3860 if (server->tcpStatus == CifsInNegotiate)
3861 server->tcpStatus = CifsNeedNegotiate;
3862 spin_unlock(&server->srv_lock);
3870 struct TCP_Server_Info *server,
3874 struct TCP_Server_Info *pserver = SERVER_IS_CHAN(server) ? server->primary_server : server;
3900 cifs_chan_set_in_reconnect(ses, server);
3913 if (server == pserver) {
3914 if (server->dstaddr.ss_family == AF_INET6)
3921 ses->capabilities = server->capabilities;
3923 ses->capabilities &= (~server->vals->cap_unix);
3935 server->sec_mode, server->capabilities, server->timeAdj);
3937 if (server->ops->sess_setup)
3938 rc = server->ops->sess_setup(xid, ses, server, nls_info);
3946 cifs_chan_clear_in_reconnect(ses, server);
3954 cifs_chan_clear_in_reconnect(ses, server);
3955 cifs_chan_clear_need_reconnect(ses, server);
4015 ++master_tcon->ses->server->srv_count;
4018 ses = cifs_get_smb_ses(master_tcon->ses->server, ctx);
4021 cifs_put_tcp_session(master_tcon->ses->server, 0);
4231 const struct smb_version_operations *ops = tcon->ses->server->ops;