svn commit: r288567 - in stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs: . sys

Alexander Motin mav at FreeBSD.org
Sat Oct 3 07:55:38 UTC 2015


Author: mav
Date: Sat Oct  3 07:55:37 2015
New Revision: 288567
URL: https://svnweb.freebsd.org/changeset/base/288567

Log:
  MFC r286677: 5695 dmu_sync'ed holes do not retain birth time
  
  illumos/illumos-gate at 70163ac57e58ace1c5c94dfbe85dca5a974eff36
  
  https://www.illumos.org/issues/5695
    In dmu_sync_ready(), a hole block pointer will have it's logical size
    explicitly set as it's necessary for replay purposes. To "undo" this,
    dmu_sync_done() will zero out any hole that it finds. This becomes a
    problem when using the "hole_birth" feature, as this will also wipe out
    any birth time that might have happened to be set on the hole.
    ...
    As a fix, the logic to zero out a hole is only applied to old style
    holes with a birth time of zero. Holes created with the "hole_birth"
    feature enabled will have a non-zero birth time, and will be skipped
    (thus preserving the ltime, type, and level information as well).
    In addition, zdb was updated to also print the ltime, type, and level
    information for these new style holes. Previously, only the logical
    birth time would be printed.
  
  Author: Prakash Surya <prakash.surya at delphix.com>
  Reviewed by: Matthew Ahrens <mahrens at delphix.com>
  Reviewed by: George Wilson <george at delphix.com>
  Reviewed by: Christopher Siden <christopher.siden at delphix.com>
  Reviewed by: Bayard Bell <buffer.g.overflow at gmail.com>
  Approved by: Dan McDonald <danmcd at omniti.com>

Modified:
  stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c
  stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa.h
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c
==============================================================================
--- stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c	Sat Oct  3 07:53:56 2015	(r288566)
+++ stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c	Sat Oct  3 07:55:37 2015	(r288567)
@@ -1485,7 +1485,19 @@ dmu_sync_done(zio_t *zio, arc_buf_t *buf
 		dr->dt.dl.dr_overridden_by = *zio->io_bp;
 		dr->dt.dl.dr_override_state = DR_OVERRIDDEN;
 		dr->dt.dl.dr_copies = zio->io_prop.zp_copies;
-		if (BP_IS_HOLE(&dr->dt.dl.dr_overridden_by))
+
+		/*
+		 * Old style holes are filled with all zeros, whereas
+		 * new-style holes maintain their lsize, type, level,
+		 * and birth time (see zio_write_compress). While we
+		 * need to reset the BP_SET_LSIZE() call that happened
+		 * in dmu_sync_ready for old style holes, we do *not*
+		 * want to wipe out the information contained in new
+		 * style holes. Thus, only zero out the block pointer if
+		 * it's an old style hole.
+		 */
+		if (BP_IS_HOLE(&dr->dt.dl.dr_overridden_by) &&
+		    dr->dt.dl.dr_overridden_by.blk_birth == 0)
 			BP_ZERO(&dr->dt.dl.dr_overridden_by);
 	} else {
 		dr->dt.dl.dr_override_state = DR_NOT_OVERRIDDEN;

Modified: stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa.h
==============================================================================
--- stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa.h	Sat Oct  3 07:53:56 2015	(r288566)
+++ stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/spa.h	Sat Oct  3 07:55:37 2015	(r288567)
@@ -536,12 +536,13 @@ _NOTE(CONSTCOND) } while (0)
 	if (bp == NULL) {						\
 		len += func(buf + len, size - len, "<NULL>");		\
 	} else if (BP_IS_HOLE(bp)) {					\
-		len += func(buf + len, size - len, "<hole>");		\
-		if (bp->blk_birth > 0) {				\
-			len += func(buf + len, size - len,		\
-			    " birth=%lluL",				\
-			    (u_longlong_t)bp->blk_birth);		\
-		}							\
+		len += func(buf + len, size - len,			\
+		    "HOLE [L%llu %s] "					\
+		    "size=%llxL birth=%lluL",				\
+		    (u_longlong_t)BP_GET_LEVEL(bp),			\
+		    type,						\
+		    (u_longlong_t)BP_GET_LSIZE(bp),			\
+		    (u_longlong_t)bp->blk_birth);			\
 	} else if (BP_IS_EMBEDDED(bp)) {				\
 		len = func(buf + len, size - len,			\
 		    "EMBEDDED [L%llu %s] et=%u %s "			\


More information about the svn-src-all mailing list