diff mbox

iSCSI options for IQN with colons

Message ID 2757099.oMy77gOrqp@pendragon.usersys.redhat.com
State New
Headers show

Commit Message

Pino Toscano Nov. 30, 2015, 3:31 p.m. UTC
Hi,

while testing the integration of QEMU with iSCSI, I was setting up an
environment with both target and initiator IQNs with colons. Then I
tried to connect to two different targets using two different initiator
IQN, like the following:

  $ qemu ... \
      -iscsi id=iqn.2015-11.com.bla:suffix1,initiator-name=iqn.2015-11.com.bla:suffix1-initiator \
      -iscsi id=iqn.2015-11.com.bla:suffix2,initiator-name=iqn.2015-11.com.bla:suffix2-initiator \
      -drive file=iscsi://server/iqn.2015-11.com.bla%3Asuffix1/0,format=raw,id=hd1,if=none \
      -drive file=iscsi://server/iqn.2015-11.com.bla%3Asuffix2/0,format=raw,id=hd2,if=none \
      ...

which didn't work at first:

  qemu-system-x86_64: -iscsi id=iqn.2015-11.com.bla:suffix1,initiator-name=iqn.2015-11.com.bla:suffix1-initiator: Parameter 'id' expects an identifier

which, according to id_wellformed in id.c, is true. Allowing colons in
id=... like in the following patch


allowed me to work run QEMU with the attached disks.

The question basically boils down to whether it is right to reject
colons in id:
- if so, then there should be a way to allow them only in id of -iscsi
  (since colons can be part of IQNs)
- if not, whether allowing them could cause regressions in option
  parsing

Thanks,

Comments

Markus Armbruster Dec. 1, 2015, 9:27 a.m. UTC | #1
Beware, I know next to nothing about iSCSI.

Pino Toscano <ptoscano@redhat.com> writes:

