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@xxxxxxxxxxxxxxxxxx> > > 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 :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list