[libvirt] [PATCH 1/3] qemu: Support for Disk Geometry Override
Daniel P. Berrange
berrange at redhat.com
Wed Jul 18 20:34:35 UTC 2012
On Fri, Jul 13, 2012 at 10:45:28AM +0200, Viktor Mihajlovski wrote:
> From: J.B. Joret <jb at linux.vnet.ibm.com>
>
> Qemu allows to override the disk geometry in the drive specification
> with cyls=,heads=,secs=[,trans=].
> This patch extends the domain config and the qemu driver to allow
> the specification of disk geometry with libvirt.
>
> Signed-off-by: J.B. Joret <jb at linux.vnet.ibm.com>
> Signed-off-by: Viktor Mihajlovski <mihajlov at linux.vnet.ibm.com>
> ---
> src/conf/domain_conf.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++
> src/conf/domain_conf.h | 17 +++++++++++
> src/libvirt_private.syms | 2 +
> src/qemu/qemu_command.c | 59 ++++++++++++++++++++++++++++++++++++++
> 4 files changed, 149 insertions(+), 0 deletions(-)
Since you're adding to the public XML schema, please also update
the files docs/schemas/domaincommon.rng and docs/formatdomain.html.in
with appropriate info. It would also be desirable to add some test
cases to the qemuxml2argvtest.c test to validate this.
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 4f8c57a..4b208fc 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -170,6 +170,12 @@ VIR_ENUM_IMPL(virDomainDiskDevice, VIR_DOMAIN_DISK_DEVICE_LAST,
> "floppy",
> "lun")
>
> +VIR_ENUM_IMPL(virDomainDiskGeometryTrans, VIR_DOMAIN_DISK_TRANS_LAST,
> + "default",
> + "none",
> + "auto",
> + "lba")
> +
> VIR_ENUM_IMPL(virDomainDiskBus, VIR_DOMAIN_DISK_BUS_LAST,
> "ide",
> "fdc",
> @@ -3347,6 +3353,7 @@ virDomainDiskDefParseXML(virCapsPtr caps,
> char *source = NULL;
> char *target = NULL;
> char *protocol = NULL;
> + char *trans = NULL;
> virDomainDiskHostDefPtr hosts = NULL;
> int nhosts = 0;
> char *bus = NULL;
> @@ -3375,6 +3382,11 @@ virDomainDiskDefParseXML(virCapsPtr caps,
> return NULL;
> }
>
> + def->geometry.cylinders = 0;
> + def->geometry.heads = 0;
> + def->geometry.sectors = 0;
> + def->geometry.trans = VIR_DOMAIN_DISK_TRANS_DEFAULT;
> +
> ctxt->node = node;
>
> type = virXMLPropString(node, "type");
> @@ -3484,6 +3496,40 @@ virDomainDiskDefParseXML(virCapsPtr caps,
> if (target &&
> STRPREFIX(target, "ioemu:"))
> memmove(target, target+6, strlen(target)-5);
> + } else if (xmlStrEqual(cur->name, BAD_CAST "geometry")) {
> + if (virXPathUInt("string(./geometry/@cyls)",
> + ctxt, &def->geometry.cylinders) < 0) {
> + virDomainReportError(VIR_ERR_INTERNAL_ERROR,
> + _("invalid geometry settings (cyls)"));
> + goto error;
> + }
> + if (virXPathUInt("string(./geometry/@heads)",
> + ctxt, &def->geometry.heads) < 0) {
> + virDomainReportError(VIR_ERR_INTERNAL_ERROR,
> + _("invalid geometry settings (heads)"));
> + goto error;
> + }
> + if (virXPathUInt("string(./geometry/@secs)",
> + ctxt, &def->geometry.sectors) < 0) {
> + virDomainReportError(VIR_ERR_INTERNAL_ERROR,
> + _("invalid geometry settings (secs)"));
> + goto error;
> + }
> + trans = virXMLPropString(cur, "trans");
> + if (trans != NULL) {
> + if (STREQ(trans, "none"))
> + def->geometry.trans = VIR_DOMAIN_DISK_TRANS_NONE;
> + else if (STREQ(trans, "auto"))
> + def->geometry.trans = VIR_DOMAIN_DISK_TRANS_AUTO;
> + else if (STREQ(trans, "lba"))
> + def->geometry.trans = VIR_DOMAIN_DISK_TRANS_LBA;
> + else {
> + virDomainReportError(VIR_ERR_INTERNAL_ERROR,
> + _("invalid translation value '%s'"),
> + trans);
> + goto error;
Since you went to trouble of defining VIR_ENUM, you should be using
virDomainDiskGeometryTransTypeFromString() here instead of all these
STREQs.
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index ae48678..23d1aba 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -2016,6 +2016,8 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED,
> {
> virBuffer opt = VIR_BUFFER_INITIALIZER;
> const char *bus = virDomainDiskQEMUBusTypeToString(disk->bus);
> + const char *trans =
> + virDomainDiskGeometryTransTypeToString(disk->geometry.trans);
> int idx = virDiskNameToIndex(disk->dst);
> int busid = -1, unitid = -1;
>
> @@ -2218,6 +2220,24 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED,
> disk->type != VIR_DOMAIN_DISK_TYPE_DIR &&
> qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_FORMAT))
> virBufferAsprintf(&opt, ",format=%s", disk->driverType);
> +
> + /* generate geometry command string*/
> + if (disk->type == VIR_DOMAIN_DISK_TYPE_BLOCK ||
> + disk->type == VIR_DOMAIN_DISK_TYPE_FILE) {
The geometry information is used to set guest device properties.
The disk->type setting is about the host backend image type.
So I don't see why there's a dependancy between them. IMHO you
should just remove this if, and unconditionally set the geometry
regardless of what the backend type is.
Regards,
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