mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-24 17:59:32 +00:00
Fix match_server check to allow for auto dialect negotiate
When using multidialect negotiate (default or specifying vers=3.0 which allows any smb3 dialect), fix how we check for an existing server session. Before this fix if you mounted a second time to the same server (e.g. a different share on the same server) we would only reuse the existing smb session if a single dialect were requested (e.g. specifying vers=2.1 or vers=3.0 or vers=3.1.1 on the mount command). If a default mount (e.g. not specifying vers=) is done then would always create a new socket connection and SMB3 (or SMB3.1.1) session each time we connect to a different share on the same server rather than reusing the existing one. Signed-off-by: Steve French <stfrench@microsoft.com> Reviewed-by: Pavel Shilovsky <pshilov@microsoft.com>
This commit is contained in:
parent
5fc3681fa5
commit
43cdae88de
3 changed files with 11 additions and 2 deletions
|
@ -2544,8 +2544,15 @@ static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
|
|||
if (vol->nosharesock)
|
||||
return 0;
|
||||
|
||||
/* BB update this for smb3any and default case */
|
||||
if ((server->vals != vol->vals) || (server->ops != vol->ops))
|
||||
/* If multidialect negotiation see if existing sessions match one */
|
||||
if (strcmp(vol->vals->version_string, SMB3ANY_VERSION_STRING) == 0) {
|
||||
if (server->vals->protocol_id < SMB30_PROT_ID)
|
||||
return 0;
|
||||
} else if (strcmp(vol->vals->version_string,
|
||||
SMBDEFAULT_VERSION_STRING) == 0) {
|
||||
if (server->vals->protocol_id < SMB21_PROT_ID)
|
||||
return 0;
|
||||
} else if ((server->vals != vol->vals) || (server->ops != vol->ops))
|
||||
return 0;
|
||||
|
||||
if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
|
||||
|
|
|
@ -1233,6 +1233,7 @@ struct smb_version_operations smb1_operations = {
|
|||
|
||||
struct smb_version_values smb1_values = {
|
||||
.version_string = SMB1_VERSION_STRING,
|
||||
.protocol_id = SMB10_PROT_ID,
|
||||
.large_lock_type = LOCKING_ANDX_LARGE_FILES,
|
||||
.exclusive_lock_type = 0,
|
||||
.shared_lock_type = LOCKING_ANDX_SHARED_LOCK,
|
||||
|
|
|
@ -227,6 +227,7 @@ struct smb2_negotiate_req {
|
|||
} __packed;
|
||||
|
||||
/* Dialects */
|
||||
#define SMB10_PROT_ID 0x0000 /* local only, not sent on wire w/CIFS negprot */
|
||||
#define SMB20_PROT_ID 0x0202
|
||||
#define SMB21_PROT_ID 0x0210
|
||||
#define SMB30_PROT_ID 0x0300
|
||||
|
|
Loading…
Reference in a new issue