render / rpms / libvirt

Forked from rpms/libvirt 4 months ago
Clone
99cbc7
From 5d93906d3a51691be4c0d3cf29d4650f090cc0e1 Mon Sep 17 00:00:00 2001
99cbc7
Message-Id: <5d93906d3a51691be4c0d3cf29d4650f090cc0e1@dist-git>
99cbc7
From: John Ferlan <jferlan@redhat.com>
99cbc7
Date: Tue, 12 Mar 2019 13:55:57 -0400
99cbc7
Subject: [PATCH] storage: Rework virStorageBackendSCSISerial
99cbc7
MIME-Version: 1.0
99cbc7
Content-Type: text/plain; charset=UTF-8
99cbc7
Content-Transfer-Encoding: 8bit
99cbc7
99cbc7
https://bugzilla.redhat.com/show_bug.cgi?id=1687715 (7.6.z)
99cbc7
https://bugzilla.redhat.com/show_bug.cgi?id=1657468 (7.7.0)
99cbc7
99cbc7
Alter the code to use the virStorageFileGetSCSIKey helper
99cbc7
to fetch the unique key for the SCSI disk. Alter the logic
99cbc7
to follow the former code which would return a duplicate
99cbc7
of @dev when either the virCommandRun succeeded, but returned
99cbc7
an empty string or when WITH_UDEV was not true.
99cbc7
99cbc7
Signed-off-by: John Ferlan <jferlan@redhat.com>
99cbc7
ACKed-by: Michal Privoznik <mprivozn@redhat.com>
99cbc7
Reviewed-by: Ján Tomko <jtomko@redhat.com>
99cbc7
(cherry picked from commit 8bf89dc83729aaa0388f89e972a4847fd1e267c6)
99cbc7
99cbc7
Managed conflict in src/locking/lock_driver_lockd.c as a result of
99cbc7
commit e9e904b3b70533982954ab39ccb81122e8dad338 which changed from
99cbc7
using "goto error" to using "goto cleanup" by using the error label.
99cbc7
99cbc7
Signed-off-by: John Ferlan <jferlan@redhat.com>
99cbc7
Message-Id: <20190312175559.13583-3-jferlan@redhat.com>
99cbc7
Reviewed-by: Ján Tomko <jtomko@redhat.com>
99cbc7
---
99cbc7
 src/locking/lock_driver_lockd.c |  2 +-
99cbc7
 src/storage/storage_util.c      | 33 +++++++--------------------------
99cbc7
 src/util/virstoragefile.c       | 10 +++++++---
99cbc7
 src/util/virstoragefile.h       |  3 ++-
99cbc7
 4 files changed, 17 insertions(+), 31 deletions(-)
