mirror of
https://github.com/lkl/linux.git
synced 2025-12-19 08:03:01 +09:00
block: delete partitions later in del_gendisk
Delay dropping the block_devices for partitions in del_gendisk until after the call to blk_mark_disk_dead, so that we can implementat notification of removed devices in blk_mark_disk_dead. This requires splitting a lower-level drop_partition helper out of delete_partition and using that from del_gendisk, while having a common loop for the whole device and partitions that calls remove_inode_hash, fsync_bdev and __invalidate_device before the call to blk_mark_disk_dead. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Jan Kara <jack@suse.cz> Acked-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Dave Chinner <dchinner@redhat.com> Link: https://lore.kernel.org/r/20230601094459.1350643-8-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
committed by
Jens Axboe
parent
69f90b70bd
commit
eec1be4c30
@@ -263,10 +263,19 @@ const struct device_type part_type = {
|
||||
.uevent = part_uevent,
|
||||
};
|
||||
|
||||
static void delete_partition(struct block_device *part)
|
||||
void drop_partition(struct block_device *part)
|
||||
{
|
||||
lockdep_assert_held(&part->bd_disk->open_mutex);
|
||||
|
||||
xa_erase(&part->bd_disk->part_tbl, part->bd_partno);
|
||||
kobject_put(part->bd_holder_dir);
|
||||
|
||||
device_del(&part->bd_device);
|
||||
put_device(&part->bd_device);
|
||||
}
|
||||
|
||||
static void delete_partition(struct block_device *part)
|
||||
{
|
||||
/*
|
||||
* Remove the block device from the inode hash, so that it cannot be
|
||||
* looked up any more even when openers still hold references.
|
||||
@@ -276,11 +285,7 @@ static void delete_partition(struct block_device *part)
|
||||
fsync_bdev(part);
|
||||
__invalidate_device(part, true);
|
||||
|
||||
xa_erase(&part->bd_disk->part_tbl, part->bd_partno);
|
||||
kobject_put(part->bd_holder_dir);
|
||||
device_del(&part->bd_device);
|
||||
|
||||
put_device(&part->bd_device);
|
||||
drop_partition(part);
|
||||
}
|
||||
|
||||
static ssize_t whole_disk_show(struct device *dev,
|
||||
@@ -519,7 +524,7 @@ static bool disk_unlock_native_capacity(struct gendisk *disk)
|
||||
return true;
|
||||
}
|
||||
|
||||
void blk_drop_partitions(struct gendisk *disk)
|
||||
static void blk_drop_partitions(struct gendisk *disk)
|
||||
{
|
||||
struct block_device *part;
|
||||
unsigned long idx;
|
||||
|
||||
Reference in New Issue
Block a user