[libvirt] [PATCH] storage_scsi: Handle physical HBA when deleting vHBA vport.

HBA will get treated as vHBA if not returned after detecting vhba_parent format. Signed-off-by: Nitesh Konkar <nitkon12@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(+) 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; } -- 1.8.3.1

Any comments on this small patch? :-) On Thu, Apr 7, 2016 at 2:39 PM, Nitesh Konkar < niteshkonkar.libvirt@gmail.com> wrote:
HBA will get treated as vHBA if not returned after detecting vhba_parent format.
Signed-off-by: Nitesh Konkar <nitkon12@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(+)
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; } -- 1.8.3.1

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@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; }

Thanks John for the reply. On Fri, Apr 15, 2016 at 5:08 PM, John Ferlan <jferlan@redhat.com> wrote:
HBA will get treated as vHBA if not returned after detecting vhba_parent format.
Signed-off-by: Nitesh Konkar <nitkon12@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
On 04/07/2016 05:09 AM, Nitesh Konkar wrote: 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> 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.

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@redhat.com> wrote:
HBA will get treated as vHBA if not returned after detecting vhba_parent format.
Signed-off-by: Nitesh Konkar <nitkon12@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
On 04/07/2016 05:09 AM, Nitesh Konkar wrote: 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.
participants (2)
-
John Ferlan
-
Nitesh Konkar