From 8b0a0840b405c67d7a2d4a78c9ebeb04fcb9d988 Mon Sep 17 00:00:00 2001 From: Tim Chase Date: Thu, 14 Aug 2014 07:01:20 -0500 Subject: [PATCH] Don't upgrade a metaslab when the pool is not writable Illumos 4982 added code to metaslab_fragmentation() to proactively update space maps when the spacemap_histogram feature is enabled. This should only happen when the pool is writeable. References: https://www.illumos.org/issues/4982 https://github.com/illumos/illumos-gate/commit/2e4c998 Signed-off-by: Tim Chase Signed-off-by: Brian Behlendorf Closes #2595 --- module/zfs/metaslab.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/module/zfs/metaslab.c b/module/zfs/metaslab.c index 68a1591c2..098d73f95 100644 --- a/module/zfs/metaslab.c +++ b/module/zfs/metaslab.c @@ -1395,13 +1395,16 @@ metaslab_fragmentation(metaslab_t *msp) * so that we upgrade next time we encounter it. */ if (msp->ms_sm->sm_dbuf->db_size != sizeof (space_map_phys_t)) { - uint64_t txg = spa_syncing_txg(spa); vdev_t *vd = msp->ms_group->mg_vd; - msp->ms_condense_wanted = B_TRUE; - vdev_dirty(vd, VDD_METASLAB, msp, txg + 1); - spa_dbgmsg(spa, "txg %llu, requesting force condense: " - "msp %p, vd %p", txg, msp, vd); + if (spa_writeable(vd->vdev_spa)) { + uint64_t txg = spa_syncing_txg(spa); + + msp->ms_condense_wanted = B_TRUE; + vdev_dirty(vd, VDD_METASLAB, msp, txg + 1); + spa_dbgmsg(spa, "txg %llu, requesting force condense: " + "msp %p, vd %p", txg, msp, vd); + } return (ZFS_FRAG_INVALID); }