[libvirt] Regression in createQemuImg()@storage_backend_fs.c of 0.6.4
Cole Robinson
crobinso at redhat.com
Thu Jun 4 15:40:28 UTC 2009
Ryota Ozaki wrote:
> Hi,
>
> I've found a regression in using a backing store of a volume (qcow2)
> in a pool (dir). The following code of 0.6.4 hits my system that works
> with 0.6.3.
>
> static int createQemuImg(virConnectPtr conn,
> virStorageVolDefPtr vol,
> virStorageVolDefPtr inputvol) {
>
> (snip)
>
> const char *inputBackingPath = (inputvol ? inputvol->backingStore.path
> : NULL);
>
> (snip)
>
> /* XXX: Not strictly required: qemu-img has an option a different
> * backing store, not really sure what use it serves though, and it
> * may cause issues with lvm. Untested essentially.
> */
> if (!inputBackingPath ||
> !STREQ(inputBackingPath, vol->backingStore.path)) {
> virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
> "%s", _("a different backing store can not "
> "be specified."));
> return -1;
> }
>
>
> The inputBackingPath will be always NULL when it is called via
> virStorageBackendFileSystemVolBuild(). (The third argument is
> passed to that of createQemuImg as it is.)
>
> static int
> virStorageBackendFileSystemVolBuild(virConnectPtr conn,
> virStorageVolDefPtr vol) {
> return _virStorageBackendFileSystemVolBuild(conn, vol, NULL);
> }
>
>
> I've addressed the regression with the patch
>
> - if (!inputBackingPath ||
> + if (inputBackingPath &&
>
> However, I'm not sure whether this fix satisfies the aim of
> the original code. Any idea?
>
Ahh, that's my fault. The idea is that if cloning a volume, the backing
store from the original vol must match the backing store in the new XML.
Thanks for looking into this. I think the correct fix is:
diff --git a/src/storage_backend_fs.c b/src/storage_backend_fs.c
index be6d011..3e26fce 100644
--- a/src/storage_backend_fs.c
+++ b/src/storage_backend_fs.c
@@ -1255,8 +1255,9 @@ static int createQemuImg(virConnectPtr conn,
* backing store, not really sure what use it serves though, and it
* may cause issues with lvm. Untested essentially.
*/
- if (!inputBackingPath ||
- !STREQ(inputBackingPath, vol->backingStore.path)) {
+ if (inputvol &&
+ (!inputBackingPath ||
+ !STREQ(inputBackingPath, vol->backingStore.path))) {
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
"%s", _("a different backing store
can not "
"be specified."));
<minus the line wrapping>
- Cole
More information about the libvir-list
mailing list