summaryrefslogtreecommitdiff
path: root/src/storage
diff options
context:
space:
mode:
authorMichal Privoznik <mprivozn@redhat.com>2013-12-16 13:00:00 +0800
committerMichal Privoznik <mprivozn@redhat.com>2013-12-18 09:08:27 +0100
commitb0579ed9005370fcc22684722412984eb64d0617 (patch)
tree42653bc21f3a3c6918b39e7e49c01fea596020eb /src/storage
parent5d7e4f0cf335235c09e4c2d797fe1cf870f5cba9 (diff)
downloadlibvirt-b0579ed9005370fcc22684722412984eb64d0617.tar.gz
storage: resize vol against real allocated size
Currently, 'vol-resize --allocate' allocates new space at the vol->capacity offset. But the vol->capacity is not necessarily the same as vol->allocation. For instance:. [root@localhost ~]# virsh vol-list --pool tmp-pool --details Name Path Type Capacity Allocation ------------------------------------------------------------- tmp-vol /root/tmp-pool/tmp-vol file 1.00 GiB 1.00 GiB [root@localhost ~]# virsh vol-resize tmp-vol --pool tmp-pool 2G [root@localhost ~]# virsh vol-list --pool tmp-pool --details Name Path Type Capacity Allocation ------------------------------------------------------------- tmp-vol /root/tmp-pool/tmp-vol file 2.00 GiB 1.00 GiB So, if we want to allocate more bytes, so the file is say 3G big, the real allocated size is 2G actually: [root@localhost ~]# virsh vol-resize tmp-vol --pool tmp-pool 3G --allocate [root@localhost ~]# virsh vol-list --pool tmp-pool --details Name Path Type Capacity Allocation ------------------------------------------------------------- tmp-vol /root/tmp-pool/tmp-vol file 3.00 GiB 2.00 GiB This commit uses the correct vol->allocation instead of incorrect vol->capacity, so the output of the commands above looks like this: [root@localhost ~]# virsh vol-resize tmp-vol --pool tmp-pool 3G --allocate [root@localhost ~]# virsh vol-list --pool tmp-pool --details Name Path Type Capacity Allocation ------------------------------------------------------------- tmp-vol /root/tmp-pool/tmp-vol file 3.00 GiB 3.00 GiB Moreover, if the '--alocate' flag was used, we must update the vol->allocation member in storageVolResize API too, not just vol->capacity. Reported-by: Wang Sen <wangsen@linux.vnet.ibm.com> Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Diffstat (limited to 'src/storage')
-rw-r--r--src/storage/storage_backend_fs.c2
-rw-r--r--src/storage/storage_driver.c2
2 files changed, 3 insertions, 1 deletions
diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c
index 11cf2df3af..95783be500 100644
--- a/src/storage/storage_backend_fs.c
+++ b/src/storage/storage_backend_fs.c
@@ -1267,7 +1267,7 @@ virStorageBackendFileSystemVolResize(virConnectPtr conn ATTRIBUTE_UNUSED,
if (vol->target.format == VIR_STORAGE_FILE_RAW) {
return virStorageFileResize(vol->target.path, capacity,
- vol->capacity, pre_allocate);
+ vol->allocation, pre_allocate);
} else {
if (pre_allocate) {
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
index f08255ea0e..816efdae1f 100644
--- a/src/storage/storage_driver.c
+++ b/src/storage/storage_driver.c
@@ -2029,6 +2029,8 @@ storageVolResize(virStorageVolPtr obj,
goto out;
vol->capacity = abs_capacity;
+ if (flags & VIR_STORAGE_VOL_RESIZE_ALLOCATE)
+ vol->allocation = abs_capacity;
/* Update pool metadata */
pool->def->allocation += (abs_capacity - vol->capacity);