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 <behlendorf1@llnl.gov> Signed-off-by: Tony Hutter <hutter2@llnl.gov> Closes #13927 Closes #13930
This commit is contained in:
parent
63d4838b4a
commit
a2705b1dd5
|
@ -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,
|
(void) nvlist_lookup_uint64_array(root, ZPOOL_CONFIG_SCAN_STATS,
|
||||||
(uint64_t **)&ps, &c);
|
(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) {
|
if (vs->vs_scan_processed != 0) {
|
||||||
(void) printf(gettext(" (%s)"),
|
(void) printf(gettext(" (%s)"),
|
||||||
(ps->pss_func == POOL_SCAN_RESILVER) ?
|
(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 */
|
/* The top-level vdevs have the rebuild stats */
|
||||||
if (vrs != NULL && vrs->vrs_state == VDEV_REBUILD_ACTIVE &&
|
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) {
|
if (vs->vs_rebuild_processed != 0) {
|
||||||
(void) printf(gettext(" (resilvering)"));
|
(void) printf(gettext(" (resilvering)"));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue