From 1c12f58815d47eb92cdd273abf43ea07839ee55d Mon Sep 17 00:00:00 2001 From: pjd Date: Sat, 14 Apr 2007 20:50:14 +0000 Subject: Fix RAID-Z resilvering. Obtained from: OpenSolaris --- sys/contrib/opensolaris/uts/common/fs/zfs/vdev_raidz.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'sys/contrib') diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_raidz.c b/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_raidz.c index 08df7e0..0c86630 100644 --- a/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_raidz.c +++ b/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_raidz.c @@ -867,8 +867,18 @@ vdev_raidz_io_done(zio_t *zio) case 0: if (zio_checksum_error(zio) == 0) { zio->io_error = 0; + + /* + * If we read parity information (unnecessarily + * as it happens since no reconstruction was + * needed) regenerate and verify the parity. + * We also regenerate parity when resilvering + * so we can write it out to the failed device + * later. + */ if (parity_errors + parity_untried < - rm->rm_firstdatacol) { + rm->rm_firstdatacol || + (zio->io_flags & ZIO_FLAG_RESILVER)) { n = raidz_parity_verify(zio, rm); unexpected_errors += n; ASSERT(parity_errors + n <= @@ -925,8 +935,12 @@ vdev_raidz_io_done(zio_t *zio) * perform the reconstruction, but this should * be a relatively uncommon case, and can be * optimized if it becomes a problem. + * We also regenerate parity when resilvering + * so we can write it out to the failed device + * later. */ - if (parity_errors < rm->rm_firstdatacol - 1) { + if (parity_errors < rm->rm_firstdatacol - 1 || + (zio->io_flags & ZIO_FLAG_RESILVER)) { n = raidz_parity_verify(zio, rm); unexpected_errors += n; ASSERT(parity_errors + n <= -- cgit v1.1