Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 6 Jun 2017 14:46:23 +0000 (UTC)
From:      Glen Barber <gjb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r319624 - stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Message-ID:  <201706061446.v56EkN8g046368@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: gjb
Date: Tue Jun  6 14:46:23 2017
New Revision: 319624
URL: https://svnweb.freebsd.org/changeset/base/319624

Log:
  MFC r318943 (avg):
  
   MFV r318942: 8166 zpool scrub thinks it repaired offline device
  
   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
  
  PR:		219537
  Approved by:	re (kib)
  Sponsored by:	The FreeBSD Foundation

Modified:
  stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c
==============================================================================
--- stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c	Tue Jun  6 14:40:53 2017	(r319623)
+++ stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c	Tue Jun  6 14:46:23 2017	(r319624)
@@ -1929,6 +1929,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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201706061446.v56EkN8g046368>