From 956ae9cd352330cffffdee5fb112fc2dbdd7c4c7 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Thu, 1 Jul 2021 17:49:54 +0800 Subject: [PATCH] block: take bd_mutex around delete_partitions in del_gendisk mainline inclusion from mainline-v5.13-rc1 commit c76f48eb5c084b1e15c931ae8cc1826cd771d70d category: bugfix bugzilla: 168631 CVE: NA Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=c76f48eb5c084b1e15c931ae8cc1826cd771d70d -------------------------------- There is nothing preventing an ioctl from trying do delete partition concurrenly with del_gendisk, so take open_mutex to serialize against that. Signed-off-by: Christoph Hellwig Link: https://lore.kernel.org/r/20210406062303.811835-6-hch@lst.de Signed-off-by: Jens Axboe Conflict: block/genhd.c block/partitions/core.c [yufen: del_gendisk didn't call blk_drop_partitions().] Signed-off-by: Yufen Yu Reviewed-by: Jason Yan Signed-off-by: Chen Jun Signed-off-by: Zheng Zengkai --- block/genhd.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/block/genhd.c b/block/genhd.c index b11b70a6bab5..7856e91ed470 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -901,6 +901,7 @@ void del_gendisk(struct gendisk *disk) { struct disk_part_iter piter; struct hd_struct *part; + struct block_device *bdev; might_sleep(); @@ -912,6 +913,13 @@ void del_gendisk(struct gendisk *disk) * disk is marked as dead (GENHD_FL_UP cleared). */ down_write(&disk->lookup_sem); + /* + * If bdev is null, that means memory allocate fail. Then + * add_partitions can also fail. + */ + bdev = bdget_disk(disk, 0); + if (bdev) + mutex_lock(&bdev->bd_mutex); /* invalidate stuff */ disk_part_iter_init(&piter, disk, DISK_PITER_INCL_EMPTY | DISK_PITER_REVERSE); @@ -920,6 +928,10 @@ void del_gendisk(struct gendisk *disk) delete_partition(part); } disk_part_iter_exit(&piter); + if (bdev) { + mutex_unlock(&bdev->bd_mutex); + bdput(bdev); + } invalidate_partition(disk, 0); set_capacity(disk, 0); -- GitLab