[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 17:45:47 UTC 2011
On 06/01/2011 12:13 PM, Matthias Bolte wrote:
> 2011/6/1 Adam Litke <agl at us.ibm.com>:
>
> This commit has a pretty long summary line.
Fixed.
>> * 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;
>> +}
>
> The generator should be able to deal with this. I might have to tweak
> it to handle multi-return-value procedures more general.
That would be excellent. I am not doing anything particularly special.
>> 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");
>> }
>
> You need to rebase your series to git head as the generator has
> changed much recently.
Ok. I will do that this afternoon.
>> 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;
>> +}
>
> This should be generatable as well.
>
>>
>> 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 */
>> };
>
> Again, you need to rebase this, this was changed to named C99
> initializers recently. Yes, libvirt is a fast moving target :)
>
>> 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
>
> Annotations for the generator go here.
I am not sure what you mean by annotations for the generator. Could you
explain further?
> I also miss corresponding updates to src/remote_protocol-structs.
Isn't this file generated from remote-protocol.x? It seems to have
exactly the same information.
> Matthias
--
Adam Litke
IBM Linux Technology Center
More information about the libvir-list
mailing list