[libvirt] [PATCH 2/7] Add virDomainBlockPull support to the remote driver. The generator can handle DomainBlockPullAll and DomainBlockPullAbort. DomainBlockPull and DomainBlockPullInfo must be written by hand.

Adam Litke agl at us.ibm.com
Wed Jun 1 16:57:29 UTC 2011


* src/remote/remote_protocol.x: provide defines for the new entry points
* src/remote/remote_driver.c daemon/remote.c: implement the client and
  server side
* daemon/remote_generator.pl: Specify the manually-written functions

Signed-off-by: Adam Litke <agl at us.ibm.com>
---
 daemon/remote.c              |   71 +++++++++++++++++++++++++++++++++++++++++
 daemon/remote_generator.pl   |    8 +++-
 src/remote/remote_driver.c   |   72 +++++++++++++++++++++++++++++++++++++++--
 src/remote/remote_protocol.x |   44 +++++++++++++++++++++++++-
 4 files changed, 188 insertions(+), 7 deletions(-)

diff --git a/daemon/remote.c b/daemon/remote.c
index 2220655..f6aa78e 100644
--- a/daemon/remote.c
+++ b/daemon/remote.c
@@ -1692,6 +1692,77 @@ no_memory:
     goto cleanup;
 }
 
+static int
+remoteDispatchDomainBlockPull(struct qemud_server *server ATTRIBUTE_UNUSED,
+                              struct qemud_client *client ATTRIBUTE_UNUSED,
+                              virConnectPtr conn,
+                              remote_message_header *hdr ATTRIBUTE_UNUSED,
+                              remote_error * rerr,
+                              remote_domain_block_pull_args *args,
+                              remote_domain_block_pull_ret *ret)
+{
+    virDomainPtr dom = NULL;
+    virDomainBlockPullInfo tmp;
+    int rv = -1;
+
+    if (!conn) {
+        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
+        goto cleanup;
+    }
+
+    if (!(dom = get_nonnull_domain(conn, args->dom)))
+        goto cleanup;
+
+    if (virDomainBlockPull(dom, args->path, &tmp, args->flags) < 0)
+        goto cleanup;
+    rv = 0;
+    ret->info.cur = tmp.cur;
+    ret->info.end = tmp.end;
+
+cleanup:
+    if (rv < 0)
+        remoteDispatchError(rerr);
+    if (dom)
+        virDomainFree(dom);
+    return rv;
+}
+
+static int
+remoteDispatchDomainGetBlockPullInfo(struct qemud_server *server ATTRIBUTE_UNUSED,
+                                     struct qemud_client *client ATTRIBUTE_UNUSED,
+                                     virConnectPtr conn,
+                                     remote_message_header *hdr ATTRIBUTE_UNUSED,
+                                     remote_error * rerr,
+                                     remote_domain_get_block_pull_info_args *args,
+                                     remote_domain_get_block_pull_info_ret *ret)
+{
+    virDomainPtr dom = NULL;
+    virDomainBlockPullInfo tmp;
+    int rv = -1;
+
+    if (!conn) {
+        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
+        goto cleanup;
+    }
+
+    if (!(dom = get_nonnull_domain(conn, args->dom)))
+        goto cleanup;
+
+    if (virDomainGetBlockPullInfo(dom, args->path, &tmp, args->flags) < 0)
+        goto cleanup;
+    rv = 0;
+    ret->info.cur = tmp.cur;
+    ret->info.end = tmp.end;
+
+cleanup:
+    if (rv < 0)
+        remoteDispatchError(rerr);
+    if (dom)
+        virDomainFree(dom);
+    return rv;
+}
+
+
 /*-------------------------------------------------------------*/
 
 static int
diff --git a/daemon/remote_generator.pl b/daemon/remote_generator.pl
index 062ccc1..d7e0383 100755
--- a/daemon/remote_generator.pl
+++ b/daemon/remote_generator.pl
@@ -278,7 +278,9 @@ elsif ($opt_b) {
                           "GetType",
                           "NodeDeviceGetParent",
                           "NodeGetSecurityModel",
-                          "SecretGetValue");
+                          "SecretGetValue",
+                          "DomainBlockPull",
+                          "DomainGetBlockPullInfo");
     } elsif ($structprefix eq "qemu") {
         @ungeneratable = ("MonitorCommand");
     }
@@ -779,7 +781,9 @@ elsif ($opt_k) {
                           "GetType",
                           "NodeDeviceGetParent",
                           "NodeGetSecurityModel",
-                          "SecretGetValue");
+                          "SecretGetValue",
+                          "DomainBlockPull",
+                          "DomainGetBlockPullInfo");
     } elsif ($structprefix eq "qemu") {
         @ungeneratable = ("MonitorCommand");
     }
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index 07bc629..0a885a9 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -2844,6 +2844,70 @@ done:
     return rv;
 }
 
