Patch "md: fix a lock order reversal in md_alloc" has been added to the 5.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    md: fix a lock order reversal in md_alloc

to the 5.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     md-fix-a-lock-order-reversal-in-md_alloc.patch
and it can be found in the queue-5.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 290d0b5fc0846d83477ec64aade0d58df4fe0686
Author: Christoph Hellwig <hch@xxxxxx>
Date:   Wed Sep 1 13:38:29 2021 +0200

    md: fix a lock order reversal in md_alloc
    
    [ Upstream commit 7df835a32a8bedf7ce88efcfa7c9b245b52ff139 ]
    
    Commit b0140891a8cea3 ("md: Fix race when creating a new md device.")
    not only moved assigning mddev->gendisk before calling add_disk, which
    fixes the races described in the commit log, but also added a
    mddev->open_mutex critical section over add_disk and creation of the
    md kobj.  Adding a kobject after add_disk is racy vs deleting the gendisk
    right after adding it, but md already prevents against that by holding
    a mddev->active reference.
    
    On the other hand taking this lock added a lock order reversal with what
    is not disk->open_mutex (used to be bdev->bd_mutex when the commit was
    added) for partition devices, which need that lock for the internal open
    for the partition scan, and a recent commit also takes it for
    non-partitioned devices, leading to further lockdep splatter.
    
    Fixes: b0140891a8ce ("md: Fix race when creating a new md device.")
    Fixes: d62633873590 ("block: support delayed holder registration")
    Reported-by: syzbot+fadc0aaf497e6a493b9f@xxxxxxxxxxxxxxxxxxxxxxxxx
    Signed-off-by: Christoph Hellwig <hch@xxxxxx>
    Tested-by: syzbot+fadc0aaf497e6a493b9f@xxxxxxxxxxxxxxxxxxxxxxxxx
    Reviewed-by: NeilBrown <neilb@xxxxxxx>
    Signed-off-by: Song Liu <songliubraving@xxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/md/md.c b/drivers/md/md.c
index 761d43829b2b..c178b2f406de 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -5535,10 +5535,6 @@ static int md_alloc(dev_t dev, char *name)
 	 */
 	disk->flags |= GENHD_FL_EXT_DEVT;
 	mddev->gendisk = disk;
-	/* As soon as we call add_disk(), another thread could get
-	 * through to md_open, so make sure it doesn't get too far
-	 */
-	mutex_lock(&mddev->open_mutex);
 	add_disk(disk);
 
 	error = kobject_add(&mddev->kobj, &disk_to_dev(disk)->kobj, "%s", "md");
@@ -5553,7 +5549,6 @@ static int md_alloc(dev_t dev, char *name)
 	if (mddev->kobj.sd &&
 	    sysfs_create_group(&mddev->kobj, &md_bitmap_group))
 		pr_debug("pointless warning\n");
-	mutex_unlock(&mddev->open_mutex);
  abort:
 	mutex_unlock(&disks_mutex);
 	if (!error && mddev->kobj.sd) {



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux