On a Thursday in 2020, Brian Turek wrote:
Expose QEMU's 9pfs 'fmode' and 'dmode' options via
attributes on the
'filesystem' node in the domain XML. These options control the creation
mode of files and directories, respectively, when using
accessmode=mapped.
Signed-off-by: Brian Turek <brian.turek(a)gmail.com>
---
docs/schemas/domaincommon.rng | 16 +++++
src/conf/domain_conf.c | 29 +++++++++
src/conf/domain_conf.h | 2 +
.../qemuxml2argvdata/virtio-9p-createmode.xml | 58 ++++++++++++++++++
.../virtio-9p-createmode.x86_64-latest.xml | 61 +++++++++++++++++++
tests/qemuxml2xmltest.c | 1 +
6 files changed, 167 insertions(+)
create mode 100644 tests/qemuxml2argvdata/virtio-9p-createmode.xml
create mode 100644 tests/qemuxml2xmloutdata/virtio-9p-createmode.x86_64-latest.xml
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 7d4b105981..a0f0eb5a23 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -26,6 +26,12 @@
</element>
</define>
+ <define name="createMode">
+ <data type="unsignedInt">
+ <param name="pattern">0[0-7]{3}|[0-7]{1,3}</param>
+ </data>
+ </define>
+
<!--
We handle only document defining a domain
-->
@@ -2736,6 +2742,16 @@
</choice>
</attribute>
</optional>
+ <optional>
+ <attribute name="fmode">
+ <ref name="createMode"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="dmode">
+ <ref name="createMode"/>
+ </attribute>
+ </optional>
<optional>
<element name="readonly">
<empty/>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 51efeb0e42..57ca2152ea 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -11471,6 +11471,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;
@@ -11499,6 +11501,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)) {
The parentheses around the two parts joined by || are not necessary,
but they do make the second line look better if indented properly.
(The second line should be indented by four spaces, to match the column
after the opening parenthesis. I'll do that before pushing)
+ 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)) {
Same here
+ virReportError(VIR_ERR_XML_ERROR,
+ _("invalid dmode: '%s'"), dmode);
+ goto error;
+ }
+ }
+
model = virXMLPropString(node, "model");
if (model) {
if ((def->model = virDomainFSModelTypeFromString(model)) < 0 ||
Reviewed-by: Ján Tomko <jtomko(a)redhat.com>
Jano