|
Pablo Greco |
40546a |
From 6dfdc50564c3d2147f36c4cf6c252cad7a0e9381 Mon Sep 17 00:00:00 2001
|
|
Pablo Greco |
40546a |
Message-Id: <6dfdc50564c3d2147f36c4cf6c252cad7a0e9381@dist-git>
|
|
Pablo Greco |
40546a |
From: Michal Privoznik <mprivozn@redhat.com>
|
|
Pablo Greco |
40546a |
Date: Fri, 6 Mar 2020 15:51:46 +0100
|
|
Pablo Greco |
40546a |
Subject: [PATCH] RHEL: virscsi: Introduce and use
|
|
Pablo Greco |
40546a |
virSCSIDeviceGetUnprivSGIOSysfsPath()
|
|
Pablo Greco |
40546a |
|
|
Pablo Greco |
40546a |
When constructing a path to the 'unpriv_sgio' file of given SCSI
|
|
Pablo Greco |
40546a |
device we don't need to go through /dev/* and major() + minor()
|
|
Pablo Greco |
40546a |
path. The generated path points to
|
|
Pablo Greco |
40546a |
/sys/dev/block/MAJ:MIN/queue/unpriv_sgio which is wrong if the
|
|
Pablo Greco |
40546a |
SCSI device in question is not a block device. We can generate a
|
|
Pablo Greco |
40546a |
different path: /sys/bus/scsi/devices/X:X:X:X/unpriv_sgio where
|
|
Pablo Greco |
40546a |
the file is directly accessible regardless of the SCSI device
|
|
Pablo Greco |
40546a |
type.
|
|
Pablo Greco |
40546a |
|
|
Pablo Greco |
40546a |
https://bugzilla.redhat.com/show_bug.cgi?id=1808388
|
|
Pablo Greco |
40546a |
|
|
Pablo Greco |
40546a |
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
|
Pablo Greco |
40546a |
Signed-off-by: Andrea Bolognani <abologna@redhat.com>
|
|
Pablo Greco |
40546a |
Message-Id: <20200306145149.1610286-4-abologna@redhat.com>
|
|
Pablo Greco |
40546a |
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
|
Pablo Greco |
40546a |
---
|
|
Pablo Greco |
40546a |
src/libvirt_private.syms | 1 +
|
|
Pablo Greco |
40546a |
src/qemu/qemu_conf.c | 19 +++++++++++--------
|
|
Pablo Greco |
40546a |
src/util/virscsi.c | 21 +++++++++++++++++++++
|
|
Pablo Greco |
40546a |
src/util/virscsi.h | 5 +++++
|
|
Pablo Greco |
40546a |
4 files changed, 38 insertions(+), 8 deletions(-)
|
|
Pablo Greco |
40546a |
|
|
Pablo Greco |
40546a |
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
|
|
Pablo Greco |
40546a |
index 2ad21a68bc..5e1d73c148 100644
|
|
Pablo Greco |
40546a |
--- a/src/libvirt_private.syms
|
|
Pablo Greco |
40546a |
+++ b/src/libvirt_private.syms
|
|
Pablo Greco |
40546a |
@@ -2727,6 +2727,7 @@ virSCSIDeviceGetSgName;
|
|
Pablo Greco |
40546a |
virSCSIDeviceGetShareable;
|
|
Pablo Greco |
40546a |
virSCSIDeviceGetTarget;
|
|
Pablo Greco |
40546a |
virSCSIDeviceGetUnit;
|
|
Pablo Greco |
40546a |
+virSCSIDeviceGetUnprivSGIOSysfsPath;
|
|
Pablo Greco |
40546a |
virSCSIDeviceIsAvailable;
|
|
Pablo Greco |
40546a |
virSCSIDeviceListAdd;
|
|
Pablo Greco |
40546a |
virSCSIDeviceListCount;
|
|
Pablo Greco |
40546a |
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
|
|
Pablo Greco |
40546a |
index a81298326f..5636277888 100644
|
|
Pablo Greco |
40546a |
--- a/src/qemu/qemu_conf.c
|
|
Pablo Greco |
40546a |
+++ b/src/qemu/qemu_conf.c
|
|
Pablo Greco |
40546a |
@@ -1648,7 +1648,6 @@ qemuSetUnprivSGIO(virDomainDeviceDefPtr dev)
|
|
Pablo Greco |
40546a |
virDomainDiskDefPtr disk = NULL;
|
|
Pablo Greco |
40546a |
virDomainHostdevDefPtr hostdev = NULL;
|
|
Pablo Greco |
40546a |
char *sysfs_path = NULL;
|
|
Pablo Greco |
40546a |
- char *hostdev_path = NULL;
|
|
Pablo Greco |
40546a |
const char *path = NULL;
|
|
Pablo Greco |
40546a |
int val = 0;
|
|
Pablo Greco |
40546a |
int ret = -1;
|
|
Pablo Greco |
40546a |
@@ -1664,24 +1663,29 @@ qemuSetUnprivSGIO(virDomainDeviceDefPtr dev)
|
|
Pablo Greco |
40546a |
return 0;
|
|
Pablo Greco |
40546a |
|
|
Pablo Greco |
40546a |
path = virDomainDiskGetSource(disk);
|
|
Pablo Greco |
40546a |
+
|
|
Pablo Greco |
40546a |
+ if (!(sysfs_path = virGetUnprivSGIOSysfsPath(path, NULL)))
|
|
Pablo Greco |
40546a |
+ goto cleanup;
|
|
Pablo Greco |
40546a |
+
|
|
Pablo Greco |
40546a |
} else if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV) {
|
|
Pablo Greco |
40546a |
hostdev = dev->data.hostdev;
|
|
Pablo Greco |
40546a |
+ virDomainHostdevSubsysSCSIPtr scsisrc = &hostdev->source.subsys.u.scsi;
|
|
Pablo Greco |
40546a |
+ virDomainHostdevSubsysSCSIHostPtr scsihostsrc = &scsisrc->u.host;
|
|
Pablo Greco |
40546a |
|
|
Pablo Greco |
40546a |
if (hostdev->source.subsys.u.scsi.protocol ==
|
|
Pablo Greco |
40546a |
VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI)
|
|
Pablo Greco |
40546a |
return 0;
|
|
Pablo Greco |
40546a |
|
|
Pablo Greco |
40546a |
- if (!(hostdev_path = qemuGetHostdevPath(hostdev)))
|
|
Pablo Greco |
40546a |
+ if (!(sysfs_path = virSCSIDeviceGetUnprivSGIOSysfsPath(NULL,
|
|
Pablo Greco |
40546a |
+ scsihostsrc->adapter,
|
|
Pablo Greco |
40546a |
+ scsihostsrc->bus,
|
|
Pablo Greco |
40546a |
+ scsihostsrc->target,
|
|
Pablo Greco |
40546a |
+ scsihostsrc->unit)))
|
|
Pablo Greco |
40546a |
goto cleanup;
|
|
Pablo Greco |
40546a |
-
|
|
Pablo Greco |
40546a |
- path = hostdev_path;
|
|
Pablo Greco |
40546a |
} else {
|
|
Pablo Greco |
40546a |
return 0;
|
|
Pablo Greco |
40546a |
}
|
|
Pablo Greco |
40546a |
|
|
Pablo Greco |
40546a |
- if (!(sysfs_path = virGetUnprivSGIOSysfsPath(path, NULL)))
|
|
Pablo Greco |
40546a |
- goto cleanup;
|
|
Pablo Greco |
40546a |
-
|
|
Pablo Greco |
40546a |
/* By default, filter the SG_IO commands, i.e. set unpriv_sgio to 0. */
|
|
Pablo Greco |
40546a |
if (dev->type == VIR_DOMAIN_DEVICE_DISK) {
|
|
Pablo Greco |
40546a |
if (disk->sgio == VIR_DOMAIN_DEVICE_SGIO_UNFILTERED)
|
|
Pablo Greco |
40546a |
@@ -1705,7 +1709,6 @@ qemuSetUnprivSGIO(virDomainDeviceDefPtr dev)
|
|
Pablo Greco |
40546a |
ret = 0;
|
|
Pablo Greco |
40546a |
|
|
Pablo Greco |
40546a |
cleanup:
|
|
Pablo Greco |
40546a |
- VIR_FREE(hostdev_path);
|
|
Pablo Greco |
40546a |
VIR_FREE(sysfs_path);
|
|
Pablo Greco |
40546a |
return ret;
|
|
Pablo Greco |
40546a |
}
|
|
Pablo Greco |
40546a |
diff --git a/src/util/virscsi.c b/src/util/virscsi.c
|
|
Pablo Greco |
40546a |
index 6c3fd8a562..5aab43fc88 100644
|
|
Pablo Greco |
40546a |
--- a/src/util/virscsi.c
|
|
Pablo Greco |
40546a |
+++ b/src/util/virscsi.c
|
|
Pablo Greco |
40546a |
@@ -342,6 +342,27 @@ virSCSIDeviceGetDevName(const char *sysfs_prefix,
|
|
Pablo Greco |
40546a |
}
|
|
Pablo Greco |
40546a |
|
|
Pablo Greco |
40546a |
|
|
Pablo Greco |
40546a |
+char *
|
|
Pablo Greco |
40546a |
+virSCSIDeviceGetUnprivSGIOSysfsPath(const char *sysfs_prefix,
|
|
Pablo Greco |
40546a |
+ const char *adapter,
|
|
Pablo Greco |
40546a |
+ unsigned int bus,
|
|
Pablo Greco |
40546a |
+ unsigned int target,
|
|
Pablo Greco |
40546a |
+ unsigned long long unit)
|
|
Pablo Greco |
40546a |
+{
|
|
Pablo Greco |
40546a |
+ char *path = NULL;
|
|
Pablo Greco |
40546a |
+ unsigned int adapter_id;
|
|
Pablo Greco |
40546a |
+ const char *prefix = sysfs_prefix ? sysfs_prefix : SYSFS_SCSI_DEVICES;
|
|
Pablo Greco |
40546a |
+
|
|
Pablo Greco |
40546a |
+ if (virSCSIDeviceGetAdapterId(adapter, &adapter_id) < 0)
|
|
Pablo Greco |
40546a |
+ return NULL;
|
|
Pablo Greco |
40546a |
+
|
|
Pablo Greco |
40546a |
+ ignore_value(virAsprintf(&path,
|
|
Pablo Greco |
40546a |
+ "%s/%d:%u:%u:%llu/unpriv_sgio",
|
|
Pablo Greco |
40546a |
+ prefix, adapter_id, bus, target, unit));
|
|
Pablo Greco |
40546a |
+ return path;
|
|
Pablo Greco |
40546a |
+}
|
|
Pablo Greco |
40546a |
+
|
|
Pablo Greco |
40546a |
+
|
|
Pablo Greco |
40546a |
virSCSIDevicePtr
|
|
Pablo Greco |
40546a |
virSCSIDeviceNew(const char *sysfs_prefix,
|
|
Pablo Greco |
40546a |
const char *adapter,
|
|
Pablo Greco |
40546a |
diff --git a/src/util/virscsi.h b/src/util/virscsi.h
|
|
Pablo Greco |
40546a |
index 9f8b3ecf1e..5dea2a9f5d 100644
|
|
Pablo Greco |
40546a |
--- a/src/util/virscsi.h
|
|
Pablo Greco |
40546a |
+++ b/src/util/virscsi.h
|
|
Pablo Greco |
40546a |
@@ -43,6 +43,11 @@ char *virSCSIDeviceGetDevName(const char *sysfs_prefix,
|
|
Pablo Greco |
40546a |
unsigned int bus,
|
|
Pablo Greco |
40546a |
unsigned int target,
|
|
Pablo Greco |
40546a |
unsigned long long unit);
|
|
Pablo Greco |
40546a |
+char *virSCSIDeviceGetUnprivSGIOSysfsPath(const char *sysfs_prefix,
|
|
Pablo Greco |
40546a |
+ const char *adapter,
|
|
Pablo Greco |
40546a |
+ unsigned int bus,
|
|
Pablo Greco |
40546a |
+ unsigned int target,
|
|
Pablo Greco |
40546a |
+ unsigned long long unit);
|
|
Pablo Greco |
40546a |
|
|
Pablo Greco |
40546a |
virSCSIDevicePtr virSCSIDeviceNew(const char *sysfs_prefix,
|
|
Pablo Greco |
40546a |
const char *adapter,
|
|
Pablo Greco |
40546a |
--
|
|
Pablo Greco |
40546a |
2.25.1
|
|
Pablo Greco |
40546a |
|