Blame SOURCES/libvirt-util-storage-Parse-lun-for-iSCSI-protocol-from-JSON-as-string-or-number.patch

c1c534
From 9356d615ccbbb556a11d70a01941964b1af7d503 Mon Sep 17 00:00:00 2001
c1c534
Message-Id: <9356d615ccbbb556a11d70a01941964b1af7d503@dist-git>
c1c534
From: Peter Krempa <pkrempa@redhat.com>
c1c534
Date: Wed, 31 Jan 2018 12:51:00 +0100
c1c534
Subject: [PATCH] util: storage: Parse 'lun' for iSCSI protocol from JSON as
c1c534
 string or number
c1c534
c1c534
While the QEMU QAPI schema describes 'lun' as a number, the code dealing
c1c534
with JSON strings does not strictly adhere to this schema and thus
c1c534
formats the number back as a string. Use the new helper to retrieve both
c1c534
possibilities.
c1c534
c1c534
Note that the formatting code is okay and qemu will accept it as an int.
c1c534
c1c534
Tweak also one of the test strings to verify that both formats work
c1c534
with libvirt.
c1c534
c1c534
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1540290
c1c534
(cherry picked from commit f46d6e22f2dc352cd43480c1d148222f4e62b8e6)
c1c534
---
c1c534
 src/util/virstoragefile.c | 13 +++++--------
c1c534
 tests/virstoragetest.c    |  2 +-
c1c534
 2 files changed, 6 insertions(+), 9 deletions(-)
c1c534
c1c534
diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
c1c534
index d1e356a121..69deaea7c5 100644
c1c534
--- a/src/util/virstoragefile.c
c1c534
+++ b/src/util/virstoragefile.c
c1c534
@@ -2966,10 +2966,9 @@ virStorageSourceParseBackingJSONiSCSI(virStorageSourcePtr src,
c1c534
     const char *transport = virJSONValueObjectGetString(json, "transport");
c1c534
     const char *portal = virJSONValueObjectGetString(json, "portal");
c1c534
     const char *target = virJSONValueObjectGetString(json, "target");
c1c534
+    const char *lun = virJSONValueObjectGetStringOrNumber(json, "lun");
c1c534
     const char *uri;
c1c534
     char *port;
c1c534
-    unsigned int lun = 0;
c1c534
-    char *fulltarget = NULL;
c1c534
     int ret = -1;
c1c534
 
c1c534
     /* legacy URI based syntax passed via 'filename' option */
c1c534
@@ -2980,6 +2979,9 @@ virStorageSourceParseBackingJSONiSCSI(virStorageSourcePtr src,
c1c534
     src->type = VIR_STORAGE_TYPE_NETWORK;
c1c534
     src->protocol = VIR_STORAGE_NET_PROTOCOL_ISCSI;
c1c534
 
c1c534
+    if (!lun)
c1c534
+        lun = "0";
c1c534
+
c1c534
     if (VIR_ALLOC(src->hosts) < 0)
c1c534
         goto cleanup;
c1c534
 
c1c534
@@ -3015,17 +3017,12 @@ virStorageSourceParseBackingJSONiSCSI(virStorageSourcePtr src,
c1c534
         *port = '\0';
c1c534
     }
c1c534
 
c1c534
-    ignore_value(virJSONValueObjectGetNumberUint(json, "lun", &lun));
c1c534
-
c1c534
-    if (virAsprintf(&fulltarget, "%s/%u", target, lun) < 0)
c1c534
+    if (virAsprintf(&src->path, "%s/%s", target, lun) < 0)
c1c534
         goto cleanup;
c1c534
 
c1c534
-    VIR_STEAL_PTR(src->path, fulltarget);
c1c534
-
c1c534
     ret = 0;
c1c534
 
c1c534
  cleanup:
c1c534
-    VIR_FREE(fulltarget);
c1c534
     return ret;
c1c534
 }
c1c534
 
c1c534
diff --git a/tests/virstoragetest.c b/tests/virstoragetest.c
c1c534
index bdd0829c21..b7f2eeb96d 100644
c1c534
--- a/tests/virstoragetest.c
c1c534
+++ b/tests/virstoragetest.c
c1c534
@@ -1572,7 +1572,7 @@ mymain(void)
c1c534
                                        "\"transport\":\"tcp\","
c1c534
                                        "\"portal\":\"test.org:1234\","
c1c534
                                        "\"target\":\"iqn.2016-12.com.virttest:emulated-iscsi-noauth.target\","
c1c534
-                                       "\"lun\":6"
c1c534
+                                       "\"lun\":\"6\""
c1c534
                                       "}"
c1c534
                             "}",
c1c534
                        "<source protocol='iscsi' name='iqn.2016-12.com.virttest:emulated-iscsi-noauth.target/6'>\n"
c1c534
-- 
c1c534
2.16.1
c1c534