diff --git a/man/man5/zfs-module-parameters.5 b/man/man5/zfs-module-parameters.5 index eabd8ebe9..e0c61ec21 100644 --- a/man/man5/zfs-module-parameters.5 +++ b/man/man5/zfs-module-parameters.5 @@ -784,6 +784,17 @@ Start syncing out a transaction group if there is at least this much dirty data. Default value: \fB67,108,864\fR. .RE +.sp +.ne 2 +.na +\fBzfs_free_bpobj_enabled\fR (int) +.ad +.RS 12n +Enable/disable the processing of the free_bpobj object. +.sp +Default value: \fB1\fR. +.RE + .sp .ne 2 .na diff --git a/module/zfs/dsl_scan.c b/module/zfs/dsl_scan.c index 477da2a5f..2b95561a9 100644 --- a/module/zfs/dsl_scan.c +++ b/module/zfs/dsl_scan.c @@ -20,7 +20,7 @@ */ /* * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2011, 2014 by Delphix. All rights reserved. + * Copyright (c) 2011, 2015 by Delphix. All rights reserved. */ #include @@ -76,6 +76,11 @@ ulong zfs_free_max_blocks = 100000; ((scn)->scn_phys.scn_func == POOL_SCAN_SCRUB || \ (scn)->scn_phys.scn_func == POOL_SCAN_RESILVER) +/* + * Enable/disable the processing of the free_bpobj object. + */ +int zfs_free_bpobj_enabled = 1; + /* the order has to match pool_scan_type */ static scan_cb_t *scan_funcs[POOL_SCAN_FUNCS] = { NULL, @@ -1502,7 +1507,8 @@ dsl_scan_sync(dsl_pool_t *dp, dmu_tx_t *tx) * have to worry about traversing it. It is also faster to free the * blocks than to scrub them. */ - if (spa_version(dp->dp_spa) >= SPA_VERSION_DEADLISTS) { + if (zfs_free_bpobj_enabled && + spa_version(dp->dp_spa) >= SPA_VERSION_DEADLISTS) { scn->scn_is_bptree = B_FALSE; scn->scn_zio_root = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED); @@ -1918,4 +1924,7 @@ MODULE_PARM_DESC(zfs_no_scrub_prefetch, "Set to disable scrub prefetching"); module_param(zfs_free_max_blocks, ulong, 0644); MODULE_PARM_DESC(zfs_free_max_blocks, "Max number of blocks freed in one txg"); + +module_param(zfs_free_bpobj_enabled, int, 0644); +MODULE_PARM_DESC(zfs_free_bpobj_enabled, "Enable processing of the free_bpobj"); #endif