| 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 |
| |
| |
| @@ -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 |
| |
| |
| @@ -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 |
| |
| |
| @@ -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 |
| |
| |
| @@ -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 |
| |
| |
| @@ -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 |
| |
| |
| @@ -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 |
| |