[libvirt] [PATCHv2] storage: Ensure 'qemu-img resize' size arg is a 512 multiple
Daniel P. Berrange
berrange at redhat.com
Tue May 14 18:47:46 UTC 2013
On Tue, May 14, 2013 at 07:38:53PM +0200, Christophe Fergeau wrote:
> 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 at 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);
ACK
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list