[libvirt] [PATCH 1/1] Add trigger of host rescan

David Allan dallan at redhat.com
Fri Apr 3 20:53:07 UTC 2009


The scsi host code does not currently rescan for new LUs when refreshing a pool.  This patch causes a scan for new LUs on all targets.  It does not cause a LIP.
---
 src/storage_backend_scsi.c |   77 ++++++++++++++++++++++++++++++++++++++++++++
 src/storage_backend_scsi.h |    1 +
 2 files changed, 78 insertions(+), 0 deletions(-)

diff --git a/src/storage_backend_scsi.c b/src/storage_backend_scsi.c
index a962d1c..e30b3ce 100644
--- a/src/storage_backend_scsi.c
+++ b/src/storage_backend_scsi.c
@@ -480,6 +480,76 @@ out:
 
 
 static int
+virStorageBackendSCSIStartPool(virConnectPtr conn ATTRIBUTE_UNUSED,
+                               virStoragePoolObjPtr pool ATTRIBUTE_UNUSED)
+{
+    int retval = 0;
+
+    return retval;
+}
+
+
+static int
+virStorageBackendSCSIStopPool(virConnectPtr conn ATTRIBUTE_UNUSED,
+                              virStoragePoolObjPtr pool ATTRIBUTE_UNUSED)
+{
+    int retval = 0;
+
+    return retval;
+}
+
+
+static int
+virStorageBackendSCSITriggerRescan(virConnectPtr conn,
+                                   uint32_t host)
+{
+    int fd = -1;
+    int retval = 0;
+    char *path;
+
+    VIR_DEBUG(_("Triggering rescan of host %d"), host);
+
+    if (virAsprintf(&path, "/sys/class/scsi_host/host%u/scan", host) < 0) {
+        virReportOOMError(conn);
+        retval = -1;
+        goto out;
+    }
+
+    VIR_DEBUG(_("Scan trigger path is '%s'"), path);
+
+    fd = open(path, O_WRONLY);
+
+    if (fd < 0) {
+        virReportSystemError(conn, errno,
+                             _("Could not open '%s' to trigger host scan"),
+                             path);
+        retval = -1;
+        goto cleanup;
+    }
+
+    if (write(fd,
+              LINUX_SYSFS_SCSI_HOST_SCAN_STRING,
+              sizeof(LINUX_SYSFS_SCSI_HOST_SCAN_STRING)) < 0) {
+
+        virReportSystemError(conn, errno,
+                             _("Write to '%s' to trigger host scan failed"),
+                             path);
+        retval = -1;
+        goto cleanup;
+    }
+
+    goto out;
+
+cleanup:
+    VIR_FREE(path);
+
+out:
+    VIR_DEBUG(_("Rescan of host %d complete"), host);
+    return retval;
+}
+
+
+static int
 virStorageBackendSCSIRefreshPool(virConnectPtr conn,
                                  virStoragePoolObjPtr pool)
 {
@@ -496,6 +566,11 @@ virStorageBackendSCSIRefreshPool(virConnectPtr conn,
 
     VIR_DEBUG(_("Scanning host%u"), host);
 
+    if (virStorageBackendSCSITriggerRescan(conn, host) < 0) {
+        retval = -1;
+        goto out;
+    }
+
     virStorageBackendSCSIFindLUs(conn, pool, host);
 
 out:
@@ -506,5 +581,7 @@ out:
 virStorageBackend virStorageBackendSCSI = {
     .type = VIR_STORAGE_POOL_SCSI,
 
+    .startPool = virStorageBackendSCSIStartPool,
     .refreshPool = virStorageBackendSCSIRefreshPool,
+    .stopPool = virStorageBackendSCSIStopPool,
 };
diff --git a/src/storage_backend_scsi.h b/src/storage_backend_scsi.h
index 808d47b..d130086 100644
--- a/src/storage_backend_scsi.h
+++ b/src/storage_backend_scsi.h
@@ -28,6 +28,7 @@
 
 #define LINUX_SYSFS_SCSI_HOST_PREFIX "/sys/class/scsi_host"
 #define LINUX_SYSFS_SCSI_HOST_POSTFIX "device"
+#define LINUX_SYSFS_SCSI_HOST_SCAN_STRING "- - -"
 
 extern virStorageBackend virStorageBackendSCSI;
 
-- 
1.6.0.6




More information about the libvir-list mailing list