[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PULL 02/23] qcow2: Support BDRV_REQ_MAY_UNMAP
From: |
Kevin Wolf |
Subject: |
[Qemu-block] [PULL 02/23] qcow2: Support BDRV_REQ_MAY_UNMAP |
Date: |
Mon, 24 Oct 2016 19:01:50 +0200 |
From: Fam Zheng <address@hidden>
Handling this is similar to what is done to the L2 entry in the case of
compressed clusters.
Signed-off-by: Fam Zheng <address@hidden>
Signed-off-by: Kevin Wolf <address@hidden>
---
block/qcow2-cluster.c | 9 +++++----
block/qcow2.c | 3 ++-
block/qcow2.h | 3 ++-
3 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
index 61d1ffd..928c1e2 100644
--- a/block/qcow2-cluster.c
+++ b/block/qcow2-cluster.c
@@ -1558,7 +1558,7 @@ fail:
* clusters.
*/
static int zero_single_l2(BlockDriverState *bs, uint64_t offset,
- uint64_t nb_clusters)
+ uint64_t nb_clusters, int flags)
{
BDRVQcow2State *s = bs->opaque;
uint64_t *l2_table;
@@ -1582,7 +1582,7 @@ static int zero_single_l2(BlockDriverState *bs, uint64_t
offset,
/* Update L2 entries */
qcow2_cache_entry_mark_dirty(bs, s->l2_table_cache, l2_table);
- if (old_offset & QCOW_OFLAG_COMPRESSED) {
+ if (old_offset & QCOW_OFLAG_COMPRESSED || flags & BDRV_REQ_MAY_UNMAP) {
l2_table[l2_index + i] = cpu_to_be64(QCOW_OFLAG_ZERO);
qcow2_free_any_clusters(bs, old_offset, 1, QCOW2_DISCARD_REQUEST);
} else {
@@ -1595,7 +1595,8 @@ static int zero_single_l2(BlockDriverState *bs, uint64_t
offset,
return nb_clusters;
}
-int qcow2_zero_clusters(BlockDriverState *bs, uint64_t offset, int nb_sectors)
+int qcow2_zero_clusters(BlockDriverState *bs, uint64_t offset, int nb_sectors,
+ int flags)
{
BDRVQcow2State *s = bs->opaque;
uint64_t nb_clusters;
@@ -1612,7 +1613,7 @@ int qcow2_zero_clusters(BlockDriverState *bs, uint64_t
offset, int nb_sectors)
s->cache_discards = true;
while (nb_clusters > 0) {
- ret = zero_single_l2(bs, offset, nb_clusters);
+ ret = zero_single_l2(bs, offset, nb_clusters, flags);
if (ret < 0) {
goto fail;
}
diff --git a/block/qcow2.c b/block/qcow2.c
index e11c7c9..6d5689a 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -1155,6 +1155,7 @@ static int qcow2_open(BlockDriverState *bs, QDict
*options, int flags,
/* Initialise locks */
qemu_co_mutex_init(&s->lock);
+ bs->supported_zero_flags = BDRV_REQ_MAY_UNMAP;
/* Repair image if dirty */
if (!(flags & (BDRV_O_CHECK | BDRV_O_INACTIVE)) && !bs->read_only &&
@@ -2477,7 +2478,7 @@ static coroutine_fn int
qcow2_co_pwrite_zeroes(BlockDriverState *bs,
trace_qcow2_pwrite_zeroes(qemu_coroutine_self(), offset, count);
/* Whatever is left can use real zero clusters */
- ret = qcow2_zero_clusters(bs, offset, count >> BDRV_SECTOR_BITS);
+ ret = qcow2_zero_clusters(bs, offset, count >> BDRV_SECTOR_BITS, flags);
qemu_co_mutex_unlock(&s->lock);
return ret;
diff --git a/block/qcow2.h b/block/qcow2.h
index 9ce5a37..92203a8 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -547,7 +547,8 @@ uint64_t
qcow2_alloc_compressed_cluster_offset(BlockDriverState *bs,
int qcow2_alloc_cluster_link_l2(BlockDriverState *bs, QCowL2Meta *m);
int qcow2_discard_clusters(BlockDriverState *bs, uint64_t offset,
int nb_sectors, enum qcow2_discard_type type, bool full_discard);
-int qcow2_zero_clusters(BlockDriverState *bs, uint64_t offset, int nb_sectors);
+int qcow2_zero_clusters(BlockDriverState *bs, uint64_t offset, int nb_sectors,
+ int flags);
int qcow2_expand_zero_clusters(BlockDriverState *bs,
BlockDriverAmendStatusCB *status_cb,
--
1.8.3.1
- [Qemu-block] [PULL 00/23] Block layer patches, Kevin Wolf, 2016/10/24
- [Qemu-block] [PULL 01/23] block: failed qemu-img command should return non-zero exit code, Kevin Wolf, 2016/10/24
- [Qemu-block] [PULL 04/23] block: improve error handling in raw_open, Kevin Wolf, 2016/10/24
- [Qemu-block] [PULL 02/23] qcow2: Support BDRV_REQ_MAY_UNMAP,
Kevin Wolf <=
- [Qemu-block] [PULL 03/23] block: Remove "options" indirection from blockdev-add, Kevin Wolf, 2016/10/24
- [Qemu-block] [PULL 05/23] qapi: fix memory leak in bdrv_image_info_specific_dump, Kevin Wolf, 2016/10/24
- [Qemu-block] [PULL 08/23] qemu-nbd: Add --fork option, Kevin Wolf, 2016/10/24
- [Qemu-block] [PULL 09/23] iotests: Remove raciness from 162, Kevin Wolf, 2016/10/24
- [Qemu-block] [PULL 10/23] iotests: Do not rely on unavailable domains in 162, Kevin Wolf, 2016/10/24
- [Qemu-block] [PULL 06/23] throttle: Correct access to wrong BlockBackendPublic structures, Kevin Wolf, 2016/10/24
- [Qemu-block] [PULL 07/23] qemu-iotests: Test I/O in a single drive from a throttling group, Kevin Wolf, 2016/10/24
- [Qemu-block] [PULL 13/23] block: Hide HBitmap in block dirty bitmap interface, Kevin Wolf, 2016/10/24
- [Qemu-block] [PULL 11/23] quorum: change child_iter to children_read, Kevin Wolf, 2016/10/24
- [Qemu-block] [PULL 16/23] block: Support meta dirty bitmap, Kevin Wolf, 2016/10/24