]> xenbits.xensource.com Git - libvirt.git/commitdiff
util: storage: Parse 'lun' for iSCSI protocol from JSON as string or number
authorPeter Krempa <pkrempa@redhat.com>
Wed, 31 Jan 2018 11:00:42 +0000 (12:00 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 31 Jan 2018 11:22:25 +0000 (12:22 +0100)
While the QEMU QAPI schema describes 'lun' as a number, the code dealing
with JSON strings does not strictly adhere to this schema and thus
formats the number back as a string. Use the new helper to retrieve both
possibilities.

Note that the formatting code is okay and qemu will accept it as an int.

Tweak also one of the test strings to verify that both formats work
with libvirt.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1540290

src/util/virstoragefile.c
tests/virstoragetest.c

index 5780180a94ef5180c83bb7cb20bc9a3807daaefe..5f661c956cfee022e61262f8d1e891130ec0d938 100644 (file)
@@ -2976,10 +2976,9 @@ virStorageSourceParseBackingJSONiSCSI(virStorageSourcePtr src,
     const char *transport = virJSONValueObjectGetString(json, "transport");
     const char *portal = virJSONValueObjectGetString(json, "portal");
     const char *target = virJSONValueObjectGetString(json, "target");
+    const char *lun = virJSONValueObjectGetStringOrNumber(json, "lun");
     const char *uri;
     char *port;
-    unsigned int lun = 0;
-    char *fulltarget = NULL;
     int ret = -1;
 
     /* legacy URI based syntax passed via 'filename' option */
@@ -2990,6 +2989,9 @@ virStorageSourceParseBackingJSONiSCSI(virStorageSourcePtr src,
     src->type = VIR_STORAGE_TYPE_NETWORK;
     src->protocol = VIR_STORAGE_NET_PROTOCOL_ISCSI;
 
+    if (!lun)
+        lun = "0";
+
     if (VIR_ALLOC(src->hosts) < 0)
         goto cleanup;
 
@@ -3026,17 +3028,12 @@ virStorageSourceParseBackingJSONiSCSI(virStorageSourcePtr src,
         *port = '\0';
     }
 
-    ignore_value(virJSONValueObjectGetNumberUint(json, "lun", &lun));
-
-    if (virAsprintf(&fulltarget, "%s/%u", target, lun) < 0)
+    if (virAsprintf(&src->path, "%s/%s", target, lun) < 0)
         goto cleanup;
 
-    VIR_STEAL_PTR(src->path, fulltarget);
-
     ret = 0;
 
  cleanup:
-    VIR_FREE(fulltarget);
     return ret;
 }
 
index 7a0d4a8260b78f0f9f8ca086747827eff1c2d0b3..1dc7608cee02dc3333d348fe566b8367334b526e 100644 (file)
@@ -1572,7 +1572,7 @@ mymain(void)
                                        "\"transport\":\"tcp\","
                                        "\"portal\":\"test.org:1234\","
                                        "\"target\":\"iqn.2016-12.com.virttest:emulated-iscsi-noauth.target\","
-                                       "\"lun\":6"
+                                       "\"lun\":\"6\""
                                       "}"
                             "}",
                        "<source protocol='iscsi' name='iqn.2016-12.com.virttest:emulated-iscsi-noauth.target/6'>\n"