block: unhash the whole device inode earlier
Unhash the whole device inode early in del_gendisk. This allows to remove the first GENHD_FL_UP check in the open path as we simply won't find a just removed inode. The second non-racy check after taking open_mutex is still kept. Signed-off-by: Christoph Hellwig <hch@lst.de> Link: https://lore.kernel.org/r/20210722075402.983367-4-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Родитель
a45e43cad7
Коммит
d7a66574b3
|
@ -585,6 +585,7 @@ void del_gendisk(struct gendisk *disk)
|
|||
disk_del_events(disk);
|
||||
|
||||
mutex_lock(&disk->open_mutex);
|
||||
remove_inode_hash(disk->part0->bd_inode);
|
||||
disk->flags &= ~GENHD_FL_UP;
|
||||
blk_drop_partitions(disk);
|
||||
mutex_unlock(&disk->open_mutex);
|
||||
|
@ -592,12 +593,6 @@ void del_gendisk(struct gendisk *disk)
|
|||
fsync_bdev(disk->part0);
|
||||
__invalidate_device(disk->part0, true);
|
||||
|
||||
/*
|
||||
* Unhash the bdev inode for this device so that it can't be looked
|
||||
* up any more even if openers still hold references to it.
|
||||
*/
|
||||
remove_inode_hash(disk->part0->bd_inode);
|
||||
|
||||
set_capacity(disk, 0);
|
||||
|
||||
if (!(disk->flags & GENHD_FL_HIDDEN)) {
|
||||
|
|
|
@ -1340,7 +1340,7 @@ struct block_device *blkdev_get_no_open(dev_t dev)
|
|||
disk = bdev->bd_disk;
|
||||
if (!kobject_get_unless_zero(&disk_to_dev(disk)->kobj))
|
||||
goto bdput;
|
||||
if ((disk->flags & (GENHD_FL_UP | GENHD_FL_HIDDEN)) != GENHD_FL_UP)
|
||||
if (disk->flags & GENHD_FL_HIDDEN)
|
||||
goto put_disk;
|
||||
if (!try_module_get(bdev->bd_disk->fops->owner))
|
||||
goto put_disk;
|
||||
|
|
Загрузка…
Ссылка в новой задаче