Lines Matching defs: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)
80 if (!server->hostname)
83 /* if server hostname isn't populated, there's nothing to do here */
84 if (server->hostname[0] == '\0')
87 len = strlen(server->hostname) + 3;
94 scnprintf(unc, len, "\\\\%s", server->hostname);
96 spin_lock(&server->srv_lock);
97 ss = server->dstaddr;
98 spin_unlock(&server->srv_lock);
104 cifs_dbg(FYI, "%s: failed to resolve server part of %s to IP: %d\n",
105 __func__, server->hostname, rc);
107 spin_lock(&server->srv_lock);
108 memcpy(&server->dstaddr, &ss, sizeof(server->dstaddr));
109 spin_unlock(&server->srv_lock);
123 struct TCP_Server_Info *server = tcon->ses->server;
126 * query server network interfaces, in case they change
128 if (!server->ops->query_server_interfaces)
132 rc = server->ops->query_server_interfaces(xid, tcon, false);
139 cifs_dbg(FYI, "%s: failed to query server interfaces: %d\n",
148 * Update the tcpStatus for the server.
153 * @server: the tcp ses for which reconnect is needed
157 cifs_signal_cifsd_for_reconnect(struct TCP_Server_Info *server,
164 /* If server is a channel, select the primary channel */
165 pserver = SERVER_IS_CHAN(server) ? server->primary_server : server;
169 spin_lock(&server->srv_lock);
170 if (server->tcpStatus != CifsExiting)
171 server->tcpStatus = CifsNeedReconnect;
172 spin_unlock(&server->srv_lock);
182 if (!ses->chans[i].server)
185 spin_lock(&ses->chans[i].server->srv_lock);
186 if (ses->chans[i].server->tcpStatus != CifsExiting)
187 ses->chans[i].server->tcpStatus = CifsNeedReconnect;
188 spin_unlock(&ses->chans[i].server->srv_lock);
201 * @server: the tcp ses for which reconnect is needed
202 * @server needs to be previously set to CifsNeedReconnect.
206 cifs_mark_tcp_ses_conns_for_reconnect(struct TCP_Server_Info *server,
219 /* If server is a channel, select the primary channel */
220 pserver = SERVER_IS_CHAN(server) ? server->primary_server : server;
223 * if the server has been marked for termination, there is a
230 if (server->terminate) {
232 server = pserver;
245 if (cifs_ses_get_chan_index(ses, server) ==
251 if (!cifs_chan_is_iface_active(ses, server)) {
253 cifs_chan_update_iface(ses, server);
257 if (!mark_smb_session && cifs_chan_needs_reconnect(ses, server)) {
265 cifs_chan_set_need_reconnect(ses, server);
300 cifs_abort_connection(struct TCP_Server_Info *server)
305 server->maxBuf = 0;
306 server->max_read = 0;
310 cifs_server_lock(server);
311 if (server->ssocket) {
312 cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n", server->ssocket->state,
313 server->ssocket->flags);
314 kernel_sock_shutdown(server->ssocket, SHUT_WR);
315 cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n", server->ssocket->state,
316 server->ssocket->flags);
317 sock_release(server->ssocket);
318 server->ssocket = NULL;
320 server->sequence_number = 0;
321 server->session_estab = false;
322 kfree_sensitive(server->session_key.response);
323 server->session_key.response = NULL;
324 server->session_key.len = 0;
325 server->lstrp = jiffies;
330 spin_lock(&server->mid_lock);
331 list_for_each_entry_safe(mid, nmid, &server->pending_mid_q, qhead) {
338 spin_unlock(&server->mid_lock);
339 cifs_server_unlock(server);
348 if (cifs_rdma_enabled(server)) {
349 cifs_server_lock(server);
350 smbd_destroy(server);
351 cifs_server_unlock(server);
355 static bool cifs_tcp_ses_needs_reconnect(struct TCP_Server_Info *server, int num_targets)
357 spin_lock(&server->srv_lock);
358 server->nr_targets = num_targets;
359 if (server->tcpStatus == CifsExiting) {
361 spin_unlock(&server->srv_lock);
362 wake_up(&server->response_q);
367 trace_smb3_reconnect(server->CurrentMid, server->conn_id,
368 server->hostname);
369 server->tcpStatus = CifsNeedReconnect;
371 spin_unlock(&server->srv_lock);
388 static int __cifs_reconnect(struct TCP_Server_Info *server,
393 if (!cifs_tcp_ses_needs_reconnect(server, 1))
396 cifs_mark_tcp_ses_conns_for_reconnect(server, mark_smb_session);
398 cifs_abort_connection(server);
402 cifs_server_lock(server);
404 if (!cifs_swn_set_server_dstaddr(server)) {
406 rc = reconn_set_ipaddr_from_hostname(server);
410 if (cifs_rdma_enabled(server))
411 rc = smbd_reconnect(server);
413 rc = generic_ip_connect(server);
415 cifs_server_unlock(server);
420 set_credits(server, 1);
421 spin_lock(&server->srv_lock);
422 if (server->tcpStatus != CifsExiting)
423 server->tcpStatus = CifsNeedNegotiate;
424 spin_unlock(&server->srv_lock);
425 cifs_swn_reset_server_dstaddr(server);
426 cifs_server_unlock(server);
427 mod_delayed_work(cifsiod_wq, &server->reconnect, 0);
429 } while (server->tcpStatus == CifsNeedReconnect);
431 spin_lock(&server->srv_lock);
432 if (server->tcpStatus == CifsNeedNegotiate)
433 mod_delayed_work(cifsiod_wq, &server->echo, 0);
434 spin_unlock(&server->srv_lock);
436 wake_up(&server->response_q);
441 static int __reconnect_target_unlocked(struct TCP_Server_Info *server, const char *target)
446 if (!cifs_swn_set_server_dstaddr(server)) {
447 if (server->hostname != target) {
450 spin_lock(&server->srv_lock);
451 kfree(server->hostname);
452 server->hostname = hostname;
453 spin_unlock(&server->srv_lock);
457 cifs_dbg(FYI, "%s: default to last target server: %s\n", __func__,
458 server->hostname);
462 rc = reconn_set_ipaddr_from_hostname(server);
466 if (cifs_rdma_enabled(server))
467 rc = smbd_reconnect(server);
469 rc = generic_ip_connect(server);
474 static int reconnect_target_unlocked(struct TCP_Server_Info *server, struct dfs_cache_tgt_list *tl,
482 /* If dfs target list is empty, then reconnect to last server */
485 return __reconnect_target_unlocked(server, server->hostname);
489 rc = __reconnect_target_unlocked(server, dfs_cache_get_tgt_name(tit));
498 static int reconnect_dfs_server(struct TCP_Server_Info *server)
510 * targets (server->nr_targets). It's also possible that the cached referral was cleared
511 * through /proc/fs/cifs/dfscache or the target list is empty due to server settings after
514 mutex_lock(&server->refpath_lock);
515 if (!dfs_cache_noreq_find(server->leaf_fullpath + 1, NULL, &tl))
517 mutex_unlock(&server->refpath_lock);
521 if (!cifs_tcp_ses_needs_reconnect(server, num_targets))
526 * different server or share during failover. It could be improved by adding some logic to
527 * only do that in case it connects to a different server or share, though.
529 cifs_mark_tcp_ses_conns_for_reconnect(server, true);
531 cifs_abort_connection(server);
535 cifs_server_lock(server);
537 rc = reconnect_target_unlocked(server, &tl, &target_hint);
540 cifs_server_unlock(server);
548 * through the reconnected target server.
551 set_credits(server, 1);
552 spin_lock(&server->srv_lock);
553 if (server->tcpStatus != CifsExiting)
554 server->tcpStatus = CifsNeedNegotiate;
555 spin_unlock(&server->srv_lock);
556 cifs_swn_reset_server_dstaddr(server);
557 cifs_server_unlock(server);
558 mod_delayed_work(cifsiod_wq, &server->reconnect, 0);
559 } while (server->tcpStatus == CifsNeedReconnect);
561 mutex_lock(&server->refpath_lock);
562 dfs_cache_noreq_update_tgthint(server->leaf_fullpath + 1, target_hint);
563 mutex_unlock(&server->refpath_lock);
567 spin_lock(&server->srv_lock);
568 if (server->tcpStatus == CifsNeedNegotiate)
569 mod_delayed_work(cifsiod_wq, &server->echo, 0);
570 spin_unlock(&server->srv_lock);
572 wake_up(&server->response_q);
576 int cifs_reconnect(struct TCP_Server_Info *server, bool mark_smb_session)
578 mutex_lock(&server->refpath_lock);
579 if (!server->leaf_fullpath) {
580 mutex_unlock(&server->refpath_lock);
581 return __cifs_reconnect(server, mark_smb_session);
583 mutex_unlock(&server->refpath_lock);
585 return reconnect_dfs_server(server);
588 int cifs_reconnect(struct TCP_Server_Info *server, bool mark_smb_session)
590 return __cifs_reconnect(server, mark_smb_session);
598 struct TCP_Server_Info *server = container_of(work,
606 if (server->tcpStatus == CifsNeedReconnect ||
607 server->tcpStatus == CifsExiting ||
608 server->tcpStatus == CifsNew ||
609 (server->ops->can_echo && !server->ops->can_echo(server)) ||
610 time_before(jiffies, server->lstrp + server->echo_interval - HZ))
613 rc = server->ops->echo ? server->ops->echo(server) : -ENOSYS;
620 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
624 allocate_buffers(struct TCP_Server_Info *server)
626 if (!server->bigbuf) {
627 server->bigbuf = (char *)cifs_buf_get();
628 if (!server->bigbuf) {
634 } else if (server->large_buf) {
636 memset(server->bigbuf, 0, HEADER_SIZE(server));
639 if (!server->smallbuf) {
640 server->smallbuf = (char *)cifs_small_buf_get();
641 if (!server->smallbuf) {
650 memset(server->smallbuf, 0, HEADER_SIZE(server));
657 server_unresponsive(struct TCP_Server_Info *server)
670 spin_lock(&server->srv_lock);
671 if ((server->tcpStatus == CifsGood ||
672 server->tcpStatus == CifsNeedNegotiate) &&
673 (!server->ops->can_echo || server->ops->can_echo(server)) &&
674 time_after(jiffies, server->lstrp + 3 * server->echo_interval)) {
675 spin_unlock(&server->srv_lock);
677 (3 * server->echo_interval) / HZ);
678 cifs_reconnect(server, false);
681 spin_unlock(&server->srv_lock);
687 zero_credits(struct TCP_Server_Info *server)
691 spin_lock(&server->req_lock);
692 val = server->credits + server->echo_credits + server->oplock_credits;
693 if (server->in_flight == 0 && val == 0) {
694 spin_unlock(&server->req_lock);
697 spin_unlock(&server->req_lock);
702 cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
711 if (zero_credits(server)) {
712 cifs_reconnect(server, false);
716 if (server_unresponsive(server))
718 if (cifs_rdma_enabled(server) && server->smbd_conn)
719 length = smbd_recv(server->smbd_conn, smb_msg);
721 length = sock_recvmsg(server->ssocket, smb_msg, 0);
723 spin_lock(&server->srv_lock);
724 if (server->tcpStatus == CifsExiting) {
725 spin_unlock(&server->srv_lock);
729 if (server->tcpStatus == CifsNeedReconnect) {
730 spin_unlock(&server->srv_lock);
731 cifs_reconnect(server, false);
734 spin_unlock(&server->srv_lock);
742 * CifsNeedReconnect if server hung.
751 cifs_reconnect(server, false);
759 cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
767 return cifs_readv_from_socket(server, &smb_msg);
771 cifs_discard_from_socket(struct TCP_Server_Info *server, size_t to_read)
782 return cifs_readv_from_socket(server, &smb_msg);
786 cifs_read_page_from_socket(struct TCP_Server_Info *server, struct page *page,
794 return cifs_readv_from_socket(server, &smb_msg);
798 cifs_read_iter_from_socket(struct TCP_Server_Info *server, struct iov_iter *iter,
805 ret = cifs_readv_from_socket(server, &smb_msg);
812 is_smb_response(struct TCP_Server_Info *server, unsigned char type)
835 /* give server a second to clean up */
843 cifs_set_port((struct sockaddr *)&server->dstaddr, CIFS_PORT);
844 cifs_reconnect(server, true);
848 cifs_reconnect(server, true);
860 spin_lock(&mid->server->mid_lock);
870 spin_unlock(&mid->server->mid_lock);
875 spin_unlock(&mid->server->mid_lock);
880 smb2_get_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
887 if (is_smb1(server))
894 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
897 if (server->ops->check_trans2 &&
898 server->ops->check_trans2(mid, server, buf, malformed))
900 mid->credits_received = smb2_get_credits_from_hdr(buf, server);
902 mid->large_buf = server->large_buf;
906 if (server->large_buf)
907 server->bigbuf = NULL;
909 server->smallbuf = NULL;
915 cifs_enable_signing(struct TCP_Server_Info *server, bool mnt_sign_required)
917 bool srv_sign_required = server->sec_mode & server->vals->signing_required;
918 bool srv_sign_enabled = server->sec_mode & server->vals->signing_enabled;
936 /* If server requires signing, does client allow it? */
942 server->sign = true;
945 /* If client requires signing, does server allow it? */
951 server->sign = true;
954 if (cifs_rdma_enabled(server) && server->sign)
961 clean_demultiplex_info(struct TCP_Server_Info *server)
966 spin_lock(&server->srv_lock);
967 list_del_init(&server->tcp_ses_list);
968 spin_unlock(&server->srv_lock);
970 cancel_delayed_work_sync(&server->echo);
972 spin_lock(&server->srv_lock);
973 server->tcpStatus = CifsExiting;
974 spin_unlock(&server->srv_lock);
975 wake_up_all(&server->response_q);
978 spin_lock(&server->req_lock);
979 if (server->credits <= 0)
980 server->credits = 1;
981 spin_unlock(&server->req_lock);
986 * same server - they now will see the session is in exit state and get
989 wake_up_all(&server->request_q);
992 if (cifs_rdma_enabled(server))
993 smbd_destroy(server);
994 if (server->ssocket) {
995 sock_release(server->ssocket);
996 server->ssocket = NULL;
999 if (!list_empty(&server->pending_mid_q)) {
1005 spin_lock(&server->mid_lock);
1006 list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
1014 spin_unlock(&server->mid_lock);
1028 if (!list_empty(&server->pending_mid_q)) {
1045 kfree(server->leaf_fullpath);
1046 kfree(server);
1054 standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1057 char *buf = server->smallbuf;
1058 unsigned int pdu_length = server->pdu_size;
1061 if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
1062 HEADER_PREAMBLE_SIZE(server)) {
1064 cifs_reconnect(server, true);
1070 server->large_buf = true;
1071 memcpy(server->bigbuf, buf, server->total_read);
1072 buf = server->bigbuf;
1076 length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
1077 pdu_length - MID_HEADER_SIZE(server));
1081 server->total_read += length;
1083 dump_smb(buf, server->total_read);
1085 return cifs_handle_standard(server, mid);
1089 cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
1091 char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
1102 rc = server->ops->check_message(buf, server->total_read, server);
1105 min_t(unsigned int, server->total_read, 48));
1107 if (server->ops->is_session_expired &&
1108 server->ops->is_session_expired(buf)) {
1109 cifs_reconnect(server, true);
1113 if (server->ops->is_status_pending &&
1114 server->ops->is_status_pending(buf, server))
1120 handle_mid(mid, server, buf, rc);
1125 smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
1133 if (is_smb1(server))
1137 spin_lock(&server->req_lock);
1138 server->credits += le16_to_cpu(shdr->CreditRequest);
1139 scredits = server->credits;
1140 in_flight = server->in_flight;
1141 spin_unlock(&server->req_lock);
1142 wake_up(&server->request_q);
1144 trace_smb3_hdr_credits(server->CurrentMid,
1145 server->conn_id, server->hostname, scredits,
1158 struct TCP_Server_Info *server = p;
1177 while (server->tcpStatus != CifsExiting) {
1181 if (!allocate_buffers(server))
1184 server->large_buf = false;
1185 buf = server->smallbuf;
1188 length = cifs_read_from_socket(server, buf, pdu_length);
1192 if (is_smb1(server))
1193 server->total_read = length;
1195 server->total_read = 0;
1204 if (!is_smb_response(server, buf[0]))
1209 server->pdu_size = pdu_length;
1212 if (server->pdu_size < MID_HEADER_SIZE(server)) {
1214 server->pdu_size);
1215 cifs_reconnect(server, true);
1220 length = cifs_read_from_socket(server,
1221 buf + HEADER_PREAMBLE_SIZE(server),
1222 MID_HEADER_SIZE(server));
1225 server->total_read += length;
1227 if (server->ops->next_header) {
1228 if (server->ops->next_header(server, buf, &next_offset)) {
1231 cifs_reconnect(server, true);
1235 server->pdu_size = next_offset;
1242 if (server->ops->is_transform_hdr &&
1243 server->ops->receive_transform &&
1244 server->ops->is_transform_hdr(buf)) {
1245 length = server->ops->receive_transform(server,
1250 mids[0] = server->ops->find_mid(server, buf);
1255 length = standard_receive3(server, mids[0]);
1257 length = mids[0]->receive(server, mids[0]);
1267 if (server->ops->is_status_io_timeout &&
1268 server->ops->is_status_io_timeout(buf)) {
1280 server->lstrp = jiffies;
1284 mids[i]->resp_buf_size = server->pdu_size;
1287 if (server->ops->is_network_name_deleted &&
1288 server->ops->is_network_name_deleted(bufs[i],
1289 server)) {
1299 } else if (server->ops->is_oplock_break &&
1300 server->ops->is_oplock_break(bufs[i],
1301 server)) {
1302 smb2_add_credits_from_hdr(bufs[i], server);
1308 HEADER_SIZE(server));
1309 smb2_add_credits_from_hdr(bufs[i], server);
1311 if (server->ops->dump_detail)
1312 server->ops->dump_detail(bufs[i],
1313 server);
1314 cifs_dump_mids(server);
1319 if (pdu_length > server->pdu_size) {
1320 if (!allocate_buffers(server))
1322 pdu_length -= server->pdu_size;
1323 server->total_read = 0;
1324 server->large_buf = false;
1325 buf = server->smallbuf;
1331 cifs_reconnect(server, true);
1336 cifs_buf_release(server->bigbuf);
1337 if (server->smallbuf) /* no sense logging a debug message if NULL */
1338 cifs_small_buf_release(server->smallbuf);
1340 task_to_wake = xchg(&server->tsk, NULL);
1341 clean_demultiplex_info(server);
1343 /* if server->tsk was NULL then wait for a signal before exiting */
1439 * families of server and addr are equal.
1442 match_port(struct TCP_Server_Info *server, struct sockaddr *addr)
1447 if (server->rdma)
1452 sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port;
1456 sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port;
1475 static bool match_server_address(struct TCP_Server_Info *server, struct sockaddr *addr)
1477 if (!cifs_match_ipaddr(addr, (struct sockaddr *)&server->dstaddr))
1484 match_security(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1491 if (server->ops->select_sectype(server, ctx->sectype)
1498 * the server->sign had better be too.
1500 if (ctx->sign && !server->sign)
1507 static int match_server(struct TCP_Server_Info *server,
1513 lockdep_assert_held(&server->srv_lock);
1518 /* this server does not share socket */
1519 if (server->nosharesock)
1524 if (server->vals->protocol_id < SMB30_PROT_ID)
1528 if (server->vals->protocol_id < SMB21_PROT_ID)
1530 } else if ((server->vals != ctx->vals) || (server->ops != ctx->ops))
1533 if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
1537 (struct sockaddr *)&server->srcaddr))
1541 * really match either @server->leaf_fullpath or @server->dstaddr
1542 * directly since this @server might belong to a completely different
1543 * server -- in case of domain-based DFS referrals or DFS links -- as
1546 * Otherwise, match the DFS referral in @server->leaf_fullpath or the
1547 * destination address in @server->dstaddr.
1554 if (server->leaf_fullpath) {
1556 strcasecmp(server->leaf_fullpath,
1562 } else if (server->leaf_fullpath) {
1571 if (!server->leaf_fullpath &&
1572 (strcasecmp(server->hostname, ctx->server_hostname) ||
1573 !match_server_address(server, addr) ||
1574 !match_port(server, addr)))
1577 if (!match_security(server, ctx))
1580 if (server->echo_interval != ctx->echo_interval * HZ)
1583 if (server->rdma != ctx->rdma)
1586 if (server->ignore_signature != ctx->ignore_signature)
1589 if (server->min_offload != ctx->min_offload)
1592 if (server->retrans != ctx->retrans)
1601 struct TCP_Server_Info *server;
1604 list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
1605 spin_lock(&server->srv_lock);
1610 if (SERVER_IS_CHAN(server) ||
1611 !match_server(server, ctx, false)) {
1612 spin_unlock(&server->srv_lock);
1615 spin_unlock(&server->srv_lock);
1617 ++server->srv_count;
1619 cifs_dbg(FYI, "Existing tcp session with server found\n");
1620 return server;
1627 cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
1632 if (--server->srv_count > 0) {
1638 WARN_ON(server->srv_count < 0);
1640 put_net(cifs_net_ns(server));
1642 list_del_init(&server->tcp_ses_list);
1645 cancel_delayed_work_sync(&server->echo);
1651 * that reconnect work does nothing with server pointer after
1654 cancel_delayed_work(&server->reconnect);
1656 cancel_delayed_work_sync(&server->reconnect);
1658 /* For secondary channels, we pick up ref-count on the primary server */
1659 if (SERVER_IS_CHAN(server))
1660 cifs_put_tcp_session(server->primary_server, from_reconnect);
1662 spin_lock(&server->srv_lock);
1663 server->tcpStatus = CifsExiting;
1664 spin_unlock(&server->srv_lock);
1666 cifs_crypto_secmech_release(server);
1668 kfree_sensitive(server->session_key.response);
1669 server->session_key.response = NULL;
1670 server->session_key.len = 0;
1671 kfree(server->hostname);
1672 server->hostname = NULL;
1674 task = xchg(&server->tsk, NULL);
1929 struct TCP_Server_Info *server = ses->server;
1936 if (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
1940 "IPC: server doesn't support encryption\n");
1950 spin_lock(&server->srv_lock);
1951 scnprintf(unc, sizeof(unc), "\\\\%s\\IPC$", server->hostname);
1952 spin_unlock(&server->srv_lock);
1958 rc = server->ops->tree_connect(xid, ses, unc, tcon, ctx->local_nls);
1978 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *ctx)
1983 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
2007 struct TCP_Server_Info *server = ses->server;
2028 cifs_chan_clear_need_reconnect(ses, server);
2031 do_logoff = ses->ses_status == SES_GOOD && server->ops->logoff;
2039 * On session close, the IPC is closed and the server must release all
2042 * Besides, it will make the server to not close durable and resilient
2049 rc = server->ops->logoff(xid, ses);
2066 cifs_put_tcp_session(ses->chans[i].server, 0);
2067 ses->chans[i].server = NULL;
2073 ses->chans[0].server = NULL;
2077 cifs_put_tcp_session(server, 0);
2095 struct TCP_Server_Info *server = ses->server;
2105 switch (server->dstaddr.ss_family) {
2107 sa = (struct sockaddr_in *)&server->dstaddr;
2111 sa6 = (struct sockaddr_in6 *)&server->dstaddr;
2116 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)
2345 /* add server as first channel */
2347 ses->chans[0].server = server;
2354 rc = cifs_negotiate_protocol(xid, ses, server);
2356 rc = cifs_setup_session(xid, ses, server, ctx->local_nls);
2377 list_add(&ses->smb_ses_list, &server->smb_ses_list);
2395 struct TCP_Server_Info *server = tcon->ses->server;
2405 } else if (!server->leaf_fullpath &&
2494 if (ses->server->ops->tree_disconnect)
2495 ses->server->ops->tree_disconnect(xid, tcon);
2543 if (!ses->server->ops->tree_connect) {
2548 if (ses->server->dialect >= SMB20_PROT_ID &&
2549 (ses->server->capabilities & SMB2_GLOBAL_CAP_DIRECTORY_LEASING))
2561 if (ses->server->vals->protocol_id == 0) {
2571 if (ses->server->vals->protocol_id == 0) {
2590 if (ses->server->vals->protocol_id == 0) {
2595 } else if (tcon->ses->server->capabilities &
2606 if (ses->server->posix_ext_supported) {
2609 } else if ((ses->server->vals->protocol_id == SMB311_PROT_ID) ||
2610 (strcmp(ses->server->vals->version_string,
2612 (strcmp(ses->server->vals->version_string,
2626 rc = ses->server->ops->tree_connect(xid, ses, ctx->UNC, tcon,
2636 if (ses->server->vals->protocol_id == 0) {
2641 } else if (ses->server->capabilities &
2651 && (ses->server->capabilities & SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)
2656 if (ses->server->vals->protocol_id == 0) {
2667 if (ses->server->vals->protocol_id >= SMB30_PROT_ID) {
2702 if (ses->server->vals->protocol_id == 0) {
2713 * resources mounted more than once to the same server share the last
2727 if (ses->server->dialect >= SMB30_PROT_ID &&
2728 (ses->server->capabilities & SMB2_GLOBAL_CAP_MULTI_CHANNEL)) {
2868 tcp_srv = ses->server;
2946 bind_socket(struct TCP_Server_Info *server)
2950 if (server->srcaddr.ss_family != AF_UNSPEC) {
2952 struct socket *socket = server->ssocket;
2955 (struct sockaddr *) &server->srcaddr,
2956 sizeof(server->srcaddr));
2961 saddr4 = (struct sockaddr_in *)&server->srcaddr;
2962 saddr6 = (struct sockaddr_in6 *)&server->srcaddr;
2975 ip_rfc1001_connect(struct TCP_Server_Info *server)
2989 if (server->server_RFC1001_name[0] != 0)
2991 server->server_RFC1001_name,
3001 if (server->workstation_RFC1001_name[0] != 0)
3003 server->workstation_RFC1001_name,
3017 rc = smb_send(server, smb_buf, len);
3019 * RFC1001 layer in at least one server requires very short break before
3030 generic_ip_connect(struct TCP_Server_Info *server)
3038 saddr = (struct sockaddr *) &server->dstaddr;
3040 if (server->dstaddr.ss_family == AF_INET6) {
3041 struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)&server->dstaddr;
3049 struct sockaddr_in *ipv4 = (struct sockaddr_in *)&server->dstaddr;
3058 if (server->ssocket) {
3059 socket = server->ssocket;
3061 rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM,
3062 IPPROTO_TCP, &server->ssocket, 1);
3070 socket = server->ssocket;
3079 rc = bind_socket(server);
3092 if (server->noautotune) {
3099 if (server->tcp_nodelay)
3107 server->noblockcnt ? O_NONBLOCK : 0);
3113 if (server->noblockcnt && rc == -EINPROGRESS)
3116 cifs_dbg(FYI, "Error %d connecting to server\n", rc);
3117 trace_smb3_connect_err(server->hostname, server->conn_id, &server->dstaddr, rc);
3119 server->ssocket = NULL;
3122 trace_smb3_connect_done(server->hostname, server->conn_id, &server->dstaddr);
3124 rc = ip_rfc1001_connect(server);
3130 ip_connect(struct TCP_Server_Info *server)
3133 struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
3134 struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
3136 if (server->dstaddr.ss_family == AF_INET6)
3147 rc = generic_ip_connect(server);
3155 return generic_ip_connect(server);
3170 * What if we wanted to mount the server share twice once with
3191 cifs_dbg(FYI, "unix caps which server supports %lld\n", cap);
3209 cifs_dbg(VFS, "server disabled POSIX path support\n");
3260 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");
3328 else if (mnt_ctx->server)
3329 cifs_put_tcp_session(mnt_ctx->server, 0);
3332 mnt_ctx->server = NULL;
3339 struct TCP_Server_Info *server = NULL;
3354 server = cifs_get_tcp_session(ctx, NULL);
3355 if (IS_ERR(server)) {
3356 rc = PTR_ERR(server);
3357 server = NULL;
3362 ses = cifs_get_smb_ses(server, ctx);
3369 if ((ctx->persistent == true) && (!(ses->server->capabilities &
3371 cifs_server_dbg(VFS, "persistent handles not supported by server\n");
3377 mnt_ctx->server = server;
3386 struct TCP_Server_Info *server;
3392 if (WARN_ON_ONCE(!mnt_ctx || !mnt_ctx->server || !mnt_ctx->ses || !mnt_ctx->fs_ctx ||
3397 server = mnt_ctx->server;
3401 /* search for existing tcon to this server share */
3414 /* tell server which Unix caps we support */
3421 spin_lock(&tcon->ses->server->srv_lock);
3422 if ((tcon->ses->server->tcpStatus == CifsNeedReconnect) &&
3425 spin_unlock(&tcon->ses->server->srv_lock);
3429 spin_unlock(&tcon->ses->server->srv_lock);
3432 tcon->unix_ext = 0; /* server does not support them */
3435 if (!tcon->pipe && server->ops->qfs_tcon) {
3436 server->ops->qfs_tcon(mnt_ctx->xid, tcon, cifs_sb);
3449 * Clamp the rsize/wsize mount arguments if they are too big for the server
3454 (cifs_sb->ctx->wsize > server->ops->negotiate_wsize(tcon, ctx))) {
3456 round_down(server->ops->negotiate_wsize(tcon, ctx), PAGE_SIZE);
3458 * in the very unlikely event that the server sent a max write size under PAGE_SIZE,
3467 (cifs_sb->ctx->rsize > server->ops->negotiate_rsize(tcon, ctx)))
3468 cifs_sb->ctx->rsize = server->ops->negotiate_rsize(tcon, ctx);
3510 cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
3525 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
3549 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3565 struct TCP_Server_Info *server = mnt_ctx->server;
3571 if (!server->ops->is_path_accessible)
3584 rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
3590 rc = cifs_are_all_path_components_accessible(server, xid, tcon,
3618 * After reconnecting to a different server, unique ids won't match anymore, so we disable
3660 if (WARN_ON(!mnt_ctx.server))
3718 smb_buffer->Mid = get_next_mid(ses->server);
3732 if (ses->server->sign)
3746 (/* server len*/ + 256 /* share len */), nls_codepage);
3853 struct TCP_Server_Info *server)
3857 if (!server->ops->need_neg || !server->ops->negotiate)
3861 spin_lock(&server->srv_lock);
3862 if (server->tcpStatus != CifsGood &&
3863 server->tcpStatus != CifsNew &&
3864 server->tcpStatus != CifsNeedNegotiate) {
3865 spin_unlock(&server->srv_lock);
3869 if (!server->ops->need_neg(server) &&
3870 server->tcpStatus == CifsGood) {
3871 spin_unlock(&server->srv_lock);
3875 server->tcpStatus = CifsInNegotiate;
3876 spin_unlock(&server->srv_lock);
3878 rc = server->ops->negotiate(xid, ses, server);
3880 spin_lock(&server->srv_lock);
3881 if (server->tcpStatus == CifsInNegotiate)
3882 server->tcpStatus = CifsGood;
3885 spin_unlock(&server->srv_lock);
3887 spin_lock(&server->srv_lock);
3888 if (server->tcpStatus == CifsInNegotiate)
3889 server->tcpStatus = CifsNeedNegotiate;
3890 spin_unlock(&server->srv_lock);
3898 struct TCP_Server_Info *server,
3902 struct TCP_Server_Info *pserver = SERVER_IS_CHAN(server) ? server->primary_server : server;
3928 cifs_chan_set_in_reconnect(ses, server);
3941 if (server == pserver) {
3942 if (server->dstaddr.ss_family == AF_INET6)
3949 ses->capabilities = server->capabilities;
3951 ses->capabilities &= (~server->vals->cap_unix);
3963 server->sec_mode, server->capabilities, server->timeAdj);
3965 if (server->ops->sess_setup)
3966 rc = server->ops->sess_setup(xid, ses, server, nls_info);
3974 cifs_chan_clear_in_reconnect(ses, server);
3982 cifs_chan_clear_in_reconnect(ses, server);
3983 cifs_chan_clear_need_reconnect(ses, server);
4045 ++master_tcon->ses->server->srv_count;
4048 ses = cifs_get_smb_ses(master_tcon->ses->server, ctx);
4051 cifs_put_tcp_session(master_tcon->ses->server, 0);
4300 const struct smb_version_operations *ops = tcon->ses->server->ops;