[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v12 09/10] qcow2: Assert that cluster operations are
From: |
Eric Blake |
Subject: |
[Qemu-devel] [PATCH v12 09/10] qcow2: Assert that cluster operations are aligned |
Date: |
Wed, 3 May 2017 22:07:54 -0500 |
We already audited (in commit 0c1bd469) that qcow2_discard_clusters()
is only passed cluster-aligned start values; but we can further
tighten the assertion that the only unaligned end value is at EOF.
Recent commits have taken advantage of an unaligned tail cluster,
for both discard and write zeroes.
Signed-off-by: Eric Blake <address@hidden>
Reviewed-by: Max Reitz <address@hidden>
---
v12: no change
v11: reserved for blkdebug half of v10
v10: rebase to context
v9: rebase to master, by asserting that only tail cluster is unaligned
v7, v8: only earlier half of series submitted for 2.9
v6: avoid assertion on non-cluster-aligned image, use s->cluster_sectors
to avoid a shift, drop R-b
v5: no change
v4: new patch
---
block/qcow2-cluster.c | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
index 78fbe34..9aab6dd 100644
--- a/block/qcow2-cluster.c
+++ b/block/qcow2-cluster.c
@@ -1557,11 +1557,10 @@ int qcow2_discard_clusters(BlockDriverState *bs,
uint64_t offset,
end_offset = offset + (nb_sectors << BDRV_SECTOR_BITS);
- /* The caller must cluster-align start; round end down except at EOF */
+ /* Caller must pass aligned values, except at image end */
assert(QEMU_IS_ALIGNED(offset, s->cluster_size));
- if (end_offset != bs->total_sectors * BDRV_SECTOR_SIZE) {
- end_offset = start_of_cluster(s, end_offset);
- }
+ assert(QEMU_IS_ALIGNED(end_offset, s->cluster_size) ||
+ end_offset == bs->total_sectors << BDRV_SECTOR_BITS);
nb_clusters = size_to_clusters(s, end_offset - offset);
@@ -1644,9 +1643,17 @@ int qcow2_zero_clusters(BlockDriverState *bs, uint64_t
offset, int nb_sectors,
int flags)
{
BDRVQcow2State *s = bs->opaque;
+ uint64_t end_offset;
uint64_t nb_clusters;
int ret;
+ end_offset = offset + (nb_sectors << BDRV_SECTOR_BITS);
+
+ /* Caller must pass aligned values, except at image end */
+ assert(QEMU_IS_ALIGNED(offset, s->cluster_size));
+ assert(QEMU_IS_ALIGNED(end_offset, s->cluster_size) ||
+ end_offset == bs->total_sectors << BDRV_SECTOR_BITS);
+
/* The zero flag is only supported by version 3 and newer */
if (s->qcow_version < 3) {
return -ENOTSUP;
--
2.9.3
- Re: [Qemu-devel] [PATCH v12 02/10] block: Update comments on BDRV_BLOCK_* meanings, (continued)
[Qemu-devel] [PATCH v12 01/10] qcow2: Use consistent switch indentation, Eric Blake, 2017/05/03
[Qemu-devel] [PATCH v12 05/10] qcow2: Optimize zero_single_l2() to minimize L2 churn, Eric Blake, 2017/05/03
[Qemu-devel] [PATCH v12 04/10] qcow2: Make distinction between zero cluster types obvious, Eric Blake, 2017/05/03
[Qemu-devel] [PATCH v12 09/10] qcow2: Assert that cluster operations are aligned,
Eric Blake <=
[Qemu-devel] [PATCH v12 06/10] iotests: Improve _filter_qemu_img_map, Eric Blake, 2017/05/03
[Qemu-devel] [PATCH v12 10/10] qcow2: Discard/zero clusters by byte count, Eric Blake, 2017/05/03
[Qemu-devel] [PATCH v12 07/10] iotests: Add test 179 to cover write zeroes with unmap, Eric Blake, 2017/05/03
[Qemu-devel] [PATCH v12 08/10] qcow2: Optimize write zero of unaligned tail cluster, Eric Blake, 2017/05/03