[libvirt] [PATCH 1/4] conf: add rawio attribute to disk element of domain XML

Taku Izumi izumi.taku at jp.fujitsu.com
Mon Jan 30 09:08:35 UTC 2012


 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 at 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;




More information about the libvir-list mailing list