[libvirt] [PATCH] storage_scsi: Handle physical HBA when deleting vHBA vport.
John Ferlan
jferlan at redhat.com
Fri Apr 15 14:38:04 UTC 2016
On 04/15/2016 10:11 AM, Nitesh Konkar wrote:
> Thanks John for the reply.
>
> On Fri, Apr 15, 2016 at 5:08 PM, John Ferlan <jferlan at redhat.com> wrote:
>
>>
>>
>> On 04/07/2016 05:09 AM, Nitesh Konkar wrote:
>>> HBA will get treated as vHBA if not returned
>>> after detecting vhba_parent format.
>>>
>>> Signed-off-by: Nitesh Konkar <nitkon12 at linux.vnet.ibm.com>
>>> ---
>>> Before Patch:
>>> # virsh pool-destroy poolhba_name
>>> error: Failed to destroy pool poolhba_name
>>> error: internal error: Invalid adapter name 'pci_000x_0x_00_x' for SCSI
>> pool
>>>
>>> # virsh nodedev-dumpxml scsi_host2
>>> <device>
>>> <name>scsi_host2</name>
>>> <path>xxxx</path>
>>> <parent>pci_000x_0x_00_x</parent>
>>> <capability type='scsi_host'>
>>> <host>2</host>
>>> ...
>>> ...
>>> <capability type='vport_ops'>
>>> <max_vports>255</max_vports>
>>> <vports>0</vports>
>>> </capability>
>>> </capability>
>>> </device>
>>>
>>> After Patch:
>>> # virsh pool-destroy poolhba_name
>>> Pool poolhba_name destroyed
>>>
>>> src/storage/storage_backend_scsi.c | 5 +++++
>>> 1 file changed, 5 insertions(+)
>>>
>>
>> Can you provide the pool-dumpxml for poolhba_name? Can you provide the
>> nodedev-dumpxml of the 'scsi_host#' that was created for the vHBA pool?
>>
>>
> This patch is to destroy a pool created out from a Physical HBA. Apologies,
> if the
> commit message was misleading.
>
> # virsh pool-dumpxml poolhba_name
> <pool type='scsi'>
> <name>poolhba_name</name>
> <uuid>60d74134-0c18-4d4f-9305-24d96ce1a1b6</uuid>
> <capacity unit='bytes'>268435456000</capacity>
> <allocation unit='bytes'>268435456000</allocation>
> <available unit='bytes'>0</available>
> <source>
> <adapter type='fc_host' managed='yes' wwnn='20000120fa8f1271'
> wwpn='10000090fa8f1271'/>
> </source>
> <target>
> <path>/dev/disk/by-id</path>
> <permissions>
> <mode>0700</mode>
> <owner>0</owner>
> <group>0</group>
> </permissions>
> </target>
> </pool>
>
OK, maybe I wasn't clear enough... Which 'scsi_host#' is *this* pool
associated with. Prior to creating it, do a virsh nodedev-list
scsi_host. Then create it. Then generate the list again.
Or of course since you cannot delete the poolvhba_name, go through the
various scsi_host#'s on your host looking for the one with the match
wwwn/wwpn - then do the nodedev-dumpxml of that. For you example you
are looking for the scsi_host# with the matching wwnn='20000120fa8f1271'
and wwpn='10000090fa8f1271'.
That one is supposed to list 'scsi_host2' in the <parent> field as my
'scsi_host19' does below.
John
> virsh nodedev-dumpxml scsi_host2
> <device>
> <name>scsi_host2</name>
>
> <path>/sys/devices/pci0001:00/0001:00:00.0/0001:01:00.0/0001:02:09.0/0001:09:00.1/host2</path>
> <parent>pci_0001_09_00_1</parent>
> <capability type='scsi_host'>
> <host>2</host>
> <unique_id>1</unique_id>
> <capability type='fc_host'>
> <wwnn>20000120fa8f1271</wwnn>
> <wwpn>10000090fa8f1271</wwpn>
> <fabric_wwn>100050eb1a99d430</fabric_wwn>
> </capability>
> <capability type='vport_ops'>
> <max_vports>255</max_vports>
> <vports>0</vports>
> </capability>
> </capability>
> </device>
>
>
> Something just doesn't seem right. The 'parent' is optional and the path
>> you're changing is for the case when the XML doesn't provide the parent.
>> Thus on delete we have to look up the parent based upon the wwwn/wwpn of
>> the vHBA. From that, we grab the 'parent' field in order to
>> automagically remove the vHBA.
>>
>>
>
>> For example, if I have:
>>
>> # cat vhbapool_noparent.xml
>> <pool type='scsi'>
>> <name>vhbapool_noparent</name>
>> <source>
>> <adapter type='fc_host' wwnn='5001a4aea69b98a3'
>> wwpn='5001a4ac3f71c7e1'/>
>> </source>
>> <target>
>> <path>/dev/disk/by-path</path>
>> <permissions>
>> <mode>0700</mode>
>> <owner>0</owner>
>> <group>0</group>
>> </permissions>
>> </target>
>> </pool>
>>
>>
>> Then the code will search for HBA's that are capable of supporting vhost
>> (e.g., they have the vport_ops). In my case, that's scsi_host3:
>>
>> # virsh nodedev-dumpxml scsi_host3
>> <device>
>> <name>scsi_host3</name>
>> <path>/sys/devices/pci0000:00/0000:00:04.0/0000:10:00.0/host3</path>
>> <parent>pci_0000_10_00_0</parent>
>> <capability type='scsi_host'>
>> <host>3</host>
>> <unique_id>0</unique_id>
>> <capability type='fc_host'>
>> <wwnn>20000000c9848140</wwnn>
>> <wwpn>10000000c9848140</wwpn>
>> <fabric_wwn>2002000573de9a81</fabric_wwn>
>> </capability>
>> <capability type='vport_ops'>
>> <max_vports>127</max_vports>
>> <vports>5</vports>
>> </capability>
>> </capability>
>> </device>
>>
>>
>> I can start the pool:
>>
>> # virsh pool-create vhbapool_noprent.xml
>> Pool vhbapool_noparent created from vhbapool_noparent.xml
>>
>> If I look at the list of scsi_host's:
>>
>> # virsh nodedev-list scsi_host
>> scsi_host0
>> scsi_host1
>> scsi_host15
>> scsi_host16
>> scsi_host17
>> scsi_host19
>> scsi_host2
>> scsi_host3
>> scsi_host4
>> scsi_host5
>>
>> I can "assume" the one with the highest number is my vHBA and then dump
>> it's XML:
>>
>> # virsh nodedev-dumpxml scsi_host19
>> <device>
>> <name>scsi_host19</name>
>>
>>
>> <path>/sys/devices/pci0000:00/0000:00:04.0/0000:10:00.0/host3/vport-3:0-14/host19</path>
>> <parent>scsi_host3</parent>
>> <capability type='scsi_host'>
>> <host>19</host>
>> <unique_id>16</unique_id>
>> <capability type='fc_host'>
>> <wwnn>5001a4aea69b98a3</wwnn>
>> <wwpn>5001a4ac3f71c7e1</wwpn>
>> <fabric_wwn>2002000573de9a81</fabric_wwn>
>> </capability>
>> </capability>
>> </device>
>>
>> Which it is since the 'wwnn' and 'wwpn' match. Note the "<parent>" in
>> this case is "scsi_host3" (just like I assumed earlier).
>>
>> When we go to delete the vHBA, the deleteVport code will do this lookup
>> for us and remove the parent scsi_host#
>>
>> # virsh pool-destroy vhbapool_noparent
>> Pool vhbapool_noparent destroyed
>>
>> # virsh nodedev-list scsi_host
>> scsi_host0
>> scsi_host1
>> scsi_host15
>> scsi_host16
>> scsi_host17
>> scsi_host2
>> scsi_host3
>> scsi_host4
>> scsi_host5
>>
>> #
>>
>> So can you show me what's different with the configuration you have that
>> the <parent> for the vHBA is not prefixed with scsi_host. Is there
>> perhaps a way to determine what the 'scsi_host#' is that was created for
>> the vHBA? (since it should be removed).
>>
>> Thanks -
>>
>> John
>>> diff --git a/src/storage/storage_backend_scsi.c
>> b/src/storage/storage_backend_scsi.c
>>> index e6c8bb5..dd0343f 100644
>>> --- a/src/storage/storage_backend_scsi.c
>>> +++ b/src/storage/storage_backend_scsi.c
>>> @@ -842,6 +842,11 @@ deleteVport(virConnectPtr conn,
>>> if (!(vhba_parent = virStoragePoolGetVhbaSCSIHostParent(conn,
>> name)))
>>> goto cleanup;
>>>
>>> + if (STRPREFIX(vhba_parent, "pci")) {
>>> + ret = 0;
>>> + goto cleanup;
>>> + }
>>> +
>>> if (virGetSCSIHostNumber(vhba_parent, &parent_host) < 0)
>>> goto cleanup;
>>> }
>>>
>>
> Looking forward for your comments.
>
> Warm Regards,
> Nitesh Konkar.
>
More information about the libvir-list
mailing list