From: Wang Sen <wang...@linux.vnet.ibm.com>

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 <wang...@linux.vnet.ibm.com>
Signed-off-by: Michal Privoznik <mpriv...@redhat.com>
---
 src/storage/storage_backend_fs.c | 2 +-
 src/storage/storage_driver.c     | 2 ++
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c
index 11cf2df..95783be 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 f08255e..816efda 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);
-- 
1.8.5.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to