@@ -91,7 +91,7 @@ The output will have the same format that
.BR "xfs_info" "(8)"
prints when querying a filesystem.
.TP
-.BI "health [ \-a agno] [ \-c ] [ \-f ] [ \-i inum ] [ \-q ] [ paths ]"
+.BI "health [ \-a agno] [ \-c ] [ \-f ] [ \-i inum ] [ \-q ] [ \-r rgno ] [ paths ]"
Reports the health of the given group of filesystem metadata.
.RS 1.0i
.PD 0
@@ -114,6 +114,9 @@ Report on the health of a specific inode.
.B \-q
Report only unhealthy metadata.
.TP
+.B \-r
+Report on the health of the given realtime group.
+.TP
.B paths
Report on the health of the files at the given path.
.PD
@@ -134,6 +134,18 @@ static const struct flag_map ag_flags[] = {
{0},
};
+static const struct flag_map rtgroup_flags[] = {
+ {
+ .mask = XFS_RTGROUP_GEOM_SICK_SUPER,
+ .descr = "superblock",
+ },
+ {
+ .mask = XFS_RTGROUP_GEOM_SICK_BITMAP,
+ .descr = "realtime bitmap",
+ },
+ {0},
+};
+
static const struct flag_map inode_flags[] = {
{
.mask = XFS_BS_SICK_INODE,
@@ -214,6 +226,25 @@ report_ag_sick(
return 0;
}
+/* Report on a rt group's health. */
+static int
+report_rtgroup_sick(
+ xfs_rgnumber_t rgno)
+{
+ struct xfs_rtgroup_geometry rgeo = { 0 };
+ char descr[256];
+ int ret;
+
+ ret = -xfrog_rtgroup_geometry(file->xfd.fd, rgno, &rgeo);
+ if (ret) {
+ xfrog_perror(ret, "rtgroup_geometry");
+ return 1;
+ }
+ snprintf(descr, sizeof(descr) - 1, _("rtgroup %u"), rgno);
+ report_sick(descr, rtgroup_flags, rgeo.rg_sick, rgeo.rg_checked);
+ return 0;
+}
+
/* Report on an inode's health. */
static int
report_inode_health(
@@ -312,7 +343,7 @@ report_bulkstat_health(
return error;
}
-#define OPT_STRING ("a:cfi:q")
+#define OPT_STRING ("a:cfi:qr:")
/* Report on health problems in XFS filesystem. */
static int
@@ -322,6 +353,7 @@ health_f(
{
unsigned long long x;
xfs_agnumber_t agno;
+ xfs_rgnumber_t rgno;
bool default_report = true;
int c;
int ret;
@@ -365,6 +397,17 @@ health_f(
case 'q':
quiet = true;
break;
+ case 'r':
+ default_report = false;
+ errno = 0;
+ x = strtoll(optarg, NULL, 10);
+ if (!errno && x >= NULLRGNUMBER)
+ errno = ERANGE;
+ if (errno) {
+ perror("rtgroup health");
+ return 1;
+ }
+ break;
default:
return command_usage(&health_cmd);
}
@@ -400,6 +443,12 @@ health_f(
if (ret)
return 1;
break;
+ case 'r':
+ rgno = strtoll(optarg, NULL, 10);
+ ret = report_rtgroup_sick(rgno);
+ if (ret)
+ return 1;
+ break;
default:
break;
}
@@ -421,6 +470,11 @@ health_f(
if (ret)
return 1;
}
+ for (rgno = 0; rgno < file->xfd.fsgeom.rgcount; rgno++) {
+ ret = report_rtgroup_sick(rgno);
+ if (ret)
+ return 1;
+ }
if (comprehensive) {
ret = report_bulkstat_health(NULLAGNUMBER);
if (ret)
@@ -450,6 +504,7 @@ health_help(void)
" -f -- Report health of the overall filesystem.\n"
" -i inum -- Report health of a given inode number.\n"
" -q -- Only report unhealthy metadata.\n"
+" -r rgno -- Report health of the given realtime group.\n"
" paths -- Report health of the given file path.\n"
"\n"));
@@ -460,7 +515,7 @@ static cmdinfo_t health_cmd = {
.cfunc = health_f,
.argmin = 0,
.argmax = -1,
- .args = "[-a agno] [-c] [-f] [-i inum] [-q] [paths]",
+ .args = "[-a agno] [-c] [-f] [-i inum] [-q] [-r rgno] [paths]",
.flags = CMD_FLAG_ONESHOT,
.help = health_help,
};