From a2705b1dd5f8d186db02091b96efdd5f87e38090 Mon Sep 17 00:00:00 2001 From: Tony Hutter Date: Fri, 23 Sep 2022 10:24:19 -0700 Subject: [PATCH] zpool: Don't print "repairing" on force faulted drives If you force fault a drive that's resilvering, it's scan stats can get frozen in time, giving the false impression that it's being resilvered. This commit checks the vdev state to see if the vdev is healthy before reporting "resilvering" or "repairing" in zpool status. Reviewed-by: Brian Behlendorf Signed-off-by: Tony Hutter Closes #13927 Closes #13930 --- cmd/zpool/zpool_main.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/cmd/zpool/zpool_main.c b/cmd/zpool/zpool_main.c index 3f46bd0513..54464731b5 100644 --- a/cmd/zpool/zpool_main.c +++ b/cmd/zpool/zpool_main.c @@ -2438,7 +2438,14 @@ print_status_config(zpool_handle_t *zhp, status_cbdata_t *cb, const char *name, (void) nvlist_lookup_uint64_array(root, ZPOOL_CONFIG_SCAN_STATS, (uint64_t **)&ps, &c); - if (ps != NULL && ps->pss_state == DSS_SCANNING && children == 0) { + /* + * If you force fault a drive that's resilvering, its scan stats can + * get frozen in time, giving the false impression that it's + * being resilvered. That's why we check the state to see if the vdev + * is healthy before reporting "resilvering" or "repairing". + */ + if (ps != NULL && ps->pss_state == DSS_SCANNING && children == 0 && + vs->vs_state == VDEV_STATE_HEALTHY) { if (vs->vs_scan_processed != 0) { (void) printf(gettext(" (%s)"), (ps->pss_func == POOL_SCAN_RESILVER) ? @@ -2450,7 +2457,7 @@ print_status_config(zpool_handle_t *zhp, status_cbdata_t *cb, const char *name, /* The top-level vdevs have the rebuild stats */ if (vrs != NULL && vrs->vrs_state == VDEV_REBUILD_ACTIVE && - children == 0) { + children == 0 && vs->vs_state == VDEV_STATE_HEALTHY) { if (vs->vs_rebuild_processed != 0) { (void) printf(gettext(" (resilvering)")); }