[libvirt] [PATCH v3] Introduce <driver> under <filesystem> to support open-by-handle.
Daniel P. Berrange
berrange at redhat.com
Tue Oct 11 11:35:03 UTC 2011
On Tue, Oct 11, 2011 at 05:00:40PM +0530, Harsh Prateek Bora wrote:
> VirtFS allows the user to choose between path/handle based fs driver.
> As of now, libvirt hardcode to use path based driver only. This patch provides
> a solution to allow user to choose between path/handle based fs driver.
>
> Sample:
>
> <filesystem type='mount'>
> <driver type='handle'/>
> <source dir='/folder/to/share1'/>
> <target dir='mount_tag1'/>
> </filesystem>
>
> <filesystem type='mount'>
> <driver type='path'/>
> <source dir='/folder/to/share2'/>
> <target dir='mount_tag2'/>
> </filesystem>
>
> Signed-off-by: Harsh Prateek Bora <harsh at linux.vnet.ibm.com>
>
> v3:
> - use enum for fs driver type (qemuDomainFSDriver)
> v2:
> - use 'path' instead of 'local' in xml terminology
> - added default enum for optional driver type
>
> ---
> docs/schemas/domaincommon.rng | 9 +++++++++
> src/conf/domain_conf.c | 24 ++++++++++++++++++++++++
> src/conf/domain_conf.h | 11 +++++++++++
> src/qemu/qemu_command.c | 15 ++++++++++++++-
> 4 files changed, 58 insertions(+), 1 deletions(-)
>
> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index 492a41d..3937393 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>path</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..ede1f01 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -238,6 +238,11 @@ VIR_ENUM_IMPL(virDomainFS, VIR_DOMAIN_FS_TYPE_LAST,
> "file",
> "template")
>
> +VIR_ENUM_IMPL(virDomainFSDriverType, VIR_DOMAIN_FS_DRIVER_TYPE_LAST,
> + "default",
> + "path",
> + "handle")
> +
> VIR_ENUM_IMPL(virDomainFSAccessMode, VIR_DOMAIN_FS_ACCESSMODE_LAST,
> "passthrough",
> "mapped",
> @@ -2828,6 +2833,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 +2884,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_PATH;
> + }
> +
> if (source == NULL) {
> virDomainReportError(VIR_ERR_NO_SOURCE,
> target ? "%s" : NULL, target);
> @@ -2905,6 +2923,7 @@ virDomainFSDefParseXML(xmlNodePtr node,
>
> cleanup:
> VIR_FREE(type);
> + VIR_FREE(fsdriver);
> VIR_FREE(target);
> VIR_FREE(source);
> VIR_FREE(accessmode);
> @@ -9351,6 +9370,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 +9389,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..4f8993b 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -368,6 +368,15 @@ enum virDomainFSType {
> VIR_DOMAIN_FS_TYPE_LAST
> };
>
> +/* Filesystem driver type */
> +enum virDomainFSDriverType {
> + VIR_DOMAIN_FS_DRIVER_TYPE_DEFAULT = 0,
> + VIR_DOMAIN_FS_DRIVER_TYPE_PATH,
> + 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 +390,7 @@ typedef struct _virDomainFSDef virDomainFSDef;
> typedef virDomainFSDef *virDomainFSDefPtr;
> struct _virDomainFSDef {
> int type;
> + int fsdriver;
> int accessmode;
> char *src;
> char *dst;
> @@ -1856,6 +1866,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..b4f4bd8 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -100,6 +100,12 @@ VIR_ENUM_IMPL(qemuControllerModelUSB, VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST,
> "vt82c686b-usb-uhci",
> "pci-ohci");
>
> +VIR_ENUM_DECL(qemuDomainFSDriver)
> +VIR_ENUM_IMPL(qemuDomainFSDriver, VIR_DOMAIN_FS_DRIVER_TYPE_LAST,
> + "local",
> + "local",
> + "handle");
> +
>
> static void
> uname_normalize (struct utsname *ut)
> @@ -1811,6 +1817,7 @@ char *qemuBuildFSStr(virDomainFSDefPtr fs,
> virBitmapPtr qemuCaps ATTRIBUTE_UNUSED)
> {
> virBuffer opt = VIR_BUFFER_INITIALIZER;
> + const char *driver = qemuDomainFSDriverTypeToString(fs->fsdriver);
>
> if (fs->type != VIR_DOMAIN_FS_TYPE_MOUNT) {
> qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> @@ -1818,7 +1825,13 @@ char *qemuBuildFSStr(virDomainFSDefPtr fs,
> goto error;
> }
>
> - virBufferAddLit(&opt, "local");
> + if (!driver) {
> + qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> + _("Filesystem driver type not supported"));
> + goto error;
> + }
> + virBufferAdd(&opt, driver, -1);
> +
> if (fs->accessmode == VIR_DOMAIN_FS_ACCESSMODE_MAPPED) {
> virBufferAddLit(&opt, ",security_model=mapped");
> } else if(fs->accessmode == VIR_DOMAIN_FS_ACCESSMODE_PASSTHROUGH) {
ACK, addressed all my comments now
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list