From 4f0f5e5be9d3811b437d9156675d584e2a2f204a Mon Sep 17 00:00:00 2001 From: Victor Latushkin Date: Tue, 30 Jun 2009 04:09:23 -0700 Subject: 6848242 zdb -e no longer works as expected --- usr/src/uts/common/fs/zfs/spa.c | 2 ++ usr/src/uts/common/fs/zfs/spa_config.c | 2 +- usr/src/uts/common/fs/zfs/sys/spa_impl.h | 1 + usr/src/uts/common/fs/zfs/vdev.c | 7 ++++++- 4 files changed, 10 insertions(+), 2 deletions(-) (limited to 'usr/src/uts/common/fs') diff --git a/usr/src/uts/common/fs/zfs/spa.c b/usr/src/uts/common/fs/zfs/spa.c index b33a483933..d774fdb56e 100644 --- a/usr/src/uts/common/fs/zfs/spa.c +++ b/usr/src/uts/common/fs/zfs/spa.c @@ -2493,6 +2493,8 @@ spa_import_verbatim(const char *pool, nvlist_t *config, nvlist_t *props) zpool_prop_to_name(ZPOOL_PROP_ALTROOT), &altroot); spa = spa_add(pool, altroot); + spa->spa_inactive_states_ok = B_TRUE; + VERIFY(nvlist_dup(config, &spa->spa_config, 0) == 0); if (props != NULL) diff --git a/usr/src/uts/common/fs/zfs/spa_config.c b/usr/src/uts/common/fs/zfs/spa_config.c index 7103e179bf..e7c2553a54 100644 --- a/usr/src/uts/common/fs/zfs/spa_config.c +++ b/usr/src/uts/common/fs/zfs/spa_config.c @@ -209,7 +209,7 @@ spa_config_sync(spa_t *target, boolean_t removing, boolean_t postsysevent) ASSERT(MUTEX_HELD(&spa_namespace_lock)); - if (rootdir == NULL) + if (rootdir == NULL || !(spa_mode_global & FWRITE)) return; /* diff --git a/usr/src/uts/common/fs/zfs/sys/spa_impl.h b/usr/src/uts/common/fs/zfs/sys/spa_impl.h index 12999ee9e2..bcecd85827 100644 --- a/usr/src/uts/common/fs/zfs/sys/spa_impl.h +++ b/usr/src/uts/common/fs/zfs/sys/spa_impl.h @@ -105,6 +105,7 @@ struct spa { int spa_inject_ref; /* injection references */ uint8_t spa_sync_on; /* sync threads are running */ spa_load_state_t spa_load_state; /* current load operation */ + boolean_t spa_inactive_states_ok; /* ok to open inactive state? */ taskq_t *spa_zio_taskq[ZIO_TYPES][ZIO_TASKQ_TYPES]; dsl_pool_t *spa_dsl_pool; metaslab_class_t *spa_normal_class; /* normal data class */ diff --git a/usr/src/uts/common/fs/zfs/vdev.c b/usr/src/uts/common/fs/zfs/vdev.c index a79cd6ce15..6408713a7e 100644 --- a/usr/src/uts/common/fs/zfs/vdev.c +++ b/usr/src/uts/common/fs/zfs/vdev.c @@ -1187,6 +1187,7 @@ vdev_validate(vdev_t *vd) nvlist_t *label; uint64_t guid, top_guid; uint64_t state; + boolean_t inactive_state; for (int c = 0; c < vd->vdev_children; c++) if (vdev_validate(vd->vdev_child[c]) != 0) @@ -1243,8 +1244,12 @@ vdev_validate(vdev_t *vd) nvlist_free(label); + inactive_state = (state == POOL_STATE_EXPORTED || + state == POOL_STATE_DESTROYED); + if (spa->spa_load_state == SPA_LOAD_OPEN && - state != POOL_STATE_ACTIVE) + !(state == POOL_STATE_ACTIVE) && + !(spa->spa_inactive_states_ok && inactive_state)) return (EBADF); /* -- cgit v1.2.3