[PATCH 2/2] qemu: implement driver support for domainBlockRebase2 API

Nikolai Barybin via Devel posted 2 patches 1 week, 2 days ago
[PATCH 2/2] qemu: implement driver support for domainBlockRebase2 API
Posted by Nikolai Barybin via Devel 1 week, 2 days ago
Parse params list and pass arguments to underlying call to
qemuDomainBlockPullCommon.

Now bandwidth unit of messurement is passed as param and passed further
with a use of VIR_DOMAIN_BLOCK_PULL_BANDWIDTH_BYTES flag.
virDomainBlockRebase2 doesn't use equavivalent external flag.

Signed-off-by: Nikolai Barybin <nikolai.barybin@virtuozzo.com>
---
 src/qemu/qemu_driver.c | 48 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index ac72ea5cb0..b5ca195bfe 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -14634,6 +14634,53 @@ qemuDomainBlockRebase(virDomainPtr dom,
     return ret;
 }
 
+static int
+qemuDomainBlockRebase2(virDomainPtr dom,
+                       const char *path,
+                       virTypedParameterPtr params,
+                       int nparams,
+                       unsigned int flags)
+{
+    virDomainObj *vm;
+    size_t i = 0;
+    unsigned long long bandwidth = 0;
+    const char *base = NULL;
+
+    virCheckFlags(VIR_DOMAIN_BLOCK_REBASE_2_RELATIVE, -1);
+
+    if (virTypedParamsValidate(params, nparams,
+                               VIR_DOMAIN_BLOCK_REBASE_PARAM_BASE,
+                               VIR_TYPED_PARAM_STRING,
+                               VIR_DOMAIN_BLOCK_REBASE_PARAM_BANDWIDTH_MIB,
+                               VIR_TYPED_PARAM_ULLONG,
+                               VIR_DOMAIN_BLOCK_REBASE_PARAM_BANDWIDTH_BYTES,
+                               VIR_TYPED_PARAM_ULLONG,
+                               NULL) < 0)
+        return -1;
+
+    if (!(vm = qemuDomainObjFromDomain(dom)))
+        return -1;
+
+    if (virDomainBlockRebase2EnsureACL(dom->conn, vm->def) < 0)
+        return -1;
+
+    for (i = 0; i < nparams; i++) {
+        virTypedParameterPtr param = &params[i];
+
+        if (STREQ(param->field, VIR_DOMAIN_BLOCK_REBASE_PARAM_BANDWIDTH_MIB)) {
+            bandwidth = param->value.ul;
+        } else if (STREQ(param->field, VIR_DOMAIN_BLOCK_REBASE_PARAM_BANDWIDTH_BYTES)) {
+            bandwidth = param->value.ul;
+            flags |= VIR_DOMAIN_BLOCK_PULL_BANDWIDTH_BYTES;
+        } else if (STREQ(param->field, VIR_DOMAIN_BLOCK_REBASE_PARAM_BASE)) {
+            base = param->value.s;
+        }
+    }
+
+    return qemuDomainBlockPullCommon(vm, path, base, bandwidth, flags);
+}
+
+
 
 static int
 qemuDomainBlockCopy(virDomainPtr dom,
@@ -20579,6 +20626,7 @@ static virHypervisorDriver qemuHypervisorDriver = {
     .domainBlockJobSetSpeed = qemuDomainBlockJobSetSpeed, /* 0.9.4 */
     .domainBlockPull = qemuDomainBlockPull, /* 0.9.4 */
     .domainBlockRebase = qemuDomainBlockRebase, /* 0.9.10 */
+    .domainBlockRebase2 = qemuDomainBlockRebase2, /* 11.8.0 */
     .domainBlockCopy = qemuDomainBlockCopy, /* 1.2.9 */
     .domainBlockCommit = qemuDomainBlockCommit, /* 1.0.0 */
     .connectIsAlive = qemuConnectIsAlive, /* 0.9.8 */
-- 
2.43.5