]> xenbits.xensource.com Git - libvirt.git/commitdiff
* src/storage_backend_scsi.[ch]: add SCSI storage rescan support,
authorDaniel Veillard <veillard@redhat.com>
Tue, 7 Apr 2009 12:50:17 +0000 (12:50 +0000)
committerDaniel Veillard <veillard@redhat.com>
Tue, 7 Apr 2009 12:50:17 +0000 (12:50 +0000)
  patch by David Allan
daniel

ChangeLog
src/storage_backend_scsi.c
src/storage_backend_scsi.h

index 5142416394b1d79ba38a26f70c84bba50d6219d7..420d425d2cb825eb164ccb86f020ff7d98329761 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Tue Apr  7 14:48:35 CEST 2009 Daniel Veillard <veillard@redhat.com>
+
+       * src/storage_backend_scsi.[ch]: add SCSI storage rescan support,
+         patch by David Allan
+
 Fri Apr  3 16:47:22 CEST 2009 Daniel Veillard <veillard@redhat.com>
 
        * configure.in libvirt.spec.in NEWS docs/*: release of 0.6.2
index b3e6180cb6832f20847d826da050fd8c8b2a693d..1d2378b5b2374e040358869a3546c0c26df093fb 100644 (file)
@@ -565,6 +565,53 @@ out:
 }
 
 
+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 free_path;
+    }
+
+    if (safewrite(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;
+    }
+
+    close(fd);
+free_path:
+    VIR_FREE(path);
+out:
+    VIR_DEBUG(_("Rescan of host %d complete"), host);
+    return retval;
+}
+
+
 static int
 virStorageBackendSCSIRefreshPool(virConnectPtr conn,
                                  virStoragePoolObjPtr pool)
@@ -575,13 +622,19 @@ virStorageBackendSCSIRefreshPool(virConnectPtr conn,
     pool->def->allocation = pool->def->capacity = pool->def->available = 0;
 
     if (sscanf(pool->def->source.adapter, "host%u", &host) != 1) {
-        VIR_DEBUG(_("Failed to get host number from '%s'"), pool->def->source.adapter);
+        VIR_DEBUG(_("Failed to get host number from '%s'"),
+                    pool->def->source.adapter);
         retval = -1;
         goto out;
     }
 
     VIR_DEBUG(_("Scanning host%u"), host);
 
+    if (virStorageBackendSCSITriggerRescan(conn, host) < 0) {
+        retval = -1;
+        goto out;
+    }
+
     virStorageBackendSCSIFindLUs(conn, pool, host);
 
 out:
index 808d47bad761310e285cf61f681e9a08dbcdf78e..d13008691e749a47127800e99849a251f7ea94ef 100644 (file)
@@ -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;