All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Daniel P. Berrange" <berrange@redhat.com>
To: qemu-devel@nongnu.org
Cc: qemu-block@nongnu.org, Ronnie Sahlberg <ronniesahlberg@gmail.com>,
	Paolo Bonzini <pbonzini@redhat.com>, Peter Lieven <pl@kamp.de>,
	Kevin Wolf <kwolf@redhat.com>, John Ferlan <jferlan@redhat.com>,
	Pino Toscano <ptoscano@redhat.com>,
	"Daniel P. Berrange" <berrange@redhat.com>
Subject: [Qemu-devel] [PATCH for-2.6] block: add an 'iscsi-id' value to match -drive with -iscsi opts
Date: Fri, 22 Apr 2016 11:24:55 +0100	[thread overview]
Message-ID: <1461320695-31372-2-git-send-email-berrange@redhat.com> (raw)
In-Reply-To: <1461320695-31372-1-git-send-email-berrange@redhat.com>

The iSCSI block driver has ability to lookup various options, in
particular authentication info, specified by the separate -iscsi
argument. It currently uses the iSCSI IQN as the ID value for this
lookup, however, this does not work for common iSCSI IQNs as they
contain characters such as ':' which are invalid for use as IDs.

This adds an optional 'iscsi-id' parameter to the iSCSI block
driver to allow an explicit ID string to be used to reference
the -iscsi arg. For example

 $QEMU \
   -iscsi id=my_initiator,user=fred,password-secret=sec0 \
   -drive driver=iscsi,iscsi-id=my_initiator,file=iscsi://somehost/iqn/1

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
---
 block/iscsi.c   | 35 +++++++++++++++++++++++------------
 qemu-doc.texi   | 12 +++++++++---
 qemu-options.hx |  4 ++--
 3 files changed, 34 insertions(+), 17 deletions(-)

diff --git a/block/iscsi.c b/block/iscsi.c
index 302baf8..4b7aa91 100644
--- a/block/iscsi.c
+++ b/block/iscsi.c
@@ -1070,7 +1070,7 @@ retry:
     return 0;
 }
 
