render / rpms / libvirt

Forked from rpms/libvirt 4 months ago
Clone
7a3408
From c98b451c7f34d5884a59ae5514cd6334065362b2 Mon Sep 17 00:00:00 2001
7a3408
Message-Id: <c98b451c7f34d5884a59ae5514cd6334065362b2@dist-git>
7a3408
From: John Ferlan <jferlan@redhat.com>
7a3408
Date: Tue, 4 Aug 2015 08:05:52 -0400
7a3408
Subject: [PATCH] conf: Allow error reporting in virDomainDiskSourceIsBlockType
7a3408
7a3408
https://bugzilla.redhat.com/show_bug.cgi?id=1238545
7a3408
7a3408
Rather than provide a somewhat generic error message when the API
7a3408
returns false, allow the caller to supply a "report = true" option
7a3408
in order to cause virReportError's to describe which of the 3 paths
7a3408
that can cause failure.
7a3408
7a3408
Some callers don't care about what caused the failure, they just want
7a3408
to have a true/false - for those, calling with report = false should
7a3408
be sufficient.
7a3408
7a3408
(cherry picked from commit 36025c552cae6c79ab9e54f65e758907845846ac)
7a3408
Signed-off-by: John Ferlan <jferlan@redhat.com>
7a3408
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
7a3408
---
7a3408
 src/conf/domain_conf.c  | 21 ++++++++++++++++++---
7a3408
 src/conf/domain_conf.h  |  2 +-
7a3408
 src/lxc/lxc_cgroup.c    |  2 +-
7a3408
 src/lxc/lxc_driver.c    |  6 ++----
7a3408
 src/qemu/qemu_command.c |  5 +----
7a3408
 src/qemu/qemu_conf.c    |  6 +++---
7a3408
 6 files changed, 26 insertions(+), 16 deletions(-)
7a3408
7a3408
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
7a3408
index d990180..72d87dd 100644
7a3408
--- a/src/conf/domain_conf.c
7a3408
+++ b/src/conf/domain_conf.c
7a3408
@@ -23812,10 +23812,16 @@ virDomainDefFindDevice(virDomainDefPtr def,
7a3408
  * Return true if its source is block type, or false otherwise.
7a3408
  */
7a3408
 bool
7a3408
-virDomainDiskSourceIsBlockType(virStorageSourcePtr src)
7a3408
+virDomainDiskSourceIsBlockType(virStorageSourcePtr src,
7a3408
+                               bool report)
7a3408
 {
7a3408
-    if (!src->path)
7a3408
+    if (!src->path) {
7a3408
+        if (report)
7a3408
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
7a3408
+                           _("source path not found for device='lun' "
7a3408
+                             "using type='%d'"), src->type);
7a3408
         return false;
7a3408
+    }
7a3408
 
7a3408
     if (src->type == VIR_STORAGE_TYPE_BLOCK)
7a3408
         return true;
7a3408
@@ -23831,11 +23837,20 @@ virDomainDiskSourceIsBlockType(virStorageSourcePtr src)
7a3408
          * (e.g. set sgio=filtered|unfiltered for it) in libvirt.
7a3408
          */
7a3408
          if (src->srcpool->pooltype == VIR_STORAGE_POOL_ISCSI &&
7a3408
-             src->srcpool->mode == VIR_STORAGE_SOURCE_POOL_MODE_DIRECT)
7a3408
+             src->srcpool->mode == VIR_STORAGE_SOURCE_POOL_MODE_DIRECT) {
7a3408
+             if (report)
7a3408
+                 virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
7a3408
+                                _("disk device='lun' for iSCSI is not "
7a3408
+                                  "supported with mode='direct'."));
7a3408
              return false;
7a3408
+         }
7a3408
 
7a3408
         return true;
7a3408
     }
7a3408
+    if (report)
7a3408
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
7a3408
+                       _("disk device='lun' is only valid for block "
7a3408
+                         "type disk source"));
7a3408
     return false;
7a3408
 }
7a3408
 
7a3408
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
7a3408
index 0adaefc..604d0b8 100644
7a3408
--- a/src/conf/domain_conf.h
7a3408
+++ b/src/conf/domain_conf.h
7a3408
@@ -3126,7 +3126,7 @@ int virDomainDefFindDevice(virDomainDefPtr def,
7a3408
                            virDomainDeviceDefPtr dev,
7a3408
                            bool reportError);
7a3408
 
7a3408
-bool virDomainDiskSourceIsBlockType(virStorageSourcePtr src)
7a3408
+bool virDomainDiskSourceIsBlockType(virStorageSourcePtr src, bool report)
7a3408
     ATTRIBUTE_NONNULL(1);
