[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