From 462cde0334763dcd32f53ec178482c1f4a90418f Mon Sep 17 00:00:00 2001 From: Tom Caputi Date: Fri, 19 Oct 2018 18:10:23 -0400 Subject: [PATCH] Fix ENXIO from spa_ld_verify_logs() in ztest This patch fixes a small issue where the zil_check_log_chain() code path would hit an EBUSY error. This would occur when 2 threads attempted to call metaslab_activate() at the same time. In this case, the "loser" would receive an error code which should have been ignored, but was instead floated to the caller. This ended up resulting in an ENXIO being returned from from spa_ld_verify_logs(). Signed-off-by: Tom Caputi TEST_ZTEST_TIMEOUT=7200 --- module/zfs/metaslab.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/module/zfs/metaslab.c b/module/zfs/metaslab.c index a117dc4460b8..616a89507a7f 100644 --- a/module/zfs/metaslab.c +++ b/module/zfs/metaslab.c @@ -2049,7 +2049,7 @@ metaslab_activate(metaslab_t *msp, int allocator, uint64_t activation_weight) * The metaslab was activated for another allocator * while we were waiting, we should reselect. */ - return (EBUSY); + return (SET_ERROR(EBUSY)); } if ((error = metaslab_activate_allocator(msp->ms_group, msp, allocator, activation_weight)) != 0) { @@ -3886,15 +3886,21 @@ metaslab_claim_concrete(vdev_t *vd, uint64_t offset, uint64_t size, int error = 0; if (offset >> vd->vdev_ms_shift >= vd->vdev_ms_count) - return (ENXIO); + return (SET_ERROR(ENXIO)); ASSERT3P(vd->vdev_ms, !=, NULL); msp = vd->vdev_ms[offset >> vd->vdev_ms_shift]; mutex_enter(&msp->ms_lock); - if ((txg != 0 && spa_writeable(spa)) || !msp->ms_loaded) + if ((txg != 0 && spa_writeable(spa)) || !msp->ms_loaded) { error = metaslab_activate(msp, 0, METASLAB_WEIGHT_CLAIM); + if (error == EBUSY) { + ASSERT(msp->ms_loaded); + ASSERT(msp->ms_weight & METASLAB_ACTIVE_MASK); + error = 0; + } + } if (error == 0 && !range_tree_contains(msp->ms_allocatable, offset, size))