From 9a8f39d097448b2b43c4a05d0edc213eacfc9ea6 Mon Sep 17 00:00:00 2001 From: Christophe Fergeau Date: Tue, 14 May 2013 15:48:21 +0200 Subject: [PATCH] storage: Ensure 'qemu-img resize' size arg is a 512 multiple qemu-img resize will fail with "The new size must be a multiple of 512" if libvirt doesn't round it first. This fixes rhbz#951495 Signed-off-by: Christophe Fergeau --- src/internal.h | 3 +++ src/libvirt.c | 3 ++- src/storage/storage_backend_fs.c | 4 ++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/internal.h b/src/internal.h index 03c2493c7d..cef9dc958f 100644 --- a/src/internal.h +++ b/src/internal.h @@ -339,6 +339,9 @@ /* divide value by size, rounding up */ # define VIR_DIV_UP(value, size) (((value) + (size) - 1) / (size)) +/* round up value to the closest multiple of size */ +# define VIR_ROUND_UP(value, size) (VIR_DIV_UP(value, size) * (size)) + # if WITH_DTRACE_PROBES # ifndef LIBVIRT_PROBES_H diff --git a/src/libvirt.c b/src/libvirt.c index e6cb8de6da..30f9646110 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -14131,7 +14131,8 @@ error: * Changes the capacity of the storage volume @vol to @capacity. The * operation will fail if the new capacity requires allocation that would * exceed the remaining free space in the parent pool. The contents of - * the new capacity will appear as all zero bytes. + * the new capacity will appear as all zero bytes. The capacity value will + * be rounded to the granularity supported by the hypervisor. * * Normally, the operation will attempt to affect capacity with a minimum * impact on allocation (that is, the default operation favors a sparse diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c index 9b83e5700f..1379f17f55 100644 --- a/src/storage/storage_backend_fs.c +++ b/src/storage/storage_backend_fs.c @@ -1219,6 +1219,10 @@ virStorageBackendFilesystemResizeQemuImg(const char *path, return -1; } + /* Round capacity as qemu-img resize errors out on sizes which are not + * a multiple of 512 */ + capacity = VIR_ROUND_UP(capacity, 512); + cmd = virCommandNew(img_tool); virCommandAddArgList(cmd, "resize", path, NULL); virCommandAddArgFormat(cmd, "%llu", capacity); -- GitLab