Version 2 based on suggestions from Paolo B. Use a function 'qemu_get_vm_name()' to pass the -name from qemu to block/iscsi.c instead of #ifdefs
This patch updates the iscsi layer to automatically pick a 'unique' initiator-name based on the name of the vm in case the user has not set an explicit iqn-name to use. Save the -name of the vm so that we can use it in the default iscsi name. Add a new variable that holds the name for the vm as specified by -name and assign this name to the iscsi_name pointer gtom block/iscsi.c This way we can thus create default names to use as the initiator name based on the guest session. If -name is not specified, iscsi will use a default initiator-name of iqn.2008-11.org.linux-kvm If -name is specified, then iscsi will use a default initiatorname of iqn.2008-11.org.linux-kvm:<name> Signed-off-by: Ronnie Sahlberg <ronniesahlb...@gmail.com> --- block/iscsi.c | 14 +++++++++++--- qemu-common.h | 1 + qemu-doc.texi | 5 +++++ qemu-options.hx | 8 ++++++++ qemu-tool.c | 5 +++++ vl.c | 5 +++++ 6 files changed, 35 insertions(+), 3 deletions(-) diff --git a/block/iscsi.c b/block/iscsi.c index 993a86d..243496b 100644 --- a/block/iscsi.c +++ b/block/iscsi.c @@ -896,23 +896,31 @@ static char *parse_initiator_name(const char *target) QemuOptsList *list; QemuOpts *opts; const char *name = NULL; + char *default_name; + const char *iscsi_name = qemu_get_vm_name(); + + if (asprintf(&default_name, "iqn.2008-11.org.linux-kvm%s%s", + iscsi_name ? ":" : "", + iscsi_name ? iscsi_name : "") == -1) { + default_name = (char *)"iqn.2008-11.org.linux-kvm"; + } list = qemu_find_opts("iscsi"); if (!list) { - return g_strdup("iqn.2008-11.org.linux-kvm"); + return g_strdup(default_name); } 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"); + return g_strdup(default_name); } } name = qemu_opt_get(opts, "initiator-name"); if (!name) { - return g_strdup("iqn.2008-11.org.linux-kvm"); + return g_strdup(default_name); } return g_strdup(name); diff --git a/qemu-common.h b/qemu-common.h index 7c8dac8..702b410 100644 --- a/qemu-common.h +++ b/qemu-common.h @@ -358,6 +358,7 @@ bool buffer_is_zero(const void *buf, size_t len); void qemu_progress_init(int enabled, float min_skip); void qemu_progress_end(void); void qemu_progress_print(float delta, int max); +const char *qemu_get_vm_name(void); #define QEMU_FILE_TYPE_BIOS 0 #define QEMU_FILE_TYPE_KEYMAP 1 diff --git a/qemu-doc.texi b/qemu-doc.texi index 84dad19..2360f7b 100644 --- a/qemu-doc.texi +++ b/qemu-doc.texi @@ -734,6 +734,11 @@ Various session related parameters can be set via special options, either in a configuration file provided via '-readconfig' or directly on the command line. +If the initiator-name is not specified qemu will use a default name +of 'iqn.2008-11.org.linux-kvm[:<name>'] where <name> is the name of the +virtual machine. + + @example Setting a specific initiator name to use when logging in to the target -iscsi initiator-name=iqn.qemu.test:my-initiator diff --git a/qemu-options.hx b/qemu-options.hx index dc68e15..3335bcc 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -1893,6 +1893,11 @@ images for the guest storage. Both disk and cdrom images are supported. Syntax for specifying iSCSI LUNs is ``iscsi://<target-ip>[:<port>]/<target-iqn>/<lun>'' +By default qemu will use the iSCSI initiator-name +'iqn.2008-11.org.linux-kvm[:<name>]' but this can also be set from the command +line or a configuration file. + + Example (without authentication): @example qemu-system-i386 -iscsi initiator-name=iqn.2001-04.com.example:my-initiator \ @@ -1922,6 +1927,9 @@ DEF("iscsi", HAS_ARG, QEMU_OPTION_iscsi, " iSCSI session parameters\n", QEMU_ARCH_ALL) STEXI +iSCSI parameters such as username and password can also be specified via +a configuration file. See qemu-doc for more information and examples. + @item NBD QEMU supports NBD (Network Block Devices) both using TCP protocol as well as Unix Domain Sockets. diff --git a/qemu-tool.c b/qemu-tool.c index 318c5fc..64b5e88 100644 --- a/qemu-tool.c +++ b/qemu-tool.c @@ -30,6 +30,11 @@ struct QEMUBH void *opaque; }; +const char *qemu_get_vm_name(void) +{ + return NULL; +} + Monitor *cur_mon; int monitor_cur_is_qmp(void) diff --git a/vl.c b/vl.c index 8904db1..dd5716c 100644 --- a/vl.c +++ b/vl.c @@ -291,6 +291,11 @@ static struct { { .driver = "qxl-vga", .flag = &default_vga }, }; +const char *qemu_get_vm_name(void) +{ + return qemu_name; +} + static void res_free(void) { if (boot_splash_filedata != NULL) { -- 1.7.3.1