]> xenbits.xensource.com Git - libvirt.git/commitdiff
virStorageFileResize: fallocate the whole capacity
authorJán Tomko <jtomko@redhat.com>
Mon, 25 Sep 2017 14:35:42 +0000 (16:35 +0200)
committerJán Tomko <jtomko@redhat.com>
Wed, 27 Sep 2017 12:40:44 +0000 (14:40 +0200)
We have been trying to implement the ALLOCATE flag to mean
"the volume should be fully allocated after the resize".

Since commit b0579ed9 we do not allocate from the existing
capacity, but from the existing allocation value.
However this value is a total of all the allocated bytes,
not an offset.

For a sparsely allocated file:
$ perl -e 'print "x"x8192;' > vol1
$ fallocate -p -o 0 -l 4096 vol1
$ virsh vol-info vol1 default
Capacity:       8.00 KiB
Allocation:     4.00 KiB

Treating allocation as an offset would result in an incompletely
allocated file:
$ virsh vol-resize vol1 --pool default 16384 --allocate
Capacity:       16.00 KiB
Allocation:     12.00 KiB

Call fallocate from zero on the whole requested capacity to fully
allocate the file. After that, the volume is fully allocated
after the resize:
$ virsh vol-resize vol1 --pool default 16384 --allocate
$ virsh vol-info vol1 default
Capacity:       16.00 KiB
Allocation:     16.00 KiB

src/storage/storage_util.c
src/util/virstoragefile.c
src/util/virstoragefile.h

index 07dba222205e48a147aa4b026a94ed1e67da3456..b94b3f397c6875ad45e259a8cd807393f7c46172 100644 (file)
@@ -2329,8 +2329,7 @@ virStorageBackendVolResizeLocal(virConnectPtr conn ATTRIBUTE_UNUSED,
     bool pre_allocate = flags & VIR_STORAGE_VOL_RESIZE_ALLOCATE;
 
     if (vol->target.format == VIR_STORAGE_FILE_RAW) {
-        return virStorageFileResize(vol->target.path, capacity,
-                                    vol->target.allocation, pre_allocate);
+        return virStorageFileResize(vol->target.path, capacity, pre_allocate);
     } else if (vol->target.format == VIR_STORAGE_FILE_PLOOP) {
         return storagePloopResize(vol, capacity);
     } else {
index b3da0a4528c044a121eaa8b6bbd5e8edf3975558..5df1ea0b8d679cf09777a165fe1e6ae3e296f07e 100644 (file)
@@ -1315,17 +1315,11 @@ virStorageFileChainGetBroken(virStorageSourcePtr chain,
 int
 virStorageFileResize(const char *path,
                      unsigned long long capacity,
-                     unsigned long long orig_capacity,
                      bool pre_allocate)
 {
     int fd = -1;
     int ret = -1;
     int rc;
-    off_t offset ATTRIBUTE_UNUSED;
-    off_t len ATTRIBUTE_UNUSED;
-
-    offset = orig_capacity;
-    len = capacity - orig_capacity;
 
     if ((fd = open(path, O_RDWR)) < 0) {
         virReportSystemError(errno, _("Unable to open '%s'"), path);
@@ -1333,7 +1327,7 @@ virStorageFileResize(const char *path,
     }
 
     if (pre_allocate) {
-        if ((rc = virFileAllocate(fd, offset, len)) != 0) {
+        if ((rc = virFileAllocate(fd, 0, capacity)) != 0) {
             if (rc == -2) {
                 virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                                _("preallocate is not supported on this platform"));
index f7e897f25e824cf55aef0b826b049814cd1bc58a..1eb1c6471cd6946f18cfa76f94d088a37d7ecfc5 100644 (file)
@@ -328,7 +328,6 @@ virStorageSourcePtr virStorageFileChainLookup(virStorageSourcePtr chain,
 
 int virStorageFileResize(const char *path,
                          unsigned long long capacity,
-                         unsigned long long orig_capacity,
                          bool pre_allocate);
 
 int virStorageFileIsClusterFS(const char *path);