* [Qemu-devel] [PATCH 0/0] Add configuration variables for iSCSI
@ 2012-01-25 22:39 Ronnie Sahlberg
2012-01-25 22:39 ` [Qemu-devel] [PATCH] iSCSI: add " Ronnie Sahlberg
0 siblings, 1 reply; 4+ messages in thread
From: Ronnie Sahlberg @ 2012-01-25 22:39 UTC (permalink / raw)
To: qemu-devel, kwolf, eblake
Kevin, List
Please review and/or apply.
This is version 3 of the patch to add configuration variables for iSCSI.
Version 2 added the feature to specify configuration blocks that apply to a specific target name, allowing qemu to use different settings if/when connecting one guest to multiple different iscsi targets.
Version 3 fixes a typo and adds an example to the documentation on how to use -readconfig for reading the configuration from a file
This patch adds configuration variables for iSCSI to set
initiator-name to use when logging in to the target,
which type of header-digest to negotiate with the target
and username and password for CHAP authentication.
This allows specifying a initiator-name either from the command line
-iscsi initiator-name=iqn.2004-01.com.example:test
or from a configuration file included with -readconfig
[iscsi]
initiator-name = iqn.2004-01.com.example:test
header-digest = CRC32C|CRC32C-NONE|NONE-CRC32C|NONE
user = CHAP username
password = CHAP password
In the configuration file it is also possible to set a target specific
configuratyion block using the header
[iscsi "iqn.target.name"]
When a iscsi session is initialized, it will first try to use a configuration
section that matches the target name.
If no such block is found, it will fall-back to try the default [iscsi] section instead.
regards
ronnie sahlberg
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Qemu-devel] [PATCH] iSCSI: add configuration variables for iSCSI
2012-01-25 22:39 [Qemu-devel] [PATCH 0/0] Add configuration variables for iSCSI Ronnie Sahlberg
@ 2012-01-25 22:39 ` Ronnie Sahlberg
2012-01-25 22:53 ` Eric Blake
2012-01-26 10:58 ` Kevin Wolf
0 siblings, 2 replies; 4+ messages in thread
From: Ronnie Sahlberg @ 2012-01-25 22:39 UTC (permalink / raw)
To: qemu-devel, kwolf, eblake; +Cc: Ronnie Sahlberg
This patch adds configuration variables for iSCSI to set
initiator-name to use when logging in to the target,
which type of header-digest to negotiate with the target
and username and password for CHAP authentication.
This allows specifying a initiator-name either from the command line
-iscsi initiator-name=iqn.2004-01.com.example:test
or from a configuration file included with -readconfig
[iscsi]
initiator-name = iqn.2004-01.com.example:test
header-digest = CRC32C|CRC32C-NONE|NONE-CRC32C|NONE
user = CHAP username
password = CHAP password
If you use several different targets, you can also configure this on a per
target basis by using a group name:
[iscsi "iqn.target.name"]
...
The configuration file can be read using -readconfig.
Example :
qemu-system-i386 -drive file=iscsi://127.0.0.1/iqn.ronnie.test/1
-readconfig iscsi.conf
Signed-off-by: Ronnie Sahlberg <ronniesahlberg@gmail.com>
---
block/iscsi.c | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++----
qemu-config.c | 27 +++++++++++
qemu-doc.texi | 54 +++++++++++++++++++++-
qemu-options.hx | 16 +++++--
vl.c | 8 +++
5 files changed, 229 insertions(+), 15 deletions(-)
diff --git a/block/iscsi.c b/block/iscsi.c
index 938c568..bd3ca11 100644
--- a/block/iscsi.c
+++ b/block/iscsi.c
@@ -455,6 +455,109 @@ iscsi_connect_cb(struct iscsi_context *iscsi, int status, void *command_data,
}
}
+static int parse_chap(struct iscsi_context *iscsi, const char *target)
+{
+ QemuOptsList *list;
+ QemuOpts *opts;
+ const char *user = NULL;
+ const char *password = NULL;
+
+ list = qemu_find_opts("iscsi");
+ if (!list) {
+ return 0;
+ }
+
+ opts = qemu_opts_find(list, target);
+ if (opts == NULL) {
+ opts = QTAILQ_FIRST(&list->head);
+ if (!opts) {
+ return 0;
+ }
+ }
+
+ user = qemu_opt_get(opts, "user");
+ if (!user) {
+ return 0;
+ }
+
+ password = qemu_opt_get(opts, "password");
+ if (!password) {
+ error_report("CHAP username specified but no password was given");
+ return -1;
+ }
+
+ if (iscsi_set_initiator_username_pwd(iscsi, user, password)) {
+ error_report("Failed to set initiator username and password");
+ return -1;
+ }
+
+ return 0;
+}
+
+static void parse_header_digest(struct iscsi_context *iscsi, const char *target)
+{
+ QemuOptsList *list;
+ QemuOpts *opts;
+ const char *digest = NULL;
+
+ list = qemu_find_opts("iscsi");
+ if (!list) {
+ return;
+ }
+
+ opts = qemu_opts_find(list, target);
+ if (opts == NULL) {
+ opts = QTAILQ_FIRST(&list->head);
+ if (!opts) {
+ return;
+ }
+ }
+
+ digest = qemu_opt_get(opts, "header-digest");
+ if (!digest) {
+ return;
+ }
+
+ if (!strcmp(digest, "CRC32C")) {
+ iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_CRC32C);
+ } else if (!strcmp(digest, "NONE")) {
+ iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_NONE);
+ } else if (!strcmp(digest, "CRC32C-NONE")) {
+ iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_CRC32C_NONE);
+ } else if (!strcmp(digest, "NONE-CRC32C")) {
+ iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_NONE_CRC32C);
+ } else {
+ error_report("Invalid header-digest setting : %s", digest);
+ }
+}
+
+static char *parse_initiator_name(const char *target)
+{
+ QemuOptsList *list;
+ QemuOpts *opts;
+ const char *name = NULL;
+
+ list = qemu_find_opts("iscsi");
+ if (!list) {
+ return g_strdup("iqn.2008-11.org.linux-kvm");
+ }
+
+ opts = qemu_opts_find(list, target);
+ if (opts == NULL) {
+ opts = QTAILQ_FIRST(&list->head);
+ if (!opts) {
+ return g_strdup("iqn.2008-11.org.linux-kvm");
+ }
+ }
+
+ name = qemu_opt_get(opts, "initiator-name");
+ if (!name) {
+ return g_strdup("iqn.2008-11.org.linux-kvm");
+ }
+
+ return g_strdup(name);
+}
+
/*
* We support iscsi url's on the form
* iscsi://[<username>%<password>@]<host>[:<port>]/<targetname>/<lun>
@@ -465,6 +568,7 @@ static int iscsi_open(BlockDriverState *bs, const char *filename, int flags)
struct iscsi_context *iscsi = NULL;
struct iscsi_url *iscsi_url = NULL;
struct IscsiTask task;
+ char *initiator_name = NULL;
int ret;
if ((BDRV_SECTOR_SIZE % 512) != 0) {
@@ -474,16 +578,6 @@ static int iscsi_open(BlockDriverState *bs, const char *filename, int flags)
return -EINVAL;
}
- memset(iscsilun, 0, sizeof(IscsiLun));
-
- /* Should really append the KVM name after the ':' here */
- iscsi = iscsi_create_context("iqn.2008-11.org.linux-kvm:");
- if (iscsi == NULL) {
- error_report("iSCSI: Failed to create iSCSI context.");
- ret = -ENOMEM;
- goto failed;
- }
-
iscsi_url = iscsi_parse_full_url(iscsi, filename);
if (iscsi_url == NULL) {
error_report("Failed to parse URL : %s %s", filename,
@@ -492,6 +586,17 @@ static int iscsi_open(BlockDriverState *bs, const char *filename, int flags)
goto failed;
}
+ memset(iscsilun, 0, sizeof(IscsiLun));
+
+ initiator_name = parse_initiator_name(iscsi_url->target);
+
+ iscsi = iscsi_create_context(initiator_name);
+ if (iscsi == NULL) {
+ error_report("iSCSI: Failed to create iSCSI context.");
+ ret = -ENOMEM;
+ goto failed;
+ }
+
if (iscsi_set_targetname(iscsi, iscsi_url->target)) {
error_report("iSCSI: Failed to set target name.");
ret = -EINVAL;
@@ -507,6 +612,14 @@ static int iscsi_open(BlockDriverState *bs, const char *filename, int flags)
goto failed;
}
}
+
+ /* check if we got CHAP username/password via the options */
+ if (parse_chap(iscsi, iscsi_url->target) != 0) {
+ error_report("iSCSI: Failed to set CHAP user/password");
+ ret = -EINVAL;
+ goto failed;
+ }
+
if (iscsi_set_session_type(iscsi, ISCSI_SESSION_NORMAL) != 0) {
error_report("iSCSI: Failed to set session type to normal.");
ret = -EINVAL;
@@ -515,6 +628,9 @@ static int iscsi_open(BlockDriverState *bs, const char *filename, 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);
+
task.iscsilun = iscsilun;
task.status = 0;
task.complete = 0;
@@ -548,6 +664,9 @@ static int iscsi_open(BlockDriverState *bs, const char *filename, int flags)
return 0;
failed:
+ if (initiator_name != NULL) {
+ g_free(initiator_name);
+ }
if (iscsi_url != NULL) {
iscsi_destroy_url(iscsi_url);
}
diff --git a/qemu-config.c b/qemu-config.c
index c12c5eb..e240bd8 100644
--- a/qemu-config.c
+++ b/qemu-config.c
@@ -118,6 +118,32 @@ static QemuOptsList qemu_drive_opts = {
},
};
+static QemuOptsList qemu_iscsi_opts = {
+ .name = "iscsi",
+ .head = QTAILQ_HEAD_INITIALIZER(qemu_iscsi_opts.head),
+ .desc = {
+ {
+ .name = "user",
+ .type = QEMU_OPT_STRING,
+ .help = "username for CHAP authentication to target",
+ },{
+ .name = "password",
+ .type = QEMU_OPT_STRING,
+ .help = "password for CHAP authentication to target",
+ },{
+ .name = "header-digest",
+ .type = QEMU_OPT_STRING,
+ .help = "HeaderDigest setting. "
+ "{CRC32C|CRC32C-NONE|NONE-CRC32C|NONE}",
+ },{
+ .name = "initiator-name",
+ .type = QEMU_OPT_STRING,
+ .help = "Initiator iqn name to use when connecting",
+ },
+ { /* end of list */ }
+ },
+};
+
static QemuOptsList qemu_chardev_opts = {
.name = "chardev",
.implied_opt_name = "backend",
@@ -580,6 +606,7 @@ static QemuOptsList *vm_config_groups[32] = {
&qemu_option_rom_opts,
&qemu_machine_opts,
&qemu_boot_opts,
+ &qemu_iscsi_opts,
NULL,
};
diff --git a/qemu-doc.texi b/qemu-doc.texi
index 11f4166..83b2ad5 100644
--- a/qemu-doc.texi
+++ b/qemu-doc.texi
@@ -730,6 +730,57 @@ export LIBISCSI_CHAP_PASSWORD=<password>
iscsi://<host>/<target-iqn-name>/<lun>
@end example
+Various session related parameters can be set via special options, either
+in a configuration file provided via '-readconfig' or directly on the
+command line.
+
+@example
+Setting a specific initiator name to use when logging in to the target
+-iscsi initiator-name=iqn.qemu.test:my-initiator
+@end example
+
+@example
+Controlling which type of header digest to negotiate with the target
+-iscsi header-digest=CRC32C|CRC32C-NONE|NONE-CRC32C|NONE
+@end example
+
+These can also be set via a configuration file
+@example
+[iscsi]
+ user = "CHAP username"
+ password = "CHAP password"
+ initiator-name = "iqn.qemu.test:my-initiator"
+ # header digest is one of CRC32C|CRC32C-NONE|NONE-CRC32C|NONE
+ header-digest = "CRC32C"
+@end example
+
+
+Setting the target name allows different options for different targets
+@example
+[iscsi "iqn.target.name"]
+ user = "CHAP username"
+ password = "CHAP password"
+ initiator-name = "iqn.qemu.test:my-initiator"
+ # header digest is one of CRC32C|CRC32C-NONE|NONE-CRC32C|NONE
+ header-digest = "CRC32C"
+@end example
+
+
+Howto use a configuration file to set iSCSI configuration options:
+@example
+cat >iscsi.conf <<EOF
+[iscsi]
+ 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 \
+ -readconfig iscsi.conf
+@end example
+
+
Howto set up a simple iSCSI target on loopback and accessing it via QEMU:
@example
This example shows how to set up an iSCSI target with one CDROM and one DISK
@@ -744,7 +795,8 @@ tgtadm --lld iscsi --mode logicalunit --op new --tid 1 --lun 2 \
-b /IMAGES/cd.iso --device-type=cd
tgtadm --lld iscsi --op bind --mode target --tid 1 -I ALL
-qemu-system-i386 -boot d -drive file=iscsi://127.0.0.1/iqn.qemu.test/1 \
+qemu-system-i386 -iscsi initiator-name=iqn.qemu.test:my-initiator \
+ -boot d -drive file=iscsi://127.0.0.1/iqn.qemu.test/1 \
-cdrom iscsi://127.0.0.1/iqn.qemu.test/2
@end example
diff --git a/qemu-options.hx b/qemu-options.hx
index 653ff2d..d93f545 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -1780,24 +1780,32 @@ Syntax for specifying iSCSI LUNs is
Example (without authentication):
@example
-qemu -cdrom iscsi://192.0.2.1/iqn.2001-04.com.example/2 \
---drive file=iscsi://192.0.2.1/iqn.2001-04.com.example/1
+qemu -iscsi initiator-name=iqn.2001-04.com.example:my-initiator \
+-cdrom iscsi://192.0.2.1/iqn.2001-04.com.example/2 \
+-drive file=iscsi://192.0.2.1/iqn.2001-04.com.example/1
@end example
Example (CHAP username/password via URL):
@example
-qemu --drive file=iscsi://user%password@@192.0.2.1/iqn.2001-04.com.example/1
+qemu -drive file=iscsi://user%password@@192.0.2.1/iqn.2001-04.com.example/1
@end example
Example (CHAP username/password via environment variables):
@example
LIBISCSI_CHAP_USERNAME="user" \
LIBISCSI_CHAP_PASSWORD="password" \
-qemu --drive file=iscsi://192.0.2.1/iqn.2001-04.com.example/1
+qemu -drive file=iscsi://192.0.2.1/iqn.2001-04.com.example/1
@end example
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"
+ " [,header-digest=CRC32C|CR32C-NONE|NONE-CRC32C|NONE\n"
+ " [,initiator-name=iqn]\n"
+ " iSCSI session parameters\n", QEMU_ARCH_ALL)
+STEXI
@item NBD
QEMU supports NBD (Network Block Devices) both using TCP protocol as well
diff --git a/vl.c b/vl.c
index d88a18c..651a2d9 100644
--- a/vl.c
+++ b/vl.c
@@ -2512,6 +2512,14 @@ int main(int argc, char **argv, char **envp)
exit(1);
}
break;
+#ifdef CONFIG_LIBISCSI
+ case QEMU_OPTION_iscsi:
+ opts = qemu_opts_parse(qemu_find_opts("iscsi"), optarg, 0);
+ if (!opts) {
+ exit(1);
+ }
+ break;
+#endif
#ifdef CONFIG_SLIRP
case QEMU_OPTION_tftp:
legacy_tftp_prefix = optarg;
--
1.7.3.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [Qemu-devel] [PATCH] iSCSI: add configuration variables for iSCSI
2012-01-25 22:39 ` [Qemu-devel] [PATCH] iSCSI: add " Ronnie Sahlberg
@ 2012-01-25 22:53 ` Eric Blake
2012-01-26 10:58 ` Kevin Wolf
1 sibling, 0 replies; 4+ messages in thread
From: Eric Blake @ 2012-01-25 22:53 UTC (permalink / raw)
To: Ronnie Sahlberg; +Cc: kwolf, qemu-devel
[-- Attachment #1: Type: text/plain, Size: 2252 bytes --]
On 01/25/2012 03:39 PM, Ronnie Sahlberg wrote:
> This patch adds configuration variables for iSCSI to set
> initiator-name to use when logging in to the target,
> which type of header-digest to negotiate with the target
> and username and password for CHAP authentication.
>
> This allows specifying a initiator-name either from the command line
> -iscsi initiator-name=iqn.2004-01.com.example:test
> or from a configuration file included with -readconfig
> [iscsi]
> initiator-name = iqn.2004-01.com.example:test
> header-digest = CRC32C|CRC32C-NONE|NONE-CRC32C|NONE
> user = CHAP username
> password = CHAP password
>
> If you use several different targets, you can also configure this on a per
> target basis by using a group name:
> [iscsi "iqn.target.name"]
> ...
>
> The configuration file can be read using -readconfig.
> Example :
> qemu-system-i386 -drive file=iscsi://127.0.0.1/iqn.ronnie.test/1
> -readconfig iscsi.conf
>
> Signed-off-by: Ronnie Sahlberg <ronniesahlberg@gmail.com>
> ---
> block/iscsi.c | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++----
> qemu-config.c | 27 +++++++++++
> qemu-doc.texi | 54 +++++++++++++++++++++-
> qemu-options.hx | 16 +++++--
> vl.c | 8 +++
> 5 files changed, 229 insertions(+), 15 deletions(-)
I don't know the qemu code base well enough to give a full ack, but I
can at least state that you addressed my concerns from v1. Thanks!
> +++ b/qemu-doc.texi
> @@ -730,6 +730,57 @@ export LIBISCSI_CHAP_PASSWORD=<password>
> +
> +
> +Howto use a configuration file to set iSCSI configuration options:
s/Howto/How to/
> +@example
> +cat >iscsi.conf <<EOF
> +[iscsi]
> + 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 \
> + -readconfig iscsi.conf
> +@end example
> +
> +
> Howto set up a simple iSCSI target on loopback and accessing it via QEMU:
then again, you were copying and pasting.
--
Eric Blake eblake@redhat.com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 620 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Qemu-devel] [PATCH] iSCSI: add configuration variables for iSCSI
2012-01-25 22:39 ` [Qemu-devel] [PATCH] iSCSI: add " Ronnie Sahlberg
2012-01-25 22:53 ` Eric Blake
@ 2012-01-26 10:58 ` Kevin Wolf
1 sibling, 0 replies; 4+ messages in thread
From: Kevin Wolf @ 2012-01-26 10:58 UTC (permalink / raw)
To: Ronnie Sahlberg; +Cc: eblake, qemu-devel
Am 25.01.2012 23:39, schrieb Ronnie Sahlberg:
> This patch adds configuration variables for iSCSI to set
> initiator-name to use when logging in to the target,
> which type of header-digest to negotiate with the target
> and username and password for CHAP authentication.
>
> This allows specifying a initiator-name either from the command line
> -iscsi initiator-name=iqn.2004-01.com.example:test
> or from a configuration file included with -readconfig
> [iscsi]
> initiator-name = iqn.2004-01.com.example:test
> header-digest = CRC32C|CRC32C-NONE|NONE-CRC32C|NONE
> user = CHAP username
> password = CHAP password
>
> If you use several different targets, you can also configure this on a per
> target basis by using a group name:
> [iscsi "iqn.target.name"]
> ...
>
> The configuration file can be read using -readconfig.
> Example :
> qemu-system-i386 -drive file=iscsi://127.0.0.1/iqn.ronnie.test/1
> -readconfig iscsi.conf
>
> Signed-off-by: Ronnie Sahlberg <ronniesahlberg@gmail.com>
> ---
> block/iscsi.c | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++----
> qemu-config.c | 27 +++++++++++
> qemu-doc.texi | 54 +++++++++++++++++++++-
> qemu-options.hx | 16 +++++--
> vl.c | 8 +++
> 5 files changed, 229 insertions(+), 15 deletions(-)
>
> diff --git a/block/iscsi.c b/block/iscsi.c
> index 938c568..bd3ca11 100644
> --- a/block/iscsi.c
> +++ b/block/iscsi.c
> @@ -455,6 +455,109 @@ iscsi_connect_cb(struct iscsi_context *iscsi, int status, void *command_data,
> }
> }
>
> +static int parse_chap(struct iscsi_context *iscsi, const char *target)
> +{
> + QemuOptsList *list;
> + QemuOpts *opts;
> + const char *user = NULL;
> + const char *password = NULL;
> +
The pattern from here...
> + list = qemu_find_opts("iscsi");
> + if (!list) {
> + return 0;
> + }
> +
> + opts = qemu_opts_find(list, target);
> + if (opts == NULL) {
> + opts = QTAILQ_FIRST(&list->head);
> + if (!opts) {
> + return 0;
> + }
> + }
...to here repeats in all three parse functions. Would probably be worth
having a function for it.
> +
> + user = qemu_opt_get(opts, "user");
> + if (!user) {
> + return 0;
> + }
> +
> + password = qemu_opt_get(opts, "password");
> + if (!password) {
> + error_report("CHAP username specified but no password was given");
> + return -1;
> + }
> +
> + if (iscsi_set_initiator_username_pwd(iscsi, user, password)) {
> + error_report("Failed to set initiator username and password");
> + return -1;
> + }
> +
> + return 0;
> +}
> +
> +static void parse_header_digest(struct iscsi_context *iscsi, const char *target)
> +{
> + QemuOptsList *list;
> + QemuOpts *opts;
> + const char *digest = NULL;
> +
> + list = qemu_find_opts("iscsi");
> + if (!list) {
> + return;
> + }
> +
> + opts = qemu_opts_find(list, target);
> + if (opts == NULL) {
> + opts = QTAILQ_FIRST(&list->head);
> + if (!opts) {
> + return;
> + }
> + }
> +
> + digest = qemu_opt_get(opts, "header-digest");
> + if (!digest) {
> + return;
> + }
> +
> + if (!strcmp(digest, "CRC32C")) {
> + iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_CRC32C);
> + } else if (!strcmp(digest, "NONE")) {
> + iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_NONE);
> + } else if (!strcmp(digest, "CRC32C-NONE")) {
> + iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_CRC32C_NONE);
> + } else if (!strcmp(digest, "NONE-CRC32C")) {
> + iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_NONE_CRC32C);
> + } else {
> + error_report("Invalid header-digest setting : %s", digest);
> + }
> +}
> +
> +static char *parse_initiator_name(const char *target)
> +{
> + QemuOptsList *list;
> + QemuOpts *opts;
> + const char *name = NULL;
> +
> + list = qemu_find_opts("iscsi");
> + if (!list) {
> + return g_strdup("iqn.2008-11.org.linux-kvm");
> + }
> +
> + opts = qemu_opts_find(list, target);
> + if (opts == NULL) {
> + opts = QTAILQ_FIRST(&list->head);
> + if (!opts) {
> + return g_strdup("iqn.2008-11.org.linux-kvm");
> + }
> + }
> +
> + name = qemu_opt_get(opts, "initiator-name");
> + if (!name) {
> + return g_strdup("iqn.2008-11.org.linux-kvm");
> + }
> +
> + return g_strdup(name);
> +}
Why do you need to strdup the strings? They look all pretty constant. An
additional advantage would be...
> +
> /*
> * We support iscsi url's on the form
> * iscsi://[<username>%<password>@]<host>[:<port>]/<targetname>/<lun>
> @@ -465,6 +568,7 @@ static int iscsi_open(BlockDriverState *bs, const char *filename, int flags)
> struct iscsi_context *iscsi = NULL;
> struct iscsi_url *iscsi_url = NULL;
> struct IscsiTask task;
> + char *initiator_name = NULL;
> int ret;
>
> if ((BDRV_SECTOR_SIZE % 512) != 0) {
> @@ -474,16 +578,6 @@ static int iscsi_open(BlockDriverState *bs, const char *filename, int flags)
> return -EINVAL;
> }
>
> - memset(iscsilun, 0, sizeof(IscsiLun));
> -
> - /* Should really append the KVM name after the ':' here */
> - iscsi = iscsi_create_context("iqn.2008-11.org.linux-kvm:");
> - if (iscsi == NULL) {
> - error_report("iSCSI: Failed to create iSCSI context.");
> - ret = -ENOMEM;
> - goto failed;
> - }
> -
> iscsi_url = iscsi_parse_full_url(iscsi, filename);
> if (iscsi_url == NULL) {
> error_report("Failed to parse URL : %s %s", filename,
> @@ -492,6 +586,17 @@ static int iscsi_open(BlockDriverState *bs, const char *filename, int flags)
> goto failed;
> }
>
> + memset(iscsilun, 0, sizeof(IscsiLun));
> +
> + initiator_name = parse_initiator_name(iscsi_url->target);
> +
> + iscsi = iscsi_create_context(initiator_name);
> + if (iscsi == NULL) {
> + error_report("iSCSI: Failed to create iSCSI context.");
> + ret = -ENOMEM;
> + goto failed;
> + }
> +
> if (iscsi_set_targetname(iscsi, iscsi_url->target)) {
> error_report("iSCSI: Failed to set target name.");
> ret = -EINVAL;
> @@ -507,6 +612,14 @@ static int iscsi_open(BlockDriverState *bs, const char *filename, int flags)
> goto failed;
> }
> }
> +
> + /* check if we got CHAP username/password via the options */
> + if (parse_chap(iscsi, iscsi_url->target) != 0) {
> + error_report("iSCSI: Failed to set CHAP user/password");
> + ret = -EINVAL;
> + goto failed;
> + }
> +
> if (iscsi_set_session_type(iscsi, ISCSI_SESSION_NORMAL) != 0) {
> error_report("iSCSI: Failed to set session type to normal.");
> ret = -EINVAL;
> @@ -515,6 +628,9 @@ static int iscsi_open(BlockDriverState *bs, const char *filename, 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);
> +
> task.iscsilun = iscsilun;
> task.status = 0;
> task.complete = 0;
> @@ -548,6 +664,9 @@ static int iscsi_open(BlockDriverState *bs, const char *filename, int flags)
> return 0;
>
> failed:
> + if (initiator_name != NULL) {
> + g_free(initiator_name);
> + }
...that you wouldn't leak initiator_name in success case without strdup.
Kevin
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2012-01-26 10:54 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-01-25 22:39 [Qemu-devel] [PATCH 0/0] Add configuration variables for iSCSI Ronnie Sahlberg
2012-01-25 22:39 ` [Qemu-devel] [PATCH] iSCSI: add " Ronnie Sahlberg
2012-01-25 22:53 ` Eric Blake
2012-01-26 10:58 ` Kevin Wolf
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).