]> granicus.if.org Git - zfs/commitdiff
Disabled resilver_defer feature leads to looping resilvers
authorKody A Kantor <kody.kantor@gmail.com>
Sun, 22 Sep 2019 22:25:39 +0000 (17:25 -0500)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Sun, 22 Sep 2019 22:25:39 +0000 (15:25 -0700)
When a disk is replaced with another on a pool with the resilver_defer
feature present, but not enabled the resilver activity restarts during
each spa_sync. This patch checks to make sure that the resilver_defer
feature is first enabled before requesting a deferred resilver.

This was originally fixed in illumos-joyent as OS-7982.

Reviewed-by: Chris Dunlop <chris@onthe.net.au>
Reviewed-by: George Melikov <mail@gmelikov.ru>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Tom Caputi <tcaputi@datto.com>
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Signed-off-by: Kody A Kantor <kody@kkantor.com>
External-issue: illumos-joyent OS-7982
Closes #9299
Closes #9338

module/zfs/dsl_scan.c

index 28e119f4306f6c4fb2da293029dde41c91420c88..f1621c9c9b66091e78aa1ff8f0ae57d9480ff4a6 100644 (file)
@@ -23,7 +23,7 @@
  * Copyright (c) 2011, 2018 by Delphix. All rights reserved.
  * Copyright 2016 Gary Mills
  * Copyright (c) 2017 Datto Inc.
- * Copyright 2017 Joyent, Inc.
+ * Copyright 2019 Joyent, Inc.
  */
 
 #include <sys/dsl_scan.h>
@@ -955,14 +955,16 @@ dsl_scan_done(dsl_scan_t *scn, boolean_t complete, dmu_tx_t *tx)
                 * will find the drives that need to be resilvered
                 * when the machine reboots and start the resilver then.
                 */
-               boolean_t resilver_needed =
-                   dsl_scan_clear_deferred(spa->spa_root_vdev, tx);
-               if (resilver_needed) {
-                       spa_history_log_internal(spa,
-                           "starting deferred resilver", tx,
-                           "errors=%llu",
-                           (u_longlong_t)spa_get_errlog_size(spa));
-                       spa_async_request(spa, SPA_ASYNC_RESILVER);
+               if (spa_feature_is_enabled(spa, SPA_FEATURE_RESILVER_DEFER)) {
+                       boolean_t resilver_needed =
+                           dsl_scan_clear_deferred(spa->spa_root_vdev, tx);
+                       if (resilver_needed) {
+                               spa_history_log_internal(spa,
+                                   "starting deferred resilver", tx,
+                                   "errors=%llu",
+                                   (u_longlong_t)spa_get_errlog_size(spa));
+                               spa_async_request(spa, SPA_ASYNC_RESILVER);
+                       }
                }
        }