qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-block] [PATCH for 2.6] block: convert iscsi target to a valid


From: Pino Toscano
Subject: Re: [Qemu-block] [PATCH for 2.6] block: convert iscsi target to a valid ID for -iscsi arg lookup
Date: Wed, 13 Apr 2016 17:43:50 +0200
User-agent: KMail/4.14.10 (Linux/4.4.6-301.fc23.x86_64; KDE/4.14.18; x86_64; ; )

On Wednesday 13 April 2016 15:18:20 Daniel P. Berrange wrote:
> The iSCSI block driver has a very strange approach whereby it
> does not accept options directly as part of the -drive arg,
> but instead takes them indirectly from a -iscsi arg. To make
> up -driver and -iscsi args, it takes the iSCSI target name
> and uses that as an ID value for the -iscsi arg lookup.
> 
> For example, given a -drive arg that looks like
> 
>  -drive 
> file=iscsi://192.168.122.1:3260/iqn.2013-12.com.example%3Aiscsi-chap-netpool/1,format=raw,if=none,id=drive-virtio-disk0
> 
> The iSCSI driver will try to find the -iscsi arg with an
> id of "iqn.2013-12.com.example:iscsi-chap-netpool" eg it
> expects
> 
>   -iscsi 
> id=iqn.2013-12.com.example:iscsi-chap-netpool,user=fred,password-secret=secret0
> 
> Unfortunately this is impossible to actually do in practice
> because almost all iSCSI target names contain a ':' which
> is not a valid ID character for QEMU:
> 
>  $ qemu-system-x86_64: -iscsi 
> id=iqn.2013-12.com.example:iscsi-chap-netpool,user=redhat,password=123456: 
> Parameter 'id' expects an identifier
>  Identifiers consist of letters, digits, '-', '.', '_', starting with a 
> letter.
> 
> So for this to work we need to remove the invalid characters
> in some manner. This patch takes the simplest possible approach
> of just converting all invalid characters into underscores. eg
> you can now use
> 
>  $ qemu-system-x86_64: -iscsi 
> id=iqn.2013-12.com.example_iscsi-chap-netpool,user=redhat,password=123456: 
> Parameter 'id' expects an identifier
> 
> There is theoretically the possibility for collison with this
> approach if there were 2 iSCSI luns attached to the same VM
> with target names that clash on the escaped char: eg
> 
>   iqn.2013-12.com.example:iscsi-chap-netpool
>   iqn.2013-12.com.example_iscsi-chap-netpool
> 
> but in reality this will never happen. In addition in QEMU 2.7
> the need to use the -iscsi arg will be removed by allowing all
> the desired options to be listed directly with -drive. IOW this
> quick stripping of invalid characters is just a short term fix
> that will ultimately go away. For this reason it is not thought
> worthwhile to invent a full collision-free escaping syntax for
> iSCSI target IDs.

Maybe it would be worth as workaround for 2.6, although ...

> Signed-off-by: Daniel P. Berrange <address@hidden>
> ---
> 
> Note this problem was previously raised:
> 
>  http://lists.nongnu.org/archive/html/qemu-devel/2015-11/msg06501.html
> 
> and discussed the following month:
> 
>  http://lists.nongnu.org/archive/html/qemu-devel/2015-12/msg00112.html
> 
>  block/iscsi.c | 21 ++++++++++++++++++++-
>  1 file changed, 20 insertions(+), 1 deletion(-)
> 
> diff --git a/block/iscsi.c b/block/iscsi.c
> index 302baf8..7475cc9 100644
> --- a/block/iscsi.c
> +++ b/block/iscsi.c
> @@ -1070,6 +1070,22 @@ retry:
>      return 0;
>  }
>  
> +
> +static char *convert_target_to_id(const char *target)
> +{
> +    char *id = g_strdup(target);
> +    size_t i;
> +
> +    for (i = 1; id[i]; i++) {
> +        if (!qemu_isalnum(id[i]) && !strchr("-._", id[i])) {
> +            id[i] = '_';
> +        }
> +    }
> +
> +    return id;
> +}
> +
> +
>  static void parse_chap(struct iscsi_context *iscsi, const char *target,
>                         Error **errp)
>  {
> @@ -1079,13 +1095,16 @@ static void parse_chap(struct iscsi_context *iscsi, 
> const char *target,
>      const char *password = NULL;
>      const char *secretid;
>      char *secret = NULL;
> +    char *targetid = NULL;
>  
>      list = qemu_find_opts("iscsi");
>      if (!list) {
>          return;
>      }
>  
> -    opts = qemu_opts_find(list, target);
> +    targetid = convert_target_to_id(target);
> +    opts = qemu_opts_find(list, targetid);
> +    g_free(targetid);
>      if (opts == NULL) {
>          opts = QTAILQ_FIRST(&list->head);
>          if (!opts) {

... the commit message seems to suggest that it applies to all the
iSCSI parameter, but it actually works on the authentication-related
ones.

IMHO a better way would be using convert_target_to_id directly in
iscsi_open on iscsi_url->target (right after the url parsing) passing
the converted id to parse_initiator_name, iscsi_set_targetname,
parse_chap, and parse_header_digest: this way it can apply to all the
parameters.

Thanks,
-- 
Pino Toscano

Attachment: signature.asc
Description: This is a digitally signed message part.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]