summaryrefslogtreecommitdiffstats
path: root/sys/cddl
diff options
context:
space:
mode:
authoravg <avg@FreeBSD.org>2014-01-16 12:26:54 +0000
committeravg <avg@FreeBSD.org>2014-01-16 12:26:54 +0000
commit31b7f68d805af95d0ed2e9b768ef212042854498 (patch)
treed2e9c9c9f01a4cb9de1295043008ede80cb23faf /sys/cddl
parent97986ccb0b599062a18e0153ae8cba713fde7df5 (diff)
downloadFreeBSD-src-31b7f68d805af95d0ed2e9b768ef212042854498.zip
FreeBSD-src-31b7f68d805af95d0ed2e9b768ef212042854498.tar.gz
fix a bug in ZFS mirror code for handling multiple DVAa
The bug was introduced in r256956 "Improve ZFS N-way mirror read performance". The code in vdev_mirror_dva_select erroneously considers already tried DVAs for the next attempt. Thus, it is possible that a failing DVA would be retried forever. As a secondary effect, if the attempts fail with checksum error, then checksum error reports are accumulated until the original request ultimately fails or succeeds. But because retrying is going on indefinitely the cheksum reports accumulation will effectively be a memory leak. Reviewed by: gibbs MFC after: 13 days Sponsored by: HybridCluster
Diffstat (limited to 'sys/cddl')
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c
index 1ffd1de..d4e1c0d 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c
@@ -317,9 +317,13 @@ vdev_mirror_dva_select(zio_t *zio, int preferred)
{
dva_t *dva = zio->io_bp->blk_dva;
mirror_map_t *mm = zio->io_vsd;
+ mirror_child_t *mc;
int c;
for (c = preferred - 1; c >= 0; c--) {
+ mc = &mm->mm_child[c];
+ if (mc->mc_tried || mc->mc_skipped)
+ continue;
if (DVA_GET_VDEV(&dva[c]) == DVA_GET_VDEV(&dva[preferred]))
preferred = c;
}
OpenPOWER on IntegriCloud