[libvirt] PATCH: Don't stop storage pools on daemon shutdown

Daniel P. Berrange berrange at redhat.com
Tue Jan 13 21:28:15 UTC 2009


Tearing a guest's storage out from under its feet on libvirtd shutdown
is just as bad as tearing out its network :-) This patch removes the
code which shuts down storage pool when the daemon shuts down. So NFS
mounts stay around, LVM VGs remain active, and iSCSI connections remain
logged in. When we then start up again, we happily detect that these
resources are already running, and mark the pool as such

Daniel

diff --git a/src/storage_backend_iscsi.c b/src/storage_backend_iscsi.c
--- a/src/storage_backend_iscsi.c
+++ b/src/storage_backend_iscsi.c
@@ -573,6 +573,7 @@ virStorageBackendISCSIStartPool(virConne
                                 virStoragePoolObjPtr pool)
 {
     char *portal = NULL;
+    char *session;
 
     if (pool->def->source.host.name == NULL) {
         virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
@@ -587,13 +588,17 @@ virStorageBackendISCSIStartPool(virConne
         return -1;
     }
 
-    if ((portal = virStorageBackendISCSIPortal(conn, pool)) == NULL)
-        return -1;
-    if (virStorageBackendISCSILogin(conn, pool, portal) < 0) {
+    if ((session = virStorageBackendISCSISession(conn, pool)) == 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;
 }
 
diff --git a/src/storage_driver.c b/src/storage_driver.c
--- a/src/storage_driver.c
+++ b/src/storage_driver.c
@@ -241,32 +241,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);

-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list