[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v4 27/39] qcow2: Update qcow2_update_snapshot_refcou
From: |
Alberto Garcia |
Subject: |
[Qemu-devel] [PATCH v4 27/39] qcow2: Update qcow2_update_snapshot_refcount() to support L2 slices |
Date: |
Mon, 5 Feb 2018 16:33:27 +0200 |
qcow2_update_snapshot_refcount() increases the refcount of all
clusters of a given snapshot. In order to do that it needs to load all
its L2 tables and iterate over their entries. Since we'll be loading
L2 slices instead of full tables we need to add an extra loop that
iterates over all slices of each L2 table.
This function doesn't need any additional changes so apart from that
this patch simply updates the variable name from l2_table to l2_slice.
Signed-off-by: Alberto Garcia <address@hidden>
---
block/qcow2-refcount.c | 32 ++++++++++++++++++--------------
1 file changed, 18 insertions(+), 14 deletions(-)
diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
index dfa28301c4..d46b69d7f3 100644
--- a/block/qcow2-refcount.c
+++ b/block/qcow2-refcount.c
@@ -1183,17 +1183,20 @@ int qcow2_update_snapshot_refcount(BlockDriverState *bs,
int64_t l1_table_offset, int l1_size, int addend)
{
BDRVQcow2State *s = bs->opaque;
- uint64_t *l1_table, *l2_table, l2_offset, entry, l1_size2, refcount;
+ uint64_t *l1_table, *l2_slice, l2_offset, entry, l1_size2, refcount;
bool l1_allocated = false;
int64_t old_entry, old_l2_offset;
+ unsigned slice, slice_size2, n_slices;
int i, j, l1_modified = 0, nb_csectors;
int ret;
assert(addend >= -1 && addend <= 1);
- l2_table = NULL;
+ l2_slice = NULL;
l1_table = NULL;
l1_size2 = l1_size * sizeof(uint64_t);
+ slice_size2 = s->l2_slice_size * sizeof(uint64_t);
+ n_slices = s->cluster_size / slice_size2;
s->cache_discards = true;
@@ -1236,19 +1239,19 @@ int qcow2_update_snapshot_refcount(BlockDriverState *bs,
goto fail;
}
- {
+ for (slice = 0; slice < n_slices; slice++) {
ret = qcow2_cache_get(bs, s->l2_table_cache,
- l2_offset,
- (void **) &l2_table);
+ l2_offset + slice * slice_size2,
+ (void **) &l2_slice);
if (ret < 0) {
goto fail;
}
- for (j = 0; j < s->l2_size; j++) {
+ for (j = 0; j < s->l2_slice_size; j++) {
uint64_t cluster_index;
uint64_t offset;
- entry = be64_to_cpu(l2_table[j]);
+ entry = be64_to_cpu(l2_slice[j]);
old_entry = entry;
entry &= ~QCOW_OFLAG_COPIED;
offset = entry & L2E_OFFSET_MASK;
@@ -1273,12 +1276,14 @@ int qcow2_update_snapshot_refcount(BlockDriverState *bs,
case QCOW2_CLUSTER_NORMAL:
case QCOW2_CLUSTER_ZERO_ALLOC:
if (offset_into_cluster(s, offset)) {
+ /* Here l2_index means table (not slice) index */
+ int l2_index = slice * s->l2_slice_size + j;
qcow2_signal_corruption(
bs, true, -1, -1, "Cluster "
"allocation offset %#" PRIx64
" unaligned (L2 offset: %#"
PRIx64 ", L2 index: %#x)",
- offset, l2_offset, j);
+ offset, l2_offset, l2_index);
ret = -EIO;
goto fail;
}
@@ -1317,14 +1322,13 @@ int qcow2_update_snapshot_refcount(BlockDriverState *bs,
qcow2_cache_set_dependency(bs, s->l2_table_cache,
s->refcount_block_cache);
}
- l2_table[j] = cpu_to_be64(entry);
+ l2_slice[j] = cpu_to_be64(entry);
qcow2_cache_entry_mark_dirty(s->l2_table_cache,
- l2_table);
+ l2_slice);
}
}
- qcow2_cache_put(s->l2_table_cache, (void **) &l2_table);
-
+ qcow2_cache_put(s->l2_table_cache, (void **) &l2_slice);
}
if (addend != 0) {
@@ -1352,8 +1356,8 @@ int qcow2_update_snapshot_refcount(BlockDriverState *bs,
ret = bdrv_flush(bs);
fail:
- if (l2_table) {
- qcow2_cache_put(s->l2_table_cache, (void **) &l2_table);
+ if (l2_slice) {
+ qcow2_cache_put(s->l2_table_cache, (void **) &l2_slice);
}
s->cache_discards = false;
--
2.11.0
- [Qemu-devel] [PATCH v4 31/39] qcow2: Update qcow2_truncate() to support L2 slices, (continued)
- [Qemu-devel] [PATCH v4 31/39] qcow2: Update qcow2_truncate() to support L2 slices, Alberto Garcia, 2018/02/05
- [Qemu-devel] [PATCH v4 36/39] qcow2: Allow configuring the L2 slice size, Alberto Garcia, 2018/02/05
- [Qemu-devel] [PATCH v4 30/39] qcow2: Update expand_zero_clusters_in_l1() to support L2 slices, Alberto Garcia, 2018/02/05
- [Qemu-devel] [PATCH v4 32/39] qcow2: Rename l2_table in qcow2_alloc_compressed_cluster_offset(), Alberto Garcia, 2018/02/05
- [Qemu-devel] [PATCH v4 33/39] qcow2: Rename l2_table in count_contiguous_clusters(), Alberto Garcia, 2018/02/05
- [Qemu-devel] [PATCH v4 39/39] iotests: Add l2-cache-entry-size to iotest 137, Alberto Garcia, 2018/02/05
- [Qemu-devel] [PATCH v4 22/39] qcow2: Update handle_copied() to support L2 slices, Alberto Garcia, 2018/02/05
- [Qemu-devel] [PATCH v4 28/39] qcow2: Read refcount before L2 table in expand_zero_clusters_in_l1(), Alberto Garcia, 2018/02/05
- [Qemu-devel] [PATCH v4 27/39] qcow2: Update qcow2_update_snapshot_refcount() to support L2 slices,
Alberto Garcia <=
- [Qemu-devel] [PATCH v4 26/39] qcow2: Prepare qcow2_update_snapshot_refcount() for adding L2 slice support, Alberto Garcia, 2018/02/05
- [Qemu-devel] [PATCH v4 14/39] qcow2: Add offset_to_l2_slice_index(), Alberto Garcia, 2018/02/05
- [Qemu-devel] [PATCH v4 21/39] qcow2: Update qcow2_alloc_cluster_link_l2() to support L2 slices, Alberto Garcia, 2018/02/05
- [Qemu-devel] [PATCH v4 25/39] qcow2: Update zero_single_l2() to support L2 slices, Alberto Garcia, 2018/02/05
- [Qemu-devel] [PATCH v4 19/39] qcow2: Update get_cluster_table() to support L2 slices, Alberto Garcia, 2018/02/05
- [Qemu-devel] [PATCH v4 29/39] qcow2: Prepare expand_zero_clusters_in_l1() for adding L2 slice support, Alberto Garcia, 2018/02/05
- [Qemu-devel] [PATCH v4 16/39] qcow2: Prepare l2_allocate() for adding L2 slice support, Alberto Garcia, 2018/02/05