-static void parse_chap(struct iscsi_context *iscsi, const char *target,
+static void parse_chap(struct iscsi_context *iscsi, const char *id,
                        Error **errp)
 {
     QemuOptsList *list;
@@ -1085,7 +1085,7 @@ static void parse_chap(struct iscsi_context *iscsi, const char *target,
         return;
     }
 
-    opts = qemu_opts_find(list, target);
+    opts = qemu_opts_find(list, id);
     if (opts == NULL) {
         opts = QTAILQ_FIRST(&list->head);
         if (!opts) {
@@ -1123,7 +1123,7 @@ static void parse_chap(struct iscsi_context *iscsi, const char *target,
     g_free(secret);
 }
 
-static void parse_header_digest(struct iscsi_context *iscsi, const char *target,
+static void parse_header_digest(struct iscsi_context *iscsi, const char *id,
                                 Error **errp)
 {
     QemuOptsList *list;
@@ -1135,7 +1135,7 @@ static void parse_header_digest(struct iscsi_context *iscsi, const char *target,
         return;
     }
 
-    opts = qemu_opts_find(list, target);
+    opts = qemu_opts_find(list, id);
     if (opts == NULL) {
         opts = QTAILQ_FIRST(&list->head);
         if (!opts) {
@@ -1161,7 +1161,7 @@ static void parse_header_digest(struct iscsi_context *iscsi, const char *target,
     }
 }
 
-static char *parse_initiator_name(const char *target)
+static char *parse_initiator_name(const char *id)
 {
     QemuOptsList *list;
     QemuOpts *opts;
@@ -1171,7 +1171,7 @@ static char *parse_initiator_name(const char *target)
 
     list = qemu_find_opts("iscsi");
     if (list) {
-        opts = qemu_opts_find(list, target);
+        opts = qemu_opts_find(list, id);
         if (!opts) {
             opts = QTAILQ_FIRST(&list->head);
         }
@@ -1195,7 +1195,7 @@ static char *parse_initiator_name(const char *target)
     return iscsi_name;
 }
 
-static int parse_timeout(const char *target)
+static int parse_timeout(const char *id)
 {
     QemuOptsList *list;
     QemuOpts *opts;
@@ -1203,7 +1203,7 @@ static int parse_timeout(const char *target)
 
     list = qemu_find_opts("iscsi");
     if (list) {
-        opts = qemu_opts_find(list, target);
+        opts = qemu_opts_find(list, id);
         if (!opts) {
             opts = QTAILQ_FIRST(&list->head);
         }
@@ -1314,6 +1314,11 @@ static QemuOptsList runtime_opts = {
             .type = QEMU_OPT_STRING,
             .help = "URL to the iscsi image",
         },
+        {
+            .name = "iscsi-id",
+            .type = QEMU_OPT_STRING,
+            .help = "ID of the -iscsi argument"
+        },
         { /* end of list */ }
     },
 };
@@ -1452,6 +1457,7 @@ static int iscsi_open(BlockDriverState *bs, QDict *options, int flags,
     QemuOpts *opts;
     Error *local_err = NULL;
     const char *filename;
+    const char *iscsi_arg_id;
     int i, ret = 0, timeout = 0;
 
     opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
@@ -1473,7 +1479,12 @@ static int iscsi_open(BlockDriverState *bs, QDict *options, int flags,
 
     memset(iscsilun, 0, sizeof(IscsiLun));
 
-    initiator_name = parse_initiator_name(iscsi_url->target);
+    iscsi_arg_id = qdict_get_try_str(bs->options, "iscsi-id");
+    if (!iscsi_arg_id) {
+        iscsi_arg_id = iscsi_url->target;
+    }
+
+    initiator_name = parse_initiator_name(iscsi_arg_id);
 
     iscsi = iscsi_create_context(initiator_name);
     if (iscsi == NULL) {
@@ -1499,7 +1510,7 @@ static int iscsi_open(BlockDriverState *bs, QDict *options, int flags,
     }
 
     /* check if we got CHAP username/password via the options */
-    parse_chap(iscsi, iscsi_url->target, &local_err);
+    parse_chap(iscsi, iscsi_arg_id, &local_err);
     if (local_err != NULL) {
         error_propagate(errp, local_err);
         ret = -EINVAL;
@@ -1515,7 +1526,7 @@ static int iscsi_open(BlockDriverState *bs, QDict *options, int flags,
     iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_NONE_CRC32C);
 
     /* check if we got HEADER_DIGEST via the options */
-    parse_header_digest(iscsi, iscsi_url->target, &local_err);
+    parse_header_digest(iscsi, iscsi_arg_id, &local_err);
     if (local_err != NULL) {
         error_propagate(errp, local_err);
         ret = -EINVAL;
@@ -1523,7 +1534,7 @@ static int iscsi_open(BlockDriverState *bs, QDict *options, int flags,
     }
 
     /* timeout handling is broken in libiscsi before 1.15.0 */
-    timeout = parse_timeout(iscsi_url->target);
+    timeout = parse_timeout(iscsi_arg_id);
 #if defined(LIBISCSI_API_VERSION) && LIBISCSI_API_VERSION >= 20150621
     iscsi_set_timeout(iscsi, timeout);
 #else
diff --git a/qemu-doc.texi b/qemu-doc.texi
index 79141d3..ecfd277 100644
--- a/qemu-doc.texi
+++ b/qemu-doc.texi
@@ -1018,7 +1018,7 @@ These can also be set via a configuration file
 
 Setting the target name allows different options for different targets
 @example
-[iscsi "iqn.target.name"]
+[iscsi "someid"]
   user = "CHAP username"
   password = "CHAP password"
   initiator-name = "iqn.qemu.test:my-initiator"
@@ -1026,18 +1026,24 @@ Setting the target name allows different options for different targets
   header-digest = "CRC32C"
 @end example
 
+The ``someid'' string is referenced from the -drive argument
+using the ``iscsi-id'' parameter. If ``iscsi-id'' is not set
+then it will try to use the iSCSI IQN value as the ID, however,
+since this often contains invalid characters, using an explicit
+ID is recommended.
 
 Howto use a configuration file to set iSCSI configuration options:
 @example
 cat >iscsi.conf <<EOF
-[iscsi]
+[iscsi "my_initiator"]
   user = "me"
   password = "my password"
   initiator-name = "iqn.qemu.test:my-initiator"
   header-digest = "CRC32C"
 EOF
 
-qemu-system-i386 -drive file=iscsi://127.0.0.1/iqn.qemu.test/1 \
+qemu-system-i386 \
+    -drive file=iscsi://127.0.0.1/iqn.qemu.test/1,driver=isci,iscsi-id=my_initiator \
     -readconfig iscsi.conf
 @end example
 
diff --git a/qemu-options.hx b/qemu-options.hx
index 6106520..181df6f 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -2489,9 +2489,9 @@ iSCSI support is an optional feature of QEMU and only available when
 compiled and linked against libiscsi.
 ETEXI
 DEF("iscsi", HAS_ARG, QEMU_OPTION_iscsi,
-    "-iscsi [user=user][,password=password]\n"
+    "-iscsi [user=user][,password=password][,password-secret=id]\n"
     "       [,header-digest=CRC32C|CR32C-NONE|NONE-CRC32C|NONE\n"
-    "       [,initiator-name=initiator-iqn][,id=target-iqn]\n"
+    "       [,initiator-name=initiator-iqn][,id=id]\n"
     "       [,timeout=timeout]\n"
     "                iSCSI session parameters\n", QEMU_ARCH_ALL)
 STEXI
-- 
2.5.5

  reply	other threads:[~2016-04-22 10:25 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-22 10:24 [Qemu-devel] [PATCH for-2.6] Fix association of -drive & -iscsi args Daniel P. Berrange
2016-04-22 10:24 ` Daniel P. Berrange [this message]
2016-04-22 10:59   ` [Qemu-devel] [PATCH for-2.6] block: add an 'iscsi-id' value to match -drive with -iscsi opts Kevin Wolf
2016-04-22 11:13     ` Peter Lieven
2016-04-22 11:43       ` Daniel P. Berrange
2016-04-22 11:53         ` Kevin Wolf
2016-04-22 11:55           ` Daniel P. Berrange
2016-04-22 12:10             ` Peter Maydell
2016-04-22 12:29               ` Daniel P. Berrange
2016-04-22 11:50     ` Markus Armbruster

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1461320695-31372-2-git-send-email-berrange@redhat.com \
    --to=berrange@redhat.com \
    --cc=jferlan@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=pl@kamp.de \
    --cc=ptoscano@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=ronniesahlberg@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.