99cbc7
99cbc7
diff --git a/src/locking/lock_driver_lockd.c b/src/locking/lock_driver_lockd.c
99cbc7
index 957a963a7b..1b9341ceba 100644
99cbc7
--- a/src/locking/lock_driver_lockd.c
99cbc7
+++ b/src/locking/lock_driver_lockd.c
99cbc7
@@ -517,7 +517,7 @@ static int virLockManagerLockDaemonAddResource(virLockManagerPtr lock,
99cbc7
         if (STRPREFIX(name, "/dev") &&
99cbc7
             driver->scsiLockSpaceDir) {
99cbc7
             VIR_DEBUG("Trying to find an SCSI ID for %s", name);
99cbc7
-            if (virStorageFileGetSCSIKey(name, &newName) < 0)
99cbc7
+            if (virStorageFileGetSCSIKey(name, &newName, false) < 0)
99cbc7
                 goto error;
99cbc7
 
99cbc7
             if (newName) {
99cbc7
diff --git a/src/storage/storage_util.c b/src/storage/storage_util.c
99cbc7
index 5dc22d3182..d1659c0c8d 100644
99cbc7
--- a/src/storage/storage_util.c
99cbc7
+++ b/src/storage/storage_util.c
99cbc7
@@ -3696,36 +3696,17 @@ virStorageBackendRefreshLocal(virStoragePoolObjPtr pool)
99cbc7
 static char *
99cbc7
 virStorageBackendSCSISerial(const char *dev)
99cbc7
 {
99cbc7
+    int rc;
99cbc7
     char *serial = NULL;
99cbc7
-#ifdef WITH_UDEV
99cbc7
-    virCommandPtr cmd = virCommandNewArgList(
99cbc7
-        "/lib/udev/scsi_id",
99cbc7
-        "--replace-whitespace",
99cbc7
-        "--whitelisted",
99cbc7
-        "--device", dev,
99cbc7
-        NULL
99cbc7
-        );
99cbc7
 
99cbc7
-    /* Run the program and capture its output */
99cbc7
-    virCommandSetOutputBuffer(cmd, &serial);
99cbc7
-    if (virCommandRun(cmd, NULL) < 0)
99cbc7
-        goto cleanup;
99cbc7
-#endif
99cbc7
+    rc = virStorageFileGetSCSIKey(dev, &serial, true);
99cbc7
+    if (rc == 0 && serial)
99cbc7
+        return serial;
99cbc7
 
99cbc7
-    if (serial && STRNEQ(serial, "")) {
99cbc7
-        char *nl = strchr(serial, '\n');
99cbc7
-        if (nl)
99cbc7
-            *nl = '\0';
99cbc7
-    } else {
99cbc7
-        VIR_FREE(serial);
99cbc7
-        ignore_value(VIR_STRDUP(serial, dev));
99cbc7
-    }
99cbc7
-
99cbc7
-#ifdef WITH_UDEV
99cbc7
- cleanup:
99cbc7
-    virCommandFree(cmd);
99cbc7
-#endif
99cbc7
+    if (rc == -2)
99cbc7
+        return NULL;
99cbc7
 
99cbc7
+    ignore_value(VIR_STRDUP(serial, dev));
99cbc7
     return serial;
99cbc7
 }
99cbc7
 
99cbc7
diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
99cbc7
index ed7266619d..56d38b467e 100644
99cbc7
--- a/src/util/virstoragefile.c
99cbc7
+++ b/src/util/virstoragefile.c
99cbc7
@@ -1438,6 +1438,7 @@ int virStorageFileGetLVMKey(const char *path,
99cbc7
 /* virStorageFileGetSCSIKey
99cbc7
  * @path: Path to the SCSI device
99cbc7
  * @key: Unique key to be returned
99cbc7
+ * @ignoreError: Used to not report ENOSYS
99cbc7
  *
99cbc7
  * Using a udev specific function, query the @path to get and return a
99cbc7
  * unique @key for the caller to use.
99cbc7
@@ -1450,7 +1451,8 @@ int virStorageFileGetLVMKey(const char *path,
99cbc7
  */
99cbc7
 int
99cbc7
 virStorageFileGetSCSIKey(const char *path,
99cbc7
-                         char **key)
99cbc7
+                         char **key,
99cbc7
+                         bool ignoreError ATTRIBUTE_UNUSED)
99cbc7
 {
99cbc7
     int status;
99cbc7
     virCommandPtr cmd = virCommandNewArgList(
99cbc7
@@ -1491,9 +1493,11 @@ virStorageFileGetSCSIKey(const char *path,
99cbc7
 }
99cbc7
 #else
99cbc7
 int virStorageFileGetSCSIKey(const char *path,
99cbc7
-                             char **key ATTRIBUTE_UNUSED)
99cbc7
+                             char **key ATTRIBUTE_UNUSED,
99cbc7
+                             bool ignoreError)
99cbc7
 {
99cbc7
-    virReportSystemError(ENOSYS, _("Unable to get SCSI key for %s"), path);
99cbc7
+    if (!ignoreError)
99cbc7
+        virReportSystemError(ENOSYS, _("Unable to get SCSI key for %s"), path);
99cbc7
     return -1;
99cbc7
 }
99cbc7
 #endif
99cbc7
diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h
99cbc7
index 991098e6c6..bbb0b8b3c1 100644
99cbc7
--- a/src/util/virstoragefile.h
99cbc7
+++ b/src/util/virstoragefile.h
99cbc7
@@ -384,7 +384,8 @@ bool virStorageIsRelative(const char *backing);
99cbc7
 int virStorageFileGetLVMKey(const char *path,
99cbc7
                             char **key);
99cbc7
 int virStorageFileGetSCSIKey(const char *path,
99cbc7
-                             char **key);
99cbc7
+                             char **key,
99cbc7
+                             bool ignoreError);
99cbc7
 
99cbc7
 void virStorageAuthDefFree(virStorageAuthDefPtr def);
99cbc7
 virStorageAuthDefPtr virStorageAuthDefCopy(const virStorageAuthDef *src);
99cbc7
-- 
99cbc7
2.21.0
99cbc7