From 36025c552cae6c79ab9e54f65e758907845846ac Mon Sep 17 00:00:00 2001 From: John Ferlan Date: Sat, 18 Jul 2015 07:34:34 -0400 Subject: [PATCH] conf: Allow error reporting in virDomainDiskSourceIsBlockType Rather than provide a somewhat generic error message when the API returns false, allow the caller to supply a "report = true" option in order to cause virReportError's to describe which of the 3 paths that can cause failure. Some callers don't care about what caused the failure, they just want to have a true/false - for those, calling with report = false should be sufficient. --- src/conf/domain_conf.c | 21 ++++++++++++++++++--- src/conf/domain_conf.h | 2 +- src/lxc/lxc_cgroup.c | 2 +- src/lxc/lxc_driver.c | 6 ++---- src/qemu/qemu_command.c | 5 +---- src/qemu/qemu_conf.c | 6 +++--- 6 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 77a50c35b7..ab96354edc 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -23995,10 +23995,16 @@ virDomainDefFindDevice(virDomainDefPtr def, * Return true if its source is block type, or false otherwise. */ bool -virDomainDiskSourceIsBlockType(virStorageSourcePtr src) +virDomainDiskSourceIsBlockType(virStorageSourcePtr src, + bool report) { - if (!src->path) + if (!src->path) { + if (report) + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("source path not found for device='lun' " + "using type='%d'"), src->type); return false; + } if (src->type == VIR_STORAGE_TYPE_BLOCK) return true; @@ -24014,11 +24020,20 @@ virDomainDiskSourceIsBlockType(virStorageSourcePtr src) * (e.g. set sgio=filtered|unfiltered for it) in libvirt. */ if (src->srcpool->pooltype == VIR_STORAGE_POOL_ISCSI && - src->srcpool->mode == VIR_STORAGE_SOURCE_POOL_MODE_DIRECT) + src->srcpool->mode == VIR_STORAGE_SOURCE_POOL_MODE_DIRECT) { + if (report) + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("disk device='lun' for iSCSI is not " + "supported with mode='direct'.")); return false; + } return true; } + if (report) + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("disk device='lun' is only valid for block " + "type disk source")); return false; } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 0fe6b1a47c..698a4d245a 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3128,7 +3128,7 @@ int virDomainDefFindDevice(virDomainDefPtr def, virDomainDeviceDefPtr dev, bool reportError); -bool virDomainDiskSourceIsBlockType(virStorageSourcePtr src) +bool virDomainDiskSourceIsBlockType(virStorageSourcePtr src, bool report) ATTRIBUTE_NONNULL(1); void virDomainChrSourceDefClear(virDomainChrSourceDefPtr def); diff --git a/src/lxc/lxc_cgroup.c b/src/lxc/lxc_cgroup.c index 507d56759f..e9caa3e68a 100644 --- a/src/lxc/lxc_cgroup.c +++ b/src/lxc/lxc_cgroup.c @@ -382,7 +382,7 @@ static int virLXCCgroupSetupDeviceACL(virDomainDefPtr def, VIR_DEBUG("Allowing any disk block devs"); for (i = 0; i < def->ndisks; i++) { - if (!virDomainDiskSourceIsBlockType(def->disks[i]->src)) + if (!virDomainDiskSourceIsBlockType(def->disks[i]->src, false)) continue; if (virCgroupAllowDevicePath(cgroup, diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 81bb71186c..d8d5119843 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -4069,11 +4069,9 @@ lxcDomainAttachDeviceDiskLive(virLXCDriverPtr driver, goto cleanup; } - if (!virDomainDiskSourceIsBlockType(def->src)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Can't setup disk for non-block device")); + if (!virDomainDiskSourceIsBlockType(def->src, true)) goto cleanup; - } + src = virDomainDiskGetSource(def); if (src == NULL) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 501c7df048..c8522fb81c 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -3476,10 +3476,7 @@ qemuCheckDiskConfig(virDomainDiskDefPtr disk) virStorageNetProtocolTypeToString(disk->src->protocol)); goto error; } - } else if (!virDomainDiskSourceIsBlockType(disk->src)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("disk device='lun' is only valid for block " - "type disk source")); + } else if (!virDomainDiskSourceIsBlockType(disk->src, true)) { goto error; } if (disk->wwn) { diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index 29049dc495..da26c2d80e 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -1210,7 +1210,7 @@ qemuAddSharedDisk(virQEMUDriverPtr driver, char *key = NULL; int ret = -1; - if (!disk->src->shared || !virDomainDiskSourceIsBlockType(disk->src)) + if (!disk->src->shared || !virDomainDiskSourceIsBlockType(disk->src, false)) return 0; qemuDriverLock(driver); @@ -1355,7 +1355,7 @@ qemuRemoveSharedDisk(virQEMUDriverPtr driver, char *key = NULL; int ret = -1; - if (!disk->src->shared || !virDomainDiskSourceIsBlockType(disk->src)) + if (!disk->src->shared || !virDomainDiskSourceIsBlockType(disk->src, false)) return 0; qemuDriverLock(driver); @@ -1443,7 +1443,7 @@ qemuSetUnprivSGIO(virDomainDeviceDefPtr dev) disk = dev->data.disk; if (disk->device != VIR_DOMAIN_DISK_DEVICE_LUN || - !virDomainDiskSourceIsBlockType(disk->src)) + !virDomainDiskSourceIsBlockType(disk->src, false)) return 0; path = virDomainDiskGetSource(disk); -- GitLab