
On 04/06/13 23:19, Michal Privoznik wrote:
On 31.05.2013 07:16, Osier Yang wrote:
There is no need to use posix_fallocate or SYS_fallocate to shrink the volume, ftruncate can do the work. qemu-img/kvm-img supports to shrink the volume itself. --- src/storage/storage_backend_fs.c | 7 +++++-- src/util/virstoragefile.c | 5 +++-- src/util/virstoragefile.h | 3 ++- 3 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c index 78f5d53..cdfa66f 100644 --- a/src/storage/storage_backend_fs.c +++ b/src/storage/storage_backend_fs.c @@ -1245,13 +1245,16 @@ virStorageBackendFileSystemVolResize(virConnectPtr conn ATTRIBUTE_UNUSED, unsigned long long capacity, unsigned int flags) { - virCheckFlags(VIR_STORAGE_VOL_RESIZE_ALLOCATE, -1); + virCheckFlags(VIR_STORAGE_VOL_RESIZE_ALLOCATE | + VIR_STORAGE_VOL_RESIZE_SHRINK, -1);
bool pre_allocate = flags & VIR_STORAGE_VOL_RESIZE_ALLOCATE; + bool shrink = flags & VIR_STORAGE_VOL_RESIZE_SHRINK;
if (vol->target.format == VIR_STORAGE_FILE_RAW) { return virStorageFileResize(vol->target.path, capacity, - vol->capacity, pre_allocate); + vol->capacity, pre_allocate, + shrink); } else { if (pre_allocate) { virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c index e42eb77..25614df 100644 --- a/src/util/virstoragefile.c +++ b/src/util/virstoragefile.c @@ -1044,7 +1044,8 @@ int virStorageFileResize(const char *path, unsigned long long capacity, unsigned long long orig_capacity, - bool pre_allocate) + bool pre_allocate, + bool shrink) { int fd = -1; int ret = -1; @@ -1057,7 +1058,7 @@ virStorageFileResize(const char *path, goto cleanup; }
- if (pre_allocate) { + if (pre_allocate && !shrink) { #if HAVE_POSIX_FALLOCATE if ((rc = posix_fallocate(fd, offset, len)) != 0) { virReportSystemError(rc, diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h index c195c9a..46fe9ba 100644 --- a/src/util/virstoragefile.h +++ b/src/util/virstoragefile.h @@ -92,7 +92,8 @@ void virStorageFileFreeMetadata(virStorageFileMetadataPtr meta); int virStorageFileResize(const char *path, unsigned long long capacity, unsigned long long orig_capacity, - bool pre_allocate); + bool pre_allocate, + bool shrink); Having two booleans is doable. But if we ever introduce yet another boolean argument, we should turn them into @flags then. Moreover, @shrink looks orthogonal to @pre_allocate to me. Aren't they?
Flags is nicer, and they are orthogonal, v2 is posted, and I have pushed 1/3 and 2/3, thanks. Osier