After new iSCSI interface is successfully set up, we issue
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(a)redhat.com>
---
src/storage/storage_backend_iscsi.c | 1 +
src/util/viriscsi.c | 21 ++++++++++++++++++---
src/util/viriscsi.h | 1 +
tests/viriscsitest.c | 3 ++-
4 files changed, 22 insertions(+), 4 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 365669aac2..baf41c5be1 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);
@@ -295,8 +296,10 @@ virISCSIConnection(const char *portal,
* 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.
+ * 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)
{
@@ -485,7 +499,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