[libvirt] [PATCH 3/3] qemu: report block job errors from qemu to the user
Nikolay Shirokovskiy
nshirokovskiy at virtuozzo.com
Thu Oct 6 08:24:40 UTC 2016
On 06.10.2016 11:01, Jiri Denemark wrote:
> On Wed, Oct 05, 2016 at 16:52:10 +0300, Nikolay Shirokovskiy wrote:
>> ---
>> src/qemu/qemu_blockjob.c | 13 +++++++++++--
>> src/qemu/qemu_blockjob.h | 3 ++-
>> src/qemu/qemu_domain.h | 1 +
>> src/qemu/qemu_driver.c | 4 ++--
>> src/qemu/qemu_migration.c | 34 ++++++++++++++++++++++------------
>> src/qemu/qemu_monitor.c | 5 +++--
>> src/qemu/qemu_monitor.h | 4 +++-
>> src/qemu/qemu_monitor_json.c | 2 +-
>> src/qemu/qemu_process.c | 3 +++
>> 9 files changed, 48 insertions(+), 21 deletions(-)
>>
>> diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c
>> index 83a5a3f..937d931 100644
>> --- a/src/qemu/qemu_blockjob.c
>> +++ b/src/qemu/qemu_blockjob.c
>> @@ -33,6 +33,7 @@
>> #include "virstoragefile.h"
>> #include "virthread.h"
>> #include "virtime.h"
>> +#include "viralloc.h"
>>
>> #define VIR_FROM_THIS VIR_FROM_QEMU
>>
>> @@ -53,16 +54,24 @@ VIR_LOG_INIT("qemu.qemu_blockjob");
>> int
>> qemuBlockJobUpdate(virQEMUDriverPtr driver,
>> virDomainObjPtr vm,
>> - virDomainDiskDefPtr disk)
>> + virDomainDiskDefPtr disk,
>> + char **error)
>> {
>> qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
>> int status = diskPriv->blockJobStatus;
>>
>> + if (error)
>> + *error = NULL;
>> +
>> if (status != -1) {
>> qemuBlockJobEventProcess(driver, vm, disk,
>> diskPriv->blockJobType,
>> diskPriv->blockJobStatus);
>> diskPriv->blockJobStatus = -1;
>> + if (error)
>> + VIR_STEAL_PTR(*error, diskPriv->blockJobHint);
>> + else
>> + VIR_FREE(diskPriv->blockJobHint);
>
> What if qemuBlockJobUpdate is never called? Shouldn't
> qemuBlockJobEventProcess be the place to free the error?
blockJobHint is used only in block job "sync" mode, thus
user will call qemuBlockJobSyncEnd and it will take care.
>
>> }
>>
>> return status;
>> @@ -241,6 +250,6 @@ qemuBlockJobSyncEnd(virQEMUDriverPtr driver,
>> virDomainDiskDefPtr disk)
>> {
>> VIR_DEBUG("disk=%s", disk->dst);
>> - qemuBlockJobUpdate(driver, vm, disk);
>> + qemuBlockJobUpdate(driver, vm, disk, NULL);
>> QEMU_DOMAIN_DISK_PRIVATE(disk)->blockJobSync = false;
>> }
>> diff --git a/src/qemu/qemu_blockjob.h b/src/qemu/qemu_blockjob.h
>> index 775ce95..c452edc 100644
>> --- a/src/qemu/qemu_blockjob.h
>> +++ b/src/qemu/qemu_blockjob.h
>> @@ -27,7 +27,8 @@
>>
>> int qemuBlockJobUpdate(virQEMUDriverPtr driver,
>> virDomainObjPtr vm,
>> - virDomainDiskDefPtr disk);
>> + virDomainDiskDefPtr disk,
>> + char **error);
>> void qemuBlockJobEventProcess(virQEMUDriverPtr driver,
>> virDomainObjPtr vm,
>> virDomainDiskDefPtr disk,
>> diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
>> index 521531b..79d88fa 100644
>> --- a/src/qemu/qemu_domain.h
>> +++ b/src/qemu/qemu_domain.h
>> @@ -290,6 +290,7 @@ struct _qemuDomainDiskPrivate {
>> /* for some synchronous block jobs, we need to notify the owner */
>> int blockJobType; /* type of the block job from the event */
>> int blockJobStatus; /* status of the finished block job */
>> + char *blockJobHint; /* hint from block job event (like error message) */
>
> So why is this called blockJobHint if it's used for storing the errors?
> I think blockJobError would be a better name...
Different qemu blockjob events use the same interface on the notification path.
Ready, cancelled, failed, complete. I doubt 'error' can be applied
to any of them except "failed", so I decided choose a more neutral name.
It's like void* in namespace of variable names )) Anyway it is not that
principal, I just wanted to explain my POV
Nikolay
More information about the libvir-list
mailing list