]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
scsi: Adjust return value for virStorageBackendSCSINewLun
authorJohn Ferlan <jferlan@redhat.com>
Wed, 1 Apr 2015 13:13:05 +0000 (09:13 -0400)
committerJohn Ferlan <jferlan@redhat.com>
Tue, 21 Apr 2015 14:20:13 +0000 (10:20 -0400)
Use virStorageBackendPoolUseDevPath API to determine whether creation of
stable target path is possible for the volume.

This will differentiate a failed virStorageBackendStablePath which won't
need to be fatal. Thus, we'll add a -2 return value to differentiate that
the failure was a result of either the inability to find the symlink for
the device or failure to open the target path directory

src/storage/storage_backend_scsi.c

index b96caecf452de822cef2a3a6165bfd4dbbb3fcf7..b97b2b01edd3d99e0a4b9a6755dc94a962481ae4 100644 (file)
@@ -146,6 +146,16 @@ virStorageBackendSCSISerial(const char *dev)
 }
 
 
+/*
+ * Attempt to create a new LUN
+ *
+ * Returns:
+ *
+ *  0  => Success
+ *  -1 => Failure due to some sort of OOM or other fatal issue found when
+ *        attempting to get/update information about a found volume
+ *  -2 => Failure to find a stable path, not fatal, caller can try another
+ */
 static int
 virStorageBackendSCSINewLun(virStoragePoolObjPtr pool,
                             uint32_t host ATTRIBUTE_UNUSED,
@@ -158,6 +168,22 @@ virStorageBackendSCSINewLun(virStoragePoolObjPtr pool,
     char *devpath = NULL;
     int retval = -1;
 
+    /* Check if the pool is using a stable target path. The call to
+     * virStorageBackendStablePath will fail if the pool target path
+     * isn't stable and just return the strdup'd 'devpath' anyway.
+     * This would be indistinguishable to failing to find the stable
+     * path to the device if the virDirRead loop to search the
+     * target pool path for our devpath had failed.
+     */
+    if (!virStorageBackendPoolPathIsStable(pool->def->target.path) &&
+        !(STREQ(pool->def->target.path, "/dev") ||
+          STREQ(pool->def->target.path, "/dev/"))) {
+        virReportError(VIR_ERR_INVALID_ARG,
+                       _("unable to use target path '%s' for dev '%s'"),
+                       NULLSTR(pool->def->target.path), dev);
+        goto cleanup;
+    }
+
     if (VIR_ALLOC(vol) < 0)
         goto cleanup;
 
@@ -194,6 +220,7 @@ virStorageBackendSCSINewLun(virStoragePoolObjPtr pool,
         VIR_DEBUG("No stable path found for '%s' in '%s'",
                   devpath, pool->def->target.path);
 
+        retval = -2;
         goto cleanup;
     }