fs/xfs/xfs_health.c

Source file repositories/reference/linux-study-clean/fs/xfs/xfs_health.c

File Facts

System
Linux kernel
Corpus path
fs/xfs/xfs_health.c
Extension
.c
Size
17729 bytes
Lines
745
Domain
Core OS
Bucket
VFS And Filesystem Core
Inferred role
Core OS: implementation source
Status
source implementation candidate

Why This File Exists

Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.

Dependency Surface

Detected Declarations

Annotated Snippet

struct ioctl_sick_map {
	unsigned int		sick_mask;
	unsigned int		ioctl_mask;
};

#define for_each_sick_map(map, m) \
	for ((m) = (map); (m) < (map) + ARRAY_SIZE(map); (m)++)

static const struct ioctl_sick_map fs_map[] = {
	{ XFS_SICK_FS_COUNTERS,	XFS_FSOP_GEOM_SICK_COUNTERS},
	{ XFS_SICK_FS_UQUOTA,	XFS_FSOP_GEOM_SICK_UQUOTA },
	{ XFS_SICK_FS_GQUOTA,	XFS_FSOP_GEOM_SICK_GQUOTA },
	{ 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 },
	{ XFS_SICK_FS_METAPATH,	XFS_FSOP_GEOM_SICK_METAPATH },
};

static const struct ioctl_sick_map rt_map[] = {
	{ XFS_SICK_RG_BITMAP,	XFS_FSOP_GEOM_SICK_RT_BITMAP },
	{ XFS_SICK_RG_SUMMARY,	XFS_FSOP_GEOM_SICK_RT_SUMMARY },
};

static inline void
xfgeo_health_tick(
	struct xfs_fsop_geom		*geo,
	unsigned int			sick,
	unsigned int			checked,
	const struct ioctl_sick_map	*m)
{
	if (checked & m->sick_mask)
		geo->checked |= m->ioctl_mask;
	if (sick & m->sick_mask)
		geo->sick |= m->ioctl_mask;
}

/* Fill out fs geometry health info. */
void
xfs_fsop_geom_health(
	struct xfs_mount		*mp,
	struct xfs_fsop_geom		*geo)
{
	struct xfs_rtgroup		*rtg = NULL;
	const struct ioctl_sick_map	*m;
	unsigned int			sick;
	unsigned int			checked;

	geo->sick = 0;
	geo->checked = 0;

	xfs_fs_measure_sickness(mp, &sick, &checked);
	for_each_sick_map(fs_map, m)
		xfgeo_health_tick(geo, sick, checked, m);

	while ((rtg = xfs_rtgroup_next(mp, rtg))) {
		xfs_group_measure_sickness(rtg_group(rtg), &sick, &checked);
		for_each_sick_map(rt_map, m)
			xfgeo_health_tick(geo, sick, checked, m);
	}
}

/*
 * Translate XFS_SICK_FS_* into XFS_FSOP_GEOM_SICK_* except for the rt free
 * space codes, which are sent via the rtgroup events.
 */
unsigned int
xfs_healthmon_fs_mask(
	unsigned int			sick_mask)
{
	const struct ioctl_sick_map	*m;
	unsigned int			ioctl_mask = 0;

	for_each_sick_map(fs_map, m) {
		if (sick_mask & m->sick_mask)
			ioctl_mask |= m->ioctl_mask;
	}

	return ioctl_mask;
}

static const struct ioctl_sick_map ag_map[] = {
	{ XFS_SICK_AG_SB,	XFS_AG_GEOM_SICK_SB },
	{ XFS_SICK_AG_AGF,	XFS_AG_GEOM_SICK_AGF },
	{ XFS_SICK_AG_AGFL,	XFS_AG_GEOM_SICK_AGFL },
	{ XFS_SICK_AG_AGI,	XFS_AG_GEOM_SICK_AGI },
	{ XFS_SICK_AG_BNOBT,	XFS_AG_GEOM_SICK_BNOBT },
	{ XFS_SICK_AG_CNTBT,	XFS_AG_GEOM_SICK_CNTBT },
	{ XFS_SICK_AG_INOBT,	XFS_AG_GEOM_SICK_INOBT },
	{ XFS_SICK_AG_FINOBT,	XFS_AG_GEOM_SICK_FINOBT },

Annotation

Implementation Notes