[libvirt] [PATCH v2 3/3] storage_conf: Resolve libvirtd crash matching scsi_host

Ján Tomko jtomko at redhat.com
Wed Oct 29 13:33:58 UTC 2014


On 10/29/2014 01:49 PM, John Ferlan wrote:
> 
> 
> On 10/29/2014 07:31 AM, Ján Tomko wrote:
>> On 10/06/2014 11:49 PM, John Ferlan wrote:
>>> https://bugzilla.redhat.com/show_bug.cgi?id=1146837
>>>
>>> Resolve a crash in libvirtd resulting from commit id 'a4bd62ad' (1.0.6)
>>> which added parentaddr and unique_id to allow unique identification of
>>> a scsi_host, but assumed that all the pool entries and the incoming
>>> definition would be similarly defined. If the existing pool uses the
>>> 'name' attribute and an incoming pool is using the parentaddr/unique_id,
>>> then the code will attempt to compare the existing name string against
>>> the incoming name string which doesn't exist (is NULL) and results in
>>> a core (STREQ).
>>>
>>> Conversely, if the existing pool used the parentaddr/unique_id and the
>>> to be defined pool used the name, then the comparison would be against
>>> the parentaddr, but since the incoming pool doesn't have one - that would
>>> leave the comparison against a parentaddr of all 0's and a unique_id of 0,
>>> which will always comparison to fail. This means someone could define the
>>> same source adapter for two pools
>>>
>>> In order to resolve this, adjust the code to get the 'host#' to be used
>>> by the storage scsi backend in order to check/start the pool and make sure
>>> the incoming definition doesn't match any of the existing pool defs.
>>>
>>> Signed-off-by: John Ferlan <jferlan at redhat.com>
>>> ---
>>>  src/conf/storage_conf.c | 69 ++++++++++++++++++++++++++++++-------------------
>>>  1 file changed, 42 insertions(+), 27 deletions(-)
>>>
>>> diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
>>> index 36696a4..19c452b 100644
>>> --- a/src/conf/storage_conf.c
>>> +++ b/src/conf/storage_conf.c
>>> @@ -2062,26 +2062,37 @@ virStoragePoolObjIsDuplicate(virStoragePoolObjListPtr pools,
>>>      return ret;
>>>  }
>>>  
>>> -static bool
>>> -matchSCSIAdapterParent(virStoragePoolObjPtr pool,
>>> -                       virStoragePoolDefPtr def)
>>> +static int
>>> +getSCSIHostNumber(virStoragePoolSourceAdapter adapter,
>>> +                  unsigned int *hostnum)
>>>  {
>>> -    virDevicePCIAddressPtr pooladdr =
>>> -        &pool->def->source.adapter.data.scsi_host.parentaddr;
>>> -    virDevicePCIAddressPtr defaddr =
>>> -        &def->source.adapter.data.scsi_host.parentaddr;
>>> -    int pool_unique_id =
>>> -        pool->def->source.adapter.data.scsi_host.unique_id;
>>> -    int def_unique_id =
>>> -        def->source.adapter.data.scsi_host.unique_id;
>>> -    if (pooladdr->domain == defaddr->domain &&
>>> -        pooladdr->bus == defaddr->bus &&
>>> -        pooladdr->slot == defaddr->slot &&
>>> -        pooladdr->function == defaddr->function &&
>>> -        pool_unique_id == def_unique_id) {
>>> -        return true;
>>> -    }
>>> -    return false;
>>> +    int ret = -1;
>>> +    unsigned int num;
>>> +    char *name = NULL;
>>> +
>>> +    if (adapter.data.scsi_host.has_parent) {
>>> +        virDevicePCIAddress addr = adapter.data.scsi_host.parentaddr;
>>> +        unsigned int unique_id = adapter.data.scsi_host.unique_id;
>>> +
>>> +        if (!(name = virGetSCSIHostNameByParentaddr(addr.domain,
>>> +                                                    addr.bus,
>>> +                                                    addr.slot,
>>> +                                                    addr.function,
>>> +                                                    unique_id)))
>>> +            goto cleanup;
>>
>> This still has the same problem v1 does:
>> https://www.redhat.com/archives/libvir-list/2014-October/msg00117.html
>>
>> A valid pool definition for an existing device can be refused because another
>> definition, the one we already accepted, is invalid. I think this is strange
>> behavior and I would rather allow duplicit pools if the user went through the
>> trouble of bypassing our checks.
>>
> 
> I think I'm missing your point. The finding of duplicate sources for
> storage pools and disallowing them to be defined (or created) has been
> around since commit id '5a1f27287".
> 
> I'm not sure what you meant by your first sentence - perhaps an example
> would help me especially in the accepted, but invalid condition.

Perhaps 'invalid' wasn't the best choice - the definition itself is valid, but
it doesn't refer to an existing device so the pool cannot be started up.

It's possible to define a pool using parentaddr (even on a host with no SCSI,
as the address is only used on pool startup, not definition):
    <adapter type='scsi_host'>
      <parentaddr unique_id='1'>
        <address domain='0x0000' bus='0x00' slot='0x1f' function='0x0'/>
      </parentaddr>
    </adapter>

After that, defining a pool with scsi_host source fails. Both via name:
<adapter type='scsi_host' name='scsi_host13'/>
and via parenaddr:
    <adapter type='scsi_host'>
      <parentaddr unique_id='1'>
        <address domain='0x0000' bus='0x00' slot='0x10' function='0x0'/>
      </parentaddr>
    </adapter>
because of the first, already accepted definition:
error: Failed to define pool from scsi2.xml
error: XML error: Failed to find scsi_host using PCI '0000:00:1f.0' and
unique_id='1'

Jan

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20141029/72e6d3be/attachment-0001.sig>


More information about the libvir-list mailing list