> Hi,
>
> while testing the integration of QEMU with iSCSI, I was setting up an
> environment with both target and initiator IQNs with colons. Then I
> tried to connect to two different targets using two different initiator
> IQN, like the following:
>
>   $ qemu ... \
>       -iscsi id=iqn.2015-11.com.bla:suffix1,initiator-name=iqn.2015-11.com.bla:suffix1-initiator \
>       -iscsi id=iqn.2015-11.com.bla:suffix2,initiator-name=iqn.2015-11.com.bla:suffix2-initiator \
>       -drive file=iscsi://server/iqn.2015-11.com.bla%3Asuffix1/0,format=raw,id=hd1,if=none \
>       -drive file=iscsi://server/iqn.2015-11.com.bla%3Asuffix2/0,format=raw,id=hd2,if=none \
>       ...
>
> which didn't work at first:
>
>   qemu-system-x86_64: -iscsi id=iqn.2015-11.com.bla:suffix1,initiator-name=iqn.2015-11.com.bla:suffix1-initiator: Parameter 'id' expects an identifier
>
> which, according to id_wellformed in id.c, is true. Allowing colons in
> id=... like in the following patch
>
> diff --git a/util/id.c b/util/id.c
> index bcc64d8..25fca9d 100644
> --- a/util/id.c
> +++ b/util/id.c
> @@ -20,7 +20,7 @@ bool id_wellformed(const char *id)
>          return false;
>      }
>      for (i = 1; id[i]; i++) {
> -        if (!qemu_isalnum(id[i]) && !strchr("-._", id[i])) {
> +        if (!qemu_isalnum(id[i]) && !strchr("-._:", id[i])) {
>              return false;
>          }
>      }
>
> allowed me to work run QEMU with the attached disks.
>
> The question basically boils down to whether it is right to reject
> colons in id:
> - if so, then there should be a way to allow them only in id of -iscsi
>   (since colons can be part of IQNs)
> - if not, whether allowing them could cause regressions in option
>   parsing

Have you tried

    -iscsi id=iscsi.1,initiator-name=iqn.2015-11.com.bla:suffix1-initiator \
    -iscsi id=iscsi.2,initiator-name=iqn.2015-11.com.bla:suffix2-initiator \
    -drive file=iscsi://server/iqn.2015-11.com.bla%3Asuffix1/0,format=raw,id=hd1,if=none \
    -drive file=iscsi://server/iqn.2015-11.com.bla%3Asuffix2/0,format=raw,id=hd2,if=none \

?
Pino Toscano Dec. 1, 2015, 1:26 p.m. UTC | #2
On Tuesday 01 December 2015 10:27:28 Markus Armbruster wrote:
> Beware, I know next to nothing about iSCSI.
> 
> Pino Toscano <ptoscano@redhat.com> writes:
> 
> > Hi,
> >
> > while testing the integration of QEMU with iSCSI, I was setting up an
> > environment with both target and initiator IQNs with colons. Then I
> > tried to connect to two different targets using two different initiator
> > IQN, like the following:
> >
> >   $ qemu ... \
> >       -iscsi id=iqn.2015-11.com.bla:suffix1,initiator-name=iqn.2015-11.com.bla:suffix1-initiator \
> >       -iscsi id=iqn.2015-11.com.bla:suffix2,initiator-name=iqn.2015-11.com.bla:suffix2-initiator \
> >       -drive file=iscsi://server/iqn.2015-11.com.bla%3Asuffix1/0,format=raw,id=hd1,if=none \
> >       -drive file=iscsi://server/iqn.2015-11.com.bla%3Asuffix2/0,format=raw,id=hd2,if=none \
> >       ...
> >
> > which didn't work at first:
> >
> >   qemu-system-x86_64: -iscsi id=iqn.2015-11.com.bla:suffix1,initiator-name=iqn.2015-11.com.bla:suffix1-initiator: Parameter 'id' expects an identifier
> >
> > which, according to id_wellformed in id.c, is true. Allowing colons in
> > id=... like in the following patch
> >
> > diff --git a/util/id.c b/util/id.c
> > index bcc64d8..25fca9d 100644
> > --- a/util/id.c
> > +++ b/util/id.c
> > @@ -20,7 +20,7 @@ bool id_wellformed(const char *id)
> >          return false;
> >      }
> >      for (i = 1; id[i]; i++) {
> > -        if (!qemu_isalnum(id[i]) && !strchr("-._", id[i])) {
> > +        if (!qemu_isalnum(id[i]) && !strchr("-._:", id[i])) {
> >              return false;
> >          }
> >      }
> >
> > allowed me to work run QEMU with the attached disks.
> >
> > The question basically boils down to whether it is right to reject
> > colons in id:
> > - if so, then there should be a way to allow them only in id of -iscsi
> >   (since colons can be part of IQNs)
> > - if not, whether allowing them could cause regressions in option
> >   parsing
> 
> Have you tried
> 
>     -iscsi id=iscsi.1,initiator-name=iqn.2015-11.com.bla:suffix1-initiator \
>     -iscsi id=iscsi.2,initiator-name=iqn.2015-11.com.bla:suffix2-initiator \
>     -drive file=iscsi://server/iqn.2015-11.com.bla%3Asuffix1/0,format=raw,id=hd1,if=none \
>     -drive file=iscsi://server/iqn.2015-11.com.bla%3Asuffix2/0,format=raw,id=hd2,if=none \

This won't work, as the various parse_* in iscsi.c (e.g.
parse_initiator_name for the above cases) use the target IQN as
identifier for the parameters.
Markus Armbruster Dec. 1, 2015, 1:43 p.m. UTC | #3
Pino Toscano <ptoscano@redhat.com> writes:

