cifs: Fix lookup of SMB connections on multichannel
With the addition of SMB session channels, we introduced new TCP server pointers that have no sessions or tcons associated with them. In this case, when we started looking for TCP connections, we might end up picking session channel rather than the master connection, hence failing to get either a session or a tcon. In order to fix that, this patch introduces a new "is_channel" field to TCP_Server_Info structure so we can skip session channels during lookup of connections. Signed-off-by: Paulo Alcantara (SUSE) <pc@cjr.nz> Reviewed-by: Aurelien Aptel <aaptel@suse.com> Signed-off-by: Steve French <stfrench@microsoft.com>
This commit is contained in:
parent
43f8a6a74e
commit
3345bb44ba
|
@ -777,6 +777,7 @@ struct TCP_Server_Info {
|
|||
*/
|
||||
int nr_targets;
|
||||
bool noblockcnt; /* use non-blocking connect() */
|
||||
bool is_channel; /* if a session channel */
|
||||
};
|
||||
|
||||
struct cifs_credits {
|
||||
|
|
|
@ -2712,7 +2712,11 @@ cifs_find_tcp_session(struct smb_vol *vol)
|
|||
|
||||
spin_lock(&cifs_tcp_ses_lock);
|
||||
list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
|
||||
if (!match_server(server, vol))
|
||||
/*
|
||||
* Skip ses channels since they're only handled in lower layers
|
||||
* (e.g. cifs_send_recv).
|
||||
*/
|
||||
if (server->is_channel || !match_server(server, vol))
|
||||
continue;
|
||||
|
||||
++server->srv_count;
|
||||
|
|
|
@ -213,6 +213,9 @@ cifs_ses_add_channel(struct cifs_ses *ses, struct cifs_server_iface *iface)
|
|||
chan->server = NULL;
|
||||
goto out;
|
||||
}
|
||||
spin_lock(&cifs_tcp_ses_lock);
|
||||
chan->server->is_channel = true;
|
||||
spin_unlock(&cifs_tcp_ses_lock);
|
||||
|
||||
/*
|
||||
* We need to allocate the server crypto now as we will need
|
||||
|
|
Loading…
Reference in New Issue