]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
qemu: Refactor qemuSetUnprivSGIO to support scsi host device
authorOsier Yang <jyang@redhat.com>
Fri, 3 May 2013 18:07:42 +0000 (02:07 +0800)
committerOsier Yang <jyang@redhat.com>
Thu, 16 May 2013 16:57:01 +0000 (00:57 +0800)
Just like what previous patches do, it refactors qemuSetUnprivSGIO
to take the virDomainDeviceDefPtr as argument instead.

src/qemu/qemu_conf.c
src/qemu/qemu_conf.h
src/qemu/qemu_driver.c
src/qemu/qemu_process.c

index 21685e1ca0f6f19b1da7381869ff3fd5d4372107..098e49c143be9464c7a56120b3f51f3367a1c7d1 100644 (file)
@@ -1341,39 +1341,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;
 }
 
index 25350ddec5a499c61a9c9fc5df34d064208b0cee..df0791ec049d0a112c23793e36c7bed4490d6b2c 100644 (file)
@@ -305,7 +305,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);
index d1708cea7746ca70896502c8e79468e2f4c397db..1933c8f26944843bef9b8d5ae7adff7b54b75ee8 100644 (file)
@@ -5734,7 +5734,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)
index c25769da59acde245bbfa71b6bda8e02a689ad14..4a7c6127d55cb4ceebac8e4f357da07ec11cb6e5 100644 (file)
@@ -3669,7 +3669,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;
     }