Re: [PATCH 8/9] xfs: wire up sops->shutdown

Darrick J. Wong
2023-05-05T18:23:11Z

On Fri, May 05, 2023 at 01:51:31PM -0400, Christoph Hellwig wrote:
> 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>
> ---
> fs/xfs/xfs_fsops.c | 3 +++
> fs/xfs/xfs_mount.h | 1 +
> fs/xfs/xfs_super.c | 8 ++++++++
> 3 files changed, 12 insertions(+)
>
> diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c
> index 13851c0d640bc8..9ebb8333a30800 100644
> --- a/fs/xfs/xfs_fsops.c
> +++ b/fs/xfs/xfs_fsops.c
> @@ -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";
> diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h
> index f3269c0626f057..a3aa954477d0dc 100644
> --- a/fs/xfs/xfs_mount.h
> +++ b/fs/xfs/xfs_mount.h
> @@ -454,6 +454,7 @@ 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 \

Could you add SHUTDOWN_DEVICE_REMOVED to XFS_SHUTDOWN_STRINGS so the
tracepoint data will decode that flag?

(Everything else in here looks fine to me)

--D

> { SHUTDOWN_META_IO_ERROR, "metadata_io" }, \
> diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
> index bc17ad350aea5a..3abe5ae96cc59b 100644
> --- a/fs/xfs/xfs_super.c
> +++ b/fs/xfs/xfs_super.c
> @@ -1156,6 +1156,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,
> @@ -1169,6 +1176,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
> --
> 2.39.2
>