[libvirt] [PATCH 1/1] libvirtd crash when defining scsi storage pool
Pradipta Kumar Banerjee
bpradip at in.ibm.com
Fri Sep 5 05:44:37 UTC 2014
On 09/03/2014 03:28 PM, John Ferlan wrote:
>
> [found this in my "probably should look at this one some day" pile..]
>
> On 06/21/2014 12:57 PM, Pradipta Kr. Banerjee wrote:
>> libvirtd crashes when there is an existing SCSI pool
>> with adapter type as 'scsi_host' and defining a new SCSI pool with adapter
>> type as 'fc_host' and parent attribute missing.
>>
>> For eg when defining a storage-pool with the following XML will crash libvirtd
>> if there already exists a SCSI pool with adapter type 'scsi_host'
>>
>> <pool type='scsi'>
>> <name>TEST_SCSI_FC_POOL</name>
>> <source>
>> <adapter type='fc_host' wwnn='1234567890abcdef' wwpn='abcdef1234567890'/>
>> </source>
>> <target>
>> <path>/dev/disk/by-path</path>
>> </target>
>> </pool>
>>
>> This happens because for fc_host, adapter 'name' is not relevant whereas
>> for scsi_host its mandatory attribute. However the check in libvirt for
>> finding duplicate storage pools doesn't take that into account while comparing,
>> resulting into crash
>>
>> This patch fixes the issue
>
> Going to need to clean the above up, but if you also provided the existing
> scsi/scsi_host pool def that would have been good!
>
>>
>> Signed-off-by: Pradipta Kr. Banerjee <bpradip at in.ibm.com>
>> ---
>> src/conf/storage_conf.c | 6 ++++--
>> 1 file changed, 4 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
>> index 8b6fd79..54a4589 100644
>> --- a/src/conf/storage_conf.c
>> +++ b/src/conf/storage_conf.c
>> @@ -2126,8 +2126,10 @@ virStoragePoolSourceFindDuplicate(virStoragePoolObjListPtr pools,
>> STREQ(pool->def->source.adapter.data.fchost.wwpn,
>> def->source.adapter.data.fchost.wwpn))
>> matchpool = pool;
>> - } else if (pool->def->source.adapter.type ==
>> - VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST){
>> + } else if ((pool->def->source.adapter.type ==
>> + VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST)\
>> + && (def->source.adapter.type ==
>> + VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST)) {
>
> My assumption is this issue is a result of commit id '9f781da'
>
> Beyond the - it needs a bit a refresh due to other changes
> since that time - I'm wondering if you've only solved half
> the potential problem
You are right.
>
> What if the fc_host is defined and you're coming in with
> a 'scsi_host' def->source.adapter.type? (see a few lines
> earlier)
This will result in crash too.. I'll send a V2 based on your suggestion
>
>
>> if (STREQ(pool->def->source.adapter.data.name,
>> def->source.adapter.data.name))
>> matchpool = pool;
>>
>
> So instead of what's here, how about the following diff:
>
>
> break;
> case VIR_STORAGE_POOL_SCSI:
> if (pool->def->source.adapter.type ==
> + VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST &&
> + def->source.adapter.type ==
> VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST) {
> if (STREQ(pool->def->source.adapter.data.fchost.wwnn,
> def->source.adapter.data.fchost.wwnn) &&
> @@ -2124,6 +2126,8 @@ virStoragePoolSourceFindDuplicate(virStoragePoolObjListPtr
> def->source.adapter.data.fchost.wwpn))
> matchpool = pool;
> } else if (pool->def->source.adapter.type ==
> + VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST &&
> + def->source.adapter.type ==
> VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST) {
> if (pool->def->source.adapter.data.scsi_host.name) {
> if (STREQ(pool->def->source.adapter.data.scsi_host.name,
>
>
> John
>
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
>
--
Regards,
Pradipta Kumar B(bpradip at in.ibm.com)
IBM Systems & Technology Labs,
India.
More information about the libvir-list
mailing list