[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v4 20/30] qcow2: Add subcluster support to discard_in_l2_slice()
From: |
Alberto Garcia |
Subject: |
[PATCH v4 20/30] qcow2: Add subcluster support to discard_in_l2_slice() |
Date: |
Tue, 17 Mar 2020 19:16:17 +0100 |
Two changes are needed in this function:
1) A full discard deallocates a cluster so we can skip the operation if
it is already unallocated. With extended L2 entries however if any
of the subclusters has the 'all zeroes' bit set then we have to
clear it.
2) Setting the QCOW_OFLAG_ZERO bit of the L2 entry is forbidden if an
image has extended L2 entries. Instead, the individual 'all zeroes'
bits must be used.
Signed-off-by: Alberto Garcia <address@hidden>
---
block/qcow2-cluster.c | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
index 746006a117..824c710760 100644
--- a/block/qcow2-cluster.c
+++ b/block/qcow2-cluster.c
@@ -1790,12 +1790,20 @@ static int discard_in_l2_slice(BlockDriverState *bs,
uint64_t offset,
* TODO We might want to use bdrv_block_status(bs) here, but we're
* holding s->lock, so that doesn't work today.
*
- * If full_discard is true, the sector should not read back as zeroes,
+ * If full_discard is true, the cluster should not read back as zeroes,
* but rather fall through to the backing file.
*/
switch (qcow2_get_cluster_type(bs, old_l2_entry)) {
case QCOW2_CLUSTER_UNALLOCATED:
- if (full_discard || !bs->backing) {
+ if (full_discard) {
+ /* If the image has extended L2 entries we can only
+ * skip this operation if the L2 bitmap is zero. */
+ uint64_t bitmap = has_subclusters(s) ?
+ get_l2_bitmap(s, l2_slice, l2_index + i) : 0;
+ if (bitmap == 0) {
+ continue;
+ }
+ } else if (!bs->backing) {
continue;
}
break;
@@ -1817,7 +1825,11 @@ static int discard_in_l2_slice(BlockDriverState *bs,
uint64_t offset,
/* First remove L2 entries */
qcow2_cache_entry_mark_dirty(s->l2_table_cache, l2_slice);
- if (!full_discard && s->qcow_version >= 3) {
+ if (has_subclusters(s)) {
+ set_l2_entry(s, l2_slice, l2_index + i, 0);
+ set_l2_bitmap(s, l2_slice, l2_index + i,
+ full_discard ? 0 : QCOW_L2_BITMAP_ALL_ZEROES);
+ } else if (!full_discard && s->qcow_version >= 3) {
set_l2_entry(s, l2_slice, l2_index + i, QCOW_OFLAG_ZERO);
} else {
set_l2_entry(s, l2_slice, l2_index + i, 0);
--
2.20.1
- Re: [PATCH v4 02/30] qcow2: Convert qcow2_get_cluster_offset() into qcow2_get_host_offset(), (continued)
- [PATCH v4 06/30] qcow2: Add get_l2_entry() and set_l2_entry(), Alberto Garcia, 2020/03/17
- [PATCH v4 05/30] qcow2: Process QCOW2_CLUSTER_ZERO_ALLOC clusters in handle_copied(), Alberto Garcia, 2020/03/17
- [PATCH v4 21/30] qcow2: Add subcluster support to check_refcounts_l2(), Alberto Garcia, 2020/03/17
- [PATCH v4 04/30] qcow2: Split cluster_needs_cow() out of count_cow_clusters(), Alberto Garcia, 2020/03/17
- [PATCH v4 23/30] qcow2: Update L2 bitmap in qcow2_alloc_cluster_link_l2(), Alberto Garcia, 2020/03/17
- [PATCH v4 25/30] qcow2: Add subcluster support to handle_alloc_space(), Alberto Garcia, 2020/03/17
- [PATCH v4 09/30] qcow2: Add subcluster-related fields to BDRVQcow2State, Alberto Garcia, 2020/03/17
- [PATCH v4 14/30] qcow2: Add cluster type parameter to qcow2_get_host_offset(), Alberto Garcia, 2020/03/17
- [PATCH v4 08/30] qcow2: Add dummy has_subclusters() function, Alberto Garcia, 2020/03/17
- [PATCH v4 20/30] qcow2: Add subcluster support to discard_in_l2_slice(),
Alberto Garcia <=
- [PATCH v4 19/30] qcow2: Add subcluster support to zero_in_l2_slice(), Alberto Garcia, 2020/03/17
- [PATCH v4 24/30] qcow2: Clear the L2 bitmap when allocating a compressed cluster, Alberto Garcia, 2020/03/17
- [PATCH v4 03/30] qcow2: Add calculate_l2_meta(), Alberto Garcia, 2020/03/17
- [PATCH v4 13/30] qcow2: Add QCow2SubclusterType and qcow2_get_subcluster_type(), Alberto Garcia, 2020/03/17
- [PATCH v4 17/30] qcow2: Add subcluster support to calculate_l2_meta(), Alberto Garcia, 2020/03/17
- [PATCH v4 01/30] qcow2: Make Qcow2AioTask store the full host offset, Alberto Garcia, 2020/03/17
- [PATCH v4 26/30] qcow2: Restrict qcow2_co_pwrite_zeroes() to full clusters only, Alberto Garcia, 2020/03/17
- [PATCH v4 27/30] qcow2: Assert that expand_zero_clusters_in_l1() does not support subclusters, Alberto Garcia, 2020/03/17
- [PATCH v4 07/30] qcow2: Document the Extended L2 Entries feature, Alberto Garcia, 2020/03/17