]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
storage: Parse 'nvme' disk source properties from json:{} pseudo-uri
authorPeter Krempa <pkrempa@redhat.com>
Mon, 23 Mar 2020 17:06:56 +0000 (18:06 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 24 Mar 2020 13:17:48 +0000 (14:17 +0100)
Our code allows snapshots of NVMe based disks which means we create
overlay file with a 'json:{}' pseudo-uri refering to the NVME device.
Our parser code doesn't handle them though. Add the parser and test it
via the XML->json->XML round-trip and reference data.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/util/virstoragefile.c
tests/qemublocktest.c
tests/virstoragetest.c

index fa04ff74e16c874c554e547e21d8737ba6eba417..d81ed70a971f1e7c4865b59fc8f60607c89ffe24 100644 (file)
@@ -3806,6 +3806,35 @@ virStorageSourceParseBackingJSONVxHS(virStorageSourcePtr src,
 }
 
 
+static int
+virStorageSourceParseBackingJSONNVMe(virStorageSourcePtr src,
+                                     virJSONValuePtr json,
+                                     const char *jsonstr G_GNUC_UNUSED,
+                                     int opaque G_GNUC_UNUSED)
+{
+    g_autoptr(virStorageSourceNVMeDef) nvme = g_new0(virStorageSourceNVMeDef, 1);
+    const char *device = virJSONValueObjectGetString(json, "device");
+
+    if (!device || virPCIDeviceAddressParse((char *) device, &nvme->pciAddr) < 0) {
+        virReportError(VIR_ERR_INVALID_ARG, "%s",
+                       _("missing or malformed 'device' field of 'nvme' storage"));
+        return -1;
+    }
+
+    if (virJSONValueObjectGetNumberUlong(json, "namespace", &nvme->namespc) < 0 ||
+        nvme->namespc == 0) {
+        virReportError(VIR_ERR_INVALID_ARG, "%s",
+                       _("missing or malformed 'namespace' field of 'nvme' storage"));
+        return -1;
+    }
+
+    src->type = VIR_STORAGE_TYPE_NVME;
+    src->nvme = g_steal_pointer(&nvme);
+
+    return 0;
+}
+
+
 struct virStorageSourceJSONDriverParser {
     const char *drvname;
     bool formatdriver;
@@ -3837,6 +3866,7 @@ static const struct virStorageSourceJSONDriverParser jsonParsers[] = {
     {"rbd", false, virStorageSourceParseBackingJSONRBD, 0},
     {"raw", true, virStorageSourceParseBackingJSONRaw, 0},
     {"vxhs", false, virStorageSourceParseBackingJSONVxHS, 0},
+    {"nvme", false, virStorageSourceParseBackingJSONNVMe, 0},
 };
 
 
index 8640b721163e602836a1a1a95c2b71aea6fe4335..124eaea7520fdf4f26b5e91e0e643bdd744459c9 100644 (file)
@@ -1096,6 +1096,11 @@ mymain(void)
     /* type VIR_STORAGE_TYPE_BLOCK is not tested since it parses back to 'file' */
     /* type VIR_STORAGE_TYPE_DIR it is a 'format' driver in qemu */
 
+    TEST_JSON_FORMAT(VIR_STORAGE_TYPE_NVME,
+                     "<source type='pci' namespace='1'>\n"
+                     "  <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>\n"
+                     "</source>\n");
+
     TEST_JSON_FORMAT_NET("<source protocol='http' name=''>\n"
                          "  <host name='example.com' port='80'/>\n"
                          "</source>\n");
index 209d0c37d316c868e90abbbe48b0a10629fba8cf..10d542115075c8d14544e934ea73f6f6003b77fb 100644 (file)
@@ -1656,6 +1656,15 @@ mymain(void)
                            "  <timeout seconds='2000'/>\n"
                            "</source>\n", 0);
 
+    TEST_BACKING_PARSE("json:{\"file\":{\"driver\": \"nvme\","
+                                       "\"device\": \"0000:01:00.0\","
+                                       "\"namespace\": 1"
+                                      "}"
+                            "}",
+                        "<source type='pci' namespace='1'>\n"
+                        "  <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>\n"
+                        "</source>\n");
+
 #endif /* WITH_YAJL */
 
  cleanup: