146 lines
5.9 KiB
Diff
146 lines
5.9 KiB
Diff
|
From 41d6c207c482093df8669f7cdcdb49bb25dba741 Mon Sep 17 00:00:00 2001
|
||
|
From: Eric Blake <eblake@redhat.com>
|
||
|
Date: Tue, 2 Jun 2020 02:34:12 +0100
|
||
|
Subject: [PATCH 07/26] block: Make it easier to learn which BDS support
|
||
|
bitmaps
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
RH-Author: Eric Blake <eblake@redhat.com>
|
||
|
Message-id: <20200602023420.2133649-5-eblake@redhat.com>
|
||
|
Patchwork-id: 97071
|
||
|
O-Subject: [RHEL-AV-8.2.1 qemu-kvm PATCH 04/12] block: Make it easier to learn which BDS support bitmaps
|
||
|
Bugzilla: 1779893 1779904
|
||
|
RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||
|
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||
|
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||
|
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||
|
|
||
|
Upcoming patches will enhance bitmap support in qemu-img, but in doing
|
||
|
so, it turns out to be nice to suppress output when persistent bitmaps
|
||
|
make no sense (such as on a qcow2 v2 image). Add a hook to make this
|
||
|
easier to query.
|
||
|
|
||
|
This patch adds a new callback .bdrv_supports_persistent_dirty_bitmap,
|
||
|
rather than trying to shoehorn the answer in via existing callbacks.
|
||
|
In particular, while it might have been possible to overload
|
||
|
.bdrv_co_can_store_new_dirty_bitmap to special-case a NULL input to
|
||
|
answer whether any persistent bitmaps are supported, that is at odds
|
||
|
with whether a particular bitmap can be stored (for example, even on
|
||
|
an image that supports persistent bitmaps but has currently filled up
|
||
|
the maximum number of bitmaps, attempts to store another one should
|
||
|
fail); and the new functionality doesn't require coroutine safety.
|
||
|
Similarly, we could have added one more piece of information to
|
||
|
.bdrv_get_info, but then again, most callers to that function tend to
|
||
|
already discard extraneous information, and making it a catch-all
|
||
|
rather than a series of dedicated scalar queries hasn't really
|
||
|
simplified life.
|
||
|
|
||
|
In the future, when we improve the ability to look up bitmaps through
|
||
|
a filter, we will probably also want to teach the block layer to
|
||
|
automatically let filters pass this request on through.
|
||
|
|
||
|
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||
|
Message-Id: <20200513011648.166876-4-eblake@redhat.com>
|
||
|
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||
|
(cherry picked from commit ef893b5c84f3199d777e33966dc28839f71b1a5c)
|
||
|
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||
|
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||
|
---
|
||
|
block/dirty-bitmap.c | 9 +++++++++
|
||
|
block/qcow2-bitmap.c | 7 +++++++
|
||
|
block/qcow2.c | 2 ++
|
||
|
block/qcow2.h | 1 +
|
||
|
include/block/block_int.h | 1 +
|
||
|
include/block/dirty-bitmap.h | 1 +
|
||
|
6 files changed, 21 insertions(+)
|
||
|
|
||
|
diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c
|
||
|
index 7039e82..2f96acc 100644
|
||
|
--- a/block/dirty-bitmap.c
|
||
|
+++ b/block/dirty-bitmap.c
|
||
|
@@ -478,6 +478,15 @@ int bdrv_remove_persistent_dirty_bitmap(BlockDriverState *bs, const char *name,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
+bool
|
||
|
+bdrv_supports_persistent_dirty_bitmap(BlockDriverState *bs)
|
||
|
+{
|
||
|
+ if (bs->drv && bs->drv->bdrv_supports_persistent_dirty_bitmap) {
|
||
|
+ return bs->drv->bdrv_supports_persistent_dirty_bitmap(bs);
|
||
|
+ }
|
||
|
+ return false;
|
||
|
+}
|
||
|
+
|
||
|
static bool coroutine_fn
|
||
|
bdrv_co_can_store_new_dirty_bitmap(BlockDriverState *bs, const char *name,
|
||
|
uint32_t granularity, Error **errp)
|
||
|
diff --git a/block/qcow2-bitmap.c b/block/qcow2-bitmap.c
|
||
|
index c6c8ebb..cbac905 100644
|
||
|
--- a/block/qcow2-bitmap.c
|
||
|
+++ b/block/qcow2-bitmap.c
|
||
|
@@ -1759,3 +1759,10 @@ fail:
|
||
|
name, bdrv_get_device_or_node_name(bs));
|
||
|
return false;
|
||
|
}
|
||
|
+
|
||
|
+bool qcow2_supports_persistent_dirty_bitmap(BlockDriverState *bs)
|
||
|
+{
|
||
|
+ BDRVQcow2State *s = bs->opaque;
|
||
|
+
|
||
|
+ return s->qcow_version >= 3;
|
||
|
+}
|
||
|
diff --git a/block/qcow2.c b/block/qcow2.c
|
||
|
index af0ad4a..36b0f7d 100644
|
||
|
--- a/block/qcow2.c
|
||
|
+++ b/block/qcow2.c
|
||
|
@@ -5551,6 +5551,8 @@ BlockDriver bdrv_qcow2 = {
|
||
|
.bdrv_detach_aio_context = qcow2_detach_aio_context,
|
||
|
.bdrv_attach_aio_context = qcow2_attach_aio_context,
|
||
|
|
||
|
+ .bdrv_supports_persistent_dirty_bitmap =
|
||
|
+ qcow2_supports_persistent_dirty_bitmap,
|
||
|
.bdrv_co_can_store_new_dirty_bitmap = qcow2_co_can_store_new_dirty_bitmap,
|
||
|
.bdrv_co_remove_persistent_dirty_bitmap =
|
||
|
qcow2_co_remove_persistent_dirty_bitmap,
|
||
|
diff --git a/block/qcow2.h b/block/qcow2.h
|
||
|
index 0942126..ceb1ceb 100644
|
||
|
--- a/block/qcow2.h
|
||
|
+++ b/block/qcow2.h
|
||
|
@@ -767,6 +767,7 @@ bool qcow2_co_can_store_new_dirty_bitmap(BlockDriverState *bs,
|
||
|
int qcow2_co_remove_persistent_dirty_bitmap(BlockDriverState *bs,
|
||
|
const char *name,
|
||
|
Error **errp);
|
||
|
+bool qcow2_supports_persistent_dirty_bitmap(BlockDriverState *bs);
|
||
|
|
||
|
ssize_t coroutine_fn
|
||
|
qcow2_co_compress(BlockDriverState *bs, void *dest, size_t dest_size,
|
||
|
diff --git a/include/block/block_int.h b/include/block/block_int.h
|
||
|
index 562dca1..cc18e8d 100644
|
||
|
--- a/include/block/block_int.h
|
||
|
+++ b/include/block/block_int.h
|
||
|
@@ -568,6 +568,7 @@ struct BlockDriver {
|
||
|
uint64_t parent_perm, uint64_t parent_shared,
|
||
|
uint64_t *nperm, uint64_t *nshared);
|
||
|
|
||
|
+ bool (*bdrv_supports_persistent_dirty_bitmap)(BlockDriverState *bs);
|
||
|
bool (*bdrv_co_can_store_new_dirty_bitmap)(BlockDriverState *bs,
|
||
|
const char *name,
|
||
|
uint32_t granularity,
|
||
|
diff --git a/include/block/dirty-bitmap.h b/include/block/dirty-bitmap.h
|
||
|
index e2b20ec..f6e9a38 100644
|
||
|
--- a/include/block/dirty-bitmap.h
|
||
|
+++ b/include/block/dirty-bitmap.h
|
||
|
@@ -16,6 +16,7 @@ typedef enum BitmapCheckFlags {
|
||
|
|
||
|
#define BDRV_BITMAP_MAX_NAME_SIZE 1023
|
||
|
|
||
|
+bool bdrv_supports_persistent_dirty_bitmap(BlockDriverState *bs);
|
||
|
BdrvDirtyBitmap *bdrv_create_dirty_bitmap(BlockDriverState *bs,
|
||
|
uint32_t granularity,
|
||
|
const char *name,
|
||
|
--
|
||
|
1.8.3.1
|
||
|
|