diff options
author | Christoph Hellwig <hch@lst.de> | 2023-08-11 12:08:25 +0200 |
---|---|---|
committer | Christian Brauner <brauner@kernel.org> | 2023-08-21 14:35:32 +0200 |
commit | d8530de5a6e82be0ce17a5fdf727a394bcf6444c (patch) | |
tree | b790d6a5ded81d976079576f1c777a59064342bc /block/bdev.c | |
parent | 560e20e4bf6484a0c12f9f3c7a1aa55056948e1e (diff) | |
download | linux-d8530de5a6e82be0ce17a5fdf727a394bcf6444c.tar.gz linux-d8530de5a6e82be0ce17a5fdf727a394bcf6444c.tar.bz2 linux-d8530de5a6e82be0ce17a5fdf727a394bcf6444c.zip |
block: call into the file system for bdev_mark_dead
Combine the newly merged bdev_mark_dead helper with the existing
mark_dead holder operation so that all operations that invalidate
a device that is dead or being removed now go through the holder
ops. This allows file systems to explicitly shutdown either ASAP
(for a surprise removal) or after writing back data (for an orderly
removal), and do so not only for the main device.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Message-Id: <20230811100828.1897174-15-hch@lst.de>
Signed-off-by: Christian Brauner <brauner@kernel.org>
Diffstat (limited to 'block/bdev.c')
-rw-r--r-- | block/bdev.c | 30 |
1 files changed, 9 insertions, 21 deletions
diff --git a/block/bdev.c b/block/bdev.c index 074a9ffa9d8b..4d580083a114 100644 --- a/block/bdev.c +++ b/block/bdev.c @@ -968,31 +968,19 @@ EXPORT_SYMBOL(lookup_bdev); * to %true the device or media is already gone, if not we are preparing for an * orderly removal. * - * This syncs out all dirty data and writes back inodes and then invalidates any - * cached data in the inodes on the file system, the inodes themselves and the - * block device mapping. + * This calls into the file system, which then typicall syncs out all dirty data + * and writes back inodes and then invalidates any cached data in the inodes on + * the file system. In addition we also invalidate the block device mapping. */ void bdev_mark_dead(struct block_device *bdev, bool surprise) { - struct super_block *sb = get_super(bdev); - int res = 0; + mutex_lock(&bdev->bd_holder_lock); + if (bdev->bd_holder_ops && bdev->bd_holder_ops->mark_dead) + bdev->bd_holder_ops->mark_dead(bdev, surprise); + else + sync_blockdev(bdev); + mutex_unlock(&bdev->bd_holder_lock); - if (sb) { - if (!surprise) - sync_filesystem(sb); - /* - * no need to lock the super, get_super holds the - * read mutex so the filesystem cannot go away - * under us (->put_super runs with the write lock - * hold). - */ - shrink_dcache_sb(sb); - res = invalidate_inodes(sb, true); - drop_super(sb); - } else { - if (!surprise) - sync_blockdev(bdev); - } invalidate_bdev(bdev); } #ifdef CONFIG_DASD_MODULE |