From d3c4a43d9291279c28b26757351a6ab72c110753 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Tue, 6 Apr 2021 08:22:55 +0200 Subject: [PATCH] block: refactor blk_drop_partitions Move the busy check and disk-wide sync into the only caller, so that the remainder can be shared with del_gendisk. Also pass the gendisk instead of the bdev as that is all that is needed. Signed-off-by: Christoph Hellwig Link: https://lore.kernel.org/r/20210406062303.811835-5-hch@lst.de Signed-off-by: Jens Axboe --- block/blk.h | 1 - block/genhd.c | 11 +---------- block/partitions/core.c | 14 +++----------- fs/block_dev.c | 8 +++++--- include/linux/genhd.h | 2 +- 5 files changed, 10 insertions(+), 26 deletions(-) diff --git a/block/blk.h b/block/blk.h index 8f4337c5a9e66c..8b3591aee0a5fe 100644 --- a/block/blk.h +++ b/block/blk.h @@ -349,7 +349,6 @@ char *disk_name(struct gendisk *hd, int partno, char *buf); #define ADDPART_FLAG_NONE 0 #define ADDPART_FLAG_RAID 1 #define ADDPART_FLAG_WHOLEDISK 2 -void delete_partition(struct block_device *part); int bdev_add_partition(struct block_device *bdev, int partno, sector_t start, sector_t length); int bdev_del_partition(struct block_device *bdev, int partno); diff --git a/block/genhd.c b/block/genhd.c index 15f99da4543f6d..8303ec67fd7099 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -667,9 +667,6 @@ EXPORT_SYMBOL(device_add_disk_no_queue_reg); */ void del_gendisk(struct gendisk *disk) { - struct disk_part_iter piter; - struct block_device *part; - might_sleep(); if (WARN_ON_ONCE(!disk->queue)) @@ -683,13 +680,7 @@ void del_gendisk(struct gendisk *disk) * disk is marked as dead (GENHD_FL_UP cleared). */ down_write(&bdev_lookup_sem); - - /* invalidate stuff */ - disk_part_iter_init(&piter, disk, DISK_PITER_INCL_EMPTY); - while ((part = disk_part_iter_next(&piter))) - delete_partition(part); - disk_part_iter_exit(&piter); - + blk_drop_partitions(disk); fsync_bdev(disk->part0); __invalidate_device(disk->part0, true); diff --git a/block/partitions/core.c b/block/partitions/core.c index 8c173529294081..536f7c5bb0b6d2 100644 --- a/block/partitions/core.c +++ b/block/partitions/core.c @@ -285,7 +285,7 @@ struct device_type part_type = { * Must be called either with bd_mutex held, before a disk can be opened or * after all disk users are gone. */ -void delete_partition(struct block_device *part) +static void delete_partition(struct block_device *part) { fsync_bdev(part); __invalidate_device(part, true); @@ -526,23 +526,15 @@ static bool disk_unlock_native_capacity(struct gendisk *disk) } } -int blk_drop_partitions(struct block_device *bdev) +void blk_drop_partitions(struct gendisk *disk) { struct disk_part_iter piter; struct block_device *part; - if (bdev->bd_part_count) - return -EBUSY; - - sync_blockdev(bdev); - invalidate_bdev(bdev); - - disk_part_iter_init(&piter, bdev->bd_disk, DISK_PITER_INCL_EMPTY); + disk_part_iter_init(&piter, disk, DISK_PITER_INCL_EMPTY); while ((part = disk_part_iter_next(&piter))) delete_partition(part); disk_part_iter_exit(&piter); - - return 0; } static bool blk_add_partition(struct gendisk *disk, struct block_device *bdev, diff --git a/fs/block_dev.c b/fs/block_dev.c index 92ed7d5df67744..594a1bee9dd9ac 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -1243,9 +1243,11 @@ int bdev_disk_changed(struct block_device *bdev, bool invalidate) clear_bit(GD_NEED_PART_SCAN, &bdev->bd_disk->state); rescan: - ret = blk_drop_partitions(bdev); - if (ret) - return ret; + if (bdev->bd_part_count) + return -EBUSY; + sync_blockdev(bdev); + invalidate_bdev(bdev); + blk_drop_partitions(disk); /* * Historically we only set the capacity to zero for devices that diff --git a/include/linux/genhd.h b/include/linux/genhd.h index f364619092cca0..16178a935c4041 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h @@ -273,7 +273,7 @@ static inline sector_t get_capacity(struct gendisk *disk) int bdev_disk_changed(struct block_device *bdev, bool invalidate); int blk_add_partitions(struct gendisk *disk, struct block_device *bdev); -int blk_drop_partitions(struct block_device *bdev); +void blk_drop_partitions(struct gendisk *disk); extern struct gendisk *__alloc_disk_node(int minors, int node_id); extern void put_disk(struct gendisk *disk);