提交 c4e462d2 编写于 作者: Y Yufen Yu 提交者: Zheng Zengkai

block: check disk exist before trying to add partition

hulk inclusion
category: bugfix
bugzilla: 168631
CVE: NA

-------------------------------------------------

If disk have been deleted, we should return fail for ioctl
BLKPG_DEL_PARTITION. Otherwise, the directory /sys/class/block
may remain invalid symlinks file. The race as following:

blkdev_open
				del_gendisk
				    disk->flags &= ~GENHD_FL_UP;
				    blk_drop_partitions
blkpg_ioctl
    bdev_add_partition
    add_partition
        device_add
	    device_add_class_symlinks

ioctl may add_partition after del_gendisk() have tried to delete
partitions. Then, symlinks file will be created.

Link: https://lore.kernel.org/linux-block/20210608092707.1062259-1-yuyufen@huawei.com/Signed-off-by: NYufen Yu <yuyufen@huawei.com>
Reviewed-by: NJason Yan <yanaijie@huawei.com>
Signed-off-by: NChen Jun <chenjun102@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 7405ca0d
...@@ -519,17 +519,26 @@ int bdev_add_partition(struct block_device *bdev, int partno, ...@@ -519,17 +519,26 @@ int bdev_add_partition(struct block_device *bdev, int partno,
sector_t start, sector_t length) sector_t start, sector_t length)
{ {
struct hd_struct *part; struct hd_struct *part;
struct gendisk *disk = bdev->bd_disk;
int ret;
mutex_lock(&bdev->bd_mutex); mutex_lock(&bdev->bd_mutex);
if (partition_overlaps(bdev->bd_disk, start, length, -1)) { if (!(disk->flags & GENHD_FL_UP)) {
mutex_unlock(&bdev->bd_mutex); ret = -ENXIO;
return -EBUSY; goto out;
} }
part = add_partition(bdev->bd_disk, partno, start, length, if (partition_overlaps(disk, start, length, -1)) {
ret = -EBUSY;
goto out;
}
part = add_partition(disk, partno, start, length,
ADDPART_FLAG_NONE, NULL); ADDPART_FLAG_NONE, NULL);
ret = PTR_ERR_OR_ZERO(part);
out:
mutex_unlock(&bdev->bd_mutex); mutex_unlock(&bdev->bd_mutex);
return PTR_ERR_OR_ZERO(part); return ret;
} }
int bdev_del_partition(struct block_device *bdev, int partno) int bdev_del_partition(struct block_device *bdev, int partno)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册