diff options
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/lib/libzfs/common/libzfs_pool.c | 4 | ||||
-rw-r--r-- | usr/src/uts/common/fs/zfs/metaslab.c | 7 | ||||
-rw-r--r-- | usr/src/uts/common/fs/zfs/spa.c | 18 | ||||
-rw-r--r-- | usr/src/uts/common/fs/zfs/zio.c | 8 | ||||
-rw-r--r-- | usr/src/uts/common/fs/zfs/zio_inject.c | 5 |
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; } |