mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 21:24:08 +08:00
3 small smb3 reconnect fixes and an error log clarification
-----BEGIN PGP SIGNATURE----- iQGzBAABCgAdFiEE6fsu8pdIjtWE/DpLiiy9cAdyT1EFAmIIE/EACgkQiiy9cAdy T1HvmwwAmwEbq9X9nqw7+SwKm9rfDuaRF+LONkgReqy6zBxf8ItWpxR9z4chPvak ba0aTxQtqUtcs+jAOCoQmnjM3qnzUKa+bIjtiwlMgYEYb2y+2iHh1KJt7udmY+89 n+OarqFSSC4t+s+DU6DqCqWQfomoGeVf5LsxohmqvJKk8nZT7JCAkHnGewpWuFiY 0OYj3fkvIHPRf790rmr7ghnY/VENEUrMWevonGTLkPynZ7P52eLiHUpcamRo8zqF xzyjLJuI4ChSXLAOeiS/jmIZkuJrBJg3Jlv6Gc3ZhQnU6fo6xZLRMXlMVYmV1L3s MVpmjgygeCyg9dHNmBqdynCmJTvk3HFW5KKSE3LMFQ4SeG3o2HSBiUbXXBSxLwS3 e0piLZHyKjGREQiswo6h5sgWEoKlrVUTUXu5Fuw+KrMdIADjoRy0gEsTAIxgKxiA bemRjxF28SZDSKQ7RkcamzED3jkxfTI7aYL0Nk3sgq/UmkKdTn4nJ7s4J77jiirs 7p5EfL9d =mhs3 -----END PGP SIGNATURE----- Merge tag '5.17-rc4-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6 Pull cifs fixes from Steve French: "Three small smb3 reconnect fixes and an error log clarification" * tag '5.17-rc4-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6: cifs: mark sessions for reconnection in helper function cifs: call helper functions for marking channels for reconnect cifs: call cifs_reconnect when a connection is marked [smb3] improve error message when mount options conflict with posix
This commit is contained in:
commit
e9c25787db
@ -396,11 +396,11 @@ static int cifs_swn_resource_state_changed(struct cifs_swn_reg *swnreg, const ch
|
||||
switch (state) {
|
||||
case CIFS_SWN_RESOURCE_STATE_UNAVAILABLE:
|
||||
cifs_dbg(FYI, "%s: resource name '%s' become unavailable\n", __func__, name);
|
||||
cifs_reconnect(swnreg->tcon->ses->server, true);
|
||||
cifs_mark_tcp_ses_conns_for_reconnect(swnreg->tcon->ses->server, true);
|
||||
break;
|
||||
case CIFS_SWN_RESOURCE_STATE_AVAILABLE:
|
||||
cifs_dbg(FYI, "%s: resource name '%s' become available\n", __func__, name);
|
||||
cifs_reconnect(swnreg->tcon->ses->server, true);
|
||||
cifs_mark_tcp_ses_conns_for_reconnect(swnreg->tcon->ses->server, true);
|
||||
break;
|
||||
case CIFS_SWN_RESOURCE_STATE_UNKNOWN:
|
||||
cifs_dbg(FYI, "%s: resource name '%s' changed to unknown state\n", __func__, name);
|
||||
@ -498,7 +498,7 @@ static int cifs_swn_reconnect(struct cifs_tcon *tcon, struct sockaddr_storage *a
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
cifs_reconnect(tcon->ses->server, false);
|
||||
cifs_mark_tcp_ses_conns_for_reconnect(tcon->ses->server, false);
|
||||
|
||||
unlock:
|
||||
mutex_unlock(&tcon->ses->server->srv_mutex);
|
||||
|
@ -175,11 +175,6 @@ cifs_mark_tcp_ses_conns_for_reconnect(struct TCP_Server_Info *server,
|
||||
struct TCP_Server_Info *pserver;
|
||||
struct cifs_ses *ses;
|
||||
struct cifs_tcon *tcon;
|
||||
struct mid_q_entry *mid, *nmid;
|
||||
struct list_head retry_list;
|
||||
|
||||
server->maxBuf = 0;
|
||||
server->max_read = 0;
|
||||
|
||||
/*
|
||||
* before reconnecting the tcp session, mark the smb session (uid) and the tid bad so they
|
||||
@ -219,6 +214,16 @@ next_session:
|
||||
spin_unlock(&ses->chan_lock);
|
||||
}
|
||||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
}
|
||||
|
||||
static void
|
||||
cifs_abort_connection(struct TCP_Server_Info *server)
|
||||
{
|
||||
struct mid_q_entry *mid, *nmid;
|
||||
struct list_head retry_list;
|
||||
|
||||
server->maxBuf = 0;
|
||||
server->max_read = 0;
|
||||
|
||||
/* do not want to be sending data on a socket we are freeing */
|
||||
cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
|
||||
@ -310,6 +315,8 @@ static int __cifs_reconnect(struct TCP_Server_Info *server,
|
||||
|
||||
cifs_mark_tcp_ses_conns_for_reconnect(server, mark_smb_session);
|
||||
|
||||
cifs_abort_connection(server);
|
||||
|
||||
do {
|
||||
try_to_freeze();
|
||||
mutex_lock(&server->srv_mutex);
|
||||
@ -434,6 +441,8 @@ reconnect_dfs_server(struct TCP_Server_Info *server,
|
||||
|
||||
cifs_mark_tcp_ses_conns_for_reconnect(server, mark_smb_session);
|
||||
|
||||
cifs_abort_connection(server);
|
||||
|
||||
do {
|
||||
try_to_freeze();
|
||||
mutex_lock(&server->srv_mutex);
|
||||
@ -639,6 +648,7 @@ cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
|
||||
|
||||
if (server->tcpStatus == CifsNeedReconnect) {
|
||||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
cifs_reconnect(server, false);
|
||||
return -ECONNABORTED;
|
||||
}
|
||||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
@ -2340,10 +2350,19 @@ cifs_get_tcon(struct cifs_ses *ses, struct smb3_fs_context *ctx)
|
||||
if (ses->server->posix_ext_supported) {
|
||||
tcon->posix_extensions = true;
|
||||
pr_warn_once("SMB3.11 POSIX Extensions are experimental\n");
|
||||
} else {
|
||||
} else if ((ses->server->vals->protocol_id == SMB311_PROT_ID) ||
|
||||
(strcmp(ses->server->vals->version_string,
|
||||
SMB3ANY_VERSION_STRING) == 0) ||
|
||||
(strcmp(ses->server->vals->version_string,
|
||||
SMBDEFAULT_VERSION_STRING) == 0)) {
|
||||
cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions\n");
|
||||
rc = -EOPNOTSUPP;
|
||||
goto out_fail;
|
||||
} else {
|
||||
cifs_dbg(VFS, "Check vers= mount option. SMB3.11 "
|
||||
"disabled but required for POSIX extensions\n");
|
||||
rc = -EOPNOTSUPP;
|
||||
goto out_fail;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1355,7 +1355,7 @@ static void mark_for_reconnect_if_needed(struct cifs_tcon *tcon, struct dfs_cach
|
||||
}
|
||||
|
||||
cifs_dbg(FYI, "%s: no cached or matched targets. mark dfs share for reconnect.\n", __func__);
|
||||
cifs_reconnect(tcon->ses->server, true);
|
||||
cifs_mark_tcp_ses_conns_for_reconnect(tcon->ses->server, true);
|
||||
}
|
||||
|
||||
/* Refresh dfs referral of tcon and mark it for reconnect if needed */
|
||||
|
@ -228,9 +228,7 @@ cifs_get_next_mid(struct TCP_Server_Info *server)
|
||||
spin_unlock(&GlobalMid_Lock);
|
||||
|
||||
if (reconnect) {
|
||||
spin_lock(&cifs_tcp_ses_lock);
|
||||
server->tcpStatus = CifsNeedReconnect;
|
||||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
cifs_mark_tcp_ses_conns_for_reconnect(server, false);
|
||||
}
|
||||
|
||||
return mid;
|
||||
|
@ -430,10 +430,7 @@ unmask:
|
||||
* be taken as the remainder of this one. We need to kill the
|
||||
* socket so the server throws away the partial SMB
|
||||
*/
|
||||
spin_lock(&cifs_tcp_ses_lock);
|
||||
if (server->tcpStatus != CifsExiting)
|
||||
server->tcpStatus = CifsNeedReconnect;
|
||||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
cifs_mark_tcp_ses_conns_for_reconnect(server, false);
|
||||
trace_smb3_partial_send_reconnect(server->CurrentMid,
|
||||
server->conn_id, server->hostname);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user