[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH v2] block/rbd: implement .bdrv_get_allocated_file_si
From: |
Stefano Garzarella |
Subject: |
[Qemu-block] [PATCH v2] block/rbd: implement .bdrv_get_allocated_file_size callback |
Date: |
Fri, 10 May 2019 17:33:46 +0200 |
This patch allows 'qemu-img info' to show the 'disk size' for
the RBD images that have the fast-diff feature enabled.
If this feature is enabled, we use the rbd_diff_iterate2() API
to calculate the allocated size for the image.
Signed-off-by: Stefano Garzarella <address@hidden>
---
v2:
- calculate the actual usage only if the fast-diff feature is
enabled [Jason]
---
block/rbd.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 54 insertions(+)
diff --git a/block/rbd.c b/block/rbd.c
index 0c549c9935..f1bc76ab80 100644
--- a/block/rbd.c
+++ b/block/rbd.c
@@ -1046,6 +1046,59 @@ static int64_t qemu_rbd_getlength(BlockDriverState *bs)
return info.size;
}
+static int rbd_allocated_size_cb(uint64_t offset, size_t len, int exists,
+ void *arg)
+{
+ int64_t *alloc_size = (int64_t *) arg;
+
+ if (exists) {
+ (*alloc_size) += len;
+ }
+
+ return 0;
+}
+
+static int64_t qemu_rbd_get_allocated_file_size(BlockDriverState *bs)
+{
+ BDRVRBDState *s = bs->opaque;
+ uint64_t flags, features;
+ int64_t alloc_size = 0;
+ int r;
+
+ r = rbd_get_flags(s->image, &flags);
+ if (r < 0) {
+ return r;
+ }
+
+ r = rbd_get_features(s->image, &features);
+ if (r < 0) {
+ return r;
+ }
+
+ /*
+ * We use rbd_diff_iterate2() only if the RBD image have fast-diff
+ * feature enabled. If it is disabled, rbd_diff_iterate2() could be
+ * very slow on a big image.
+ */
+ if (!(features & RBD_FEATURE_FAST_DIFF) ||
+ (flags & RBD_FLAG_FAST_DIFF_INVALID)) {
+ return -1;
+ }
+
+ /*
+ * rbd_diff_iterate2(), if the source snapshot name is NULL, invokes
+ * the callback on all allocated regions of the image.
+ */
+ r = rbd_diff_iterate2(s->image, NULL, 0,
+ bs->total_sectors * BDRV_SECTOR_SIZE, 0, 1,
+ &rbd_allocated_size_cb, &alloc_size);
+ if (r < 0) {
+ return r;
+ }
+
+ return alloc_size;
+}
+
static int coroutine_fn qemu_rbd_co_truncate(BlockDriverState *bs,
int64_t offset,
PreallocMode prealloc,
@@ -1254,6 +1307,7 @@ static BlockDriver bdrv_rbd = {
.bdrv_get_info = qemu_rbd_getinfo,
.create_opts = &qemu_rbd_create_opts,
.bdrv_getlength = qemu_rbd_getlength,
+ .bdrv_get_allocated_file_size = qemu_rbd_get_allocated_file_size,
.bdrv_co_truncate = qemu_rbd_co_truncate,
.protocol_name = "rbd",
--
2.20.1
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemu-block] [PATCH v2] block/rbd: implement .bdrv_get_allocated_file_size callback,
Stefano Garzarella <=