aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPrakash Surya <[email protected]>2015-03-27 13:03:22 +1100
committerBrian Behlendorf <[email protected]>2015-03-27 14:51:34 -0700
commita4069eef2e403a3b2a307b23b7500e2adc6ecae5 (patch)
treefdffc88b612ac92c8c4bdfc7641b0a1045171157
parent9540be9b23fd6f8b5bf7d81853c251010d9b7205 (diff)
Illumos 5695 - dmu_sync'ed holes do not retain birth time
5695 dmu_sync'ed holes do not retain birth time Reviewed by: Matthew Ahrens <[email protected]> Reviewed by: George Wilson <[email protected]> Reviewed by: Christopher Siden <[email protected]> Reviewed by: Bayard Bell <[email protected]> Approved by: Dan McDonald <[email protected]> References: https://www.illumos.org/issues/5695 https://github.com/illumos/illumos-gate/commit/70163ac Ported-by: Chris Dunlop <[email protected]> Signed-off-by: Brian Behlendorf <[email protected]> Closes #3229
-rw-r--r--cmd/zdb/zdb.c4
-rw-r--r--include/sys/spa.h13
-rw-r--r--module/zfs/dmu.c14
3 files changed, 23 insertions, 8 deletions
diff --git a/cmd/zdb/zdb.c b/cmd/zdb/zdb.c
index b0d7170b9..1d76f2a7d 100644
--- a/cmd/zdb/zdb.c
+++ b/cmd/zdb/zdb.c
@@ -1115,7 +1115,9 @@ snprintf_blkptr_compact(char *blkbuf, size_t buflen, const blkptr_t *bp)
if (BP_IS_HOLE(bp)) {
(void) snprintf(blkbuf + strlen(blkbuf),
- buflen - strlen(blkbuf), "B=%llu",
+ buflen - strlen(blkbuf),
+ "%llxL B=%llu",
+ (u_longlong_t)BP_GET_LSIZE(bp),
(u_longlong_t)bp->blk_birth);
} else {
(void) snprintf(blkbuf + strlen(blkbuf),
diff --git a/include/sys/spa.h b/include/sys/spa.h
index 2f73793fe..83b6723a4 100644
--- a/include/sys/spa.h
+++ b/include/sys/spa.h
@@ -501,12 +501,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 " \
diff --git a/module/zfs/dmu.c b/module/zfs/dmu.c
index 1501ae804..3b7bbefc2 100644
--- a/module/zfs/dmu.c
+++ b/module/zfs/dmu.c
@@ -1472,7 +1472,19 @@ dmu_sync_done(zio_t *zio, arc_buf_t *buf, void *varg)
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;