Currently we call virSetDeviceUnprivSGIO with val == 0 if a block device
has an sgio attribute. But for sgio='filtered', we know that a
kernel with no unpriv_sgio support will always behave as the user
wanted. In this case, there is no need to call the function and
report a (bogus) error.
Signed-off-by: Paolo Bonzini <pbonzini(a)redhat.com>
---
src/qemu/qemu_process.c | 35 +++++++++++++++++------------------
1 file changed, 17 insertions(+), 18 deletions(-)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index b560d2e..4c152b2 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -3455,36 +3455,35 @@ qemuProcessReconnectAll(virConnectPtr conn, virQEMUDriverPtr
driver)
int
qemuSetUnprivSGIO(virDomainDiskDefPtr disk)
{
+ char *sysfs_path = NULL;
int val = -1;
+ int ret = 0;
/* "sgio" is only valid for block disk; cdrom
* and floopy disk can have empty source.
*/
if (disk->type != VIR_DOMAIN_DISK_TYPE_BLOCK ||
+ disk->device != VIR_DOMAIN_DISK_DEVICE_LUN ||
!disk->src)
return 0;
- if (disk->sgio)
- val = (disk->sgio == VIR_DOMAIN_DISK_SGIO_UNFILTERED);
-
- /* Ignore the setting if unpriv_sgio is not supported by the
- * kernel, otherwise defaults to filter the SG_IO commands,
- * I.E. Set unpriv_sgio to 0.
- */
- if (disk->sgio == VIR_DOMAIN_DISK_SGIO_DEFAULT &&
- disk->device == VIR_DOMAIN_DISK_DEVICE_LUN) {
- char *sysfs_path = NULL;
+ sysfs_path = virGetUnprivSGIOSysfsPath(disk->src, NULL);
+ if (sysfs_path == NULL)
+ return -1;
- if ((sysfs_path = virGetUnprivSGIOSysfsPath(disk->src, NULL)) &&
- virFileExists(sysfs_path))
- val = 0;
- VIR_FREE(sysfs_path);
- }
+ /* By default, filter the SG_IO commands, i.e. set unpriv_sgio to 0. */
+ val = (disk->sgio == VIR_DOMAIN_DISK_SGIO_UNFILTERED);
- if (val >= 0 && virSetDeviceUnprivSGIO(disk->src, NULL, val) < 0)
- return -1;
+ /* Do not do anything if unpriv_sgio is not supported by the kernel and the
+ * whitelist is enabled. But if requesting unfiltered access, always call
+ * virSetDeviceUnprivSGIO, to report an error for unsupported unpriv_sgio.
+ */
+ if ((virFileExists(sysfs_path) || val == 1) &&
+ virSetDeviceUnprivSGIO(disk->src, NULL, val) < 0)
+ ret = -1;
- return 0;
+ VIR_FREE(sysfs_path);
+ return ret;
}
int qemuProcessStart(virConnectPtr conn,
--
1.8.1.2