]> xenbits.xensource.com Git - libvirt.git/commitdiff
storage: Fetch a unique key for vHBA/NPIV LUNs
authorJohn Ferlan <jferlan@redhat.com>
Fri, 18 Jan 2019 13:33:10 +0000 (08:33 -0500)
committerJohn Ferlan <jferlan@redhat.com>
Fri, 1 Feb 2019 15:39:19 +0000 (10:39 -0500)
https://bugzilla.redhat.com/show_bug.cgi?id=1657468

Commit be1bb6c95 changed the way volumes were stored from a forward
linked list to a hash table. In doing so, it required that each vol
object would have 3 unique values as keys into tables - key, name,
and path. Due to how vHBA/NPIV LUNs are created/used this resulted
in a failure to utilize all the LUN's found during processing.

During virStorageBackendSCSINewLun processing fetch the key (or
serial value) for NPIV LUN's using virStorageFileGetNPIVKey which
will formulate a more unique key based on the serial value and
the port for the LUN.

Signed-off-by: John Ferlan <jferlan@redhat.com>
ACKed-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/storage/storage_util.c

index b5056bbb05ec8a4709fc2db34a6d07b24b1067b1..95e05d950b69ab7e853426fcc20392055e9f3de7 100644 (file)
@@ -3776,12 +3776,16 @@ virStorageBackendRefreshLocal(virStoragePoolObjPtr pool)
 
 
 static char *
-virStorageBackendSCSISerial(const char *dev)
+virStorageBackendSCSISerial(const char *dev,
+                            bool isNPIV)
 {
     int rc;
     char *serial = NULL;
 
-    rc = virStorageFileGetSCSIKey(dev, &serial, true);
+    if (isNPIV)
+        rc = virStorageFileGetNPIVKey(dev, &serial);
+    else
+        rc = virStorageFileGetSCSIKey(dev, &serial, true);
     if (rc == 0 && serial)
         return serial;
 
@@ -3878,7 +3882,10 @@ virStorageBackendSCSINewLun(virStoragePoolObjPtr pool,
                                                  VIR_STORAGE_VOL_READ_NOERROR)) < 0)
         goto cleanup;
 
-    if (!(vol->key = virStorageBackendSCSISerial(vol->target.path)))
+    vol->key = virStorageBackendSCSISerial(vol->target.path,
+                                           (def->source.adapter.type ==
+                                            VIR_STORAGE_ADAPTER_TYPE_FC_HOST));
+    if (!vol->key)
         goto cleanup;
 
     def->capacity += vol->target.capacity;