> On Tuesday 01 December 2015 10:27:28 Markus Armbruster wrote:
>> Beware, I know next to nothing about iSCSI.
>> 
>> Pino Toscano <ptoscano@redhat.com> writes:
>> 
>> > Hi,
>> >
>> > while testing the integration of QEMU with iSCSI, I was setting up an
>> > environment with both target and initiator IQNs with colons. Then I
>> > tried to connect to two different targets using two different initiator
>> > IQN, like the following:
>> >
>> >   $ qemu ... \
>> >       -iscsi id=iqn.2015-11.com.bla:suffix1,initiator-name=iqn.2015-11.com.bla:suffix1-initiator \
>> >       -iscsi id=iqn.2015-11.com.bla:suffix2,initiator-name=iqn.2015-11.com.bla:suffix2-initiator \
>> >       -drive file=iscsi://server/iqn.2015-11.com.bla%3Asuffix1/0,format=raw,id=hd1,if=none \
>> >       -drive file=iscsi://server/iqn.2015-11.com.bla%3Asuffix2/0,format=raw,id=hd2,if=none \
>> >       ...
>> >
>> > which didn't work at first:
>> >
>> >   qemu-system-x86_64: -iscsi id=iqn.2015-11.com.bla:suffix1,initiator-name=iqn.2015-11.com.bla:suffix1-initiator: Parameter 'id' expects an identifier
>> >
>> > which, according to id_wellformed in id.c, is true. Allowing colons in
>> > id=... like in the following patch
>> >
>> > diff --git a/util/id.c b/util/id.c
>> > index bcc64d8..25fca9d 100644
>> > --- a/util/id.c
>> > +++ b/util/id.c
>> > @@ -20,7 +20,7 @@ bool id_wellformed(const char *id)
>> >          return false;
>> >      }
>> >      for (i = 1; id[i]; i++) {
>> > -        if (!qemu_isalnum(id[i]) && !strchr("-._", id[i])) {
>> > +        if (!qemu_isalnum(id[i]) && !strchr("-._:", id[i])) {
>> >              return false;
>> >          }
>> >      }
>> >
>> > allowed me to work run QEMU with the attached disks.
>> >
>> > The question basically boils down to whether it is right to reject
>> > colons in id:
>> > - if so, then there should be a way to allow them only in id of -iscsi
>> >   (since colons can be part of IQNs)
>> > - if not, whether allowing them could cause regressions in option
>> >   parsing
>> 
>> Have you tried
>> 
>>     -iscsi id=iscsi.1,initiator-name=iqn.2015-11.com.bla:suffix1-initiator \
>>     -iscsi id=iscsi.2,initiator-name=iqn.2015-11.com.bla:suffix2-initiator \
>>     -drive
>> file=iscsi://server/iqn.2015-11.com.bla%3Asuffix1/0,format=raw,id=hd1,if=none
>> \
>>     -drive
>> file=iscsi://server/iqn.2015-11.com.bla%3Asuffix2/0,format=raw,id=hd2,if=none
>> \
>
> This won't work, as the various parse_* in iscsi.c (e.g.
> parse_initiator_name for the above cases) use the target IQN as
> identifier for the parameters.

Option parameter "id" is for naming things so that other things can
refer to them.  The actual name should not matter.  If it does, it's a
bug.

From my largely iSCSI-ignorant point of view, it looks like -drive
file=iscsi *might* use the target IQN it gets from the URL to look up
the matching -iscsi option.  That would be inappropriate.

I'm copying iSCSI maintainers for an authoritative answer.
Paolo Bonzini Dec. 1, 2015, 1:55 p.m. UTC | #4
On 01/12/2015 14:43, Markus Armbruster wrote:
> Option parameter "id" is for naming things so that other things can
> refer to them.  The actual name should not matter.  If it does, it's a
> bug.
> 
> From my largely iSCSI-ignorant point of view, it looks like -drive
> file=iscsi *might* use the target IQN it gets from the URL to look up
> the matching -iscsi option.  That would be inappropriate.

Yes, it does.

I'm not sure if it's inappropriate; "id" is the one mechanism that
QemuOpts provides for looking up things, and it makes sense to use it
even if the lookup key is not user-controlled.

Unfortunately, the limitations on ids make -iscsi almost unusable; IQNs
almost always have a colon (the syntax is
iqn.YYYY-MM.com.example:string.controlled.by.example.com.owner; the
after-colon part is optional but in practice will be there).  Either we
fix it with Pino's patch, or we might as well remove it.

In 2.6 we probably should get the new secret API, and -iscsi should be
modified so that you can specify a reference to a secret directly in -drive.

Paolo
diff mbox

Patch

diff --git a/util/id.c b/util/id.c
index bcc64d8..25fca9d 100644
--- a/util/id.c
+++ b/util/id.c
@@ -20,7 +20,7 @@  bool id_wellformed(const char *id)
         return false;
     }
     for (i = 1; id[i]; i++) {
-        if (!qemu_isalnum(id[i]) && !strchr("-._", id[i])) {
+        if (!qemu_isalnum(id[i]) && !strchr("-._:", id[i])) {
             return false;
         }
     }