Pino Toscano
2019-Nov-28 12:46 UTC
[Libguestfs] [v2v PATCH v2] v2v: require 100 available inodes on each filesystem
Enough free space in a filesystem does not imply available inodes to create/modify files on that filesystem. Hence, require at least 100 available inodes on filesystems that can provide inode counts. Related to: RHBZ#1764569 --- docs/virt-v2v.pod | 3 +++ v2v/v2v.ml | 13 +++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod index 6d677a45..1c884616 100644 --- a/docs/virt-v2v.pod +++ b/docs/virt-v2v.pod @@ -1353,6 +1353,9 @@ Minimum free space: 10 MB =back +In addition to the actual free space, each filesystem is required to +have at least 100 available inodes. + =head3 Minimum free space check in the host You must have sufficient free space in the host directory used to diff --git a/v2v/v2v.ml b/v2v/v2v.ml index f9d81460..dc1dedd7 100644 --- a/v2v/v2v.ml +++ b/v2v/v2v.ml @@ -375,6 +375,8 @@ and print_mpstat chan { mp_dev = dev; mp_path = path; (* Conversion can fail if there is no space on the guest filesystems * (RHBZ#1139543). To avoid this situation, check there is some * headroom. Mainly we care about the root filesystem. + * + * Also make sure filesystems have available inodes. (RHBZ#1764569) *) and check_guest_free_space mpstats message (f_"Checking for sufficient free disk space in the guest"); @@ -399,14 +401,21 @@ and check_guest_free_space mpstats 10_000_000L in + (* Reasonable headroom for conversion operations. *) + let needed_inodes = 100L in + List.iter ( - fun { mp_path; mp_statvfs = { G.bfree; bsize } } -> + fun { mp_path; mp_statvfs = { G.bfree; bsize; files; ffree } } -> (* 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 + mp_path free_bytes needed_bytes; + (* Not all the filesystems have inode counts. *) + if files > 0L && ffree < needed_inodes then + error (f_"not enough available inodes for conversion on filesystem ‘%s’. %Ld inodes available < %Ld inodes needed") + mp_path ffree needed_inodes ) mpstats (* Perform the fstrim. *) -- 2.21.0
Richard W.M. Jones
2019-Nov-28 13:31 UTC
Re: [Libguestfs] [v2v PATCH v2] v2v: require 100 available inodes on each filesystem
On Thu, Nov 28, 2019 at 01:46:39PM +0100, Pino Toscano wrote:> Enough free space in a filesystem does not imply available inodes to > create/modify files on that filesystem. Hence, require at least 100 > available inodes on filesystems that can provide inode counts. > > Related to: RHBZ#1764569 > --- > docs/virt-v2v.pod | 3 +++ > v2v/v2v.ml | 13 +++++++++++-- > 2 files changed, 14 insertions(+), 2 deletions(-) > > diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod > index 6d677a45..1c884616 100644 > --- a/docs/virt-v2v.pod > +++ b/docs/virt-v2v.pod > @@ -1353,6 +1353,9 @@ Minimum free space: 10 MB > > =back > > +In addition to the actual free space, each filesystem is required to > +have at least 100 available inodes. > + > =head3 Minimum free space check in the host > > You must have sufficient free space in the host directory used to > diff --git a/v2v/v2v.ml b/v2v/v2v.ml > index f9d81460..dc1dedd7 100644 > --- a/v2v/v2v.ml > +++ b/v2v/v2v.ml > @@ -375,6 +375,8 @@ and print_mpstat chan { mp_dev = dev; mp_path = path; > (* Conversion can fail if there is no space on the guest filesystems > * (RHBZ#1139543). To avoid this situation, check there is some > * headroom. Mainly we care about the root filesystem. > + * > + * Also make sure filesystems have available inodes. (RHBZ#1764569) > *) > and check_guest_free_space mpstats > message (f_"Checking for sufficient free disk space in the guest"); > @@ -399,14 +401,21 @@ and check_guest_free_space mpstats > 10_000_000L > in > > + (* Reasonable headroom for conversion operations. *) > + let needed_inodes = 100L in > + > List.iter ( > - fun { mp_path; mp_statvfs = { G.bfree; bsize } } -> > + fun { mp_path; mp_statvfs = { G.bfree; bsize; files; ffree } } -> > (* 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 > + mp_path free_bytes needed_bytes; > + (* Not all the filesystems have inode counts. *) > + if files > 0L && ffree < needed_inodes then > + error (f_"not enough available inodes for conversion on filesystem ‘%s’. %Ld inodes available < %Ld inodes needed") > + mp_path ffree needed_inodes > ) mpstats > > (* Perform the fstrim. *)This is fine now, ACK Thanks, 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
Apparently Analagous Threads
- [v2v PATCH] v2v: require 100 availabe inodes on each filesystem (RHBZ#1764569)
- [PATCH] v2v: rework free space check in guest mountpoints
- Re: [PATCH] v2v: rework free space check in guest mountpoints
- [PATCH v3 04/13] v2v: factor out size checks
- [PATCH v2 00/17] v2v: add --in-place mode