[libvirt] [PATCH 3/3] storage: Allow --shrink for raw type volume of fs pool

Michal Privoznik mprivozn at redhat.com
Tue Jun 4 15:19:35 UTC 2013


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),
> 




More information about the libvir-list mailing list