summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/fs
diff options
context:
space:
mode:
authorVictor Latushkin <Victor.Latushkin@Sun.COM>2009-06-30 04:09:23 -0700
committerVictor Latushkin <Victor.Latushkin@Sun.COM>2009-06-30 04:09:23 -0700
commit4f0f5e5be9d3811b437d9156675d584e2a2f204a (patch)
treeb0c00be7f2e8d83eb5e1283a185627492717d94d /usr/src/uts/common/fs
parentdd1de3740722a4b99a74005255effebbd20a6d70 (diff)
downloadillumos-gate-4f0f5e5be9d3811b437d9156675d584e2a2f204a.tar.gz
6848242 zdb -e no longer works as expected
Diffstat (limited to 'usr/src/uts/common/fs')
-rw-r--r--usr/src/uts/common/fs/zfs/spa.c2
-rw-r--r--usr/src/uts/common/fs/zfs/spa_config.c2
-rw-r--r--usr/src/uts/common/fs/zfs/sys/spa_impl.h1
-rw-r--r--usr/src/uts/common/fs/zfs/vdev.c7
4 files changed, 10 insertions, 2 deletions
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);
/*