On Fri, Mar 13, 2015 at 13:36:13 -0600, Eric Blake wrote:
On 03/13/2015 10:25 AM, Peter Krempa wrote:
> While qemu may be prepared to do this libvirt is not. Forbid the block
> ops until we fix our code.
> ---
> src/conf/domain_conf.h | 1 +
> src/qemu/qemu_domain.c | 23 +++++++++++++++++++++++
> src/qemu/qemu_domain.h | 2 ++
> src/qemu/qemu_driver.c | 28 +++++++++++++---------------
> 4 files changed, 39 insertions(+), 15 deletions(-)
>
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index ea463cb..6f2df46 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -664,6 +664,7 @@ struct _virDomainDiskDef {
> int tray_status; /* enum virDomainDiskTray */
> int removable; /* enum virTristateSwitch */
>
> + bool blockjob;
Might be worth a FIXME comment acknowledging that a bool will be
insufficient when we update our code to support parallel jobs.
Ok, I'll add a note.
> +
> +bool
> +qemuDomainDiskBlockJobIsActive(virDomainDiskDefPtr disk)
> +{
> + if (disk->mirror) {
> + virReportError(VIR_ERR_BLOCK_COPY_ACTIVE,
> + _("disk '%s' already in active block
job"),
> + disk->dst);
> +
> + return true;
> + }
> +
> + if (disk->blockjob) {
> + virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
> + _("disk '%s' already in active block
job"),
> + disk->dst);
> + return true;
> + }
Shorter as 'if (disk->mirror || disk->blockjob)', up to you if you want
to compress the common code.
The errors have different error codes and I wanted to avoid a ternary
operator.
ACK. Looks like you have correctly locked out blockpull, blockcopy, and
blockcommit as the three jobs that are all mutually exclusive according
to our current abilities.
Peter