[Libguestfs] [PATCH v3 1/3] v2v: refactor copy_drivers() in Windows_virtio
Tomáš Golembiovský
tgolembi at redhat.com
Tue Nov 13 22:42:27 UTC 2018
On Wed, 7 Nov 2018 15:43:00 +0000
"Richard W.M. Jones" <rjones at redhat.com> wrote:
> On Wed, Nov 07, 2018 at 12:53:18PM +0100, Tomáš Golembiovský wrote:
> > Changed the function to be more generic and renamed.
> > The only change in behavior is in produced debug messages.
> >
> > Signed-off-by: Tomáš Golembiovský <tgolembi at redhat.com>
> > ---
> > v2v/windows_virtio.ml | 48 ++++++++++++++++++++++++++++---------------
> > 1 file changed, 31 insertions(+), 17 deletions(-)
> >
> > diff --git a/v2v/windows_virtio.ml b/v2v/windows_virtio.ml
> > index 9b45c76f5..da02b6c4e 100644
> > --- a/v2v/windows_virtio.ml
> > +++ b/v2v/windows_virtio.ml
> > @@ -254,28 +254,41 @@ and ddb_regedits inspect drv_name drv_pciid =
> > * been copied.
> > *)
> > and copy_drivers g inspect driverdir =
> > - let ret = ref false in
> > + List.length (
> > + copy_from_virtio_win g inspect "/" driverdir virtio_iso_path_matches_guest_os
> > + ) > 0
>
> You can write this as:
>
> [] <> copy_from_virtio_win g [etc...]
>
> which is also more efficient because the compiler will optimize it to
> a single test that the function doesn't return a cons.
done
>
> > +(* Copy all files from virtio_win directory/ISO located in [srcdir]
> > + * subdirectory and all its subdirectories to the [destdir]. The directory
> > + * hierarchy is not preserved, meaning all files will be directly in [destdir].
> > + * The file list is filtered based on [filter] function.
> > + *
> > + * Returns list of copied files.
> > + *)
> > +and copy_from_virtio_win g inspect srcdir destdir filter =
> > + let ret = ref [] in
> > if is_directory virtio_win then (
> > - debug "windows: copy_drivers: source directory virtio_win %s" virtio_win;
> > + let dir = virtio_win // srcdir in
> > + debug "windows: copy_from_virtio_win: guest tools source directory %s" dir;
> >
> > - let cmd = sprintf "cd %s && find -L -type f" (quote virtio_win) in
> > + let cmd = sprintf "cd %s && find -L -type f" (quote dir) in
> > let paths = external_command cmd in
> > List.iter (
> > fun path ->
> > - if virtio_iso_path_matches_guest_os path inspect then (
> > - let source = virtio_win // path in
> > - let target = driverdir //
> > - String.lowercase_ascii (Filename.basename path) in
> > - debug "copying virtio driver bits: 'host:%s' -> '%s'"
> > + if filter path inspect then (
> > + let source = dir // path in
> > + let target_name = String.lowercase_ascii (Filename.basename path) in
> > + let target = destdir // target_name in
> > + debug "windows: copying guest tools bits: 'host:%s' -> '%s'"
> > source target;
> >
> > g#write target (read_whole_file source);
> > - ret := true
> > + List.push_front target_name ret
>
> This will return the list of files backwards (if that matters), but is
> also more efficient than using push_back.
I don't believe it matters.
The comments below were applied in separate commit.
Tomas
>
> > )
> > ) paths
> > )
> > else if is_regular_file virtio_win then (
> > - debug "windows: copy_drivers: source ISO virtio_win %s" virtio_win;
> > + debug "windows: copy_from_virtio_win: guest tools source ISO %s" virtio_win;
> >
> > try
> > let g2 = open_guestfs ~identifier:"virtio_win" () in
> > @@ -283,19 +296,20 @@ and copy_drivers g inspect driverdir =
> > g2#launch ();
> > let vio_root = "/" in
> > g2#mount_ro "/dev/sda" vio_root;
> > - let paths = g2#find vio_root in
> > + let srcdir = vio_root // srcdir in
>
> It doesn't really matter since virt-v2v only ever runs on Linux,
> but strictly speaking this is wrong. It should be:
>
> let srcdir = vio_root ^ "/" ^ srcdir in
>
> (But using // in the previous part of the code *was* correct). The
> reason is that this path is evaluated in the libguestfs appliance
> name space, whereas operation // uses host path concatenation
> (would be \ on Windows host for example).
>
> > + let paths = g2#find srcdir in
> > Array.iter (
> > fun path ->
> > - let source = vio_root // path in
> > + let source = srcdir // path in
>
> Same here, except the old code was wrong too :-)
>
> > if g2#is_file source ~followsymlinks:false &&
> > - virtio_iso_path_matches_guest_os path inspect then (
> > - let target = driverdir //
> > - String.lowercase_ascii (Filename.basename path) in
> > - debug "copying virtio driver bits: '%s:%s' -> '%s'"
> > + filter path inspect then (
> > + let target_name = String.lowercase_ascii (Filename.basename path) in
> > + let target = destdir // target_name in
>
> And this is wrong too (and in the old code).
>
> > + debug "windows: copying guest tools bits: '%s:%s' -> '%s'"
> > virtio_win path target;
> >
> > g#write target (g2#read_file source);
> > - ret := true
> > + List.push_front target_name ret
> > )
> > ) paths;
> > g2#close()
> > --
>
> Generally looks fine.
>
> 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/
--
Tomáš Golembiovský <tgolembi at redhat.com>
More information about the Libguestfs
mailing list