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@huawei.com> --- 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
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@huawei.com> Looks good to me. Feel free to add: Reviewed-by: Jan Kara <jack@suse.cz> 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@suse.com> SUSE Labs, CR
Looks good, Reviewed-by: Christoph Hellwig <hch@lst.de>
On 6/8/21 3:27 AM, 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.
Let's do this for 5.14, which means send it against for-5.14/block
please. Thanks.
--
Jens Axboe
On 2021/6/9 5:08, Jens Axboe wrote: > On 6/8/21 3:27 AM, 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. > > Let's do this for 5.14, which means send it against for-5.14/block > please. Thanks. > OK, I have send v2 for 5.14/block. https://lore.kernel.org/linux-block/20210610023241.3646241-1-yuyufen@huawei.com/T/#u Thanks, Yufen
On Tue, Jun 8, 2021 at 5:21 PM Yufen Yu <yuyufen@huawei.com> 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@huawei.com>
Reviewed-by: Ming Lei <ming.lei@redhat.com>
--
Ming