1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2024-12-23 21:34:54 +03:00

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:

 <disk type='block' device='lun' rawio='yes'>
  ...
 </disk>

 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 <izumi.taku@jp.fujitsu.com>
This commit is contained in:
Taku Izumi 2012-01-30 23:49:00 -05:00 committed by Laine Stump
parent e545dd4ffe
commit 397e6a705b
6 changed files with 54 additions and 12 deletions

View File

@ -1096,8 +1096,11 @@
- also note that device='lun' will only be recognized for - also note that device='lun' will only be recognized for
actual raw devices, never for individual partitions or LVM actual raw devices, never for individual partitions or LVM
partitions (in those cases, the kernel will reject the generic partitions (in those cases, the kernel will reject the generic
SCSI commands, making it identical to device='disk'). The SCSI commands, making it identical to device='disk').
optional <code>snapshot</code> attribute indicates the default The optional <code>rawio</code> attribute indicates that the disk
is desirous of rawio capability. This attribute is only valid when
device is "lun".
The optional <code>snapshot</code> attribute indicates the default
behavior of the disk during disk snapshots: "internal" behavior of the disk during disk snapshots: "internal"
requires a file format such as qcow2 that can store both the requires a file format such as qcow2 that can store both the
snapshot and the data changes since the snapshot; snapshot and the data changes since the snapshot;

View File

@ -805,6 +805,14 @@
</choice> </choice>
</attribute> </attribute>
</optional> </optional>
<optional>
<attribute name="rawio">
<choice>
<value>yes</value>
<value>no</value>
</choice>
</attribute>
</optional>
<optional> <optional>
<ref name="snapshot"/> <ref name="snapshot"/>
</optional> </optional>

View File

@ -2806,6 +2806,7 @@ virDomainDiskDefParseXML(virCapsPtr caps,
char *type = NULL; char *type = NULL;
char *device = NULL; char *device = NULL;
char *snapshot = NULL; char *snapshot = NULL;
char *rawio = NULL;
char *driverName = NULL; char *driverName = NULL;
char *driverType = NULL; char *driverType = NULL;
char *source = NULL; char *source = NULL;
@ -2850,6 +2851,8 @@ virDomainDiskDefParseXML(virCapsPtr caps,
snapshot = virXMLPropString(node, "snapshot"); snapshot = virXMLPropString(node, "snapshot");
rawio = virXMLPropString(node, "rawio");
cur = node->children; cur = node->children;
while (cur != NULL) { while (cur != NULL) {
if (cur->type == XML_ELEMENT_NODE) { if (cur->type == XML_ELEMENT_NODE) {
@ -3156,6 +3159,26 @@ virDomainDiskDefParseXML(virCapsPtr caps,
def->snapshot = VIR_DOMAIN_DISK_SNAPSHOT_NO; 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 (bus) {
if ((def->bus = virDomainDiskBusTypeFromString(bus)) < 0) { if ((def->bus = virDomainDiskBusTypeFromString(bus)) < 0) {
virDomainReportError(VIR_ERR_INTERNAL_ERROR, virDomainReportError(VIR_ERR_INTERNAL_ERROR,
@ -9972,6 +9995,13 @@ virDomainDiskDefFormat(virBufferPtr buf,
virBufferAsprintf(buf, virBufferAsprintf(buf,
" <disk type='%s' device='%s'", " <disk type='%s' device='%s'",
type, device); type, device);
if (def->rawio_specified) {
if (def->rawio == 1) {
virBufferAddLit(buf, " rawio='yes'");
} else if (def->rawio == 0) {
virBufferAddLit(buf, " rawio='no'");
}
}
if (def->snapshot && if (def->snapshot &&
!(def->snapshot == VIR_DOMAIN_DISK_SNAPSHOT_NO && def->readonly)) !(def->snapshot == VIR_DOMAIN_DISK_SNAPSHOT_NO && def->readonly))
virBufferAsprintf(buf, " snapshot='%s'", virBufferAsprintf(buf, " snapshot='%s'",

View File

@ -413,6 +413,8 @@ struct _virDomainDiskDef {
unsigned int transient : 1; unsigned int transient : 1;
virDomainDeviceInfo info; virDomainDeviceInfo info;
virStorageEncryptionPtr encryption; virStorageEncryptionPtr encryption;
bool rawio_specified;
int rawio; /* no = 0, yes = 1 */
}; };

View File

@ -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 \ -boot dc -device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x6 \
-drive file=/dev/sdfake,if=none,id=drive-virtio-disk0 \ -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 \ -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 \ -drive file=/dev/sdfake2,if=none,id=drive-virtio-disk1 \
-device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 \ -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 \ -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 \ -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

View File

@ -16,18 +16,17 @@
<on_crash>restart</on_crash> <on_crash>restart</on_crash>
<devices> <devices>
<emulator>/usr/bin/qemu</emulator> <emulator>/usr/bin/qemu</emulator>
<disk type='block' device='lun'> <disk type='block' device='lun' rawio='yes'>
<driver name='qemu' type='qcow2'/> <driver name='qemu' type='qcow2'/>
<source dev='/dev/sdfake'/> <source dev='/dev/sdfake'/>
<target dev='vda' bus='virtio'/> <target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</disk> </disk>
<disk type='file' device='cdrom'> <disk type='block' device='lun'>
<driver name='qemu' type='raw'/> <driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/> <source dev='/dev/sdfake2'/>
<target dev='hdc' bus='ide'/> <target dev='vdb' bus='virtio'/>
<readonly/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
<address type='drive' controller='0' bus='1' unit='0'/>
</disk> </disk>
<controller type='virtio-serial' index='0'> <controller type='virtio-serial' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>