]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
Simplify allocation check in storageVolResize
authorJán Tomko <jtomko@redhat.com>
Wed, 27 May 2015 13:39:07 +0000 (15:39 +0200)
committerJán Tomko <jtomko@redhat.com>
Thu, 28 May 2015 12:10:09 +0000 (14:10 +0200)
Since shrinking a volume below existing allocation is not allowed,
it is not possible for a successful resize with VOL_RESIZE_ALLOCATE
to increase the pool's available value.

Even with the SHRINK flag it is possible to extend the current
allocation or even the capacity. Remove the overflow when
computing delta with this flag and do the check even if the
flag was specified.

https://bugzilla.redhat.com/show_bug.cgi?id=1073305

src/storage/storage_driver.c

index ac4a74a1a87ca99e61b79bec802cd085ff987e32..5312032366833b71c721c08fa376f89c9f46c0ec 100644 (file)
@@ -2292,7 +2292,7 @@ storageVolResize(virStorageVolPtr obj,
     virStorageBackendPtr backend;
     virStoragePoolObjPtr pool = NULL;
     virStorageVolDefPtr vol = NULL;
-    unsigned long long abs_capacity, delta;
+    unsigned long long abs_capacity, delta = 0;
     int ret = -1;
 
     virCheckFlags(VIR_STORAGE_VOL_RESIZE_ALLOCATE |
@@ -2341,18 +2341,10 @@ storageVolResize(virStorageVolPtr obj,
         goto cleanup;
     }
 
-    if (flags & VIR_STORAGE_VOL_RESIZE_SHRINK)
-        delta = vol->target.allocation - abs_capacity;
-    else
+    if (flags & VIR_STORAGE_VOL_RESIZE_ALLOCATE)
         delta = abs_capacity - vol->target.allocation;
 
-    /* If the operation is going to increase the allocation value and not
-     * just the capacity value, then let's make sure there's enough space
-     * in the pool in order to perform that operation
-     */
-    if (flags & VIR_STORAGE_VOL_RESIZE_ALLOCATE &&
-        !(flags & VIR_STORAGE_VOL_RESIZE_SHRINK) &&
-        delta > pool->def->available) {
+    if (delta > pool->def->available) {
         virReportError(VIR_ERR_OPERATION_FAILED, "%s",
                        _("Not enough space left in storage pool"));
         goto cleanup;
@@ -2375,15 +2367,8 @@ storageVolResize(virStorageVolPtr obj,
      */
     if (flags & VIR_STORAGE_VOL_RESIZE_ALLOCATE) {
         vol->target.allocation = abs_capacity;
-
-        /* Update pool metadata */
-        if (flags & VIR_STORAGE_VOL_RESIZE_SHRINK) {
-           pool->def->allocation -= delta;
-           pool->def->available += delta;
-        } else {
-           pool->def->allocation += delta;
-           pool->def->available -= delta;
-        }
+        pool->def->allocation += delta;
+        pool->def->available -= delta;
     }
 
     ret = 0;