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(a)jp.fujitsu.com>
---
docs/formatdomain.html.in | 7 +++++--
docs/schemas/domaincommon.rng | 8 ++++++++
src/conf/domain_conf.c | 36 ++++++++++++++++++++++++++++++++++++
src/conf/domain_conf.h | 3 +++
4 files changed, 52 insertions(+), 2 deletions(-)
Index: libvirt/docs/schemas/domaincommon.rng
===================================================================
--- libvirt.orig/docs/schemas/domaincommon.rng
+++ libvirt/docs/schemas/domaincommon.rng
@@ -806,6 +806,14 @@
</attribute>
</optional>
<optional>
+ <attribute name="rawio">
+ <choice>
+ <value>yes</value>
+ <value>no</value>
+ </choice>
+ </attribute>
+ </optional>
+ <optional>
<ref name="snapshot"/>
</optional>
<choice>
Index: libvirt/src/conf/domain_conf.c
===================================================================
--- libvirt.orig/src/conf/domain_conf.c
+++ libvirt/src/conf/domain_conf.c
@@ -30,6 +30,7 @@
#include <dirent.h>
#include <sys/time.h>
#include <strings.h>
+#include <linux/capability.h>
#include "virterror_internal.h"
#include "datatypes.h"
@@ -2751,6 +2752,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;
@@ -2795,6 +2797,8 @@ virDomainDiskDefParseXML(virCapsPtr caps
snapshot = virXMLPropString(node, "snapshot");
+ rawio = virXMLPropString(node, "rawio");
+
cur = node->children;
while (cur != NULL) {
if (cur->type == XML_ELEMENT_NODE) {
@@ -3103,6 +3107,26 @@ virDomainDiskDefParseXML(virCapsPtr caps
def->snapshot = VIR_DOMAIN_DISK_SNAPSHOT_NO;
}
+ def->rawio = -1; /* unspecified */
+ if (rawio) {
+ 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_INTERNAL_ERROR,
+ _("unknown disk rawio setting
'%s'"),
+ rawio);
+ goto error;
+ }
+ } else {
+ virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("rawio can be used only with
device='lun'"));
+ goto error;
+ }
+ }
+
if (bus) {
if ((def->bus = virDomainDiskBusTypeFromString(bus)) < 0) {
virDomainReportError(VIR_ERR_INTERNAL_ERROR,
@@ -7517,6 +7541,13 @@ static virDomainDefPtr virDomainDefParse
if (!disk)
goto error;
+ /* cap_sys_rawio check */
+ if (disk->rawio == 1 &&
+ (def->process_caps & (1ULL << CAP_SYS_RAWIO)) == 0) {
+ def->process_caps |= (1ULL << CAP_SYS_RAWIO);
+ VIR_WARN("domain %s will be granted CAP_SYS_RAWIO", def->name);
+ }
+
virDomainDiskInsertPreAlloced(def, disk);
}
VIR_FREE(nodes);
@@ -9930,6 +9961,11 @@ virDomainDiskDefFormat(virBufferPtr buf,
virBufferAsprintf(buf,
" <disk type='%s' device='%s'",
type, device);
+ 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'",
Index: libvirt/src/conf/domain_conf.h
===================================================================
--- libvirt.orig/src/conf/domain_conf.h
+++ libvirt/src/conf/domain_conf.h
@@ -401,6 +401,7 @@ struct _virDomainDiskDef {
unsigned int transient : 1;
virDomainDeviceInfo info;
virStorageEncryptionPtr encryption;
+ int rawio; /* unspecified:-1 no:0 yes:1 */
};
@@ -1464,6 +1465,8 @@ struct _virDomainDef {
char *emulator;
int features;
+ unsigned long long process_caps;
+
virDomainClockDef clock;
int ngraphics;
Index: libvirt/docs/formatdomain.html.in
===================================================================
--- libvirt.orig/docs/formatdomain.html.in
+++ libvirt/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 <code>snapshot</code> attribute indicates the default
+ SCSI commands, making it identical to device='disk').
+ 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"
requires a file format such as qcow2 that can store both the
snapshot and the data changes since the snapshot;