[libvirt] [PATCH] qemu: check for vm after starting a job
Eric Blake
eblake at redhat.com
Wed Oct 27 14:19:12 UTC 2010
On 10/27/2010 08:08 AM, Daniel P. Berrange wrote:
> On Tue, Oct 26, 2010 at 05:32:09PM -0600, Eric Blake wrote:
>> https://bugzilla.redhat.com/show_bug.cgi?id=638285 - when migrating
>> a guest, it was very easy to provoke a race where an application
>> could query block information on a VM that had just been migrated
>> away. Any time qemu code obtains a job lock, it must also check
>> that the VM was not taken down in the time where it was waiting
>> for the lock.
>>
>> @@ -4948,6 +4949,12 @@ static int qemudDomainSetMemory(virDomainPtr dom, unsigned long newmem) {
>> if (qemuDomainObjBeginJob(vm)< 0)
>> goto cleanup;
>>
>> + if (!virDomainObjIsActive(vm)) {
>> + qemuReportError(VIR_ERR_OPERATION_INVALID,
>> + "%s", _("domain is not running"));
>> + goto endjob;
>> + }
>> +
>
> There is already an IsActive check in this method, it is simply in
> the wrong place wrt to the BeginJob call, so it is better to just
> move the existing call, rather than duplicate it i reckon.
Okay, I'll see about swapping things around.
>> @@ -10350,6 +10368,7 @@ static int qemuDomainGetBlockInfo(virDomainPtr dom,
>> &info->allocation);
>> qemuDomainObjExitMonitor(vm);
>>
>> + endjob:
>> if (qemuDomainObjEndJob(vm) == 0)
>> vm = NULL;
>> } else {
>
> I'm not much of a fan of adding goto jump targets which are in the middle
> of long methods. Could we just invert the IsActive checks in these two
> methods& thus avoid the 'endjob' in the middle of the method.
Yes, I'll submit a v2 that avoids extra goto labels (or at least sinks
the endjob label to the end of the function rather than the middle).
--
Eric Blake eblake at redhat.com +1-801-349-2682
Libvirt virtualization library http://libvirt.org
More information about the libvir-list
mailing list