6d3351
From 70c60798f09324a9e4d91f787cad493a1ceca5d9 Mon Sep 17 00:00:00 2001
6d3351
Message-Id: <70c60798f09324a9e4d91f787cad493a1ceca5d9@dist-git>
6d3351
From: John Ferlan <jferlan@redhat.com>
6d3351
Date: Wed, 24 May 2017 10:27:57 -0400
6d3351
Subject: [PATCH] conf: Resolve corner case on fc_host deletion
6d3351
6d3351
https://bugzilla.redhat.com/show_bug.cgi?id=1420740
6d3351
6d3351
Testing found an inventive way to cause an error at shutdown by providing the
6d3351
parent name for the fc host creation using the "same name" as the HBA. Since
6d3351
the code thus assumed the parent host name provided was the parent HBA and
6d3351
just extracted out the host number and sent that along to the vport_destroy
6d3351
this avoided checks made for equality.
6d3351
6d3351
So just add the equality check to that path to resolve.
6d3351
6d3351
(cherry picked from commit 2c8e30ee7e287d6490f643ccd2d7653a834e75e5)
6d3351
Signed-off-by: John Ferlan <jferlan@redhat.com>
6d3351
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
6d3351
---
6d3351
 src/conf/node_device_conf.c | 14 +++++++++++---
6d3351
 1 file changed, 11 insertions(+), 3 deletions(-)
6d3351
6d3351
diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
6d3351
index ac61db34c..2d0b14850 100644
6d3351
--- a/src/conf/node_device_conf.c
6d3351
+++ b/src/conf/node_device_conf.c
6d3351
@@ -2300,17 +2300,25 @@ virNodeDeviceDeleteVport(virConnectPtr conn,
6d3351
         goto cleanup;
6d3351
     }
6d3351
 
6d3351
+    if (virAsprintf(&scsi_host_name, "scsi_%s", name) < 0)
6d3351
+        goto cleanup;
6d3351
+
6d3351
     /* If at startup time we provided a parent, then use that to
6d3351
      * get the parent_host value; otherwise, we have to determine
6d3351
      * the parent scsi_host which we did not save at startup time
6d3351
      */
6d3351
     if (fchost->parent) {
6d3351
+        /* Someone provided a parent string at startup time that
6d3351
+         * was the same as the scsi_host - meaning we have a pool
6d3351
+         * backed to an HBA, so there won't be a vHBA to delete */
6d3351
+        if (STREQ(scsi_host_name, fchost->parent)) {
6d3351
+            ret = 0;
6d3351
+            goto cleanup;
6d3351
+        }
6d3351
+
6d3351
         if (virSCSIHostGetNumber(fchost->parent, &parent_host) < 0)
6d3351
             goto cleanup;
6d3351
     } else {
6d3351
-        if (virAsprintf(&scsi_host_name, "scsi_%s", name) < 0)
6d3351
-            goto cleanup;
6d3351
-
6d3351
         if (!(vhba_parent = virNodeDeviceGetParentName(conn, scsi_host_name)))
6d3351
             goto cleanup;
6d3351
 
6d3351
-- 
6d3351
2.13.0
6d3351