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
next prev parent 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).