mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-23 19:04:45 +03:00
OpenZFS 6513 - partially filled holes lose birth time
Reviewed by: Matthew Ahrens <mahrens@delphix.com> Reviewed by: George Wilson <george.wilson@delphix.com> Reviewed by: Boris Protopopov <bprotopopov@hotmail.com> Approved by: Richard Lowe <richlowe@richlowe.net>a Ported by: Boris Protopopov <bprotopopov@actifio.com> Signed-off-by: Boris Protopopov <bprotopopov@actifio.com> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> OpenZFS-issue: https://www.illumos.org/issues/6513 OpenZFS-commit: https://github.com/openzfs/openzfs/commit/8df0bcf0 If a ZFS object contains a hole at level one, and then a data block is created at level 0 underneath that l1 block, l0 holes will be created. However, these l0 holes do not have the birth time property set; as a result, incremental sends will not send those holes. Fix is to modify the dbuf_read code to fill in birth time data.
This commit is contained in:
committed by
Brian Behlendorf
parent
100a91aa3e
commit
bc77ba73fe
+16
-3
@@ -21,7 +21,7 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, Joyent, Inc. All rights reserved.
|
||||
* Copyright (c) 2011, 2015 by Delphix. All rights reserved.
|
||||
* Copyright (c) 2011, 2016 by Delphix. All rights reserved.
|
||||
* Copyright (c) 2014 by Saso Kiselkov. All rights reserved.
|
||||
* Copyright 2014 Nexenta Systems, Inc. All rights reserved.
|
||||
*/
|
||||
@@ -4981,6 +4981,15 @@ arc_write_ready(zio_t *zio)
|
||||
hdr->b_flags |= ARC_FLAG_IO_IN_PROGRESS;
|
||||
}
|
||||
|
||||
static void
|
||||
arc_write_children_ready(zio_t *zio)
|
||||
{
|
||||
arc_write_callback_t *callback = zio->io_private;
|
||||
arc_buf_t *buf = callback->awcb_buf;
|
||||
|
||||
callback->awcb_children_ready(zio, buf, callback->awcb_private);
|
||||
}
|
||||
|
||||
/*
|
||||
* The SPA calls this callback for each physical write that happens on behalf
|
||||
* of a logical write. See the comment in dbuf_write_physdone() for details.
|
||||
@@ -5077,7 +5086,8 @@ arc_write_done(zio_t *zio)
|
||||
zio_t *
|
||||
arc_write(zio_t *pio, spa_t *spa, uint64_t txg,
|
||||
blkptr_t *bp, arc_buf_t *buf, boolean_t l2arc, boolean_t l2arc_compress,
|
||||
const zio_prop_t *zp, arc_done_func_t *ready, arc_done_func_t *physdone,
|
||||
const zio_prop_t *zp, arc_done_func_t *ready,
|
||||
arc_done_func_t *children_ready, arc_done_func_t *physdone,
|
||||
arc_done_func_t *done, void *private, zio_priority_t priority,
|
||||
int zio_flags, const zbookmark_phys_t *zb)
|
||||
{
|
||||
@@ -5097,13 +5107,16 @@ arc_write(zio_t *pio, spa_t *spa, uint64_t txg,
|
||||
hdr->b_flags |= ARC_FLAG_L2COMPRESS;
|
||||
callback = kmem_zalloc(sizeof (arc_write_callback_t), KM_SLEEP);
|
||||
callback->awcb_ready = ready;
|
||||
callback->awcb_children_ready = children_ready;
|
||||
callback->awcb_physdone = physdone;
|
||||
callback->awcb_done = done;
|
||||
callback->awcb_private = private;
|
||||
callback->awcb_buf = buf;
|
||||
|
||||
zio = zio_write(pio, spa, txg, bp, buf->b_data, hdr->b_size, zp,
|
||||
arc_write_ready, arc_write_physdone, arc_write_done, callback,
|
||||
arc_write_ready,
|
||||
(children_ready != NULL) ? arc_write_children_ready : NULL,
|
||||
arc_write_physdone, arc_write_done, callback,
|
||||
priority, zio_flags, zb);
|
||||
|
||||
return (zio);
|
||||
|
||||
Reference in New Issue
Block a user