[libvirt] [PATCH v4 2/7] blockcopy: add qemu implementation of new API
Peter Krempa
pkrempa at redhat.com
Fri Sep 12 11:41:05 UTC 2014
On 09/12/14 05:55, Eric Blake wrote:
> The hard part of managing the disk copy is already coded; all
> this had to do was convert the XML and virTypedParameters into
> the internal representation.
>
> With this patch, all blockcopy operations that used the old
> API should also work via the new API. Additional extensions,
> such as supporting the granularity tunable or a network rather
> than file destination, will be added as later patches.
>
> * src/qemu/qemu_driver.c (qemuDomainBlockCopy): New function.
>
> Signed-off-by: Eric Blake <eblake at redhat.com>
> ---
> src/qemu/qemu_driver.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 84 insertions(+)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 75c529b..6895b23 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -15539,6 +15539,89 @@ qemuDomainBlockRebase(virDomainPtr dom, const char *path, const char *base,
> return ret;
> }
>
> +
> +static int
> +qemuDomainBlockCopy(virDomainPtr dom, const char *disk, const char *destxml,
> + virTypedParameterPtr params, int nparams,
> + unsigned int flags)
> +{
> + virQEMUDriverPtr driver = dom->conn->privateData;
> + virDomainObjPtr vm;
> + int ret = -1;
> + unsigned long long bandwidth = 0;
> + unsigned int granularity = 0;
> + unsigned long long buf_size = 0;
> + virStorageSourcePtr dest = NULL;
> + size_t i;
> +
> + virCheckFlags(VIR_DOMAIN_BLOCK_COPY_SHALLOW |
> + VIR_DOMAIN_BLOCK_COPY_REUSE_EXT, -1);
> + if (virTypedParamsValidate(params, nparams,
> + VIR_DOMAIN_BLOCK_COPY_BANDWIDTH,
> + VIR_TYPED_PARAM_ULLONG,
> + VIR_DOMAIN_BLOCK_COPY_GRANULARITY,
> + VIR_TYPED_PARAM_UINT,
> + VIR_DOMAIN_BLOCK_COPY_BUF_SIZE,
> + VIR_TYPED_PARAM_ULLONG,
> + NULL) < 0)
> + return -1;
> +
> + if (!(vm = qemuDomObjFromDomain(dom)))
> + return -1;
> +
> + if (virDomainBlockCopyEnsureACL(dom->conn, vm->def) < 0)
> + goto cleanup;
> +
> + for (i = 0; i < nparams; i++) {
> + virTypedParameterPtr param = ¶ms[i];
> +
> + /* Typed params (wisely) refused to expose unsigned long, but
> + * back-compat demands that we stick with a maximum of
> + * unsigned long bandwidth in MiB/s, while our value is
> + * unsigned long long in bytes/s. Hence, we have to do
> + * overflow detection if this is a 32-bit server handling a
> + * 64-bit client. */
> + if (STREQ(param->field, VIR_DOMAIN_BLOCK_COPY_BANDWIDTH)) {
> + if (sizeof(unsigned long) < sizeof(bandwidth) &&
> + param->value.ul > ULONG_MAX * (1ULL << 20)) {
> + virReportError(VIR_ERR_OVERFLOW,
> + _("bandwidth must be less than %llu bytes"),
> + ULONG_MAX * (1ULL << 20));
> + goto cleanup;
> + }
> + bandwidth = param->value.ul;
> + } else if (STREQ(param->field, VIR_DOMAIN_BLOCK_COPY_GRANULARITY)) {
> + granularity = param->value.ui;
> + } else if (STREQ(param->field, VIR_DOMAIN_BLOCK_COPY_BUF_SIZE)) {
> + buf_size = param->value.ul;
> + }
> + }
> + if (granularity) {
> + virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
> + _("granularity tuning not supported yet"));
> + goto cleanup;
> + }
> + if (buf_size) {
> + virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
> + _("buffer size tuning not supported yet"));
> + goto cleanup;
> + }
> +
> + if (!(dest = virDomainDiskDefSourceParse(destxml, vm->def, driver->xmlopt,
> + VIR_DOMAIN_XML_INACTIVE)))
IIRC you added "VIR_DOMAIN_XML_INTERNAL_DISK_SOURCE" so that some of the
members of the <disk> structure can be omitted, so I presume you want to
pass it here.
> + goto cleanup;
> +
> + ret = qemuDomainBlockCopyCommon(vm, dom->conn, disk, dest,
> + bandwidth, flags);
> + vm = NULL;
> +
> + cleanup:
> + if (vm)
> + virObjectUnlock(vm);
> + return ret;
> +}
> +
> +
> static int
> qemuDomainBlockPull(virDomainPtr dom, const char *path, unsigned long bandwidth,
> unsigned int flags)
ACK if you pass VIR_DOMAIN_XML_INTERNAL_DISK_SOURCE or explain why not
appropriately.
Peter
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140912/c64888ac/attachment-0001.sig>
More information about the libvir-list
mailing list