Print this page
3956 ::vdev -r should work with pipelines
3957 ztest should update the cachefile before killing itself
3958 multiple scans can lead to partial resilvering
3959 ddt entries are not always resilvered
3960 dsl_scan can skip over dedup-ed blocks if physical birth != logical birth
3961 freed gang blocks are not resilvered and can cause pool to suspend
3962 ztest should print out zfs debug buffer before exiting
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Adam Leventhal <ahl@delphix.com>

@@ -4444,11 +4444,11 @@
                         oldvd->vdev_devid = NULL;
                 }
         }
 
         /* mark the device being resilvered */
-        newvd->vdev_resilvering = B_TRUE;
+        newvd->vdev_resilver_txg = txg;
 
         /*
          * If the parent is not a mirror, or if we're replacing, insert the new
          * mirror/replacing/spare vdev above oldvd.
          */

@@ -5301,17 +5301,10 @@
                 oldvd = spa_vdev_resilver_done_hunt(vd->vdev_child[c]);
                 if (oldvd != NULL)
                         return (oldvd);
         }
 
-        if (vd->vdev_resilvering && vdev_dtl_empty(vd, DTL_MISSING) &&
-            vdev_dtl_empty(vd, DTL_OUTAGE)) {
-                ASSERT(vd->vdev_ops->vdev_op_leaf);
-                vd->vdev_resilvering = B_FALSE;
-                vdev_config_dirty(vd->vdev_top);
-        }
-
         /*
          * Check for a completed replacement.  We always consider the first
          * vdev in the list to be the oldest vdev, and the last one to be
          * the newest (see spa_vdev_attach() for how that works).  In
          * the case where the newest vdev is faulted, we will not automatically

@@ -5397,10 +5390,12 @@
                 if (ppvd->vdev_ops == &vdev_spare_ops && pvd->vdev_id == 0 &&
                     ppvd->vdev_children == 2) {
                         ASSERT(pvd->vdev_ops == &vdev_replacing_ops);
                         sguid = ppvd->vdev_child[1]->vdev_guid;
                 }
+                ASSERT(vd->vdev_resilver_txg == 0 || !vdev_dtl_required(vd));
+
                 spa_config_exit(spa, SCL_ALL, FTAG);
                 if (spa_vdev_detach(spa, guid, pguid, B_TRUE) != 0)
                         return;
                 if (sguid && spa_vdev_detach(spa, sguid, ppguid, B_TRUE) != 0)
                         return;