提交 ffc6249c 编写于 作者: P Peter Krempa

qemu: block: Support VIR_DOMAIN_BLOCK_COMMIT/PULL/REBASE_RELATIVE with blockdev

Preservation of the relative relationship requires us to load the
backing store strings from the disk images. With blockdev we stopped
detecting the backing chain if it's specified in the XML so the relative
links were not loaded at that point. To preserve the functionality from
the pre-blockdev without accessing the backing chain unnecessarily
during VM startup we must refresh the relative links when relative
block commit or block pull is requested.

https://bugzilla.redhat.com/show_bug.cgi?id=1818655Signed-off-by: NPeter Krempa <pkrempa@redhat.com>
Reviewed-by: NJán Tomko <jtomko@redhat.com>
上级 9c8753fe
......@@ -3378,3 +3378,49 @@ qemuBlockStorageSourceGetCookieString(virStorageSourcePtr src)
return virBufferContentAndReset(&buf);
}
/**
* qemuBlockUpdateRelativeBacking:
* @vm: domain object
* @src: starting point of the update
* @topsrc: top level image in the backing chain (used to get security label)
*
* Reload data necessary for keeping backing store links starting from @src
* relative.
*/
int
qemuBlockUpdateRelativeBacking(virDomainObjPtr vm,
virStorageSourcePtr src,
virStorageSourcePtr topsrc)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
virQEMUDriverPtr driver = priv->driver;
virStorageSourcePtr n;
for (n = src; virStorageSourceHasBacking(n); n = n->backingStore) {
g_autofree char *backingStoreStr = NULL;
int rc;
if (n->backingStore->relPath)
break;
if (!virStorageFileSupportsBackingChainTraversal(n))
continue;
if (qemuDomainStorageFileInit(driver, vm, n, topsrc) < 0)
return -1;
rc = virStorageFileGetBackingStoreStr(n, &backingStoreStr);
virStorageFileDeinit(n);
if (rc < 0)
return rc;
if (backingStoreStr && virStorageIsRelative(backingStoreStr))
n->backingStore->relPath = g_steal_pointer(&backingStoreStr);
}
return 0;
}
......@@ -261,3 +261,8 @@ qemuBlockStorageSourceNeedsStorageSliceLayer(const virStorageSource *src);
char *
qemuBlockStorageSourceGetCookieString(virStorageSourcePtr src);
int
qemuBlockUpdateRelativeBacking(virDomainObjPtr vm,
virStorageSourcePtr src,
virStorageSourcePtr topsrc);
......@@ -17466,6 +17466,10 @@ qemuDomainBlockPullCommon(virDomainObjPtr vm,
goto endjob;
}
if (blockdev &&
qemuBlockUpdateRelativeBacking(vm, disk->src, disk->src) < 0)
goto endjob;
if (virStorageFileGetRelativeBackingPath(disk->src->backingStore,
baseSource,
&backingPath) < 0)
......@@ -18593,6 +18597,10 @@ qemuDomainBlockCommit(virDomainPtr dom,
goto endjob;
}
if (blockdev && top_parent &&
qemuBlockUpdateRelativeBacking(vm, top_parent, disk->src) < 0)
goto endjob;
if (virStorageFileGetRelativeBackingPath(topSource, baseSource,
&backingPath) < 0)
goto endjob;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册