[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:49:24 UTC 2011



On 06/01/2011 12:27 PM, Matthias Bolte wrote:
> 2011/6/1 Adam Litke <agl at us.ibm.com>:
>> * 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>
>> ---
> 
> +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;
> +}
> 
> From the generator point-of-view I would want to avoid having the info
> parameter being NULLable, as this differs from the common pattern and
> results in special case code in the generator.

>From an API user's point of view, I think it's nice to allow NULL for
the info struct.  The user may not care about the current progress
information.  I could fix this at the global libvirt level by allocating
a dummy struct to pass down to the driver implementations if the user
passed NULL.  Would that be acceptable?

>> +struct remote_domain_block_pull_info {
>> +    unsigned hyper cur;
>> +    unsigned hyper end;
>> +};
> 
>> +struct remote_domain_block_pull_ret {
>> +    remote_domain_block_pull_info info;
>> +};
> 
>> +struct remote_domain_get_block_pull_info_ret {
>> +    remote_domain_block_pull_info info;
>> +};
> 
> From the generator point-of-view I would avoid this approach of
> putting a struct in a struct because that differs from the common
> approach and results in special case code in the generator. It should
> look like this
> 
> struct remote_domain_block_pull_ret {
>     unsigned hyper cur;
>     unsigned hyper end;
> };
> 
> struct remote_domain_get_block_pull_info_ret {
>     unsigned hyper cur;
>     unsigned hyper end;
> };

Ok, I will make this change.

-- 
Adam Litke
IBM Linux Technology Center




More information about the libvir-list mailing list