From 5a4a59fb373b5bacbb3a2388c1dd7484cb9e413b Mon Sep 17 00:00:00 2001 From: Rich Ercolani Date: Fri, 8 Jul 2016 16:51:50 -0400 Subject: [PATCH] Add tunable to ignore hole_birth Adds a module option which disables the hole_birth optimization which has been responsible for several recent bugs, including issue #4050. Original-patch: https://gist.github.com/pcd1193182/2c0cd47211f3aee623958b4698836c48 Signed-off-by: Rich Ercolani Signed-off-by: Brian Behlendorf Closes #4833 --- man/man5/zfs-module-parameters.5 | 13 +++++++++++++ module/zfs/dmu_traverse.c | 6 +++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/man/man5/zfs-module-parameters.5 b/man/man5/zfs-module-parameters.5 index bce26fa9d284..23f7efaec00f 100644 --- a/man/man5/zfs-module-parameters.5 +++ b/man/man5/zfs-module-parameters.5 @@ -24,6 +24,19 @@ Description of the different parameters to the ZFS module. .sp .LP +.sp +.ne 2 +.na +\fBignore_hole_birth\fR (int) +.ad +.RS 12n +When set, the hole_birth optimization will not be used, and all holes will +always be sent on zfs send. Useful if you suspect your datasets are affected +by a bug in hole_birth. +.sp +Use \fB1\fR (default) for on and \fB0\fR for off. +.RE + .sp .ne 2 .na diff --git a/module/zfs/dmu_traverse.c b/module/zfs/dmu_traverse.c index cdb29b622182..a58f77f082f3 100644 --- a/module/zfs/dmu_traverse.c +++ b/module/zfs/dmu_traverse.c @@ -39,6 +39,7 @@ #include int32_t zfs_pd_bytes_max = 50 * 1024 * 1024; /* 50MB */ +int32_t ignore_hole_birth = 1; typedef struct prefetch_data { kmutex_t pd_mtx; @@ -250,7 +251,7 @@ traverse_visitbp(traverse_data_t *td, const dnode_phys_t *dnp, * * Note that the meta-dnode cannot be reallocated. */ - if ((!td->td_realloc_possible || + if (!ignore_hole_birth && (!td->td_realloc_possible || zb->zb_object == DMU_META_DNODE_OBJECT) && td->td_hole_birth_enabled_txg <= td->td_min_txg) return (0); @@ -692,4 +693,7 @@ EXPORT_SYMBOL(traverse_pool); module_param(zfs_pd_bytes_max, int, 0644); MODULE_PARM_DESC(zfs_pd_bytes_max, "Max number of bytes to prefetch"); + +module_param(ignore_hole_birth, int, 0644); +MODULE_PARM_DESC(ignore_hole_birth, "Ignore hole_birth txg for send"); #endif