Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0+ */
0002 /*
0003  * Copyright (C) 2019 Oracle.  All Rights Reserved.
0004  * Author: Darrick J. Wong <darrick.wong@oracle.com>
0005  */
0006 #ifndef __XFS_HEALTH_H__
0007 #define __XFS_HEALTH_H__
0008 
0009 /*
0010  * In-Core Filesystem Health Assessments
0011  * =====================================
0012  *
0013  * We'd like to be able to summarize the current health status of the
0014  * filesystem so that the administrator knows when it's necessary to schedule
0015  * some downtime for repairs.  Until then, we would also like to avoid abrupt
0016  * shutdowns due to corrupt metadata.
0017  *
0018  * The online scrub feature evaluates the health of all filesystem metadata.
0019  * When scrub detects corruption in a piece of metadata it will set the
0020  * corresponding sickness flag, and repair will clear it if successful.  If
0021  * problems remain at unmount time, we can also request manual intervention by
0022  * logging a notice to run xfs_repair.
0023  *
0024  * Each health tracking group uses a pair of fields for reporting.  The
0025  * "checked" field tell us if a given piece of metadata has ever been examined,
0026  * and the "sick" field tells us if that piece was found to need repairs.
0027  * Therefore we can conclude that for a given sick flag value:
0028  *
0029  *  - checked && sick  => metadata needs repair
0030  *  - checked && !sick => metadata is ok
0031  *  - !checked         => has not been examined since mount
0032  */
0033 
0034 struct xfs_mount;
0035 struct xfs_perag;
0036 struct xfs_inode;
0037 struct xfs_fsop_geom;
0038 
0039 /* Observable health issues for metadata spanning the entire filesystem. */
0040 #define XFS_SICK_FS_COUNTERS    (1 << 0)  /* summary counters */
0041 #define XFS_SICK_FS_UQUOTA  (1 << 1)  /* user quota */
0042 #define XFS_SICK_FS_GQUOTA  (1 << 2)  /* group quota */
0043 #define XFS_SICK_FS_PQUOTA  (1 << 3)  /* project quota */
0044 
0045 /* Observable health issues for realtime volume metadata. */
0046 #define XFS_SICK_RT_BITMAP  (1 << 0)  /* realtime bitmap */
0047 #define XFS_SICK_RT_SUMMARY (1 << 1)  /* realtime summary */
0048 
0049 /* Observable health issues for AG metadata. */
0050 #define XFS_SICK_AG_SB      (1 << 0)  /* superblock */
0051 #define XFS_SICK_AG_AGF     (1 << 1)  /* AGF header */
0052 #define XFS_SICK_AG_AGFL    (1 << 2)  /* AGFL header */
0053 #define XFS_SICK_AG_AGI     (1 << 3)  /* AGI header */
0054 #define XFS_SICK_AG_BNOBT   (1 << 4)  /* free space by block */
0055 #define XFS_SICK_AG_CNTBT   (1 << 5)  /* free space by length */
0056 #define XFS_SICK_AG_INOBT   (1 << 6)  /* inode index */
0057 #define XFS_SICK_AG_FINOBT  (1 << 7)  /* free inode index */
0058 #define XFS_SICK_AG_RMAPBT  (1 << 8)  /* reverse mappings */
0059 #define XFS_SICK_AG_REFCNTBT    (1 << 9)  /* reference counts */
0060 
0061 /* Observable health issues for inode metadata. */
0062 #define XFS_SICK_INO_CORE   (1 << 0)  /* inode core */
0063 #define XFS_SICK_INO_BMBTD  (1 << 1)  /* data fork */
0064 #define XFS_SICK_INO_BMBTA  (1 << 2)  /* attr fork */
0065 #define XFS_SICK_INO_BMBTC  (1 << 3)  /* cow fork */
0066 #define XFS_SICK_INO_DIR    (1 << 4)  /* directory */
0067 #define XFS_SICK_INO_XATTR  (1 << 5)  /* extended attributes */
0068 #define XFS_SICK_INO_SYMLINK    (1 << 6)  /* symbolic link remote target */
0069 #define XFS_SICK_INO_PARENT (1 << 7)  /* parent pointers */
0070 
0071 /* Primary evidence of health problems in a given group. */
0072 #define XFS_SICK_FS_PRIMARY (XFS_SICK_FS_COUNTERS | \
0073                  XFS_SICK_FS_UQUOTA | \
0074                  XFS_SICK_FS_GQUOTA | \
0075                  XFS_SICK_FS_PQUOTA)
0076 
0077 #define XFS_SICK_RT_PRIMARY (XFS_SICK_RT_BITMAP | \
0078                  XFS_SICK_RT_SUMMARY)
0079 
0080 #define XFS_SICK_AG_PRIMARY (XFS_SICK_AG_SB | \
0081                  XFS_SICK_AG_AGF | \
0082                  XFS_SICK_AG_AGFL | \
0083                  XFS_SICK_AG_AGI | \
0084                  XFS_SICK_AG_BNOBT | \
0085                  XFS_SICK_AG_CNTBT | \
0086                  XFS_SICK_AG_INOBT | \
0087                  XFS_SICK_AG_FINOBT | \
0088                  XFS_SICK_AG_RMAPBT | \
0089                  XFS_SICK_AG_REFCNTBT)
0090 
0091 #define XFS_SICK_INO_PRIMARY    (XFS_SICK_INO_CORE | \
0092                  XFS_SICK_INO_BMBTD | \
0093                  XFS_SICK_INO_BMBTA | \
0094                  XFS_SICK_INO_BMBTC | \
0095                  XFS_SICK_INO_DIR | \
0096                  XFS_SICK_INO_XATTR | \
0097                  XFS_SICK_INO_SYMLINK | \
0098                  XFS_SICK_INO_PARENT)
0099 
0100 /* These functions must be provided by the xfs implementation. */
0101 
0102 void xfs_fs_mark_sick(struct xfs_mount *mp, unsigned int mask);
0103 void xfs_fs_mark_healthy(struct xfs_mount *mp, unsigned int mask);
0104 void xfs_fs_measure_sickness(struct xfs_mount *mp, unsigned int *sick,
0105         unsigned int *checked);
0106 
0107 void xfs_rt_mark_sick(struct xfs_mount *mp, unsigned int mask);
0108 void xfs_rt_mark_healthy(struct xfs_mount *mp, unsigned int mask);
0109 void xfs_rt_measure_sickness(struct xfs_mount *mp, unsigned int *sick,
0110         unsigned int *checked);
0111 
0112 void xfs_ag_mark_sick(struct xfs_perag *pag, unsigned int mask);
0113 void xfs_ag_mark_healthy(struct xfs_perag *pag, unsigned int mask);
0114 void xfs_ag_measure_sickness(struct xfs_perag *pag, unsigned int *sick,
0115         unsigned int *checked);
0116 
0117 void xfs_inode_mark_sick(struct xfs_inode *ip, unsigned int mask);
0118 void xfs_inode_mark_healthy(struct xfs_inode *ip, unsigned int mask);
0119 void xfs_inode_measure_sickness(struct xfs_inode *ip, unsigned int *sick,
0120         unsigned int *checked);
0121 
0122 void xfs_health_unmount(struct xfs_mount *mp);
0123 
0124 /* Now some helpers. */
0125 
0126 static inline bool
0127 xfs_fs_has_sickness(struct xfs_mount *mp, unsigned int mask)
0128 {
0129     unsigned int    sick, checked;
0130 
0131     xfs_fs_measure_sickness(mp, &sick, &checked);
0132     return sick & mask;
0133 }
0134 
0135 static inline bool
0136 xfs_rt_has_sickness(struct xfs_mount *mp, unsigned int mask)
0137 {
0138     unsigned int    sick, checked;
0139 
0140     xfs_rt_measure_sickness(mp, &sick, &checked);
0141     return sick & mask;
0142 }
0143 
0144 static inline bool
0145 xfs_ag_has_sickness(struct xfs_perag *pag, unsigned int mask)
0146 {
0147     unsigned int    sick, checked;
0148 
0149     xfs_ag_measure_sickness(pag, &sick, &checked);
0150     return sick & mask;
0151 }
0152 
0153 static inline bool
0154 xfs_inode_has_sickness(struct xfs_inode *ip, unsigned int mask)
0155 {
0156     unsigned int    sick, checked;
0157 
0158     xfs_inode_measure_sickness(ip, &sick, &checked);
0159     return sick & mask;
0160 }
0161 
0162 static inline bool
0163 xfs_fs_is_healthy(struct xfs_mount *mp)
0164 {
0165     return !xfs_fs_has_sickness(mp, -1U);
0166 }
0167 
0168 static inline bool
0169 xfs_rt_is_healthy(struct xfs_mount *mp)
0170 {
0171     return !xfs_rt_has_sickness(mp, -1U);
0172 }
0173 
0174 static inline bool
0175 xfs_ag_is_healthy(struct xfs_perag *pag)
0176 {
0177     return !xfs_ag_has_sickness(pag, -1U);
0178 }
0179 
0180 static inline bool
0181 xfs_inode_is_healthy(struct xfs_inode *ip)
0182 {
0183     return !xfs_inode_has_sickness(ip, -1U);
0184 }
0185 
0186 void xfs_fsop_geom_health(struct xfs_mount *mp, struct xfs_fsop_geom *geo);
0187 void xfs_ag_geom_health(struct xfs_perag *pag, struct xfs_ag_geometry *ageo);
0188 void xfs_bulkstat_health(struct xfs_inode *ip, struct xfs_bulkstat *bs);
0189 
0190 #endif  /* __XFS_HEALTH_H__ */