[libvirt] [PATCH 2/3] qemu: unlock qemu driver and vm before returning from processWatchdogEvent()
Hu Tao
hutao at cn.fujitsu.com
Wed Mar 30 05:59:03 UTC 2011
On Wed, Mar 30, 2011 at 12:34:39PM +0800, Wen Congyang wrote:
> ---
> src/qemu/qemu_driver.c | 28 +++++++++++++++++++---------
> 1 files changed, 19 insertions(+), 9 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index f843dc8..d79d61b 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -2403,19 +2403,22 @@ static void processWatchdogEvent(void *data, void *opaque)
> wdEvent->vm->def->name,
> (unsigned int)time(NULL)) < 0) {
> virReportOOMError();
> - break;
> + goto cleanup;
> }
>
> qemuDriverLock(driver);
> virDomainObjLock(wdEvent->vm);
>
> - if (qemuDomainObjBeginJobWithDriver(driver, wdEvent->vm) < 0)
> - break;
> + if (qemuDomainObjBeginJobWithDriver(driver, wdEvent->vm) < 0) {
> + VIR_FREE(dumpfile);
> + goto unlock;
> + }
>
> if (!virDomainObjIsActive(wdEvent->vm)) {
> qemuReportError(VIR_ERR_OPERATION_INVALID,
> "%s", _("domain is not running"));
> - break;
> + VIR_FREE(dumpfile);
> + goto endjob;
> }
>
> ret = doCoreDump(driver,
> @@ -2432,16 +2435,23 @@ static void processWatchdogEvent(void *data, void *opaque)
> qemuReportError(VIR_ERR_OPERATION_FAILED,
> "%s", _("Resuming after dump failed"));
>
> - if (qemuDomainObjEndJob(wdEvent->vm) > 0)
> - virDomainObjUnlock(wdEvent->vm);
> -
> - qemuDriverUnlock(driver);
> -
> VIR_FREE(dumpfile);
> }
> break;
> + default:
> + goto cleanup;
> }
>
> +endjob:
> + if (qemuDomainObjEndJob(wdEvent->vm) == 0)
> + wdEvent->vm = NULL;
> +
> +unlock:
> + if (wdEvent->vm)
> + virDomainObjUnlock(wdEvent->vm);
> + qemuDriverUnlock(driver);
> +
> +cleanup:
> VIR_FREE(wdEvent);
> }
>
Looks good to me.
More information about the libvir-list
mailing list