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 <mahrens@delphix.com> Reviewed by: George Wilson <george@delphix.com> Reviewed by: Christopher Siden <christopher.siden@delphix.com> Reviewed by: Bayard Bell <buffer.g.overflow@gmail.com> Approved by: Dan McDonald <danmcd@omniti.com> References: https://www.illumos.org/issues/5695 https://github.com/illumos/illumos-gate/commit/70163ac Ported-by: Chris Dunlop <chris@onthe.net.au> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #3229
This commit is contained in:
parent
9540be9b23
commit
a4069eef2e
|
@ -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),
|
||||
|
|
|
@ -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 " \
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue