diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index a62a598568..97fa873977 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -26,6 +26,12 @@ + + + 0[0-7]{3}|[0-7]{1,3} + + + @@ -2746,6 +2752,16 @@ + + + + + + + + + + diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index b47f43afd9..7696b12ef9 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -11476,6 +11476,8 @@ virDomainFSDefParseXML(virDomainXMLOptionPtr xmlopt, g_autofree char *units = NULL; g_autofree char *model = NULL; g_autofree char *multidevs = NULL; + g_autofree char *fmode = NULL; + g_autofree char *dmode = NULL; ctxt->node = node; @@ -11504,6 +11506,26 @@ virDomainFSDefParseXML(virDomainXMLOptionPtr xmlopt, def->accessmode = VIR_DOMAIN_FS_ACCESSMODE_PASSTHROUGH; } + fmode = virXMLPropString(node, "fmode"); + if (fmode) { + if ((virStrToLong_uip(fmode, NULL, 8, &def->fmode) < 0) || + (def->fmode > 0777)) { + virReportError(VIR_ERR_XML_ERROR, + _("invalid fmode: '%s'"), fmode); + goto error; + } + } + + dmode = virXMLPropString(node, "dmode"); + if (dmode) { + if ((virStrToLong_uip(dmode, NULL, 8, &def->dmode) < 0) || + (def->dmode > 0777)) { + virReportError(VIR_ERR_XML_ERROR, + _("invalid dmode: '%s'"), dmode); + goto error; + } + } + model = virXMLPropString(node, "model"); if (model) { if ((def->model = virDomainFSModelTypeFromString(model)) < 0 || @@ -26181,6 +26203,13 @@ virDomainFSDefFormat(virBufferPtr buf, } if (def->multidevs) virBufferAsprintf(buf, " multidevs='%s'", multidevs); + + if (def->fmode) + virBufferAsprintf(buf, " fmode='%04o'", def->fmode); + + if (def->dmode) + virBufferAsprintf(buf, " dmode='%04o'", def->dmode); + virBufferAddLit(buf, ">\n"); virBufferAdjustIndent(buf, 2); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 170fc73af9..8a487e9de3 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -849,6 +849,8 @@ struct _virDomainFSDef { int wrpolicy; /* enum virDomainFSWrpolicy */ int format; /* virStorageFileFormat */ int model; /* virDomainFSModel */ + unsigned int fmode; + unsigned int dmode; int multidevs; /* virDomainFSMultidevs */ unsigned long long usage; /* in bytes */ virStorageSourcePtr src; diff --git a/tests/qemuxml2argvdata/virtio-9p-createmode.xml b/tests/qemuxml2argvdata/virtio-9p-createmode.xml new file mode 100644 index 0000000000..032b22a2da --- /dev/null +++ b/tests/qemuxml2argvdata/virtio-9p-createmode.xml @@ -0,0 +1,58 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219136 + 219136 + 1 + + hvm + + + + destroy + restart + destroy + + /usr/bin/qemu-system-x86_64 + +
+ + +
+ + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + + + + + + + + + +
+ + + diff --git a/tests/qemuxml2xmloutdata/virtio-9p-createmode.x86_64-latest.xml b/tests/qemuxml2xmloutdata/virtio-9p-createmode.x86_64-latest.xml new file mode 100644 index 0000000000..7c374ca3a6 --- /dev/null +++ b/tests/qemuxml2xmloutdata/virtio-9p-createmode.x86_64-latest.xml @@ -0,0 +1,61 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219136 + 219136 + 1 + + hvm + + + + qemu64 + + + destroy + restart + destroy + + /usr/bin/qemu-system-x86_64 + +
+ + +
+ + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + + + + + + + + + +
+ + + diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 44ac9fbce7..0e9f88788c 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -1513,6 +1513,7 @@ mymain(void) DO_TEST_CAPS_ARCH_LATEST("x86_64-default-cpu-tcg-q35-4.2", "x86_64"); DO_TEST_CAPS_LATEST("virtio-9p-multidevs"); + DO_TEST_CAPS_LATEST("virtio-9p-createmode"); DO_TEST("downscript", NONE); cleanup: