changeset 10890:499786962772

6807339 spurious checksum errors when replacing a vdev
author Eric Taylor <Eric.Taylor@Sun.COM>
date Tue, 27 Oct 2009 15:14:40 -0600
parents 8b6ec68049bd
children 805b7ab7ad22
files usr/src/uts/common/fs/zfs/vdev.c
diffstat 1 files changed, 3 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/fs/zfs/vdev.c	Tue Oct 27 13:44:45 2009 -0700
+++ b/usr/src/uts/common/fs/zfs/vdev.c	Tue Oct 27 15:14:40 2009 -0600
@@ -1628,6 +1628,8 @@
 
 	mutex_enter(&vd->vdev_dtl_lock);
 	for (int t = 0; t < DTL_TYPES; t++) {
+		/* account for child's outage in parent's missing map */
+		int s = (t == DTL_MISSING) ? DTL_OUTAGE: t;
 		if (t == DTL_SCRUB)
 			continue;			/* leaf vdevs only */
 		if (t == DTL_PARTIAL)
@@ -1640,7 +1642,7 @@
 		for (int c = 0; c < vd->vdev_children; c++) {
 			vdev_t *cvd = vd->vdev_child[c];
 			mutex_enter(&cvd->vdev_dtl_lock);
-			space_map_ref_add_map(&reftree, &cvd->vdev_dtl[t], 1);
+			space_map_ref_add_map(&reftree, &cvd->vdev_dtl[s], 1);
 			mutex_exit(&cvd->vdev_dtl_lock);
 		}
 		space_map_ref_generate_map(&reftree, &vd->vdev_dtl[t], minref);