[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