Commit 93cee45c authored by Paulo Alcantara's avatar Paulo Alcantara Committed by Steve French
Browse files

smb: client: serialise cifs_construct_tcon() with cifs_mount_mutex



Serialise cifs_construct_tcon() with cifs_mount_mutex to handle
parallel mounts that may end up reusing the session and tcon created
by it.

Cc: stable@vger.kernel.org # 6.4+
Signed-off-by: default avatarPaulo Alcantara (Red Hat) <pc@manguebit.com>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent 4a5ba0e0
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -3988,7 +3988,7 @@ cifs_set_vol_auth(struct smb3_fs_context *ctx, struct cifs_ses *ses)
}

static struct cifs_tcon *
cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
__cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
{
	int rc;
	struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
@@ -4086,6 +4086,17 @@ cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
	return tcon;
}

static struct cifs_tcon *
cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid)
{
	struct cifs_tcon *ret;

	cifs_mount_lock();
	ret = __cifs_construct_tcon(cifs_sb, fsuid);
	cifs_mount_unlock();
	return ret;
}

struct cifs_tcon *
cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
{
+3 −3
Original line number Diff line number Diff line
@@ -37,7 +37,7 @@
#include "rfc1002pdu.h"
#include "fs_context.h"

static DEFINE_MUTEX(cifs_mount_mutex);
DEFINE_MUTEX(cifs_mount_mutex);

static const match_table_t cifs_smb_version_tokens = {
	{ Smb_1, SMB1_VERSION_STRING },
@@ -783,9 +783,9 @@ static int smb3_get_tree(struct fs_context *fc)

	if (err)
		return err;
	mutex_lock(&cifs_mount_mutex);
	cifs_mount_lock();
	ret = smb3_get_tree_common(fc);
	mutex_unlock(&cifs_mount_mutex);
	cifs_mount_unlock();
	return ret;
}

+12 −0
Original line number Diff line number Diff line
@@ -304,4 +304,16 @@ extern void smb3_update_mnt_flags(struct cifs_sb_info *cifs_sb);
#define MAX_CACHED_FIDS 16
extern char *cifs_sanitize_prepath(char *prepath, gfp_t gfp);

extern struct mutex cifs_mount_mutex;

static inline void cifs_mount_lock(void)
{
	mutex_lock(&cifs_mount_mutex);
}

static inline void cifs_mount_unlock(void)
{
	mutex_unlock(&cifs_mount_mutex);
}

#endif