+static int remoteDomainBlockPull(virDomainPtr domain,
+                                 const char *path,
+                                 virDomainBlockPullInfoPtr info,
+                                 unsigned int flags)
+{
+    int rv = -1;
+    remote_domain_block_pull_args args;
+    remote_domain_block_pull_ret ret;
+    struct private_data *priv = domain->conn->privateData;
+
+    remoteDriverLock(priv);
+
+    make_nonnull_domain(&args.dom, domain);
+    args.path = (char *)path;
+    args.flags = flags;
+
+    if (call(domain->conn, priv, 0, REMOTE_PROC_DOMAIN_BLOCK_PULL,
+             (xdrproc_t)xdr_remote_domain_block_pull_args, (char *)&args,
+             (xdrproc_t)xdr_remote_domain_block_pull_ret, (char *)&ret) == -1)
+        goto done;
+
+    if (info) {
+        info->cur = ret.info.cur;
+        info->end = ret.info.end;
+    }
+    rv = 0;
+
+done:
+    remoteDriverUnlock(priv);
+    return rv;
+}
+
+static int remoteDomainGetBlockPullInfo(virDomainPtr domain,
+                                        const char *path,
+                                        virDomainBlockPullInfoPtr info,
+                                        unsigned int flags)
+{
+    int rv = -1;
+    remote_domain_get_block_pull_info_args args;
+    remote_domain_get_block_pull_info_ret ret;
+    struct private_data *priv = domain->conn->privateData;
+
+    remoteDriverLock(priv);
+
+    make_nonnull_domain(&args.dom, domain);
+    args.path = (char *)path;
+    args.flags = flags;
+
+    if (call(domain->conn, priv, 0, REMOTE_PROC_DOMAIN_GET_BLOCK_PULL_INFO,
+             (xdrproc_t)xdr_remote_domain_get_block_pull_info_args,
+               (char *)&args,
+             (xdrproc_t)xdr_remote_domain_get_block_pull_info_ret,
+               (char *)&ret) == -1)
+        goto done;
+
+    info->cur = ret.info.cur;
+    info->end = ret.info.end;
+    rv = 0;
+
+done:
+    remoteDriverUnlock(priv);
+    return rv;
+}
+
 /*----------------------------------------------------------------------*/
 
 static virDrvOpenStatus ATTRIBUTE_NONNULL (1)
@@ -6493,10 +6557,10 @@ static virDriver remote_driver = {
     remoteDomainSnapshotDelete, /* domainSnapshotDelete */
     remoteQemuDomainMonitorCommand, /* qemuDomainMonitorCommand */
     remoteDomainOpenConsole, /* domainOpenConsole */
-    NULL, /* domainBlockPull */
-    NULL, /* domainBlockPullAll */
-    NULL, /* domainBlockPullAbort */
-    NULL, /* domainGetBlockPullInfo */
+    remoteDomainBlockPull, /* domainBlockPull */
+    remoteDomainBlockPullAll, /* domainBlockPullAll */
+    remoteDomainBlockPullAbort, /* domainBlockPullAbort */
+    remoteDomainGetBlockPullInfo, /* domainGetBlockPullInfo */
 };
 
 static virNetworkDriver network_driver = {
diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
index c706c36..2f52ceb 100644
--- a/src/remote/remote_protocol.x
+++ b/src/remote/remote_protocol.x
@@ -917,6 +917,43 @@ struct remote_domain_set_autostart_args {
     int autostart;
 };
 
+struct remote_domain_block_pull_info {
+    unsigned hyper cur;
+    unsigned hyper end;
+};
+
+struct remote_domain_block_pull_args {
+    remote_nonnull_domain dom;
+    remote_nonnull_string path;
+    unsigned int flags;
+};
+
+struct remote_domain_block_pull_ret {
+    remote_domain_block_pull_info info;
+};
+
+struct remote_domain_block_pull_all_args {
+    remote_nonnull_domain dom;
+    remote_nonnull_string path;
+    unsigned int flags;
+};
+
+struct remote_domain_block_pull_abort_args {
+    remote_nonnull_domain dom;
+    remote_nonnull_string path;
+    unsigned int flags;
+};
+
+struct remote_domain_get_block_pull_info_args {
+    remote_nonnull_domain dom;
+    remote_nonnull_string path;
+    unsigned int flags;
+};
+
+struct remote_domain_get_block_pull_info_ret {
+    remote_domain_block_pull_info info;
+};
+
 /* Network calls: */
 
 struct remote_num_of_networks_ret {
@@ -2176,7 +2213,12 @@ enum remote_procedure {
     REMOTE_PROC_DOMAIN_GET_BLKIO_PARAMETERS = 206,
     REMOTE_PROC_DOMAIN_MIGRATE_SET_MAX_SPEED = 207,
     REMOTE_PROC_STORAGE_VOL_UPLOAD = 208,
-    REMOTE_PROC_STORAGE_VOL_DOWNLOAD = 209
+    REMOTE_PROC_STORAGE_VOL_DOWNLOAD = 209,
+    REMOTE_PROC_DOMAIN_BLOCK_PULL = 210,
+
+    REMOTE_PROC_DOMAIN_BLOCK_PULL_ALL = 211,
+    REMOTE_PROC_DOMAIN_BLOCK_PULL_ABORT = 212,
+    REMOTE_PROC_DOMAIN_GET_BLOCK_PULL_INFO = 213
 
     /*
      * Notice how the entries are grouped in sets of 10 ?
-- 
1.7.3




More information about the libvir-list mailing list