smb: client: serialise cifs_construct_tcon() with cifs_mount_mutex
authorPaulo Alcantara <pc@manguebit.com>
Tue, 2 Apr 2024 01:44:09 +0000 (22:44 -0300)
committerSteve French <stfrench@microsoft.com>
Tue, 2 Apr 2024 15:12:22 +0000 (10:12 -0500)
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>
fs/smb/client/connect.c
fs/smb/client/fs_context.c
fs/smb/client/fs_context.h

index 9a357888149613cfed64a12154e4341a605d5926..95e4bda4fd5172c662393fc2787308116679a670 100644 (file)
@@ -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 @@ out:
        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)
 {
index bdcbe6ff2739ab4539c128e7945258a8914a477a..b7bfe705b2c498b83a60131713246bb9d37abf98 100644 (file)
@@ -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;
 }
 
index 7863f2248c4df8f1e892c2b8589813cca1f1bdd4..8a35645e0b65b244741da59177a2bcb0acea0256 100644 (file)
@@ -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