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