[Libguestfs] [PATCH] v2v: rework free space check in guest mountpoints

Richard W.M. Jones rjones at redhat.com
Mon Nov 6 14:54:14 UTC 2017


On Mon, Nov 06, 2017 at 03:45:14PM +0100, Pino Toscano wrote:
> - move the space needed by mountpoint mapping to an own function,
>   outside of the checking loop
> - remove the minimum limit of 100M on partitions, since existing
>   partitions that we check (e.g. /boot) may be smaller than that
> - in case /boot is not on a separate mountpoint, enforce the space check
>   on the root mountpoint instead, since it is where /boot is in that
>   case
> ---
>  v2v/v2v.ml | 55 ++++++++++++++++++++++++++++---------------------------
>  1 file changed, 28 insertions(+), 27 deletions(-)
> 
> diff --git a/v2v/v2v.ml b/v2v/v2v.ml
> index b4c41e188..24b38458f 100644
> --- a/v2v/v2v.ml
> +++ b/v2v/v2v.ml
> @@ -415,34 +415,35 @@ and print_mpstat chan { mp_dev = dev; mp_path = path;
>   *)
>  and check_guest_free_space mpstats =
>    message (f_"Checking for sufficient free disk space in the guest");
> +
> +  (* Check whether /boot has its own mount point. *)
> +  let has_boot = List.exists (fun { mp_path } -> mp_path = "/boot") mpstats in
> +
> +  let needed_bytes_for_mp = function
> +    | "/boot"
> +    | "/" when not has_boot ->
> +      (* We usually regenerate the initramfs, which has a
> +       * typical size of 20-30MB.  Hence:
> +       *)
> +      50_000_000L
> +    | "/" ->
> +      (* We may install some packages, and they would usually go
> +       * on the root filesystem.
> +       *)
> +      20_000_000L
> +    | _ ->
> +      (* For everything else, just make sure there is some free space. *)
> +      10_000_000L
> +  in
> +
>    List.iter (
> -    fun { mp_path = mp;
> -          mp_statvfs = { G.bfree; blocks; bsize } } ->
> -      (* Ignore small filesystems. *)
> -      let total_size = blocks *^ bsize in
> -      if total_size > 100_000_000L then (
> -        (* bfree = free blocks for root user *)
> -        let free_bytes = bfree *^ bsize in
> -        let needed_bytes =
> -          match mp with
> -          | "/" ->
> -            (* We may install some packages, and they would usually go
> -             * on the root filesystem.
> -             *)
> -            20_000_000L
> -          | "/boot" ->
> -            (* We usually regenerate the initramfs, which has a
> -             * typical size of 20-30MB.  Hence:
> -             *)
> -            50_000_000L
> -          | _ ->
> -            (* For everything else, just make sure there is some free space. *)
> -            10_000_000L in
> -
> -        if free_bytes < needed_bytes then
> -          error (f_"not enough free space for conversion on filesystem ‘%s’.  %Ld bytes free < %Ld bytes needed")
> -            mp free_bytes needed_bytes
> -      )
> +    fun { mp_path; mp_statvfs = { G.bfree; bsize } } ->
> +      (* bfree = free blocks for root user *)
> +      let free_bytes = bfree *^ bsize in
> +      let needed_bytes = needed_bytes_for_mp mp_path in
> +      if free_bytes < needed_bytes then
> +        error (f_"not enough free space for conversion on filesystem ‘%s’.  %Ld bytes free < %Ld bytes needed")
> +          mp_path free_bytes needed_bytes
>    ) mpstats
>  
>  (* Perform the fstrim. *)

Yeah, it's a pretty straightforward refactoring except for
losing the 100 MB min size and the bit about checking root if
/boot is not separately mounted.

Therefore:
ACK

I suspect this change is a bit dangerous for RHEL 7.5 at this
point.  Better to give it a bit more testing in case the
100 MB min size was really needed for some reason.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-builder quickly builds VMs from scratch
http://libguestfs.org/virt-builder.1.html




More information about the Libguestfs mailing list