[Libguestfs] [PATCH] v2v: linux: correctly update resume=/dev/device entries (RHBZ#1532224)
Richard W.M. Jones
rjones at redhat.com
Fri Apr 20 10:41:18 UTC 2018
On Wed, Apr 11, 2018 at 06:15:28PM +0200, Pino Toscano wrote:
> When updating the device names to the new names, handle GRUB_CMDLINE
> entries (typically in grub2 configuration files) correctly: loop over
> the whole configuration value, and replace each occurrency of
> resume=/dev/device found.
>
> The actual code is moved away from replace_if_device, since this
> function now does only the actual replacement of the device string.
> ---
> v2v/convert_linux.ml | 38 ++++++++++++++++++++++++--------------
> 1 file changed, 24 insertions(+), 14 deletions(-)
>
> diff --git a/v2v/convert_linux.ml b/v2v/convert_linux.ml
> index b273785e6..02dc2fee2 100644
> --- a/v2v/convert_linux.ml
> +++ b/v2v/convert_linux.ml
> @@ -976,7 +976,7 @@ let convert (g : G.guestfs) inspect source output rcaps =
> List.flatten (List.map Array.to_list (List.map g#aug_match paths)) in
>
> (* Map device names for each entry. *)
> - let rex_resume = PCRE.compile "^(.*resume=)(/dev/\\S+)(.*)$"
> + let rex_resume = PCRE.compile "^resume=(/dev/[a-z\\d]+)(.*)$"
> and rex_device_cciss = PCRE.compile "^/dev/(cciss/c\\d+d\\d+)(?:p(\\d+))?$"
> and rex_device = PCRE.compile "^/dev/([a-z]+)(\\d*)?$" in
>
> @@ -994,18 +994,7 @@ let convert (g : G.guestfs) inspect source output rcaps =
> device
> in
>
> - if String.find path "GRUB_CMDLINE" >= 0 then (
> - (* Handle grub2 resume=<dev> specially. *)
> - if PCRE.matches rex_resume value then (
> - let start = PCRE.sub 1
> - and device = PCRE.sub 2
> - and end_ = PCRE.sub 3 in
> - let device = replace_if_device path device in
> - start ^ device ^ end_
> - )
> - else value
> - )
> - else if PCRE.matches rex_device_cciss value then (
> + if PCRE.matches rex_device_cciss value then (
> let device = PCRE.sub 1
> and part = try PCRE.sub 2 with Not_found -> "" in
> "/dev/" ^ replace device ^ part
> @@ -1023,7 +1012,28 @@ let convert (g : G.guestfs) inspect source output rcaps =
> List.iter (
> fun path ->
> let value = g#aug_get path in
> - let new_value = replace_if_device path value in
> + let new_value =
> + if String.find path "GRUB_CMDLINE" >= 0 then (
> + (* Handle grub2 resume=<dev> specially. *)
> + let rec loop str =
> + let index = String.find str "resume=" in
> + if index >= 0 then (
> + let part = String.sub str index (String.length str - index) in
> + if PCRE.matches rex_resume part then (
> + let start = String.sub str 0 (index + 7 (* "resume=" *))
> + and device = PCRE.sub 1
> + and end_ = PCRE.sub 2 in
> + let device = replace_if_device path device in
> + start ^ device ^ loop end_
> + )
> + else str
> + )
> + else str
> + in
> + loop value
> + )
> + else
> + replace_if_device path value in
>
> if value <> new_value then (
> g#aug_set path new_value;
Looks OK, ACK.
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-df lists disk usage of guests without needing to install any
software inside the virtual machine. Supports Linux and Windows.
http://people.redhat.com/~rjones/virt-df/
More information about the Libguestfs
mailing list