3 small cifs/smb3 fixes, 2 to address minor coverity issues and one cleanup
-----BEGIN PGP SIGNATURE----- iQGzBAABCgAdFiEE6fsu8pdIjtWE/DpLiiy9cAdyT1EFAmGYKGIACgkQiiy9cAdy T1ED5wwAtDe73G0fLjajrlVaOfBgHVqRWg1QkGxrwe0Pk8BXJkrrfze5kizD7B5D xgVDbAWmF3wfkoGukggpjrLpwe/36F/xdHHIATRH2xG7zielDSab/RHPZQx4xPJQ Qz/F7f5N8cSvDYX5HdTYncAtF3yV6MM48n9N6fBoKTL43mDWK7EI90KM5EkL2Mdc DT1wYzTpuNoR1qY4oBIftV8mau6DAVtE/GIdpijzIbCf07xADvaM62QmA1qFLCFT zlya3RmgyTS2UtCV9pKnbzZ2o1rm7J/C6YWvqrggH24Fu7V4nGTAx5yY/X2Zm3iu uyoMTT1uvaiaihFCVUYN2e4jhYX/SuWA2Q0WczHAcx0LFXWWsIe5pOl78i9aQkU3 UQhTk4G1HNd35CEtR53HEil8wt674p2D/kJpZ5VL6OIg7H1jgwG6UoterNEbEUVT qFvKCbePXyt8kDdgk9DqsAQQZTkJKMeiuk+hwVUngDRd/jsp7N7p4ISdBQNzNVG3 JVtinWzM =IGYd -----END PGP SIGNATURE----- Merge tag '5.16-rc1-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6 Pull cifs fixes from Steve French: "Three small cifs/smb3 fixes: two to address minor coverity issues and one cleanup" * tag '5.16-rc1-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6: cifs: introduce cifs_ses_mark_for_reconnect() helper cifs: protect srv_count with cifs_tcp_ses_lock cifs: move debug print out of spinlock
This commit is contained in:
commit
b38bfc747c
@ -393,26 +393,14 @@ static void cifs_put_swn_reg(struct cifs_swn_reg *swnreg)
|
|||||||
|
|
||||||
static int cifs_swn_resource_state_changed(struct cifs_swn_reg *swnreg, const char *name, int state)
|
static int cifs_swn_resource_state_changed(struct cifs_swn_reg *swnreg, const char *name, int state)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case CIFS_SWN_RESOURCE_STATE_UNAVAILABLE:
|
case CIFS_SWN_RESOURCE_STATE_UNAVAILABLE:
|
||||||
cifs_dbg(FYI, "%s: resource name '%s' become unavailable\n", __func__, name);
|
cifs_dbg(FYI, "%s: resource name '%s' become unavailable\n", __func__, name);
|
||||||
for (i = 0; i < swnreg->tcon->ses->chan_count; i++) {
|
cifs_ses_mark_for_reconnect(swnreg->tcon->ses);
|
||||||
spin_lock(&GlobalMid_Lock);
|
|
||||||
if (swnreg->tcon->ses->chans[i].server->tcpStatus != CifsExiting)
|
|
||||||
swnreg->tcon->ses->chans[i].server->tcpStatus = CifsNeedReconnect;
|
|
||||||
spin_unlock(&GlobalMid_Lock);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case CIFS_SWN_RESOURCE_STATE_AVAILABLE:
|
case CIFS_SWN_RESOURCE_STATE_AVAILABLE:
|
||||||
cifs_dbg(FYI, "%s: resource name '%s' become available\n", __func__, name);
|
cifs_dbg(FYI, "%s: resource name '%s' become available\n", __func__, name);
|
||||||
for (i = 0; i < swnreg->tcon->ses->chan_count; i++) {
|
cifs_ses_mark_for_reconnect(swnreg->tcon->ses);
|
||||||
spin_lock(&GlobalMid_Lock);
|
|
||||||
if (swnreg->tcon->ses->chans[i].server->tcpStatus != CifsExiting)
|
|
||||||
swnreg->tcon->ses->chans[i].server->tcpStatus = CifsNeedReconnect;
|
|
||||||
spin_unlock(&GlobalMid_Lock);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case CIFS_SWN_RESOURCE_STATE_UNKNOWN:
|
case CIFS_SWN_RESOURCE_STATE_UNKNOWN:
|
||||||
cifs_dbg(FYI, "%s: resource name '%s' changed to unknown state\n", __func__, name);
|
cifs_dbg(FYI, "%s: resource name '%s' changed to unknown state\n", __func__, name);
|
||||||
|
@ -599,6 +599,7 @@ int cifs_try_adding_channels(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses)
|
|||||||
bool is_server_using_iface(struct TCP_Server_Info *server,
|
bool is_server_using_iface(struct TCP_Server_Info *server,
|
||||||
struct cifs_server_iface *iface);
|
struct cifs_server_iface *iface);
|
||||||
bool is_ses_using_iface(struct cifs_ses *ses, struct cifs_server_iface *iface);
|
bool is_ses_using_iface(struct cifs_ses *ses, struct cifs_server_iface *iface);
|
||||||
|
void cifs_ses_mark_for_reconnect(struct cifs_ses *ses);
|
||||||
|
|
||||||
void extract_unc_hostname(const char *unc, const char **h, size_t *len);
|
void extract_unc_hostname(const char *unc, const char **h, size_t *len);
|
||||||
int copy_path_name(char *dst, const char *src);
|
int copy_path_name(char *dst, const char *src);
|
||||||
|
@ -1452,8 +1452,10 @@ cifs_get_tcp_session(struct smb3_fs_context *ctx,
|
|||||||
tcp_ses->max_in_flight = 0;
|
tcp_ses->max_in_flight = 0;
|
||||||
tcp_ses->credits = 1;
|
tcp_ses->credits = 1;
|
||||||
if (primary_server) {
|
if (primary_server) {
|
||||||
|
spin_lock(&cifs_tcp_ses_lock);
|
||||||
++primary_server->srv_count;
|
++primary_server->srv_count;
|
||||||
tcp_ses->primary_server = primary_server;
|
tcp_ses->primary_server = primary_server;
|
||||||
|
spin_unlock(&cifs_tcp_ses_lock);
|
||||||
}
|
}
|
||||||
init_waitqueue_head(&tcp_ses->response_q);
|
init_waitqueue_head(&tcp_ses->response_q);
|
||||||
init_waitqueue_head(&tcp_ses->request_q);
|
init_waitqueue_head(&tcp_ses->request_q);
|
||||||
@ -4111,18 +4113,6 @@ cifs_prune_tlinks(struct work_struct *work)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_CIFS_DFS_UPCALL
|
#ifdef CONFIG_CIFS_DFS_UPCALL
|
||||||
static void mark_tcon_tcp_ses_for_reconnect(struct cifs_tcon *tcon)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < tcon->ses->chan_count; i++) {
|
|
||||||
spin_lock(&GlobalMid_Lock);
|
|
||||||
if (tcon->ses->chans[i].server->tcpStatus != CifsExiting)
|
|
||||||
tcon->ses->chans[i].server->tcpStatus = CifsNeedReconnect;
|
|
||||||
spin_unlock(&GlobalMid_Lock);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Update dfs referral path of superblock */
|
/* Update dfs referral path of superblock */
|
||||||
static int update_server_fullpath(struct TCP_Server_Info *server, struct cifs_sb_info *cifs_sb,
|
static int update_server_fullpath(struct TCP_Server_Info *server, struct cifs_sb_info *cifs_sb,
|
||||||
const char *target)
|
const char *target)
|
||||||
@ -4299,7 +4289,7 @@ static int tree_connect_dfs_target(const unsigned int xid, struct cifs_tcon *tco
|
|||||||
*/
|
*/
|
||||||
if (rc && server->current_fullpath != server->origin_fullpath) {
|
if (rc && server->current_fullpath != server->origin_fullpath) {
|
||||||
server->current_fullpath = server->origin_fullpath;
|
server->current_fullpath = server->origin_fullpath;
|
||||||
mark_tcon_tcp_ses_for_reconnect(tcon);
|
cifs_ses_mark_for_reconnect(tcon->ses);
|
||||||
}
|
}
|
||||||
|
|
||||||
dfs_cache_free_tgts(tl);
|
dfs_cache_free_tgts(tl);
|
||||||
|
@ -1355,12 +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_dbg(FYI, "%s: no cached or matched targets. mark dfs share for reconnect.\n", __func__);
|
||||||
for (i = 0; i < tcon->ses->chan_count; i++) {
|
cifs_ses_mark_for_reconnect(tcon->ses);
|
||||||
spin_lock(&GlobalMid_Lock);
|
|
||||||
if (tcon->ses->chans[i].server->tcpStatus != CifsExiting)
|
|
||||||
tcon->ses->chans[i].server->tcpStatus = CifsNeedReconnect;
|
|
||||||
spin_unlock(&GlobalMid_Lock);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Refresh dfs referral of tcon and mark it for reconnect if needed */
|
/* Refresh dfs referral of tcon and mark it for reconnect if needed */
|
||||||
|
@ -95,9 +95,9 @@ int cifs_try_adding_channels(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!(ses->server->capabilities & SMB2_GLOBAL_CAP_MULTI_CHANNEL)) {
|
if (!(ses->server->capabilities & SMB2_GLOBAL_CAP_MULTI_CHANNEL)) {
|
||||||
cifs_dbg(VFS, "server %s does not support multichannel\n", ses->server->hostname);
|
|
||||||
ses->chan_max = 1;
|
ses->chan_max = 1;
|
||||||
spin_unlock(&ses->chan_lock);
|
spin_unlock(&ses->chan_lock);
|
||||||
|
cifs_dbg(VFS, "server %s does not support multichannel\n", ses->server->hostname);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
spin_unlock(&ses->chan_lock);
|
spin_unlock(&ses->chan_lock);
|
||||||
@ -318,6 +318,19 @@ out:
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Mark all session channels for reconnect */
|
||||||
|
void cifs_ses_mark_for_reconnect(struct cifs_ses *ses)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < ses->chan_count; i++) {
|
||||||
|
spin_lock(&GlobalMid_Lock);
|
||||||
|
if (ses->chans[i].server->tcpStatus != CifsExiting)
|
||||||
|
ses->chans[i].server->tcpStatus = CifsNeedReconnect;
|
||||||
|
spin_unlock(&GlobalMid_Lock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static __u32 cifs_ssetup_hdr(struct cifs_ses *ses, SESSION_SETUP_ANDX *pSMB)
|
static __u32 cifs_ssetup_hdr(struct cifs_ses *ses, SESSION_SETUP_ANDX *pSMB)
|
||||||
{
|
{
|
||||||
__u32 capabilities = 0;
|
__u32 capabilities = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user