On 1/26/21 3:51 PM, Richard W.M. Jones wrote:
By storing an extra bit in the overlay bitmap we can mark when whole blocks have been trimmed. This allows us to match a feature of qcow2 (zero clusters).
In theory we could punch holes in the overlay to save a bit of disk space. --- filters/cow/blk.h | 4 ++ filters/cow/blk.c | 106 +++++++++++++++++++++++++++++++--------------- filters/cow/cow.c | 75 +++++++++++++++++++++++++++++++- 3 files changed, 149 insertions(+), 36 deletions(-)
+++ b/filters/cow/cow.c @@ -150,7 +150,7 @@ cow_can_write (struct nbdkit_next_ops *next_ops, void *nxdata, void *handle)
+/* Trim data. */ +static int +cow_trim (struct nbdkit_next_ops *next_ops, void *nxdata, + void *handle, uint32_t count, uint64_t offset, uint32_t flags, + int *err) +{ + CLEANUP_FREE uint8_t *block = NULL; + uint64_t blknum, blkoffs; + int r; + + if (!IS_ALIGNED (count | offset, BLKSIZE)) { + block = malloc (BLKSIZE); + if (block == NULL) { + *err = errno; + nbdkit_error ("malloc: %m"); + return -1; + } + }
Technically, we could leave the unallocated portions unchanged rather than forcing it to read as zero. Maybe it's worth a command-line option - some users want security (no stale data can leak) while others want speed (no time wasted on read-modify-write). Overall, the series looks good (and yes, I know you pushed before my review, which turned out fine). -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3226 Virtualization: qemu.org | libvirt.org