[libvirt] [PATCH] qemu: Fix a regression of attaching device

Wen Congyang wency at cn.fujitsu.com
Thu Jul 14 02:00:13 UTC 2011


At 07/13/2011 11:03 PM, Eric Blake Write:
> On 07/13/2011 09:17 AM, Osier Yang wrote:
>> qemuDomainModifyDeviceFlags: Changing "ret" to "0", but don't
>> reset it to "-1" on failure, it's not good idea to change the value
>> of "ret" in the codes to do some condition checking. This patch
>> fix it.
> 
> Can you identify which commit introduced the regression, and what
> behavior actually broke as a result?  The commit message will be more
> useful with that information.

Commit da1eba6b introduced this regression.

I can reproduce this bug as the following:

# cat usb.xml #The format of the xml file is wrong.
<disk type='file' device='disk'>
  <driver name='qemu' type='raw'/>
  <source file='/var/lib/libvirt/images/test2.img'/>
  <target dev='ubdb' bus='usb'/>
<disk>

# virsh attach-device vm1 usb.xml 
Device attached successfully

The command successed, but it failed actually.

> 
>> ---
>>  src/qemu/qemu_driver.c |    6 +++---
>>  1 files changed, 3 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>> index 0a6b48e..ae11c68 100644
>> --- a/src/qemu/qemu_driver.c
>> +++ b/src/qemu/qemu_driver.c
>> @@ -4892,10 +4892,10 @@ qemuDomainModifyDeviceFlags(virDomainPtr dom, const char *xml,
>>                              _("unknown domain modify action %d"), action);
>>              break;
>>          }
>> -    } else
>> -        ret = 0;
>> +    }
>>  
>> -    if (!ret && (flags & VIR_DOMAIN_AFFECT_LIVE)) {
>> +    if (!(flags & VIR_DOMAIN_AFFECT_CONFIG) &&
>> +        (flags & VIR_DOMAIN_AFFECT_LIVE)) {
> 
> I'm not sure I agree with this change.  The logic flow before this patch is:

I do not agree with this change too.

> 
> if config
>   make the change in a copy, or record that the change failed
> if live, and either no config or change to config copy is happy
>   make the change live, or record that change failed
> if config, and either no live or change to live is happy
>   commit the changed copy made earlier
> 
> Your proposed change makes it so that we can now change live even if we
> are going to fail to change the config, which is not a good idea.
> 
> Why not instead do:
> 
> if config {
>   make change in a copy
>   if ret < 0
>     goto error
> }
> if live {
>   make change in live
>   if ret < 0
>     goto error
> }
> if config
>   commit the changed copy made earlier

Agree with this way, but I have anohter simple way to fix this problem:

if !ret && live {
    reset ret to -1
    ...
}


> 
> 
> 
> 
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list




More information about the libvir-list mailing list