mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 10:00:17 +00:00
smb: client: serialise cifs_construct_tcon() with cifs_mount_mutex
commit 93cee45ccf upstream.
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: Paulo Alcantara (Red Hat) <pc@manguebit.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
e2cce9c3b5
commit
67fe1cca5e
@@ -3989,7 +3989,7 @@ cifs_set_vol_auth(struct smb3_fs_context *ctx, struct cifs_ses *ses)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct cifs_tcon *
|
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;
|
int rc;
|
||||||
struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
|
struct cifs_tcon *master_tcon = cifs_sb_master_tcon(cifs_sb);
|
||||||
@@ -4087,6 +4087,17 @@ out:
|
|||||||
return tcon;
|
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 *
|
struct cifs_tcon *
|
||||||
cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
|
cifs_sb_master_tcon(struct cifs_sb_info *cifs_sb)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
#include "rfc1002pdu.h"
|
#include "rfc1002pdu.h"
|
||||||
#include "fs_context.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 = {
|
static const match_table_t cifs_smb_version_tokens = {
|
||||||
{ Smb_1, SMB1_VERSION_STRING },
|
{ Smb_1, SMB1_VERSION_STRING },
|
||||||
@@ -753,9 +753,9 @@ static int smb3_get_tree(struct fs_context *fc)
|
|||||||
|
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
mutex_lock(&cifs_mount_mutex);
|
cifs_mount_lock();
|
||||||
ret = smb3_get_tree_common(fc);
|
ret = smb3_get_tree_common(fc);
|
||||||
mutex_unlock(&cifs_mount_mutex);
|
cifs_mount_unlock();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -295,4 +295,16 @@ extern void smb3_update_mnt_flags(struct cifs_sb_info *cifs_sb);
|
|||||||
#define MAX_CACHED_FIDS 16
|
#define MAX_CACHED_FIDS 16
|
||||||
extern char *cifs_sanitize_prepath(char *prepath, gfp_t gfp);
|
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
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user