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@xxxxxxxxxx> > --- > 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 :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list