block: unhash the inode earlier in delete_partition
authorChristoph Hellwig <hch@lst.de>
Thu, 1 Jun 2023 09:44:49 +0000 (11:44 +0200)
committerJens Axboe <axboe@kernel.dk>
Mon, 5 Jun 2023 16:53:04 +0000 (10:53 -0600)
Move the call to remove_inode_hash to the beginning of delete_partition,
as we want to prevent opening a block_device that is about to be removed
ASAP.

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-7-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/partitions/core.c

index 82d2642..9d1deba 100644 (file)
@@ -267,6 +267,12 @@ static void delete_partition(struct block_device *part)
 {
        lockdep_assert_held(&part->bd_disk->open_mutex);
 
+       /*
+        * Remove the block device from the inode hash, so that it cannot be
+        * looked up any more even when openers still hold references.
+        */
+       remove_inode_hash(part->bd_inode);
+
        fsync_bdev(part);
        __invalidate_device(part, true);
 
@@ -274,12 +280,6 @@ static void delete_partition(struct block_device *part)
        kobject_put(part->bd_holder_dir);
        device_del(&part->bd_device);
 
-       /*
-        * Remove the block device from the inode hash, so that it cannot be
-        * looked up any more even when openers still hold references.
-        */
-       remove_inode_hash(part->bd_inode);
-
        put_device(&part->bd_device);
 }