]> xenbits.xensource.com Git - libvirt.git/commitdiff
storage: Need to update freeExtent at delete primary partition
authorJohn Ferlan <jferlan@redhat.com>
Fri, 27 Mar 2015 15:04:22 +0000 (11:04 -0400)
committerJohn Ferlan <jferlan@redhat.com>
Thu, 9 Apr 2015 23:04:18 +0000 (19:04 -0400)
Commit id '471e1c4e' only considered updating the pool if the extended
partition was removed. As it turns out removing a primary partition
would also need to update the freeExtent list otherwise the following
sequence would fail (assuming a "fresh" disk pool for /dev/sde of 500M):

$  virsh pool-info disk-pool
...
Capacity:       509.88 MiB
Allocation:     0.00 B
Available:      509.84 MiB

$ virsh vol-create-as disk-pool sde1 --capacity 300M
$ virsh vol-delete --pool disk-pool sde1
$ virsh vol-create-as disk-pool sde1 --capacity 300M
error: Failed to create vol sde1
error: internal error: no large enough free extent

$

This patch will refresh the pool, rereading the partitions, and
return

src/storage/storage_backend_disk.c

index ba928d84e75b24baf7aee11f7e0956e6709ab25a..17c6492f98d777b824ad648fd71815e22e23997f 100644 (file)
@@ -746,10 +746,13 @@ virStorageBackendDiskDeleteVol(virConnectPtr conn,
             goto cleanup;
     }
 
-    /* If this was the extended partition, then all the logical partitions
-     * are then lost. Make it easy on ourselves and just refresh the pool
+    /* If this is not a logical partition, then either we've removed an
+     * extended partition or a primary partion - refresh the pool which
+     * includes resetting the [n]freeExtents data so a subsequent allocation
+     * might be able to use what was deleted.  A logical partition is part
+     * of an extended partition and handled differently
      */
-    if (vol->source.partType == VIR_STORAGE_VOL_DISK_TYPE_EXTENDED) {
+    if (vol->source.partType != VIR_STORAGE_VOL_DISK_TYPE_LOGICAL) {
         virStoragePoolObjClearVols(pool);
         if (virStorageBackendDiskRefreshPool(conn, pool) < 0)
             goto cleanup;