Pino Toscano
2015-Jan-29 17:54 UTC
[Libguestfs] [PATCH 1/2] sparsify: ignore read-only btrfs snapshots (RHBZ#1079625)
In copy mode, make sure to not zero-free-space read-only btrfs snapshots, as we cannot write to them. --- sparsify/copying.ml | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/sparsify/copying.ml b/sparsify/copying.ml index 8d77964..4c23939 100644 --- a/sparsify/copying.ml +++ b/sparsify/copying.ml @@ -208,6 +208,11 @@ You can ignore this warning or change it to a hard failure using the * and selected swap partitions. *) let filesystems = g#list_filesystems () in + let btrfs_filesystems = List.filter ( + fun (fs, fstype) -> + fstype = "btrfs" + ) filesystems in + let btrfs_filesystems = List.map fst btrfs_filesystems in let filesystems = List.map fst filesystems in let filesystems = List.sort compare filesystems in @@ -216,6 +221,18 @@ You can ignore this warning or change it to a hard failure using the List.exists (fun fs' -> fs = g#canonical_device_name fs') ignores in + let is_readonly_btrfs_snapshot fs mp + try + let is_btrfs = List.mem fs btrfs_filesystems in + if is_btrfs then ( + try + let vol_info = g#btrfs_subvolume_show mp in + string_find (List.assoc "Flags" vol_info) "readonly" <> -1 + with _ -> false + ) else false + with Not_found -> false + in + List.iter ( fun fs -> if not (is_ignored fs) then ( @@ -230,10 +247,15 @@ You can ignore this warning or change it to a hard failure using the with _ -> false in if mounted then ( - if not quiet then - printf (f_"Fill free space in %s with zero ...\n%!") fs; + if is_readonly_btrfs_snapshot fs "/" then ( + if not quiet then + printf (f_"Skipping %s, as it is a read-only btrfs snapshot.\n%!") fs; + ) else ( + if not quiet then + printf (f_"Fill free space in %s with zero ...\n%!") fs; - g#zero_free_space "/" + g#zero_free_space "/" + ) ) else ( let is_linux_x86_swap (* Look for the signature for Linux swap on i386. -- 1.9.3
Pino Toscano
2015-Jan-29 17:54 UTC
[Libguestfs] [PATCH 2/2] sparsify: ignore read-only devices
In copy mode, make sure to not zero-free-space devices mounted as read-only, as we cannot write to them. Related to RHBZ#1079625. --- sparsify/copying.ml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/sparsify/copying.ml b/sparsify/copying.ml index 4c23939..9c2c545 100644 --- a/sparsify/copying.ml +++ b/sparsify/copying.ml @@ -233,6 +233,13 @@ You can ignore this warning or change it to a hard failure using the with Not_found -> false in + let is_readonly_device mp + let statvfs = g#statvfs mp in + let flags = statvfs.G.flag in + (* 0x01 is ST_RDONLY in Linux' GNU libc. *) + flags <> -1_L && (flags &^ 0x1_L) <> 0_L + in + List.iter ( fun fs -> if not (is_ignored fs) then ( @@ -250,6 +257,9 @@ You can ignore this warning or change it to a hard failure using the if is_readonly_btrfs_snapshot fs "/" then ( if not quiet then printf (f_"Skipping %s, as it is a read-only btrfs snapshot.\n%!") fs; + ) else if is_readonly_device "/" then ( + if not quiet then + printf (f_"Skipping %s, as it is a read-only device.\n%!") fs; ) else ( if not quiet then printf (f_"Fill free space in %s with zero ...\n%!") fs; -- 1.9.3
Richard W.M. Jones
2015-Feb-02 13:18 UTC
[Libguestfs] [PATCH 1/2] sparsify: ignore read-only btrfs snapshots (RHBZ#1079625)
On Thu, Jan 29, 2015 at 06:54:30PM +0100, Pino Toscano wrote:> + let is_readonly_btrfs_snapshot fs mp > + try > + let is_btrfs = List.mem fs btrfs_filesystems in > + if is_btrfs then ( > + try > + let vol_info = g#btrfs_subvolume_show mp in > + string_find (List.assoc "Flags" vol_info) "readonly" <> -1 > + with _ -> falseHmm, catching every exception and ignoring it? I'm guessing you're trying to ignore G.Error only here (Not_found could escape but will be caught by the outer try).> + ) else false > + with Not_found -> false > + inRich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com libguestfs lets you edit virtual machines. Supports shell scripting, bindings from many languages. http://libguestfs.org
Richard W.M. Jones
2015-Feb-02 13:19 UTC
Re: [Libguestfs] [PATCH 2/2] sparsify: ignore read-only devices
On Thu, Jan 29, 2015 at 06:54:31PM +0100, Pino Toscano wrote:> In copy mode, make sure to not zero-free-space devices mounted as > read-only, as we cannot write to them. > > Related to RHBZ#1079625. > --- > sparsify/copying.ml | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/sparsify/copying.ml b/sparsify/copying.ml > index 4c23939..9c2c545 100644 > --- a/sparsify/copying.ml > +++ b/sparsify/copying.ml > @@ -233,6 +233,13 @@ You can ignore this warning or change it to a hard failure using the > with Not_found -> false > in > > + let is_readonly_device mp > + let statvfs = g#statvfs mp in > + let flags = statvfs.G.flag in > + (* 0x01 is ST_RDONLY in Linux' GNU libc. *) > + flags <> -1_L && (flags &^ 0x1_L) <> 0_L > + in > + > List.iter ( > fun fs -> > if not (is_ignored fs) then ( > @@ -250,6 +257,9 @@ You can ignore this warning or change it to a hard failure using the > if is_readonly_btrfs_snapshot fs "/" then ( > if not quiet then > printf (f_"Skipping %s, as it is a read-only btrfs snapshot.\n%!") fs; > + ) else if is_readonly_device "/" then ( > + if not quiet then > + printf (f_"Skipping %s, as it is a read-only device.\n%!") fs; > ) else ( > if not quiet then > printf (f_"Fill free space in %s with zero ...\n%!") fs;Looks good, ACK. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com Fedora Windows cross-compiler. Compile Windows programs, test, and build Windows installers. Over 100 libraries supported. http://fedoraproject.org/wiki/MinGW
Possibly Parallel Threads
- [PATCH 1/2] sparsify: ignore read-only btrfs snapshots (RHBZ#1079625)
- [PATCH 3/3] sparsify: Ignore read-only LVs (RHBZ#1185561).
- Re: [PATCH 3/3] sparsify: Ignore read-only LVs (RHBZ#1185561).
- [PATCH 0/3] sparsify: Ignore read-only LVs (RHBZ#1185561).
- [PATCH] sparsify: Make the interface between cmdline.ml and sparsify.ml explicit.