]> granicus.if.org Git - zfs/commitdiff
Add tunable to ignore hole_birth
authorRich Ercolani <rincebrain@gmail.com>
Fri, 8 Jul 2016 20:51:50 +0000 (16:51 -0400)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 15 Aug 2016 16:52:56 +0000 (09:52 -0700)
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 <rincebrain@gmail.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #4833

man/man5/zfs-module-parameters.5
module/zfs/dmu_traverse.c

index 41fc20debc8751b968a19ec2255355a3cc2bf651..3e62a4436284bd3e6e4cb77619e7b623d8ef0f85 100644 (file)
@@ -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 for on and \fB0\fR (default) for off.
+.RE
+
 .sp
 .ne 2
 .na
index 0df12fac8c36777c21d27239e9cfbde4012a7e6c..4c9459412ff3415a14b819a6aa0bf617e9845a8e 100644 (file)
@@ -39,6 +39,7 @@
 #include <sys/zfeature.h>
 
 int32_t zfs_pd_bytes_max = 50 * 1024 * 1024;   /* 50MB */
+int32_t ignore_hole_birth = 0;
 
 typedef struct prefetch_data {
        kmutex_t pd_mtx;
@@ -251,7 +252,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);
@@ -727,4 +728,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