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(a)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?
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;
}