From 397e6a705b98a89c0cc6ca74db9648cf8697e214 Mon Sep 17 00:00:00 2001 From: Taku Izumi Date: Mon, 30 Jan 2012 23:49:00 -0500 Subject: [PATCH] conf: add rawio attribute to disk element of domain XML This patch adds a new attribute "rawio" to the "disk" element of domain XML. Valid values of "rawio" attribute are "yes" and "no". rawio='yes' indicates the disk is desirous of CAP_SYS_RAWIO. If you specify the following XML: ... the domain will be granted CAP_SYS_RAWIO. (of course, the domain have to be executed with root privilege) NOTE: - "rawio" attribute is only valid when device='lun' - At the moment, any other disks you won't use rawio can use rawio. Signed-off-by: Taku Izumi --- docs/formatdomain.html.in | 7 +++-- docs/schemas/domaincommon.rng | 8 +++++ src/conf/domain_conf.c | 30 +++++++++++++++++++ src/conf/domain_conf.h | 2 ++ .../qemuxml2argv-virtio-lun.args | 6 ++-- .../qemuxml2argv-virtio-lun.xml | 13 ++++---- 6 files changed, 54 insertions(+), 12 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index ab84730b8f..a025a8ef6b 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -1096,8 +1096,11 @@ - also note that device='lun' will only be recognized for actual raw devices, never for individual partitions or LVM partitions (in those cases, the kernel will reject the generic - SCSI commands, making it identical to device='disk'). The - optional snapshot attribute indicates the default + SCSI commands, making it identical to device='disk'). + The optional rawio attribute indicates that the disk + is desirous of rawio capability. This attribute is only valid when + device is "lun". + The optional snapshot attribute indicates the default behavior of the disk during disk snapshots: "internal" requires a file format such as qcow2 that can store both the snapshot and the data changes since the snapshot; diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index ee4270ab56..66e5491fc8 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -805,6 +805,14 @@ + + + + yes + no + + + diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 4803cdf33f..35cb7a454d 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2806,6 +2806,7 @@ virDomainDiskDefParseXML(virCapsPtr caps, char *type = NULL; char *device = NULL; char *snapshot = NULL; + char *rawio = NULL; char *driverName = NULL; char *driverType = NULL; char *source = NULL; @@ -2850,6 +2851,8 @@ virDomainDiskDefParseXML(virCapsPtr caps, snapshot = virXMLPropString(node, "snapshot"); + rawio = virXMLPropString(node, "rawio"); + cur = node->children; while (cur != NULL) { if (cur->type == XML_ELEMENT_NODE) { @@ -3156,6 +3159,26 @@ virDomainDiskDefParseXML(virCapsPtr caps, def->snapshot = VIR_DOMAIN_DISK_SNAPSHOT_NO; } + if (rawio) { + def->rawio_specified = true; + if (def->device == VIR_DOMAIN_DISK_DEVICE_LUN) { + if (STREQ(rawio, "yes")) { + def->rawio = 1; + } else if (STREQ(rawio, "no")) { + def->rawio = 0; + } else { + virDomainReportError(VIR_ERR_XML_ERROR, + _("unknown disk rawio setting '%s'"), + rawio); + goto error; + } + } else { + virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("rawio can be used only with device='lun'")); + goto error; + } + } + if (bus) { if ((def->bus = virDomainDiskBusTypeFromString(bus)) < 0) { virDomainReportError(VIR_ERR_INTERNAL_ERROR, @@ -9972,6 +9995,13 @@ virDomainDiskDefFormat(virBufferPtr buf, virBufferAsprintf(buf, " rawio_specified) { + if (def->rawio == 1) { + virBufferAddLit(buf, " rawio='yes'"); + } else if (def->rawio == 0) { + virBufferAddLit(buf, " rawio='no'"); + } + } if (def->snapshot && !(def->snapshot == VIR_DOMAIN_DISK_SNAPSHOT_NO && def->readonly)) virBufferAsprintf(buf, " snapshot='%s'", diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 9a036853c9..503684f408 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -413,6 +413,8 @@ struct _virDomainDiskDef { unsigned int transient : 1; virDomainDeviceInfo info; virStorageEncryptionPtr encryption; + bool rawio_specified; + int rawio; /* no = 0, yes = 1 */ }; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-virtio-lun.args b/tests/qemuxml2argvdata/qemuxml2argv-virtio-lun.args index 5df9182bfb..b229f2a0db 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-virtio-lun.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-virtio-lun.args @@ -4,8 +4,8 @@ LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \ -boot dc -device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x6 \ -drive file=/dev/sdfake,if=none,id=drive-virtio-disk0 \ -device virtio-blk-pci,scsi=on,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0 \ --drive file=/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso,if=none,media=cdrom,id=drive-ide0-1-0 \ --device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 \ +-drive file=/dev/sdfake2,if=none,id=drive-virtio-disk1 \ +-device virtio-blk-pci,scsi=on,bus=pci.0,addr=0x5,drive=drive-virtio-disk1,id=virtio-disk1 \ -device virtio-net-pci,vlan=0,id=net0,mac=52:54:00:e5:48:58,bus=pci.0,addr=0x3 \ -net user,vlan=0,name=hostnet0 -serial pty -usb -vnc 127.0.0.1:-809 -std-vga \ --device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5 +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x7 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-virtio-lun.xml b/tests/qemuxml2argvdata/qemuxml2argv-virtio-lun.xml index abe1b2f3c3..63107d524a 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-virtio-lun.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-virtio-lun.xml @@ -16,18 +16,17 @@ restart /usr/bin/qemu - +
- - - - - -
+ + + + +