[libvirt] [PATCH 23/25] qemu: Refactor qemuSetUnprivSGIO to support scsi host device

Osier Yang jyang at redhat.com
Fri May 3 18:07:42 UTC 2013


Just like what previous patches do, it refactors qemuSetUnprivSGIO
to take the virDomainDeviceDefPtr as argument instead.
---
 src/qemu/qemu_conf.c    | 67 ++++++++++++++++++++++++++++++++++++++++---------
 src/qemu/qemu_conf.h    |  2 +-
 src/qemu/qemu_driver.c  |  2 +-
 src/qemu/qemu_process.c |  2 +-
 4 files changed, 58 insertions(+), 15 deletions(-)

diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index b7dea57..cf1c7ee 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -1309,39 +1309,82 @@ cleanup:
 }
 
 int
-qemuSetUnprivSGIO(virDomainDiskDefPtr disk)
+qemuSetUnprivSGIO(virDomainDeviceDefPtr dev)
 {
+    virDomainDiskDefPtr disk = NULL;
+    virDomainHostdevDefPtr hostdev = NULL;
     char *sysfs_path = NULL;
+    char *path = NULL;
+    char *hostdev_name = NULL;
+    char *hostdev_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->src ||
-        disk->device != VIR_DOMAIN_DISK_DEVICE_LUN ||
-        (disk->type != VIR_DOMAIN_DISK_TYPE_BLOCK &&
-         !(disk->type == VIR_DOMAIN_DISK_TYPE_VOLUME &&
-           disk->srcpool &&
-           disk->srcpool->voltype == VIR_STORAGE_VOL_BLOCK)))
+    if (dev->type == VIR_DOMAIN_DEVICE_DISK) {
+        disk = dev->data.disk;
+
+        if (!disk->src ||
+            disk->device != VIR_DOMAIN_DISK_DEVICE_LUN ||
+            (disk->type != VIR_DOMAIN_DISK_TYPE_BLOCK &&
+             !(disk->type == VIR_DOMAIN_DISK_TYPE_VOLUME &&
+               disk->srcpool &&
+               disk->srcpool->voltype == VIR_STORAGE_VOL_BLOCK)))
+            return 0;
+
+        path = disk->src;
+    } else if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV) {
+        hostdev = dev->data.hostdev;
+
+        if (!hostdev->shareable ||
+            (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
+             hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI))
+            return 0;
+
+        if (!(hostdev_name = virSCSIDeviceGetDevName(hostdev->source.subsys.u.scsi.adapter,
+                                                     hostdev->source.subsys.u.scsi.bus,
+                                                     hostdev->source.subsys.u.scsi.target,
+                                                     hostdev->source.subsys.u.scsi.unit)))
+            goto cleanup;
+
+        if (virAsprintf(&hostdev_path, "/dev/%s", hostdev_name) < 0) {
+            virReportOOMError();
+            goto cleanup;
+        }
+
+        path = hostdev_path;
+    } else {
         return 0;
+    }
 
-    sysfs_path = virGetUnprivSGIOSysfsPath(disk->src, NULL);
-    if (sysfs_path == NULL)
-        return -1;
+    sysfs_path = virGetUnprivSGIOSysfsPath(path, NULL);
+    if (sysfs_path == NULL) {
+        ret = -1;
+        goto cleanup;
+    }
 
     /* By default, filter the SG_IO commands, i.e. set unpriv_sgio to 0.  */
-    val = (disk->sgio == VIR_DOMAIN_DEVICE_SGIO_UNFILTERED);
+
+    if (dev->type == VIR_DOMAIN_DEVICE_DISK)
+        val = (disk->sgio == VIR_DOMAIN_DEVICE_SGIO_UNFILTERED);
+    else
+        val = (hostdev->source.subsys.u.scsi.sgio ==
+               VIR_DOMAIN_DEVICE_SGIO_UNFILTERED);
 
     /* 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)
+        virSetDeviceUnprivSGIO(path, NULL, val) < 0)
         ret = -1;
 
+cleanup:
     VIR_FREE(sysfs_path);
+    VIR_FREE(hostdev_name);
+    VIR_FREE(hostdev_path);
     return ret;
 }
 
diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
index 5e76739..2483fd6 100644
--- a/src/qemu/qemu_conf.h
+++ b/src/qemu/qemu_conf.h
@@ -299,7 +299,7 @@ int qemuRemoveSharedDevice(virQEMUDriverPtr driver,
                            const char *name)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
 
-int qemuSetUnprivSGIO(virDomainDiskDefPtr disk);
+int qemuSetUnprivSGIO(virDomainDeviceDefPtr dev);
 
 int qemuDriverAllocateID(virQEMUDriverPtr driver);
 virDomainXMLOptionPtr virQEMUDriverCreateXMLConf(virQEMUDriverPtr driver);
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 991b68b..f523f03 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -5651,7 +5651,7 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn,
     if (qemuAddSharedDevice(driver, dev, vm->def->name) < 0)
         goto end;
 
-    if (qemuSetUnprivSGIO(disk) < 0)
+    if (qemuSetUnprivSGIO(dev) < 0)
         goto end;
 
     if (qemuDomainDetermineDiskChain(driver, disk, false) < 0)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index eb42df1..a6d58cb 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -3645,7 +3645,7 @@ int qemuProcessStart(virConnectPtr conn,
         if (qemuAddSharedDevice(driver, &dev, vm->def->name) < 0)
             goto cleanup;
 
-        if (qemuSetUnprivSGIO(disk) < 0)
+        if (qemuSetUnprivSGIO(&dev) < 0)
             goto cleanup;
     }
 
-- 
1.8.1.4




More information about the libvir-list mailing list