VirtFS allows the user to choose between local/handle for fs driver. As of now, libvirt hardcode to use local driver only. This patch provides a solution to allow user to choose between local/handle as fs driver. Sample: <filesystem type='mount'> <driver type='handle'/> <source dir='/folder/to/share'/> <target dir='mount_tag'/> </filesystem> Signed-off-by: Harsh Prateek Bora <harsh@xxxxxxxxxxxxxxxxxx> --- docs/schemas/domaincommon.rng | 9 +++++++++ src/conf/domain_conf.c | 23 +++++++++++++++++++++++ src/conf/domain_conf.h | 10 ++++++++++ src/qemu/qemu_command.c | 7 ++++++- 4 files changed, 48 insertions(+), 1 deletions(-) diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 492a41d..3a0cb86 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -1025,6 +1025,15 @@ </choice> <optional> <ref name="address"/> + <element name="driver"> + <attribute name="type"> + <choice> + <value>local</value> + <value>handle</value> + </choice> + </attribute> + <empty/> + </element> <attribute name="accessmode"> <choice> <value>passthrough</value> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index a537251..04410f2 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -238,6 +238,10 @@ VIR_ENUM_IMPL(virDomainFS, VIR_DOMAIN_FS_TYPE_LAST, "file", "template") +VIR_ENUM_IMPL(virDomainFSDriverType, VIR_DOMAIN_FS_DRIVER_TYPE_LAST, + "local", + "handle") + VIR_ENUM_IMPL(virDomainFSAccessMode, VIR_DOMAIN_FS_ACCESSMODE_LAST, "passthrough", "mapped", @@ -2828,6 +2832,7 @@ virDomainFSDefParseXML(xmlNodePtr node, virDomainFSDefPtr def; xmlNodePtr cur; char *type = NULL; + char *fsdriver = NULL; char *source = NULL; char *target = NULL; char *accessmode = NULL; @@ -2878,11 +2883,23 @@ virDomainFSDefParseXML(xmlNodePtr node, target = virXMLPropString(cur, "dir"); } else if (xmlStrEqual(cur->name, BAD_CAST "readonly")) { def->readonly = 1; + } else if ((fsdriver == NULL) && (xmlStrEqual(cur->name, BAD_CAST "driver"))) { + fsdriver = virXMLPropString(cur, "type"); } } cur = cur->next; } + if (fsdriver) { + if ((def->fsdriver = virDomainFSDriverTypeTypeFromString(fsdriver)) < 0) { + virDomainReportError(VIR_ERR_INTERNAL_ERROR, + _("unknown fs driver type '%s'"), fsdriver); + goto error; + } + } else { + def->fsdriver = VIR_DOMAIN_FS_DRIVER_TYPE_LOCAL; + } + if (source == NULL) { virDomainReportError(VIR_ERR_NO_SOURCE, target ? "%s" : NULL, target); @@ -2905,6 +2922,7 @@ virDomainFSDefParseXML(xmlNodePtr node, cleanup: VIR_FREE(type); + VIR_FREE(fsdriver); VIR_FREE(target); VIR_FREE(source); VIR_FREE(accessmode); @@ -9351,6 +9369,7 @@ virDomainFSDefFormat(virBufferPtr buf, { const char *type = virDomainFSTypeToString(def->type); const char *accessmode = virDomainFSAccessModeTypeToString(def->accessmode); + const char *fsdriver = virDomainFSDriverTypeTypeToString(def->fsdriver); if (!type) { virDomainReportError(VIR_ERR_INTERNAL_ERROR, @@ -9369,6 +9388,10 @@ virDomainFSDefFormat(virBufferPtr buf, " <filesystem type='%s' accessmode='%s'>\n", type, accessmode); + if (def->fsdriver) { + virBufferAsprintf(buf, " <driver type='%s'/>\n", fsdriver); + } + if (def->src) { switch (def->type) { case VIR_DOMAIN_FS_TYPE_MOUNT: diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index e07fd2f..d42325e 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -368,6 +368,14 @@ enum virDomainFSType { VIR_DOMAIN_FS_TYPE_LAST }; +/* Filesystem driver type */ +enum virDomainFSDriverType { + VIR_DOMAIN_FS_DRIVER_TYPE_LOCAL, + VIR_DOMAIN_FS_DRIVER_TYPE_HANDLE, + + VIR_DOMAIN_FS_DRIVER_TYPE_LAST +}; + /* Filesystem mount access mode */ enum virDomainFSAccessMode { VIR_DOMAIN_FS_ACCESSMODE_PASSTHROUGH, @@ -381,6 +389,7 @@ typedef struct _virDomainFSDef virDomainFSDef; typedef virDomainFSDef *virDomainFSDefPtr; struct _virDomainFSDef { int type; + int fsdriver; int accessmode; char *src; char *dst; @@ -1856,6 +1865,7 @@ VIR_ENUM_DECL(virDomainController) VIR_ENUM_DECL(virDomainControllerModelSCSI) VIR_ENUM_DECL(virDomainControllerModelUSB) VIR_ENUM_DECL(virDomainFS) +VIR_ENUM_DECL(virDomainFSDriverType) VIR_ENUM_DECL(virDomainFSAccessMode) VIR_ENUM_DECL(virDomainNet) VIR_ENUM_DECL(virDomainNetBackend) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index cf99f89..a989aa7 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1818,7 +1818,12 @@ char *qemuBuildFSStr(virDomainFSDefPtr fs, goto error; } - virBufferAddLit(&opt, "local"); + if (fs->fsdriver == VIR_DOMAIN_FS_DRIVER_TYPE_LOCAL) { + virBufferAddLit(&opt, "local"); + } else if (fs->fsdriver == VIR_DOMAIN_FS_DRIVER_TYPE_HANDLE) { + virBufferAddLit(&opt, "handle"); + } + if (fs->accessmode == VIR_DOMAIN_FS_ACCESSMODE_MAPPED) { virBufferAddLit(&opt, ",security_model=mapped"); } else if(fs->accessmode == VIR_DOMAIN_FS_ACCESSMODE_PASSTHROUGH) { -- 1.7.1.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list