diff options
Diffstat (limited to 'module/zfs/spa.c')
-rw-r--r-- | module/zfs/spa.c | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/module/zfs/spa.c b/module/zfs/spa.c index aac469f44b59..532f04b91ca1 100644 --- a/module/zfs/spa.c +++ b/module/zfs/spa.c @@ -21,7 +21,7 @@ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2011, 2019 by Delphix. All rights reserved. + * Copyright (c) 2011, 2020 by Delphix. All rights reserved. * Copyright (c) 2018, Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2014 Spectra Logic Corporation, All rights reserved. * Copyright 2013 Saso Kiselkov. All rights reserved. @@ -1000,13 +1000,25 @@ spa_taskqs_init(spa_t *spa, zio_type_t t, zio_taskq_type_t q) /* * The write issue taskq can be extremely CPU * intensive. Run it at slightly less important - * priority than the other taskqs. Under Linux this - * means incrementing the priority value on platforms - * like illumos it should be decremented. + * priority than the other taskqs. + * + * Under Linux and FreeBSD this means incrementing + * the priority value as opposed to platforms like + * illumos where it should be decremented. + * + * On FreeBSD, if priorities divided by four (RQ_PPQ) + * are equal then a difference between them is + * insignificant. */ - if (t == ZIO_TYPE_WRITE && q == ZIO_TASKQ_ISSUE) + if (t == ZIO_TYPE_WRITE && q == ZIO_TASKQ_ISSUE) { +#if defined(__linux__) pri++; - +#elif defined(__FreeBSD__) + pri += 4; +#else +#error "unknown OS" +#endif + } tq = taskq_create_proc(name, value, pri, 50, INT_MAX, spa->spa_proc, flags); } @@ -2485,11 +2497,12 @@ spa_livelist_delete_cb(void *arg, zthr_t *z) VERIFY0(dsl_get_next_livelist_obj(mos, zap_obj, &ll_obj)); VERIFY0(zap_count(mos, ll_obj, &count)); if (count > 0) { - dsl_deadlist_t ll = { 0 }; + dsl_deadlist_t *ll; dsl_deadlist_entry_t *dle; bplist_t to_free; - dsl_deadlist_open(&ll, mos, ll_obj); - dle = dsl_deadlist_first(&ll); + ll = kmem_zalloc(sizeof (dsl_deadlist_t), KM_SLEEP); + dsl_deadlist_open(ll, mos, ll_obj); + dle = dsl_deadlist_first(ll); ASSERT3P(dle, !=, NULL); bplist_create(&to_free); int err = dsl_process_sub_livelist(&dle->dle_bpobj, &to_free, @@ -2497,7 +2510,7 @@ spa_livelist_delete_cb(void *arg, zthr_t *z) if (err == 0) { sublist_delete_arg_t sync_arg = { .spa = spa, - .ll = &ll, + .ll = ll, .key = dle->dle_mintxg, .to_free = &to_free }; @@ -2512,7 +2525,8 @@ spa_livelist_delete_cb(void *arg, zthr_t *z) } bplist_clear(&to_free); bplist_destroy(&to_free); - dsl_deadlist_close(&ll); + dsl_deadlist_close(ll); + kmem_free(ll, sizeof (dsl_deadlist_t)); } else { livelist_delete_arg_t sync_arg = { .spa = spa, @@ -2688,8 +2702,7 @@ spa_livelist_condense_cb(void *arg, zthr_t *t) lca->first_size = first_size; lca->next_size = next_size; dsl_sync_task_nowait(spa_get_dsl(spa), - spa_livelist_condense_sync, lca, 0, - ZFS_SPACE_CHECK_NONE, tx); + spa_livelist_condense_sync, lca, tx); dmu_tx_commit(tx); return; } @@ -2869,7 +2882,7 @@ spa_load(spa_t *spa, spa_load_state_t state, spa_import_type_t type) } if (error != EBADF) { (void) zfs_ereport_post(ereport, spa, - NULL, NULL, NULL, 0, 0); + NULL, NULL, NULL, 0); } } spa->spa_load_state = error ? SPA_LOAD_ERROR : SPA_LOAD_NONE; @@ -5749,7 +5762,6 @@ spa_create(const char *pool, nvlist_t *nvroot, nvlist_t *props, for (int c = 0; error == 0 && c < rvd->vdev_children; c++) { vdev_t *vd = rvd->vdev_child[c]; - vdev_ashift_optimize(vd); vdev_metaslab_set_size(vd); vdev_expand(vd, txg); } |