[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC PATCH 20/23] qcow2: Update L2 bitmap in qcow2_alloc_cluster_link_l2
From: |
Alberto Garcia |
Subject: |
[RFC PATCH 20/23] qcow2: Update L2 bitmap in qcow2_alloc_cluster_link_l2() |
Date: |
Tue, 15 Oct 2019 18:23:31 +0300 |
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 | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
index 75579c1470..9a4bf672b3 100644
--- a/block/qcow2-cluster.c
+++ b/block/qcow2-cluster.c
@@ -980,6 +980,22 @@ 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)) {
+ uint64_t written_from = m->cow_start.offset;
+ uint64_t written_to = m->cow_end.offset + m->cow_end.nb_bytes;
+ uint64_t l2_bitmap = get_l2_bitmap(s, l2_slice, l2_index + i);
+ int sc;
+ for (sc = 0; sc < s->subclusters_per_cluster; sc++) {
+ uint64_t 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 09/23] qcow2: Add l2_entry_size(), (continued)
- [RFC PATCH 09/23] qcow2: Add l2_entry_size(), Alberto Garcia, 2019/10/15
- [RFC PATCH 03/23] qcow2: Process QCOW2_CLUSTER_ZERO_ALLOC clusters in handle_copied(), Alberto Garcia, 2019/10/15
- [RFC PATCH 05/23] qcow2: Document the Extended L2 Entries feature, Alberto Garcia, 2019/10/15
- [RFC PATCH 04/23] qcow2: Add get_l2_entry() and set_l2_entry(), Alberto Garcia, 2019/10/15
- [RFC PATCH 23/23] qcow2: Add the 'extended_l2' option and the QCOW2_INCOMPAT_EXTL2 bit, Alberto Garcia, 2019/10/15
- [RFC PATCH 11/23] qcow2: Add qcow2_get_subcluster_type(), Alberto Garcia, 2019/10/15
- [RFC PATCH 08/23] qcow2: Add offset_to_sc_index(), Alberto Garcia, 2019/10/15
- [RFC PATCH 19/23] qcow2: Fix offset calculation in handle_dependencies(), Alberto Garcia, 2019/10/15
- [RFC PATCH 02/23] qcow2: Split cluster_needs_cow() out of count_cow_clusters(), Alberto Garcia, 2019/10/15
- [RFC PATCH 20/23] qcow2: Update L2 bitmap in qcow2_alloc_cluster_link_l2(),
Alberto Garcia <=
- [RFC PATCH 18/23] qcow2: Add subcluster support to expand_zero_clusters_in_l1(), Alberto Garcia, 2019/10/15
- [RFC PATCH 21/23] qcow2: Add subcluster support to handle_alloc_space(), Alberto Garcia, 2019/10/15
- [RFC PATCH 22/23] qcow2: Restrict qcow2_co_pwrite_zeroes() to full clusters only, Alberto Garcia, 2019/10/15
- [RFC PATCH 15/23] qcow2: Add subcluster support to zero_in_l2_slice(), Alberto Garcia, 2019/10/15
- [RFC PATCH 14/23] qcow2: Add subcluster support to qcow2_get_cluster_offset(), Alberto Garcia, 2019/10/15
- [RFC PATCH 17/23] qcow2: Add subcluster support to check_refcounts_l2(), Alberto Garcia, 2019/10/15
- [RFC PATCH 07/23] qcow2: Add subcluster-related fields to BDRVQcow2State, Alberto Garcia, 2019/10/15
- [RFC PATCH 13/23] qcow2: Add subcluster support to calculate_l2_meta(), Alberto Garcia, 2019/10/15
- Re: [RFC PATCH 00/23] Add subcluster allocation to qcow2, Eric Blake, 2019/10/15