[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC PATCH v3 21/27] qcow2: Update L2 bitmap in qcow2_alloc_cluster_link
From: |
Alberto Garcia |
Subject: |
[RFC PATCH v3 21/27] qcow2: Update L2 bitmap in qcow2_alloc_cluster_link_l2() |
Date: |
Sun, 22 Dec 2019 12:37:02 +0100 |
The L2 bitmap needs to be updated after each write to indicate what
new subclusters are now allocated.
This needs to happen even if the cluster was already allocated and the
L2 entry was otherwise valid.
Signed-off-by: Alberto Garcia <address@hidden>
---
block/qcow2-cluster.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
index 0a40944667..ed291a4042 100644
--- a/block/qcow2-cluster.c
+++ b/block/qcow2-cluster.c
@@ -986,6 +986,23 @@ int qcow2_alloc_cluster_link_l2(BlockDriverState *bs,
QCowL2Meta *m)
set_l2_entry(s, l2_slice, l2_index + i, QCOW_OFLAG_COPIED |
(cluster_offset + (i << s->cluster_bits)));
+
+ /* Update bitmap with the subclusters that were just written */
+ if (has_subclusters(s)) {
+ unsigned written_from = m->cow_start.offset;
+ unsigned written_to = m->cow_end.offset + m->cow_end.nb_bytes ?:
+ m->nb_clusters << s->cluster_bits;
+ uint64_t l2_bitmap = get_l2_bitmap(s, l2_slice, l2_index + i);
+ int sc;
+ for (sc = 0; sc < s->subclusters_per_cluster; sc++) {
+ int sc_off = i * s->cluster_size + sc * s->subcluster_size;
+ if (sc_off >= written_from && sc_off < written_to) {
+ l2_bitmap |= QCOW_OFLAG_SUB_ALLOC(sc);
+ l2_bitmap &= ~QCOW_OFLAG_SUB_ZERO(sc);
+ }
+ }
+ set_l2_bitmap(s, l2_slice, l2_index + i, l2_bitmap);
+ }
}
--
2.20.1
- [RFC PATCH v3 16/27] qcow2: Add subcluster support to zero_in_l2_slice(), (continued)
- [RFC PATCH v3 16/27] qcow2: Add subcluster support to zero_in_l2_slice(), Alberto Garcia, 2019/12/22
- [RFC PATCH v3 07/27] qcow2: Add subcluster-related fields to BDRVQcow2State, Alberto Garcia, 2019/12/22
- [RFC PATCH v3 18/27] qcow2: Add subcluster support to check_refcounts_l2(), Alberto Garcia, 2019/12/22
- [RFC PATCH v3 17/27] qcow2: Add subcluster support to discard_in_l2_slice(), Alberto Garcia, 2019/12/22
- [RFC PATCH v3 10/27] qcow2: Update get/set_l2_entry() and add get/set_l2_bitmap(), Alberto Garcia, 2019/12/22
- [RFC PATCH v3 01/27] qcow2: Add calculate_l2_meta(), Alberto Garcia, 2019/12/22
- [RFC PATCH v3 24/27] qcow2: Restrict qcow2_co_pwrite_zeroes() to full clusters only, Alberto Garcia, 2019/12/22
- [RFC PATCH v3 11/27] qcow2: Add QCow2SubclusterType and qcow2_get_subcluster_type(), Alberto Garcia, 2019/12/22
- [RFC PATCH v3 03/27] qcow2: Process QCOW2_CLUSTER_ZERO_ALLOC clusters in handle_copied(), Alberto Garcia, 2019/12/22
- [RFC PATCH v3 27/27] iotests: Add tests for qcow2 images with extended L2 entries, Alberto Garcia, 2019/12/22
- [RFC PATCH v3 21/27] qcow2: Update L2 bitmap in qcow2_alloc_cluster_link_l2(),
Alberto Garcia <=
- [RFC PATCH v3 13/27] qcow2: Handle QCOW2_SUBCLUSTER_UNALLOCATED_ALLOC, Alberto Garcia, 2019/12/22
- [RFC PATCH v3 19/27] qcow2: Add subcluster support to expand_zero_clusters_in_l1(), Alberto Garcia, 2019/12/22
- [RFC PATCH v3 22/27] qcow2: Clear the L2 bitmap when allocating a compressed cluster, Alberto Garcia, 2019/12/22
- [RFC PATCH v3 08/27] qcow2: Add offset_to_sc_index(), Alberto Garcia, 2019/12/22
- [RFC PATCH v3 06/27] qcow2: Add dummy has_subclusters() function, Alberto Garcia, 2019/12/22
- [RFC PATCH v3 02/27] qcow2: Split cluster_needs_cow() out of count_cow_clusters(), Alberto Garcia, 2019/12/22
- [RFC PATCH v3 23/27] qcow2: Add subcluster support to handle_alloc_space(), Alberto Garcia, 2019/12/22
- [RFC PATCH v3 14/27] qcow2: Add subcluster support to calculate_l2_meta(), Alberto Garcia, 2019/12/22
- [RFC PATCH v3 26/27] qcow2: Add subcluster support to qcow2_measure(), Alberto Garcia, 2019/12/22
- [RFC PATCH v3 09/27] qcow2: Add l2_entry_size(), Alberto Garcia, 2019/12/22