This commit only handles submission of block-stream command. Since block-stream is a job, we'll need to handle its completion as well in an upcoming commit. Signed-off-by: Pavel Mores <pmores@xxxxxxxxxx> --- src/qemu/qemu_driver.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index b3f97bf593..b1ffc68e6b 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -17410,7 +17410,15 @@ qemuDomainBlockPullCommon(virDomainObjPtr vm, !(backingPath = qemuBlockGetBackingStoreString(baseSource))) goto endjob; } - device = disk->src->nodeformat; + if (topSource) { + device = topSource->nodeformat; + if (qemuDomainStorageSourceAccessAllow(driver, vm, topSource, false, false) < 0) { + virReportError(VIR_ERR_ACCESS_DENIED, "can't make 'top' writable"); + goto endjob; + } + } else { + device = disk->src->nodeformat; + } } else { device = job->name; } @@ -18171,7 +18179,7 @@ qemuDomainBlockRebase(virDomainPtr dom, const char *path, const char *base, /* For normal rebase (enhanced blockpull), the common code handles * everything, including vm cleanup. */ if (!(flags & VIR_DOMAIN_BLOCK_REBASE_COPY)) - return qemuDomainBlockPullCommon(vm, path, base, NULL, bandwidth, flags); + return qemuDomainBlockPullCommon(vm, path, base, top, bandwidth, flags); /* If we got here, we are doing a block copy rebase. */ if (!(dest = virStorageSourceNew())) @@ -18302,8 +18310,8 @@ qemuDomainBlockCopy(virDomainPtr dom, const char *disk, const char *destxml, static int -qemuDomainBlockPull(virDomainPtr dom, const char *path, unsigned long bandwidth, - unsigned int flags) +qemuDomainBlockPull(virDomainPtr dom, const char *path, + unsigned long bandwidth, unsigned int flags) { virDomainObjPtr vm; virCheckFlags(VIR_DOMAIN_BLOCK_PULL_BANDWIDTH_BYTES, -1); -- 2.24.1