[libvirt] [REPOST PATCHv2 1/2] qemu: Check for existing hostdev address for cold attach device

John Ferlan posted 2 patches 7 years, 7 months ago
There is a newer version of this series
[libvirt] [REPOST PATCHv2 1/2] qemu: Check for existing hostdev address for cold attach device
Posted by John Ferlan 7 years, 7 months ago
Prior to the hostdev being inserted in the hostdevs list,
add a check during qemuDomainAttachDeviceConfig to determine
whether the new/incoming <hostdev ...> device is providing
the same <address> as some existing hostdev on the list
and if so fail the cold attach.

This cannot be done during virDomainHostdevDefPostParse
because that is called after virDomainDefParseXML would
have inserted a hostdev onto the hostdevs list and thus
would have a "conflict" with itself. Therefore, the post
parse processing can only compare if the current hostdev
address conflicts with a SCSI <disk> address.

By comparison this is similar to the validation phase
checks in virDomainDefCheckDuplicateDriveAddresses that
occur during define/startup processing but are not run
during config attach of a live guest.

Signed-off-by: John Ferlan <jferlan@redhat.com>
---
 src/qemu/qemu_driver.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 9a35e04a85..ef1abe3f68 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -8007,6 +8007,12 @@ qemuDomainAttachDeviceConfig(virDomainDefPtr vmdef,
                            _("device is already in the domain configuration"));
             return -1;
         }
+        if (dev->data.hostdev->info->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE &&
+            virDomainDefHasDeviceAddress(vmdef, dev->data.hostdev->info)) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("a device with the same address already exists "));
+            return -1;
+        }
         if (virDomainHostdevInsert(vmdef, hostdev))
             return -1;
         dev->data.hostdev = NULL;
-- 
2.14.4

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [REPOST PATCHv2 1/2] qemu: Check for existing hostdev address for cold attach device
Posted by Michal Privoznik 7 years, 7 months ago
On 07/06/2018 08:50 PM, John Ferlan wrote:
> Prior to the hostdev being inserted in the hostdevs list,
> add a check during qemuDomainAttachDeviceConfig to determine
> whether the new/incoming <hostdev ...> device is providing
> the same <address> as some existing hostdev on the list
> and if so fail the cold attach.
> 
> This cannot be done during virDomainHostdevDefPostParse
> because that is called after virDomainDefParseXML would
> have inserted a hostdev onto the hostdevs list and thus
> would have a "conflict" with itself. Therefore, the post
> parse processing can only compare if the current hostdev
> address conflicts with a SCSI <disk> address.
> 
> By comparison this is similar to the validation phase
> checks in virDomainDefCheckDuplicateDriveAddresses that
> occur during define/startup processing but are not run
> during config attach of a live guest.
> 
> Signed-off-by: John Ferlan <jferlan@redhat.com>
> ---
>  src/qemu/qemu_driver.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 9a35e04a85..ef1abe3f68 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -8007,6 +8007,12 @@ qemuDomainAttachDeviceConfig(virDomainDefPtr vmdef,
>                             _("device is already in the domain configuration"));
>              return -1;
>          }
> +        if (dev->data.hostdev->info->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE &&
> +            virDomainDefHasDeviceAddress(vmdef, dev->data.hostdev->info)) {
> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                           _("a device with the same address already exists "));
> +            return -1;
> +        }
>          if (virDomainHostdevInsert(vmdef, hostdev))
>              return -1;
>          dev->data.hostdev = NULL;
> 

I think hostdevs are not the only type of device suffering from this. In
fact, I've just tested disks and libvirt accepts attaching another disk
onto same <address/> happily.

I wonder if this should go into virDomainDefCompatibleDevice() (now that
we have @action there ;-) ).

Michal

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [REPOST PATCHv2 1/2] qemu: Check for existing hostdev address for cold attach device
Posted by John Ferlan 7 years, 6 months ago

On 07/09/2018 10:32 AM, Michal Privoznik wrote:
> On 07/06/2018 08:50 PM, John Ferlan wrote:
>> Prior to the hostdev being inserted in the hostdevs list,
>> add a check during qemuDomainAttachDeviceConfig to determine
>> whether the new/incoming <hostdev ...> device is providing
>> the same <address> as some existing hostdev on the list
>> and if so fail the cold attach.
>>
>> This cannot be done during virDomainHostdevDefPostParse
>> because that is called after virDomainDefParseXML would
>> have inserted a hostdev onto the hostdevs list and thus
>> would have a "conflict" with itself. Therefore, the post
>> parse processing can only compare if the current hostdev
>> address conflicts with a SCSI <disk> address.
>>
>> By comparison this is similar to the validation phase
>> checks in virDomainDefCheckDuplicateDriveAddresses that
>> occur during define/startup processing but are not run
>> during config attach of a live guest.
>>
>> Signed-off-by: John Ferlan <jferlan@redhat.com>
>> ---
>>  src/qemu/qemu_driver.c | 6 ++++++
>>  1 file changed, 6 insertions(+)
>>
>> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>> index 9a35e04a85..ef1abe3f68 100644
>> --- a/src/qemu/qemu_driver.c
>> +++ b/src/qemu/qemu_driver.c
>> @@ -8007,6 +8007,12 @@ qemuDomainAttachDeviceConfig(virDomainDefPtr vmdef,
>>                             _("device is already in the domain configuration"));
>>              return -1;
>>          }
>> +        if (dev->data.hostdev->info->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE &&
>> +            virDomainDefHasDeviceAddress(vmdef, dev->data.hostdev->info)) {
>> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>> +                           _("a device with the same address already exists "));
>> +            return -1;
>> +        }
>>          if (virDomainHostdevInsert(vmdef, hostdev))
>>              return -1;
>>          dev->data.hostdev = NULL;
>>
> 
> I think hostdevs are not the only type of device suffering from this. In
> fact, I've just tested disks and libvirt accepts attaching another disk
> onto same <address/> happily.
> 
> I wonder if this should go into virDomainDefCompatibleDevice() (now that
> we have @action there ;-) ).
> 

