[libvirt] [PATCH 1/3] Simplify allocation check in storageVolResize
John Ferlan
jferlan at redhat.com
Wed May 27 19:03:04 UTC 2015
On 05/27/2015 11:08 AM, Ján Tomko wrote:
> The volume cannot be shrinked below existing allocation, thus
> a successful resize with VOL_RESIZE_ALLOCATE will never increase
> the pool's available value.
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
Editorial comment:
This bz should go back to POST...
> ---
> src/storage/storage_driver.c | 21 +++++----------------
> 1 file changed, 5 insertions(+), 16 deletions(-)
>
> diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
> index ac4a74a..fbb8050 100644
> --- a/src/storage/storage_driver.c
> +++ b/src/storage/storage_driver.c
> @@ -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,14 @@ 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
> */
The comment won't make sense any more as well.
ACK
I would think safe for freeze
John
> - 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 +2371,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;
>
More information about the libvir-list
mailing list