aboutsummaryrefslogtreecommitdiffstats
path: root/module/zfs
diff options
context:
space:
mode:
authormav <[email protected]>2018-08-17 15:00:41 +0000
committerBrian Behlendorf <[email protected]>2018-09-02 12:21:54 -0700
commite38afd34c37343c2df17dc6860788f33eec7c2b3 (patch)
tree63c06a23939ee86ef2a8e99fabab5c94d934e5c4 /module/zfs
parentb83a0e2dc1b972e3ae5c0c17b714941b4604dfd6 (diff)
OpenZFS 9738 - Fix third block copy allocations, broken at 9112.
Use METASLAB_WEIGHT_CLAIM weight to allocate tertiary blocks. Previous use of METASLAB_WEIGHT_SECONDARY for that caused errors later on metaslab_activate_allocator() call, leading to massive load of unneeded metaslabs and write freezes. Authored by: mav <[email protected]> Reviewed by: Paul Dagnelie <[email protected]> Ported-by: Brian Behlendorf <[email protected]> OpenZFS-issue: https://illumos.org/issues/9738 FreeBSD-commit: https://github.com/freebsd/freebsd/commit/63e7138 Closes #7858
Diffstat (limited to 'module/zfs')
-rw-r--r--module/zfs/metaslab.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/module/zfs/metaslab.c b/module/zfs/metaslab.c
index c1e32884f..12fe5890a 100644
--- a/module/zfs/metaslab.c
+++ b/module/zfs/metaslab.c
@@ -3035,7 +3035,6 @@ metaslab_group_alloc_normal(metaslab_group_t *mg, zio_alloc_list_t *zal,
metaslab_t *msp = NULL;
uint64_t offset = -1ULL;
uint64_t activation_weight;
- boolean_t tertiary = B_FALSE;
activation_weight = METASLAB_WEIGHT_PRIMARY;
for (int i = 0; i < d; i++) {
@@ -3044,7 +3043,7 @@ metaslab_group_alloc_normal(metaslab_group_t *mg, zio_alloc_list_t *zal,
activation_weight = METASLAB_WEIGHT_SECONDARY;
} else if (activation_weight == METASLAB_WEIGHT_SECONDARY &&
DVA_GET_VDEV(&dva[i]) == mg->mg_vd->vdev_id) {
- tertiary = B_TRUE;
+ activation_weight = METASLAB_WEIGHT_CLAIM;
break;
}
}
@@ -3053,10 +3052,8 @@ metaslab_group_alloc_normal(metaslab_group_t *mg, zio_alloc_list_t *zal,
* If we don't have enough metaslabs active to fill the entire array, we
* just use the 0th slot.
*/
- if (mg->mg_ms_ready < mg->mg_allocators * 2) {
- tertiary = B_FALSE;
+ if (mg->mg_ms_ready < mg->mg_allocators * 3)
allocator = 0;
- }
ASSERT3U(mg->mg_vd->vdev_ms_count, >=, 2);
@@ -3082,7 +3079,7 @@ metaslab_group_alloc_normal(metaslab_group_t *mg, zio_alloc_list_t *zal,
msp = mg->mg_primaries[allocator];
was_active = B_TRUE;
} else if (activation_weight == METASLAB_WEIGHT_SECONDARY &&
- mg->mg_secondaries[allocator] != NULL && !tertiary) {
+ mg->mg_secondaries[allocator] != NULL) {
msp = mg->mg_secondaries[allocator];
was_active = B_TRUE;
} else {
@@ -3125,7 +3122,8 @@ metaslab_group_alloc_normal(metaslab_group_t *mg, zio_alloc_list_t *zal,
continue;
}
- if (msp->ms_weight & METASLAB_WEIGHT_CLAIM) {
+ if (msp->ms_weight & METASLAB_WEIGHT_CLAIM &&
+ activation_weight != METASLAB_WEIGHT_CLAIM) {
metaslab_passivate(msp, msp->ms_weight &
~METASLAB_WEIGHT_CLAIM);
mutex_exit(&msp->ms_lock);