7a3408
 
7a3408
 void virDomainChrSourceDefClear(virDomainChrSourceDefPtr def);
7a3408
diff --git a/src/lxc/lxc_cgroup.c b/src/lxc/lxc_cgroup.c
7a3408
index 507d567..e9caa3e 100644
7a3408
--- a/src/lxc/lxc_cgroup.c
7a3408
+++ b/src/lxc/lxc_cgroup.c
7a3408
@@ -382,7 +382,7 @@ static int virLXCCgroupSetupDeviceACL(virDomainDefPtr def,
7a3408
 
7a3408
     VIR_DEBUG("Allowing any disk block devs");
7a3408
     for (i = 0; i < def->ndisks; i++) {
7a3408
-        if (!virDomainDiskSourceIsBlockType(def->disks[i]->src))
7a3408
+        if (!virDomainDiskSourceIsBlockType(def->disks[i]->src, false))
7a3408
             continue;
7a3408
 
7a3408
         if (virCgroupAllowDevicePath(cgroup,
7a3408
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
7a3408
index cc1277b..5ecfc7a 100644
7a3408
--- a/src/lxc/lxc_driver.c
7a3408
+++ b/src/lxc/lxc_driver.c
7a3408
@@ -4069,11 +4069,9 @@ lxcDomainAttachDeviceDiskLive(virLXCDriverPtr driver,
7a3408
         goto cleanup;
7a3408
     }
7a3408
 
7a3408
-    if (!virDomainDiskSourceIsBlockType(def->src)) {
7a3408
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
7a3408
-                       _("Can't setup disk for non-block device"));
7a3408
+    if (!virDomainDiskSourceIsBlockType(def->src, true))
7a3408
         goto cleanup;
7a3408
-    }
7a3408
+
7a3408
     src = virDomainDiskGetSource(def);
7a3408
     if (src == NULL) {
7a3408
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
7a3408
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
7a3408
index 48d2ee0..feba308 100644
7a3408
--- a/src/qemu/qemu_command.c
7a3408
+++ b/src/qemu/qemu_command.c
7a3408
@@ -3453,10 +3453,7 @@ qemuCheckDiskConfig(virDomainDiskDefPtr disk)
7a3408
                                virStorageNetProtocolTypeToString(disk->src->protocol));
7a3408
                 goto error;
7a3408
             }
7a3408
-        } else if (!virDomainDiskSourceIsBlockType(disk->src)) {
7a3408
-            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
7a3408
-                           _("disk device='lun' is only valid for block "
7a3408
-                             "type disk source"));
7a3408
+        } else if (!virDomainDiskSourceIsBlockType(disk->src, true)) {
7a3408
             goto error;
7a3408
         }
7a3408
         if (disk->wwn) {
7a3408
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
7a3408
index d521886..7c2947c 100644
7a3408
--- a/src/qemu/qemu_conf.c
7a3408
+++ b/src/qemu/qemu_conf.c
7a3408
@@ -1178,7 +1178,7 @@ qemuAddSharedDisk(virQEMUDriverPtr driver,
7a3408
     char *key = NULL;
7a3408
     int ret = -1;
7a3408
 
7a3408
-    if (!disk->src->shared || !virDomainDiskSourceIsBlockType(disk->src))
7a3408
+    if (!disk->src->shared || !virDomainDiskSourceIsBlockType(disk->src, false))
7a3408
         return 0;
7a3408
 
7a3408
     qemuDriverLock(driver);
7a3408
@@ -1315,7 +1315,7 @@ qemuRemoveSharedDisk(virQEMUDriverPtr driver,
7a3408
     char *key = NULL;
7a3408
     int ret = -1;
7a3408
 
7a3408
-    if (!disk->src->shared || !virDomainDiskSourceIsBlockType(disk->src))
7a3408
+    if (!disk->src->shared || !virDomainDiskSourceIsBlockType(disk->src, false))
7a3408
         return 0;
7a3408
 
7a3408
     qemuDriverLock(driver);
7a3408
@@ -1400,7 +1400,7 @@ qemuSetUnprivSGIO(virDomainDeviceDefPtr dev)
7a3408
         disk = dev->data.disk;
7a3408
 
7a3408
         if (disk->device != VIR_DOMAIN_DISK_DEVICE_LUN ||
7a3408
-            !virDomainDiskSourceIsBlockType(disk->src))
7a3408
+            !virDomainDiskSourceIsBlockType(disk->src, false))
7a3408
             return 0;
7a3408
 
7a3408
         path = virDomainDiskGetSource(disk);
7a3408
-- 
7a3408
2.5.0
7a3408