xfs: wire up sops->shutdown
authorChristoph Hellwig <hch@lst.de>
Thu, 1 Jun 2023 09:44:55 +0000 (11:44 +0200)
committerJens Axboe <axboe@kernel.dk>
Mon, 5 Jun 2023 16:53:04 +0000 (10:53 -0600)
Wire up the shutdown method to shut down the file system when the
underlying block device is marked dead.  Add a new message to
clearly distinguish this shutdown reason from other shutdowns.

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-13-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/xfs/xfs_fsops.c
fs/xfs/xfs_mount.h
fs/xfs/xfs_super.c

index 13851c0..9ebb833 100644 (file)
@@ -534,6 +534,9 @@ xfs_do_force_shutdown(
        } else if (flags & SHUTDOWN_CORRUPT_ONDISK) {
                tag = XFS_PTAG_SHUTDOWN_CORRUPT;
                why = "Corruption of on-disk metadata";
+       } else if (flags & SHUTDOWN_DEVICE_REMOVED) {
+               tag = XFS_PTAG_SHUTDOWN_IOERROR;
+               why = "Block device removal";
        } else {
                tag = XFS_PTAG_SHUTDOWN_IOERROR;
                why = "Metadata I/O Error";
index aaaf5ec..429a5e1 100644 (file)
@@ -457,12 +457,14 @@ void xfs_do_force_shutdown(struct xfs_mount *mp, uint32_t flags, char *fname,
 #define SHUTDOWN_FORCE_UMOUNT  (1u << 2) /* shutdown from a forced unmount */
 #define SHUTDOWN_CORRUPT_INCORE        (1u << 3) /* corrupt in-memory structures */
 #define SHUTDOWN_CORRUPT_ONDISK        (1u << 4)  /* corrupt metadata on device */
+#define SHUTDOWN_DEVICE_REMOVED        (1u << 5) /* device removed underneath us */
 
 #define XFS_SHUTDOWN_STRINGS \
        { SHUTDOWN_META_IO_ERROR,       "metadata_io" }, \
        { SHUTDOWN_LOG_IO_ERROR,        "log_io" }, \
        { SHUTDOWN_FORCE_UMOUNT,        "force_umount" }, \
-       { SHUTDOWN_CORRUPT_INCORE,      "corruption" }
+       { SHUTDOWN_CORRUPT_INCORE,      "corruption" }, \
+       { SHUTDOWN_DEVICE_REMOVED,      "device_removed" }
 
 /*
  * Flags for xfs_mountfs
index 5684c53..eb469b8 100644 (file)
@@ -1159,6 +1159,13 @@ xfs_fs_free_cached_objects(
        return xfs_reclaim_inodes_nr(XFS_M(sb), sc->nr_to_scan);
 }
 
+static void
+xfs_fs_shutdown(
+       struct super_block      *sb)
+{
+       xfs_force_shutdown(XFS_M(sb), SHUTDOWN_DEVICE_REMOVED);
+}
+
 static const struct super_operations xfs_super_operations = {
        .alloc_inode            = xfs_fs_alloc_inode,
        .destroy_inode          = xfs_fs_destroy_inode,
@@ -1172,6 +1179,7 @@ static const struct super_operations xfs_super_operations = {
        .show_options           = xfs_fs_show_options,
        .nr_cached_objects      = xfs_fs_nr_cached_objects,
        .free_cached_objects    = xfs_fs_free_cached_objects,
+       .shutdown               = xfs_fs_shutdown,
 };
 
 static int