xfs: wire up the ->mark_dead holder operation for log and RT devices
authorChristoph Hellwig <hch@lst.de>
Thu, 1 Jun 2023 09:44:56 +0000 (11:44 +0200)
committerJens Axboe <axboe@kernel.dk>
Mon, 5 Jun 2023 16:53:04 +0000 (10:53 -0600)
Implement a set of holder_ops that shut down the file system when the
block device used as log or RT device is removed undeneath the file
system.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Acked-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Link: https://lore.kernel.org/r/20230601094459.1350643-14-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/xfs/xfs_super.c

index eb469b8..1b4bd5c 100644 (file)
@@ -377,6 +377,17 @@ disable_dax:
        return 0;
 }
 
+static void
+xfs_bdev_mark_dead(
+       struct block_device     *bdev)
+{
+       xfs_force_shutdown(bdev->bd_holder, SHUTDOWN_DEVICE_REMOVED);
+}
+
+static const struct blk_holder_ops xfs_holder_ops = {
+       .mark_dead              = xfs_bdev_mark_dead,
+};
+
 STATIC int
 xfs_blkdev_get(
        xfs_mount_t             *mp,
@@ -386,7 +397,7 @@ xfs_blkdev_get(
        int                     error = 0;
 
        *bdevp = blkdev_get_by_path(name, FMODE_READ|FMODE_WRITE|FMODE_EXCL,
-                                   mp, NULL);
+                                   mp, &xfs_holder_ops);
        if (IS_ERR(*bdevp)) {
                error = PTR_ERR(*bdevp);
                xfs_warn(mp, "Invalid device [%s], error=%d", name, error);