Skip to content

Commit

Permalink
block/copy-before-write: support unligned snapshot-discard
Browse files Browse the repository at this point in the history
First thing that crashes on unligned access here is
bdrv_reset_dirty_bitmap(). Correct way is to align-down the
snapshot-discard request.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
Reviewed-by: Fiona Ebner <f.ebner@proxmox.com>
Tested-by: Fiona Ebner <f.ebner@proxmox.com>
Message-Id: <20240313152822.626493-3-vsementsov@yandex-team.ru>
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
  • Loading branch information
Vladimir Sementsov-Ogievskiy committed Apr 29, 2024
1 parent 2bc68cb commit 64c4db6
Showing 1 changed file with 13 additions and 3 deletions.
16 changes: 13 additions & 3 deletions block/copy-before-write.c
Original file line number Diff line number Diff line change
Expand Up @@ -325,14 +325,24 @@ static int coroutine_fn GRAPH_RDLOCK
cbw_co_pdiscard_snapshot(BlockDriverState *bs, int64_t offset, int64_t bytes)
{
BDRVCopyBeforeWriteState *s = bs->opaque;
uint32_t cluster_size = block_copy_cluster_size(s->bcs);
int64_t aligned_offset = QEMU_ALIGN_UP(offset, cluster_size);
int64_t aligned_end = QEMU_ALIGN_DOWN(offset + bytes, cluster_size);
int64_t aligned_bytes;

if (aligned_end <= aligned_offset) {
return 0;
}
aligned_bytes = aligned_end - aligned_offset;

WITH_QEMU_LOCK_GUARD(&s->lock) {
bdrv_reset_dirty_bitmap(s->access_bitmap, offset, bytes);
bdrv_reset_dirty_bitmap(s->access_bitmap, aligned_offset,
aligned_bytes);
}

block_copy_reset(s->bcs, offset, bytes);
block_copy_reset(s->bcs, aligned_offset, aligned_bytes);

return bdrv_co_pdiscard(s->target, offset, bytes);
return bdrv_co_pdiscard(s->target, aligned_offset, aligned_bytes);
}

static void GRAPH_RDLOCK cbw_refresh_filename(BlockDriverState *bs)
Expand Down

0 comments on commit 64c4db6

Please sign in to comment.