Commit be42fc13 authored by Darrick J. Wong's avatar Darrick J. Wong
Browse files

xfs: record health problems with the metadata directory



Make a report to the health monitoring subsystem any time we encounter
something in the metadata directory tree that looks like corruption.

Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
parent 61b6bdb3
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -198,6 +198,7 @@ struct xfs_fsop_geom {
#define XFS_FSOP_GEOM_SICK_RT_SUMMARY	(1 << 5)  /* realtime summary */
#define XFS_FSOP_GEOM_SICK_QUOTACHECK	(1 << 6)  /* quota counts */
#define XFS_FSOP_GEOM_SICK_NLINKS	(1 << 7)  /* inode link counts */
#define XFS_FSOP_GEOM_SICK_METADIR	(1 << 8)  /* metadata directory */

/* Output for XFS_FS_COUNTS */
typedef struct xfs_fsop_counts {
+3 −1
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@ struct xfs_da_args;
#define XFS_SICK_FS_PQUOTA	(1 << 3)  /* project quota */
#define XFS_SICK_FS_QUOTACHECK	(1 << 4)  /* quota counts */
#define XFS_SICK_FS_NLINKS	(1 << 5)  /* inode link counts */
#define XFS_SICK_FS_METADIR	(1 << 6)  /* metadata directory tree */

/* Observable health issues for realtime volume metadata. */
#define XFS_SICK_RT_BITMAP	(1 << 0)  /* realtime bitmap */
@@ -105,7 +106,8 @@ struct xfs_da_args;
				 XFS_SICK_FS_GQUOTA | \
				 XFS_SICK_FS_PQUOTA | \
				 XFS_SICK_FS_QUOTACHECK | \
				 XFS_SICK_FS_NLINKS)
				 XFS_SICK_FS_NLINKS | \
				 XFS_SICK_FS_METADIR)

#define XFS_SICK_RT_PRIMARY	(XFS_SICK_RT_BITMAP | \
				 XFS_SICK_RT_SUMMARY)
+10 −3
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
#include "xfs_dir2.h"
#include "xfs_dir2_priv.h"
#include "xfs_parent.h"
#include "xfs_health.h"

/*
 * Metadata Directory Tree
@@ -94,8 +95,10 @@ xfs_metadir_lookup(
	};
	int			error;

	if (!S_ISDIR(VFS_I(dp)->i_mode))
	if (!S_ISDIR(VFS_I(dp)->i_mode)) {
		xfs_fs_mark_sick(mp, XFS_SICK_FS_METADIR);
		return -EFSCORRUPTED;
	}
	if (xfs_is_shutdown(mp))
		return -EIO;

@@ -103,10 +106,14 @@ xfs_metadir_lookup(
	if (error)
		return error;

	if (!xfs_verify_ino(mp, args.inumber))
	if (!xfs_verify_ino(mp, args.inumber)) {
		xfs_fs_mark_sick(mp, XFS_SICK_FS_METADIR);
		return -EFSCORRUPTED;
	if (xname->type != XFS_DIR3_FT_UNKNOWN && xname->type != args.filetype)
	}
	if (xname->type != XFS_DIR3_FT_UNKNOWN && xname->type != args.filetype) {
		xfs_fs_mark_sick(mp, XFS_SICK_FS_METADIR);
		return -EFSCORRUPTED;
	}

	trace_xfs_metadir_lookup(dp, xname, args.inumber);
	*ino = args.inumber;
+1 −0
Original line number Diff line number Diff line
@@ -380,6 +380,7 @@ static const struct ioctl_sick_map fs_map[] = {
	{ XFS_SICK_FS_PQUOTA,	XFS_FSOP_GEOM_SICK_PQUOTA },
	{ XFS_SICK_FS_QUOTACHECK, XFS_FSOP_GEOM_SICK_QUOTACHECK },
	{ XFS_SICK_FS_NLINKS,	XFS_FSOP_GEOM_SICK_NLINKS },
	{ XFS_SICK_FS_METADIR,	XFS_FSOP_GEOM_SICK_METADIR },
	{ 0, 0 },
};

+1 −0
Original line number Diff line number Diff line
@@ -878,6 +878,7 @@ xfs_trans_metafile_iget(
whine:
	xfs_err(mp, "metadata inode 0x%llx type %u is corrupt", ino,
			metafile_type);
	xfs_fs_mark_sick(mp, XFS_SICK_FS_METADIR);
	return -EFSCORRUPTED;
}

Loading