From owner-svn-src-all@FreeBSD.ORG Thu Jan 16 13:24:10 2014 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id E03B935F; Thu, 16 Jan 2014 13:24:10 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id B374E1B34; Thu, 16 Jan 2014 13:24:10 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id s0GDOA1w008513; Thu, 16 Jan 2014 13:24:10 GMT (envelope-from avg@svn.freebsd.org) Received: (from avg@localhost) by svn.freebsd.org (8.14.7/8.14.7/Submit) id s0GDOADB008512; Thu, 16 Jan 2014 13:24:10 GMT (envelope-from avg@svn.freebsd.org) Message-Id: <201401161324.s0GDOADB008512@svn.freebsd.org> From: Andriy Gapon Date: Thu, 16 Jan 2014 13:24:10 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r260713 - head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 16 Jan 2014 13:24:11 -0000 Author: avg Date: Thu Jan 16 13:24:10 2014 New Revision: 260713 URL: http://svnweb.freebsd.org/changeset/base/260713 Log: 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 Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c ============================================================================== --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c Thu Jan 16 13:21:32 2014 (r260712) +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c Thu Jan 16 13:24:10 2014 (r260713) @@ -313,13 +313,16 @@ vdev_mirror_scrub_done(zio_t *zio) * single-copy data. */ static int -vdev_mirror_dva_select(zio_t *zio, int preferred) +vdev_mirror_dva_select(zio_t *zio, int p) { dva_t *dva = zio->io_bp->blk_dva; mirror_map_t *mm = zio->io_vsd; + int preferred; int c; - for (c = preferred - 1; c >= 0; c--) { + preferred = mm->mm_preferred[p]; + for (p-- ; p >= 0; p--) { + c = mm->mm_preferred[p]; if (DVA_GET_VDEV(&dva[c]) == DVA_GET_VDEV(&dva[preferred])) preferred = c; } @@ -334,7 +337,7 @@ vdev_mirror_preferred_child_randomize(zi if (mm->mm_root) { p = spa_get_random(mm->mm_preferred_cnt); - return (vdev_mirror_dva_select(zio, mm->mm_preferred[p])); + return (vdev_mirror_dva_select(zio, p)); } /*