mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 13:45:38 +00:00
storage: Parse 'nvme' disk source properties from json:{} pseudo-uri
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>
This commit is contained in:
parent
3b06103e69
commit
1b84dd190c
@ -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},
|
||||
};
|
||||
|
||||
|
||||
|
@ -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");
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user