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? > > enum { > VIR_STORAGE_FILE_SHFS_NFS = (1 << 0), > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list