[libvirt] [PATCH v2 05/10] virISCSIScanTargets: Allow making targets persistent

Michal Privoznik mprivozn at redhat.com
Wed Jul 4 09:23:39 UTC 2018


After a new iSCSI interface is successfully set up, we issue a
sendtargets command. However, after 56057900dc53df490d we don't
update the host config which in turn makes login fail because
iscsiadm is unable to find any matching record for the interface.

Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
Reviewed-by: John Ferlan <jferlan at redhat.com>
---
 src/storage/storage_backend_iscsi.c |  1 +
 src/util/viriscsi.c                 | 23 +++++++++++++++++++----
 src/util/viriscsi.h                 |  1 +
 tests/viriscsitest.c                |  3 ++-
 4 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/src/storage/storage_backend_iscsi.c b/src/storage/storage_backend_iscsi.c
index 3b9dddb4fd..6242cd0fac 100644
--- a/src/storage/storage_backend_iscsi.c
+++ b/src/storage/storage_backend_iscsi.c
@@ -196,6 +196,7 @@ virStorageBackendISCSIFindPoolSources(const char *srcSpec,
 
     if (virISCSIScanTargets(portal,
                             source->initiator.iqn,
+                            false,
                             &ntargets, &targets) < 0)
         goto cleanup;
 
diff --git a/src/util/viriscsi.c b/src/util/viriscsi.c
index 549f75b434..e2c80acaaa 100644
--- a/src/util/viriscsi.c
+++ b/src/util/viriscsi.c
@@ -43,6 +43,7 @@ VIR_LOG_INIT("util.iscsi");
 static int
 virISCSIScanTargetsInternal(const char *portal,
                             const char *ifacename,
+                            bool persist,
                             size_t *ntargetsret,
                             char ***targetsret);
 
@@ -294,9 +295,11 @@ virISCSIConnection(const char *portal,
              * unless you've first issued a 'sendtargets' command to the
              * portal. Without the sendtargets all that is received is a
              * "iscsiadm: No records found". However, we must ensure that
-             * the command is issued over interface name we invented above.
+             * the command is issued over interface name we invented above
+             * and that targets are made persistent.
              */
-            if (virISCSIScanTargetsInternal(portal, ifacename, NULL, NULL) < 0)
+            if (virISCSIScanTargetsInternal(portal, ifacename,
+                                            true, NULL, NULL) < 0)
                 goto cleanup;
 
             break;
@@ -382,6 +385,7 @@ virISCSIGetTargets(char **const groups,
 static int
 virISCSIScanTargetsInternal(const char *portal,
                             const char *ifacename,
+                            bool persist,
                             size_t *ntargetsret,
                             char ***targetsret)
 {
@@ -406,9 +410,14 @@ virISCSIScanTargetsInternal(const char *portal,
                                              "--mode", "discovery",
                                              "--type", "sendtargets",
                                              "--portal", portal,
-                                             "--op", "nonpersistent",
                                              NULL);
 
+    if (!persist) {
+        virCommandAddArgList(cmd,
+                             "--op", "nonpersistent",
+                             NULL);
+    }
+
     if (ifacename) {
         virCommandAddArgList(cmd,
                              "--interface", ifacename,
@@ -445,6 +454,7 @@ virISCSIScanTargetsInternal(const char *portal,
  * virISCSIScanTargets:
  * @portal: iSCSI portal
  * @initiatoriqn: Initiator IQN
+ * @persists: whether scanned targets should be saved
  * @ntargets: number of items in @targetsret array
  * @targets: array of targets
  *
@@ -453,12 +463,16 @@ virISCSIScanTargetsInternal(const char *portal,
  * The targets are stored into @targets array and the size of
  * the array is stored into @ntargets.
  *
+ * If @persist is true, then targets returned by iSCSI portal are
+ * made persistent on the host (their config is saved).
+ *
  * Returns: 0 on success,
  *         -1 otherwise (with error reported)
  */
 int
 virISCSIScanTargets(const char *portal,
                     const char *initiatoriqn,
+                    bool persist,
                     size_t *ntargets,
                     char ***targets)
 {
@@ -486,7 +500,8 @@ virISCSIScanTargets(const char *portal,
         }
     }
 
-    ret = virISCSIScanTargetsInternal(portal, ifacename, ntargets, targets);
+    ret = virISCSIScanTargetsInternal(portal, ifacename,
+                                      persist, ntargets, targets);
     VIR_FREE(ifacename);
     return ret;
 }
diff --git a/src/util/viriscsi.h b/src/util/viriscsi.h
index 31b589dbf9..4da9becfb2 100644
--- a/src/util/viriscsi.h
+++ b/src/util/viriscsi.h
@@ -50,6 +50,7 @@ virISCSIRescanLUNs(const char *session)
 int
 virISCSIScanTargets(const char *portal,
                     const char *initiatoriqn,
+                    bool persist,
                     size_t *ntargetsret,
                     char ***targetsret)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
diff --git a/tests/viriscsitest.c b/tests/viriscsitest.c
index 4bdb782e36..3bb3993196 100644
--- a/tests/viriscsitest.c
+++ b/tests/viriscsitest.c
@@ -145,7 +145,8 @@ testISCSIScanTargets(const void *data)
 
     virCommandSetDryRun(NULL, testIscsiadmCb, NULL);
 
-    if (virISCSIScanTargets(info->portal, NULL, &ntargets, &targets) < 0)
+    if (virISCSIScanTargets(info->portal, NULL,
+                            false, &ntargets, &targets) < 0)
         goto cleanup;
 
     if (info->nexpected != ntargets) {
-- 
2.16.4




More information about the libvir-list mailing list