On Tue 08-06-21 17:27:07, Yufen Yu wrote: > 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. > > Signed-off-by: Yufen Yu <yuyufen@xxxxxxxxxx> Looks good to me. Feel free to add: Reviewed-by: Jan Kara <jack@xxxxxxx> Honza > --- > block/partitions/core.c | 19 ++++++++++++++----- > 1 file changed, 14 insertions(+), 5 deletions(-) > > diff --git a/block/partitions/core.c b/block/partitions/core.c > index dc60ecf46fe6..58662a0f48e4 100644 > --- a/block/partitions/core.c > +++ b/block/partitions/core.c > @@ -449,17 +449,26 @@ int bdev_add_partition(struct block_device *bdev, int partno, > sector_t start, sector_t length) > { > struct block_device *part; > + struct gendisk *disk = bdev->bd_disk; > + int ret; > > mutex_lock(&bdev->bd_mutex); > - if (partition_overlaps(bdev->bd_disk, start, length, -1)) { > - mutex_unlock(&bdev->bd_mutex); > - return -EBUSY; > + if (!(disk->flags & GENHD_FL_UP)) { > + ret = -ENXIO; > + 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); > + ret = PTR_ERR_OR_ZERO(part); > +out: > mutex_unlock(&bdev->bd_mutex); > - return PTR_ERR_OR_ZERO(part); > + return ret; > } > > int bdev_del_partition(struct block_device *bdev, int partno) > -- > 2.25.4 > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR