]> xenbits.xensource.com Git - libvirt.git/commitdiff
util: Introduce virISCSINodeNew
authorJohn Ferlan <jferlan@redhat.com>
Sat, 16 Jul 2016 12:10:30 +0000 (08:10 -0400)
committerJohn Ferlan <jferlan@redhat.com>
Thu, 28 Jul 2016 12:27:13 +0000 (08:27 -0400)
https://bugzilla.redhat.com/show_bug.cgi?id=1356436

According to RFC 3721 (https://www.ietf.org/rfc/rfc3721.txt), there are
two ways to "discover" targets in/for the iSCSI environment. Discovery
is the process which allows the initiator to find the targets to which
it has access and at least one address at which each target may be
accessed.

The method currently implemented in libvirt using the virISCSIScanTargets
API is known as "SendTargets" discovery. This method is more useful when
the target IP Address and TCP port information are available, e.g. in
libvirt terms the "portal". It returns a list of targets for the portal.
From that list, the target can be found. This operation can also fill an
iSCSI node table into which iSCSI logins may occur. Commit id '56057900'
altered that filling by adding the "--op nonpersistent" since it was
not necessarily desired to perform that for non libvirt related targets.

The second method is "Static Configuration". This method not only needs
the IP Address and TCP port (e.g. portal), but also the iSCSI target name.
In libvirt terms this would be the device path field from the iSCSI pool
<source> XML. This patch implements the second methodology using that
required device path as the targetname.

src/libvirt_private.syms
src/util/viriscsi.c
src/util/viriscsi.h

index 56ceac8958783d42fdec9ef3dae7ab422b6b2bb1..89c45117488af8944c5a3ba7d5a114e66ce9b7ff 100644 (file)
@@ -1722,6 +1722,7 @@ iptablesRemoveUdpOutput;
 virISCSIConnectionLogin;
 virISCSIConnectionLogout;
 virISCSIGetSession;
+virISCSINodeNew;
 virISCSINodeUpdate;
 virISCSIRescanLUNs;
 virISCSIScanTargets;
index e705517a7d0252ecf96beea977d41f5537b2f6aa..504ffbd14bfa0e01628737dd3225c9ab4b881dab 100644 (file)
@@ -444,6 +444,57 @@ virISCSIScanTargets(const char *portal,
     return ret;
 }
 
+/*
+ * virISCSINodeNew:
+ * @portal: address for iSCSI target
+ * @target: IQN and specific LUN target
+ *
+ * Usage of nonpersistent discovery in virISCSIScanTargets is useful primarily
+ * only when the target IQN is not known; however, since we have the target IQN
+ * usage of the "--op new" can be done. This avoids problems if "--op delete"
+ * had been used wiping out the static nodes determined by the scanning of
+ * all targets.
+ *
+ * NB: If an iSCSI node record is already created for this portal and
+ * target, subsequent "--op new" commands do not return an error.
+ *
+ * Returns 0 on success, -1 w/ error message on error
+ */
+int
+virISCSINodeNew(const char *portal,
+                const char *target)
+{
+    virCommandPtr cmd = NULL;
+    int status;
+    int ret = -1;
+
+    cmd = virCommandNewArgList(ISCSIADM,
+                               "--mode", "node",
+                               "--portal", portal,
+                               "--targetname", target,
+                               "--op", "new",
+                               NULL);
+
+    if (virCommandRun(cmd, &status) < 0) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("Failed new node mode for target '%s'"),
+                       target);
+        goto cleanup;
+    }
+
+    if (status != 0) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("%s failed new mode for target '%s' with status '%d'"),
+                       ISCSIADM, target, status);
+        goto cleanup;
+    }
+
+    ret = 0;
+ cleanup:
+    virCommandFree(cmd);
+    return ret;
+}
+
 
 int
 virISCSINodeUpdate(const char *portal,
index 459249ee60c93d1922f0a8edb1c1623129766ca9..a44beeaf67968fb6e8d1cdaf1f0b61e51603ccd1 100644 (file)
@@ -53,6 +53,12 @@ virISCSIScanTargets(const char *portal,
                     char ***targetsret)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
 
+int
+virISCSINodeNew(const char *portal,
+                const char *target)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
+    ATTRIBUTE_RETURN_CHECK;
+
 int
 virISCSINodeUpdate(const char *portal,
                    const char *target,