It's a case of myopia for the bug I'm working on as listed in patch2.

What I did is no different than the VIR_DOMAIN_DEVICE_RNG check in the
same function.

Still, if I change this patch to add:

     if (action == VIR_DOMAIN_DEVICE_ACTION_ATTACH && !live &&
data.newInfo &&
        data.newInfo->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE &&
        virDomainDefHasDeviceAddress(def, data.newInfo)) {
        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                       _("a device with the same address already exists "));
        return -1;
    }

to virDomainDefCompatibleDevice and remove the (new)hostdev and
(existing)rng checks, then I believe it covers the existing cases.

Tks -

John

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [REPOST PATCHv2 1/2] qemu: Check for existing hostdev address for cold attach device
Posted by Michal Privoznik 7 years, 6 months ago
On 07/13/2018 02:50 PM, John Ferlan wrote:
> 
> 
> On 07/09/2018 10:32 AM, Michal Privoznik wrote:
>> On 07/06/2018 08:50 PM, John Ferlan wrote:
>>> Prior to the hostdev being inserted in the hostdevs list,
>>> add a check during qemuDomainAttachDeviceConfig to determine
>>> whether the new/incoming <hostdev ...> device is providing
>>> the same <address> as some existing hostdev on the list
>>> and if so fail the cold attach.
>>>
>>> This cannot be done during virDomainHostdevDefPostParse
>>> because that is called after virDomainDefParseXML would
>>> have inserted a hostdev onto the hostdevs list and thus
>>> would have a "conflict" with itself. Therefore, the post
>>> parse processing can only compare if the current hostdev
>>> address conflicts with a SCSI <disk> address.
>>>
>>> By comparison this is similar to the validation phase
>>> checks in virDomainDefCheckDuplicateDriveAddresses that
>>> occur during define/startup processing but are not run
>>> during config attach of a live guest.
>>>
>>> Signed-off-by: John Ferlan <jferlan@redhat.com>
>>> ---
>>>  src/qemu/qemu_driver.c | 6 ++++++
>>>  1 file changed, 6 insertions(+)
>>>
>>> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>>> index 9a35e04a85..ef1abe3f68 100644
>>> --- a/src/qemu/qemu_driver.c
>>> +++ b/src/qemu/qemu_driver.c
>>> @@ -8007,6 +8007,12 @@ qemuDomainAttachDeviceConfig(virDomainDefPtr vmdef,
>>>                             _("device is already in the domain configuration"));
>>>              return -1;
>>>          }
>>> +        if (dev->data.hostdev->info->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE &&
>>> +            virDomainDefHasDeviceAddress(vmdef, dev->data.hostdev->info)) {
>>> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>>> +                           _("a device with the same address already exists "));
>>> +            return -1;
>>> +        }
>>>          if (virDomainHostdevInsert(vmdef, hostdev))
>>>              return -1;
>>>          dev->data.hostdev = NULL;
>>>
>>
>> I think hostdevs are not the only type of device suffering from this. In
>> fact, I've just tested disks and libvirt accepts attaching another disk
>> onto same <address/> happily.
>>
>> I wonder if this should go into virDomainDefCompatibleDevice() (now that
>> we have @action there ;-) ).
>>
> 
> It's a case of myopia for the bug I'm working on as listed in patch2.
> 
> What I did is no different than the VIR_DOMAIN_DEVICE_RNG check in the
> same function.
> 
> Still, if I change this patch to add:
> 
>      if (action == VIR_DOMAIN_DEVICE_ACTION_ATTACH && !live &&
> data.newInfo &&
>         data.newInfo->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE &&
>         virDomainDefHasDeviceAddress(def, data.newInfo)) {
>         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>                        _("a device with the same address already exists "));
>         return -1;
>     }
> 
> to virDomainDefCompatibleDevice and remove the (new)hostdev and
> (existing)rng checks, then I believe it covers the existing cases.

Yes, this looks reasonable.

Michal

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