]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
storage: When delete volume avoid disk backend removal
authorJohn Ferlan <jferlan@redhat.com>
Tue, 9 Jan 2018 13:40:24 +0000 (08:40 -0500)
committerJohn Ferlan <jferlan@redhat.com>
Wed, 10 Jan 2018 13:10:23 +0000 (08:10 -0500)
For a disk backend, the deleteVol code will clear all the
volumes in the pool and perform a pool refresh, thus the
storageVolDeleteInternal should not use access @voldef
after deleteVol succeeds.

src/storage/storage_driver.c

index f590f6b9be30257b872027c74fbe360850f59347..3b66d517191bf726bcf00dbd3aad17ff99561321 100644 (file)
@@ -1670,15 +1670,21 @@ storageVolDeleteInternal(virStorageVolPtr vol,
     if (backend->deleteVol(vol->conn, obj, voldef, flags) < 0)
         goto cleanup;
 
+    /* The disk backend updated the pool data including removing the
+     * voldef from the pool (for both the deleteVol and the createVol
+     * failure path. */
+    if (def->type == VIR_STORAGE_POOL_DISK) {
+        ret = 0;
+        goto cleanup;
+    }
+
     /* Update pool metadata - don't update meta data from error paths
      * in this module since the allocation/available weren't adjusted yet.
      * Ignore the disk backend since it updates the pool values.
      */
     if (updateMeta) {
-        if (def->type != VIR_STORAGE_POOL_DISK) {
-            def->allocation -= voldef->target.allocation;
-            def->available += voldef->target.allocation;
-        }
+        def->allocation -= voldef->target.allocation;
+        def->available += voldef->target.allocation;
     }
 
     virStoragePoolObjRemoveVol(obj, voldef);