From dff836b79c45bde78ede1dc3a922c53aa589ac9c Mon Sep 17 00:00:00 2001 From: avg Date: Fri, 26 May 2017 12:02:51 +0000 Subject: [PATCH] 8166 zpool scrub thinks it repaired offline device illumos/illumos-gate@2d2f193a21231a58c583466dc23ba71f1a25f424 https://github.com/illumos/illumos-gate/commit/2d2f193a21231a58c583466dc23ba71f1a25f424 https://www.illumos.org/issues/8166 If we do a scrub while a leaf device is offline (via "zpool offline"), we will inadvertently clear the DTL (dirty time log) of the offline device, even though it is still damaged. When the device comes back online, we will incompletely resilver it, thinking that the scrub repaired blocks written before the scrub was started. The incomplete resilver can lead to data loss if there is a subsequent failure of a different leaf device. The fix is to never clear the DTL of offline devices. Note that if a device is onlined while a scrub is in progress, the scrub will be restarted. The problem can be worked around by running "zpool scrub" after "zpool online". See also https://github.com/zfsonlinux/zfs/issues/5806 Reviewed by: George Wilson george.wilson@delphix.com Reviewed by: Brad Lewis Approved by: Richard Lowe Author: Matthew Ahrens --- uts/common/fs/zfs/vdev.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/uts/common/fs/zfs/vdev.c b/uts/common/fs/zfs/vdev.c index c0905abb46cbff..b7fce8b5578cd7 100644 --- a/uts/common/fs/zfs/vdev.c +++ b/uts/common/fs/zfs/vdev.c @@ -1788,6 +1788,9 @@ vdev_dtl_should_excise(vdev_t *vd) ASSERT0(scn->scn_phys.scn_errors); ASSERT0(vd->vdev_children); + if (vd->vdev_state < VDEV_STATE_DEGRADED) + return (B_FALSE); + if (vd->vdev_resilver_txg == 0 || range_tree_space(vd->vdev_dtl[DTL_MISSING]) == 0) return (B_TRUE);