]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Allow storage driver to handle daemon restarts
authorDaniel P. Berrange <berrange@redhat.com>
Tue, 20 Jan 2009 22:43:07 +0000 (22:43 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 20 Jan 2009 22:43:07 +0000 (22:43 +0000)
ChangeLog
src/storage_backend_iscsi.c
src/storage_driver.c

index bc2cac37b23d769cf3c72ddd3f987033ec9b07bd..c6ac7253ba1c116fd278df6645ca0c44b163e40d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Tue Jan 20 22:39:53 GMT 2009 Daniel P. Berrange <berrange@redhat.com>
+
+       Properly handle daemon restarts with storage driver
+       * src/storage_backend_iscsi.c: Detect if already logged into
+       an iSCSI target
+       * src/storage_driver.c: Don't shutdown storage when daemon
+       shuts down
+
 Tue Jan 20 22:25:53 GMT 2009 Daniel P. Berrange <berrange@redhat.com>
 
        Allow virtual networks to survive a daemon restart
index ff73fcaf88813951f97fcfbe0f6c08aec798e463..1d909c5c10f0b5404183e2e3e29c4c33815d3cc7 100644 (file)
@@ -107,7 +107,8 @@ virStorageBackendISCSIExtractSession(virConnectPtr conn,
 
 static char *
 virStorageBackendISCSISession(virConnectPtr conn,
-                              virStoragePoolObjPtr pool)
+                              virStoragePoolObjPtr pool,
+                              int probe)
 {
     /*
      * # iscsiadm --mode session
@@ -141,7 +142,8 @@ virStorageBackendISCSISession(virConnectPtr conn,
                                       NULL) < 0)
         return NULL;
 
-    if (session == NULL) {
+    if (session == NULL &&
+        !probe) {
         virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
                               "%s", _("cannot find session"));
         return NULL;
@@ -573,6 +575,7 @@ virStorageBackendISCSIStartPool(virConnectPtr conn,
                                 virStoragePoolObjPtr pool)
 {
     char *portal = NULL;
+    char *session;
 
     if (pool->def->source.host.name == NULL) {
         virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
@@ -587,13 +590,17 @@ virStorageBackendISCSIStartPool(virConnectPtr conn,
         return -1;
     }
 
-    if ((portal = virStorageBackendISCSIPortal(conn, pool)) == NULL)
-        return -1;
-    if (virStorageBackendISCSILogin(conn, pool, portal) < 0) {
+    if ((session = virStorageBackendISCSISession(conn, pool, 1)) == NULL) {
+        if ((portal = virStorageBackendISCSIPortal(conn, pool)) == NULL)
+            return -1;
+        if (virStorageBackendISCSILogin(conn, pool, portal) < 0) {
+            VIR_FREE(portal);
+            return -1;
+        }
         VIR_FREE(portal);
-        return -1;
+    } else {
+        VIR_FREE(session);
     }
-    VIR_FREE(portal);
     return 0;
 }
 
@@ -607,7 +614,7 @@ virStorageBackendISCSIRefreshPool(virConnectPtr conn,
 
     virStorageBackendWaitForDevices(conn);
 
-    if ((session = virStorageBackendISCSISession(conn, pool)) == NULL)
+    if ((session = virStorageBackendISCSISession(conn, pool, 0)) == NULL)
         goto cleanup;
     if (virStorageBackendISCSIRescanLUNs(conn, pool, session) < 0)
         goto cleanup;
index 0e7a7e753bcbe9d412c4776f5600c741b8e9725e..6ca5c1e5ba31668ca4116ca8fadfb0f887d31a52 100644 (file)
@@ -238,32 +238,10 @@ storageDriverActive(void) {
  */
 static int
 storageDriverShutdown(void) {
-    unsigned int i;
-
     if (!driverState)
         return -1;
 
     storageDriverLock(driverState);
-    /* shutdown active pools */
-    for (i = 0 ; i < driverState->pools.count ; i++) {
-        virStoragePoolObjPtr pool = driverState->pools.objs[i];
-
-        if (virStoragePoolObjIsActive(pool)) {
-            virStorageBackendPtr backend;
-            if ((backend = virStorageBackendForType(pool->def->type)) == NULL) {
-                storageLog("Missing backend");
-                continue;
-            }
-
-            if (backend->stopPool &&
-                backend->stopPool(NULL, pool) < 0) {
-                virErrorPtr err = virGetLastError();
-                storageLog("Failed to stop storage pool '%s': %s",
-                           pool->def->name, err ? err->message : NULL);
-            }
-            virStoragePoolObjClearVols(pool);
-        }
-    }
 
     /* free inactive pools */
     virStoragePoolObjListFree(&driverState->pools);