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 <cfergeau(a)redhat.com>
---
Changes since v1:
- move rounding code to a new VIR_ROUND_UP() macro
- add a note in virStorageVolResize API doc that the
requested capacity may be rounded up
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 d819aa3..28540f4 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 2b3515e..f2360f8 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -14124,7 +14124,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 9b83e57..1379f17 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);
--
1.8.2.1