summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr/src/lib/libzfs/common/libzfs_pool.c4
-rw-r--r--usr/src/uts/common/fs/zfs/metaslab.c7
-rw-r--r--usr/src/uts/common/fs/zfs/spa.c18
-rw-r--r--usr/src/uts/common/fs/zfs/zio.c8
-rw-r--r--usr/src/uts/common/fs/zfs/zio_inject.c5
5 files changed, 27 insertions, 15 deletions
diff --git a/usr/src/lib/libzfs/common/libzfs_pool.c b/usr/src/lib/libzfs/common/libzfs_pool.c
index e30f876279..0b28814a50 100644
--- a/usr/src/lib/libzfs/common/libzfs_pool.c
+++ b/usr/src/lib/libzfs/common/libzfs_pool.c
@@ -1355,8 +1355,8 @@ zpool_explain_recover(libzfs_handle_t *hdl, const char *name, int reason,
}
}
(void) printf(dgettext(TEXT_DOMAIN,
- "Recovery can be\n\tattempted by executing "
- "'zpool %s -F %s'. "), reason >= 0 ? "clear" : "import", name);
+ "Recovery can be attempted\n\tby executing 'zpool %s -F %s'. "),
+ reason >= 0 ? "clear" : "import", name);
(void) printf(dgettext(TEXT_DOMAIN,
"A scrub of the pool\n"
diff --git a/usr/src/uts/common/fs/zfs/metaslab.c b/usr/src/uts/common/fs/zfs/metaslab.c
index 0f7f6aa68b..cdbed0144c 100644
--- a/usr/src/uts/common/fs/zfs/metaslab.c
+++ b/usr/src/uts/common/fs/zfs/metaslab.c
@@ -196,7 +196,12 @@ metaslab_group_destroy(metaslab_group_t *mg)
{
ASSERT(mg->mg_prev == NULL);
ASSERT(mg->mg_next == NULL);
- ASSERT(mg->mg_activation_count + mg->mg_vd->vdev_removing == 0);
+ /*
+ * We may have gone below zero with the activation count
+ * either because we never activated in the first place or
+ * because we're done, and possibly removing the vdev.
+ */
+ ASSERT(mg->mg_activation_count <= 0);
avl_destroy(&mg->mg_metaslab_tree);
mutex_destroy(&mg->mg_lock);
diff --git a/usr/src/uts/common/fs/zfs/spa.c b/usr/src/uts/common/fs/zfs/spa.c
index 92d558aa55..069d2cafc7 100644
--- a/usr/src/uts/common/fs/zfs/spa.c
+++ b/usr/src/uts/common/fs/zfs/spa.c
@@ -1245,6 +1245,8 @@ spa_load_verify(spa_t *spa)
verify_ok = B_TRUE;
spa->spa_load_txg = spa->spa_uberblock.ub_txg;
spa->spa_load_txg_ts = spa->spa_uberblock.ub_timestamp;
+ } else {
+ spa->spa_load_max_txg = spa->spa_uberblock.ub_txg;
}
if (error) {
@@ -1822,10 +1824,12 @@ spa_load_best(spa_t *spa, spa_load_state_t state, int mosconfig,
uint64_t safe_rollback_txg;
uint64_t min_txg;
- if (spa->spa_load_txg && state == SPA_LOAD_RECOVER)
+ if (spa->spa_load_txg && state == SPA_LOAD_RECOVER) {
spa->spa_load_max_txg = spa->spa_load_txg;
- else
+ spa->spa_log_state = SPA_LOG_CLEAR;
+ } else {
spa->spa_load_max_txg = max_request;
+ }
load_error = rewind_error = spa_load(spa, state, mosconfig);
if (load_error == 0)
@@ -1977,16 +1981,16 @@ spa_open_common(const char *pool, spa_t **spapp, void *tag, nvlist_t *nvpolicy,
spa_open_ref(spa, tag);
- spa->spa_last_open_failed = 0;
if (config != NULL)
*config = spa_config_generate(spa, NULL, -1ULL, B_TRUE);
- spa->spa_last_ubsync_txg = 0;
- spa->spa_load_txg = 0;
-
- if (locked)
+ if (locked) {
+ spa->spa_last_open_failed = 0;
+ spa->spa_last_ubsync_txg = 0;
+ spa->spa_load_txg = 0;
mutex_exit(&spa_namespace_lock);
+ }
*spapp = spa;
diff --git a/usr/src/uts/common/fs/zfs/zio.c b/usr/src/uts/common/fs/zfs/zio.c
index 364a6ab80c..3216427dfe 100644
--- a/usr/src/uts/common/fs/zfs/zio.c
+++ b/usr/src/uts/common/fs/zfs/zio.c
@@ -1008,10 +1008,6 @@ zio_free_bp_init(zio_t *zio)
arc_free(zio->io_spa, bp);
}
- if (zio_injection_enabled &&
- zio->io_spa->spa_syncing_txg == zio->io_txg)
- zio_handle_ignored_writes(zio);
-
return (ZIO_PIPELINE_CONTINUE);
}
@@ -2573,6 +2569,10 @@ zio_ready(zio_t *zio)
}
}
+ if (zio_injection_enabled &&
+ zio->io_spa->spa_syncing_txg == zio->io_txg)
+ zio_handle_ignored_writes(zio);
+
return (ZIO_PIPELINE_CONTINUE);
}
diff --git a/usr/src/uts/common/fs/zfs/zio_inject.c b/usr/src/uts/common/fs/zfs/zio_inject.c
index 6ec6d0f011..5c4a6c3df6 100644
--- a/usr/src/uts/common/fs/zfs/zio_inject.c
+++ b/usr/src/uts/common/fs/zfs/zio_inject.c
@@ -322,7 +322,10 @@ zio_handle_ignored_writes(zio_t *zio)
else
handler->zi_record.zi_timer = zio->io_txg;
}
- zio->io_pipeline &= ~ZIO_VDEV_IO_STAGES;
+
+ /* Have a "problem" writing 60% of the time */
+ if (spa_get_random(100) < 60)
+ zio->io_pipeline &= ~ZIO_VDEV_IO_STAGES;
break;
}