diff options
36 files changed, 210 insertions, 89 deletions
diff --git a/edit/virt-edit.c b/edit/virt-edit.c index c0427451..3d23da86 100644 --- a/edit/virt-edit.c +++ b/edit/virt-edit.c @@ -298,7 +298,7 @@ main (int argc, char *argv[]) free (root); /* Cleanly unmount the disks after editing. */ - if (guestfs_umount_all (g) == -1 || guestfs_sync (g) == -1) + if (guestfs_shutdown (g) == -1) exit (EXIT_FAILURE); guestfs_close (g); diff --git a/erlang/examples/create_disk.erl b/erlang/examples/create_disk.erl index a0c90444..d192435a 100755 --- a/erlang/examples/create_disk.erl +++ b/erlang/examples/create_disk.erl @@ -51,6 +51,11 @@ main(_) -> % the disk image. ok = guestfs:upload(G, "/etc/resolv.conf", "/foo/resolv.conf"), + % Because we wrote to the disk and we want to detect write + % errors, call guestfs:shutdown. You don't need to do this: + % guestfs:close will do it implicitly. + ok = guestfs:shutdown(G), + % Note also that handles are automatically closed if they are % reaped by the garbage collector. You only need to call close % if you want to close the handle right away. diff --git a/examples/copy_over.c b/examples/copy_over.c index 9cff00bc..45b8fa6d 100644 --- a/examples/copy_over.c +++ b/examples/copy_over.c @@ -145,7 +145,7 @@ main (int argc, char *argv[]) } /* Clean up. */ - if (guestfs_umount_all (destg) == -1) + if (guestfs_shutdown (destg) == -1) exit (EXIT_FAILURE); guestfs_close (destg); @@ -193,10 +193,6 @@ start_srcthread (void *arg) } /* Clean up. */ - if (guestfs_umount_all (srcg) == -1) { - pthread_cancel (threaddata->mainthread); - exit (EXIT_FAILURE); - } guestfs_close (srcg); return NULL; diff --git a/examples/create_disk.c b/examples/create_disk.c index 5380888b..e314328f 100644 --- a/examples/create_disk.c +++ b/examples/create_disk.c @@ -99,6 +99,13 @@ main (int argc, char *argv[]) if (guestfs_upload (g, "/etc/resolv.conf", "/foo/resolv.conf") == -1) exit (EXIT_FAILURE); + /* Because we wrote to the disk and we want to detect write + * errors, call guestfs_shutdown. You don't need to do this: + * guestfs_close will do it implicitly. + */ + if (guestfs_shutdown (g) == -1) + exit (EXIT_FAILURE); + guestfs_close (g); /* Free up the lists. */ diff --git a/examples/mount_local.c b/examples/mount_local.c index 240e31f3..5c24cd19 100644 --- a/examples/mount_local.c +++ b/examples/mount_local.c @@ -186,8 +186,8 @@ main (int argc, char *argv[]) waitpid (pid, NULL, 0); - /* Unmount and close. */ - if (guestfs_umount (g, "/") == -1) + /* Shutdown the handle explicitly so write errors can be detected. */ + if (guestfs_shutdown (g) == -1) exit (EXIT_FAILURE); guestfs_close (g); diff --git a/fish/fish.c b/fish/fish.c index 80b33644..ded80ec2 100644 --- a/fish/fish.c +++ b/fish/fish.c @@ -553,6 +553,9 @@ main (int argc, char *argv[]) else cmdline (argv, optind, argc); + if (guestfs_shutdown (g) == -1) + exit (EXIT_FAILURE); + guestfs_close (g); out_after_handle_close: diff --git a/fish/reopen.c b/fish/reopen.c index 3fc9510b..6b3707e9 100644 --- a/fish/reopen.c +++ b/fish/reopen.c @@ -40,6 +40,9 @@ run_reopen (const char *cmd, size_t argc, char *argv[]) return -1; } + if (guestfs_shutdown (g) == -1) + return -1; + /* Open the new handle first, so we can copy the settings from the * old one to the new one, and also so if it fails we still have an * open handle. diff --git a/fish/test-events.sh b/fish/test-events.sh index 76d3823f..b3684a83 100755 --- a/fish/test-events.sh +++ b/fish/test-events.sh @@ -53,6 +53,9 @@ if [ "$(cat test.out)" != '"ev1" (0): *: echo $EVENT $@ "ev1" (1): *: echo $EVENT $@ "ev2" (2): *: echo $EVENT $@ "ev2" (2): *: echo $EVENT $@ +enter shutdown +trace shutdown +trace shutdown = 0 enter get_autosync trace get_autosync trace get_autosync = 1 diff --git a/format/format.c b/format/format.c index b9bab4d2..bbe7f5ca 100644 --- a/format/format.c +++ b/format/format.c @@ -260,6 +260,8 @@ main (int argc, char *argv[]) guestfs_set_verbose (g2, guestfs_get_verbose (g)); guestfs_set_trace (g2, guestfs_get_trace (g)); + if (guestfs_shutdown (g) == -1) + exit (EXIT_FAILURE); guestfs_close (g); g = g2; } @@ -278,6 +280,8 @@ main (int argc, char *argv[]) /* Free up data structures. */ free_drives (drvs); + if (guestfs_shutdown (g) == -1) + exit (EXIT_FAILURE); guestfs_close (g); exit (EXIT_SUCCESS); diff --git a/fuse/guestmount.c b/fuse/guestmount.c index b6c64671..0c2e2dc6 100644 --- a/fuse/guestmount.c +++ b/fuse/guestmount.c @@ -431,6 +431,8 @@ main (int argc, char *argv[]) r = guestfs_mount_local_run (g); /* Cleanup. */ + if (guestfs_shutdown (g) == -1) + r = -1; guestfs_close (g); exit (r == 0 ? EXIT_SUCCESS : EXIT_FAILURE); diff --git a/generator/generator_actions.ml b/generator/generator_actions.ml index e6219d17..5baa9b2d 100644 --- a/generator/generator_actions.ml +++ b/generator/generator_actions.ml @@ -137,11 +137,13 @@ If you see any calls to this function in code then you can just remove them, unless you want to retain compatibility with older versions of the API."); - ("kill_subprocess", (RErr, [], []), -1, [], + ("kill_subprocess", (RErr, [], []), -1, [DeprecatedBy "shutdown"], [], "kill the qemu subprocess", "\ -This kills the qemu subprocess. You should never need to call this."); +This kills the qemu subprocess. + +Do not call this. See: C<guestfs_shutdown> instead."); ("add_drive", (RErr, [String "filename"], []), -1, [ConfigOnly], [], @@ -1766,6 +1768,26 @@ Converted to C</dev/VG/LV> form using C<guestfs_lvm_canonical_lvm_name>. Other strings are returned unmodified."); + ("shutdown", (RErr, [], []), -1, [], + [], + "shutdown the qemu subprocess", + "\ +This is the opposite of C<guestfs_launch>. It performs an orderly +shutdown of the backend process(es). If the autosync flag is set +(which is the default) then the disk image is synchronized. + +If the subprocess exits with an error then this function will return +an error, which should I<not> be ignored (it may indicate that the +disk image could not be written out properly). + +It is safe to call this multiple times. Extra calls are ignored. + +This call does I<not> close or free up the handle. You still +need to call C<guestfs_close> afterwards. + +C<guestfs_close> will call this if you don't do it explicitly, +but note that any errors are ignored in that case."); + ] (* daemon_functions are any functions which cause some action diff --git a/java/examples/CreateDisk.java b/java/examples/CreateDisk.java index 41f8739b..381fae1f 100644 --- a/java/examples/CreateDisk.java +++ b/java/examples/CreateDisk.java @@ -66,6 +66,11 @@ public class CreateDisk // the disk image. g.upload ("/etc/resolv.conf", "/foo/resolv.conf"); + // Because we wrote to the disk and we want to detect write + // errors, call g.shutdown. You don't need to do this: + // g.close will do it implicitly. + g.shutdown (); + // Note also that handles are automatically closed if they are // reaped by the garbage collector. You only need to call close // if you want to close the handle right away. diff --git a/java/t/GuestFS010Basic.java b/java/t/GuestFS010Basic.java index 21f88dd3..a44fde1f 100644 --- a/java/t/GuestFS010Basic.java +++ b/java/t/GuestFS010Basic.java @@ -55,6 +55,7 @@ public class GuestFS010Basic assert m.get ("/dev/VG/LV1").equals ("ext2"); assert m.get ("/dev/VG/LV2").equals ("unknown"); + g.shutdown (); g.close (); File f2 = new File ("test.img"); diff --git a/ocaml/examples/create_disk.ml b/ocaml/examples/create_disk.ml index 75dbdc35..4437b1c8 100644 --- a/ocaml/examples/create_disk.ml +++ b/ocaml/examples/create_disk.ml @@ -57,6 +57,12 @@ let () = *) g#upload "/etc/resolv.conf" "/foo/resolv.conf"; + (* Because we wrote to the disk and we want to detect write + * errors, call g#shutdown. You don't need to do this: + * g#close will do it implicitly. + *) + g#shutdown (); + (* Note also that handles are automatically closed if they are * reaped by the garbage collector. You only need to call close * if you want to close the handle right away. diff --git a/ocaml/t/guestfs_010_basic.ml b/ocaml/t/guestfs_010_basic.ml index b6750a1a..bb96737b 100644 --- a/ocaml/t/guestfs_010_basic.ml +++ b/ocaml/t/guestfs_010_basic.ml @@ -61,5 +61,6 @@ let () = "q", 'r' ] then failwith "Guestfs.readdir returned incorrect result"; + g#shutdown (); g#close (); unlink "test.img" diff --git a/ocaml/t/guestfs_070_threads.ml b/ocaml/t/guestfs_070_threads.ml index 8b22f938..419f853e 100644 --- a/ocaml/t/guestfs_070_threads.ml +++ b/ocaml/t/guestfs_070_threads.ml @@ -65,8 +65,7 @@ let () = let s = String.copy "/test" in Guestfs.touch g s; - Guestfs.umount_all g; - Guestfs.sync g; + Guestfs.shutdown g; Guestfs.close g; unlink "test.img"; Gc.compact (); diff --git a/ocaml/t/guestfs_500_parallel_mount_local.ml b/ocaml/t/guestfs_500_parallel_mount_local.ml index 5a432f00..a26ff9d6 100644 --- a/ocaml/t/guestfs_500_parallel_mount_local.ml +++ b/ocaml/t/guestfs_500_parallel_mount_local.ml @@ -145,6 +145,7 @@ and start_thread (filename, mp) = in loop (); + g#shutdown (); g#close () (* This is run in a child program. *) diff --git a/perl/examples/create_disk.pl b/perl/examples/create_disk.pl index fa15bc7b..11b91469 100755 --- a/perl/examples/create_disk.pl +++ b/perl/examples/create_disk.pl @@ -57,6 +57,11 @@ $g->mkdir ("/foo"); # the disk image. $g->upload ("/etc/resolv.conf", "/foo/resolv.conf"); +# Because we wrote to the disk and we want to detect write +# errors, call $g->shutdown. You don't need to do this: +# $g->close will do it implicitly. +$g->shutdown (); + # Note also that handles are automatically closed if they are # reaped by reference counting. You only need to call close # if you want to close the handle right away. diff --git a/python/examples/create_disk.py b/python/examples/create_disk.py index 0885383e..86f50427 100644 --- a/python/examples/create_disk.py +++ b/python/examples/create_disk.py @@ -51,6 +51,11 @@ g.mkdir ("/foo") # the disk image. g.upload ("/etc/resolv.conf", "/foo/resolv.conf") +# Because we wrote to the disk and we want to detect write +# errors, call g.shutdown. You don't need to do this: +# g.close will do it implicitly. +g.shutdown () + # Note also that handles are automatically closed if they are # reaped by reference counting. You only need to call close # if you want to close the handle right away. diff --git a/python/t/010-basic.py b/python/t/010-basic.py index a97f3d24..779af484 100644 --- a/python/t/010-basic.py +++ b/python/t/010-basic.py @@ -31,6 +31,7 @@ g.lvcreate ("LV1", "VG", 200) g.lvcreate ("LV2", "VG", 200) if (g.lvs () != ["/dev/VG/LV1", "/dev/VG/LV2"]): raise "Error: g.lvs() returned incorrect result" +g.shutdown () g.close () os.unlink ("test.img") diff --git a/rescue/virt-rescue.c b/rescue/virt-rescue.c index 684baeb9..f1f8d85c 100644 --- a/rescue/virt-rescue.c +++ b/rescue/virt-rescue.c @@ -341,7 +341,9 @@ main (int argc, char *argv[]) */ guestfs_set_error_handler (g, NULL, NULL); - /* We expect launch to fail, so ignore the return value. */ + /* We expect launch to fail, so ignore the return value, and don't + * bother with explicit guestfs_shutdown either. + */ ignore_value (guestfs_launch (g)); guestfs_close (g); diff --git a/resize/resize.ml b/resize/resize.ml index 5e323bae..cd4c9d62 100644 --- a/resize/resize.ml +++ b/resize/resize.ml @@ -836,7 +836,7 @@ let g = if ok then g, true else if attempts > 0 then ( g#zero "/dev/sdb"; - g#sync (); + g#shutdown (); g#close (); let g = connect_both_disks () in @@ -1120,8 +1120,7 @@ let to_be_expanded = let g = if to_be_expanded then ( - g#umount_all (); - g#sync (); + g#shutdown (); g#close (); let g = new G.guestfs () in @@ -1192,8 +1191,7 @@ let () = (* Finished. Unmount disks and exit. *) let () = - g#umount_all (); - g#sync (); + g#shutdown (); g#close (); if not quiet then ( diff --git a/ruby/examples/create_disk.rb b/ruby/examples/create_disk.rb index 026ea2e7..32fb1171 100644 --- a/ruby/examples/create_disk.rb +++ b/ruby/examples/create_disk.rb @@ -54,6 +54,11 @@ g.mkdir("/foo") # the disk image. g.upload("/etc/resolv.conf", "/foo/resolv.conf") +# Because we wrote to the disk and we want to detect write +# errors, call g.shutdown. You don't need to do this: +# g.close will do it implicitly. +g.shutdown() + # Note also that handles are automatically closed if they are # reaped by the garbage collector. You only need to call close # if you want to close the handle right away. diff --git a/sparsify/sparsify.ml b/sparsify/sparsify.ml index ec3512a9..6f1635b2 100644 --- a/sparsify/sparsify.ml +++ b/sparsify/sparsify.ml @@ -295,6 +295,7 @@ let () = (* Don't need libguestfs now. *) let () = + g#shutdown (); g#close () (* What should the output format be? If the user specified an diff --git a/src/guestfs.c b/src/guestfs.c index e36ad461..93ae2477 100644 --- a/src/guestfs.c +++ b/src/guestfs.c @@ -172,8 +172,6 @@ guestfs_create (void) void guestfs_close (guestfs_h *g) { - int status, sig; - if (g->state == NO_HANDLE) { /* Not safe to call ANY callbacks here, so ... */ fprintf (stderr, _("guestfs_close: called twice on the same handle\n")); @@ -202,10 +200,6 @@ guestfs_close (guestfs_h *g) debug (g, "closing guestfs handle %p (state %d)", g, g->state); - /* Try to sync if autosync flag is set. */ - if (g->autosync && g->state == READY) - ignore_value (guestfs_internal_autosync (g)); - /* If we are valgrinding the daemon, then we *don't* want to kill * the subprocess because we want the final valgrind messages sent * when we close sockets below. However for normal production use, @@ -213,42 +207,10 @@ guestfs_close (guestfs_h *g) * daemon or qemu is not responding). */ #ifndef VALGRIND_DAEMON - /* Kill the qemu subprocess. */ if (g->state != CONFIG) - ignore_value (guestfs_kill_subprocess (g)); + ignore_value (guestfs_shutdown (g)); #endif - /* Close sockets. */ - if (g->fd[0] >= 0) - close (g->fd[0]); - if (g->fd[1] >= 0) - close (g->fd[1]); - if (g->sock >= 0) - close (g->sock); - g->fd[0] = -1; - g->fd[1] = -1; - g->sock = -1; - - /* Wait for subprocess(es) to exit. */ - if (g->pid > 0) { - if (waitpid (g->pid, &status, 0) == -1) - perror ("waitpid (qemu)"); - if (WIFEXITED (status) && WEXITSTATUS (status) != 0) - fprintf (stderr, "libguestfs: close: qemu failed (status %d)\n", - WEXITSTATUS (status)); - else if (WIFSIGNALED (status)) { - sig = WTERMSIG (status); - fprintf (stderr, "libguestfs: close: qemu terminated by signal %d (%s)\n", - sig, strsignal (sig)); - } - else if (WIFSTOPPED (status)) { - sig = WSTOPSIG (status); - fprintf (stderr, "libguestfs: close: qemu stopped by signal %d (%s)\n", - sig, strsignal (sig)); - } - } - if (g->recoverypid > 0) waitpid (g->recoverypid, NULL, 0); - /* Run user close callbacks. */ guestfs___call_callbacks_void (g, GUESTFS_EVENT_CLOSE); @@ -290,6 +252,69 @@ guestfs_close (guestfs_h *g) free (g); } +/* Shutdown the backend. */ +int +guestfs__shutdown (guestfs_h *g) +{ + int ret = 0; + int status, sig; + + if (g->state == CONFIG) + return 0; + + /* Try to sync if autosync flag is set. */ + if (g->autosync && g->state == READY) { + if (guestfs_internal_autosync (g) == -1) + ret = -1; + } + + /* Signal qemu to shutdown cleanly, and kill the recovery process. */ + if (g->pid > 0) { + debug (g, "sending SIGTERM to process %d", g->pid); + kill (g->pid, SIGTERM); + } + if (g->recoverypid > 0) kill (g->recoverypid, 9); + + /* Close sockets. */ + if (g->fd[0] >= 0) + close (g->fd[0]); + if (g->fd[1] >= 0) + close (g->fd[1]); + if (g->sock >= 0) + close (g->sock); + g->fd[0] = -1; + g->fd[1] = -1; + g->sock = -1; + + /* Wait for subprocess(es) to exit. */ + if (g->pid > 0) { + if (waitpid (g->pid, &status, 0) == -1) { + perrorf (g, "waitpid (qemu)"); + ret = -1; + } + else if (WIFEXITED (status) && WEXITSTATUS (status) != 0) { + error (g, "qemu failed (status %d)", WEXITSTATUS (status)); + ret = -1; + } + else if (WIFSIGNALED (status)) { + sig = WTERMSIG (status); + error (g, "qemu terminated by signal %d (%s)", sig, strsignal (sig)); + ret = -1; + } + else if (WIFSTOPPED (status)) { + sig = WSTOPSIG (status); + error (g, "qemu stopped by signal %d (%s)", sig, strsignal (sig)); + ret = -1; + } + } + if (g->recoverypid > 0) waitpid (g->recoverypid, NULL, 0); + + g->pid = g->recoverypid = 0; + g->state = CONFIG; + + return ret; +} + /* Close all open handles (called from atexit(3)). */ static void close_handles (void) diff --git a/src/guestfs.pod b/src/guestfs.pod index 6959f50c..3ab43d0d 100644 --- a/src/guestfs.pod +++ b/src/guestfs.pod @@ -14,6 +14,7 @@ guestfs - Library for accessing and modifying virtual machine images guestfs_mount (g, "/dev/sda1", "/"); guestfs_touch (g, "/hello"); guestfs_umount (g, "/"); + guestfs_shutdown (g); guestfs_close (g); cc prog.c -o prog -lguestfs @@ -83,13 +84,10 @@ this: */ guestfs_touch (g, "/hello"); - /* This is only needed for libguestfs < 1.5.24. Since then - * it is done automatically when you close the handle. See - * discussion of autosync in this page. - */ - guestfs_sync (g); + /* Synchronize the disk. This is the opposite of guestfs_launch. */ + guestfs_shutdown (g); - /* Close the handle 'g'. */ + /* Close and free the handle 'g'. */ guestfs_close (g); The code above doesn't include any error checking. In real code you @@ -1423,12 +1421,37 @@ L</ERROR HANDLING> section below. void guestfs_close (guestfs_h *g); This closes the connection handle and frees up all resources used. +If a close callback was set on the handle, then it is called. -If autosync was set on the handle and the handle was launched, then -this implicitly calls various functions to unmount filesystems and -sync the disk. See L</guestfs_set_autosync> for more details. +The correct way to close the handle is: -If a close callback was set on the handle, then it is called. + if (guestfs_shutdown (g) == -1) { + /* handle write errors here */ + } + guestfs_close (g); + +L</guestfs_shutdown> is only needed if B<all> of the following are true: + +=over 4 + +=item 1 + +one or more disks were added in read-write mode, I<and> + +=item 2 + +guestfs_launch was called, I<and> + +=item 3 + +you made some changes, I<and> + +=item 4 + +you have a way to handle write errors (eg. by exiting with an +error code or reporting something to the user). + +=back =head1 ERROR HANDLING diff --git a/src/launch.c b/src/launch.c index 95694ff8..af5ca9fd 100644 --- a/src/launch.c +++ b/src/launch.c @@ -1629,17 +1629,7 @@ guestfs__wait_ready (guestfs_h *g) int guestfs__kill_subprocess (guestfs_h *g) { - if (g->state == CONFIG) { - error (g, _("no subprocess to kill")); - return -1; - } - - debug (g, "sending SIGTERM to process %d", g->pid); - - if (g->pid > 0) kill (g->pid, SIGTERM); - if (g->recoverypid > 0) kill (g->recoverypid, 9); - - return 0; + return guestfs__shutdown (g); } /* Maximum number of disks. */ diff --git a/sysprep/main.ml b/sysprep/main.ml index ca5664de..05dd57d7 100644 --- a/sysprep/main.ml +++ b/sysprep/main.ml @@ -239,6 +239,7 @@ let () = (* Finished. *) let () = + g#shutdown (); g#close (); if debug_gc then diff --git a/test-tool/test-tool.c b/test-tool/test-tool.c index f0e3a314..865720ea 100644 --- a/test-tool/test-tool.c +++ b/test-tool/test-tool.c @@ -255,6 +255,11 @@ main (int argc, char *argv[]) } /* Close the handle. */ + if (guestfs_shutdown (g) == -1) { + fprintf (stderr, _("libguestfs-test-tool: shutdown failed\n")); + exit (EXIT_FAILURE); + } + guestfs_close (g); /* Booted and performed some simple operations -- success! */ diff --git a/tests/btrfs/test-btrfs-subvolume-default.pl b/tests/btrfs/test-btrfs-subvolume-default.pl index 013291ba..2c09ce2d 100755 --- a/tests/btrfs/test-btrfs-subvolume-default.pl +++ b/tests/btrfs/test-btrfs-subvolume-default.pl @@ -90,6 +90,7 @@ $g->mount ("/dev/sda1", "/"); # Now we're back to the original default volume, so this should work: $g->mkdir ("/test1/foo/bar/baz"); +$g->shutdown (); $g->close (); unlink $testimg or die "$testimg: unlink: $!"; diff --git a/tests/disks/test-max-disks.pl b/tests/disks/test-max-disks.pl index 3ced9713..a0bba7f5 100755 --- a/tests/disks/test-max-disks.pl +++ b/tests/disks/test-max-disks.pl @@ -140,7 +140,7 @@ for ($i = 0, $j = 0; $i < $max_disks; ++$i) { } } -$g->umount_all (); +$g->shutdown (); $g->close (); for ($i = 0; $i < $max_disks; ++$i) { diff --git a/tests/guests/guest-aux/make-fedora-img.pl b/tests/guests/guest-aux/make-fedora-img.pl index 96e41683..6a0a183e 100755 --- a/tests/guests/guest-aux/make-fedora-img.pl +++ b/tests/guests/guest-aux/make-fedora-img.pl @@ -195,6 +195,9 @@ $g->mkfs_opts ('ext2', '/dev/VG/LV2', blocksize => 1024); $g->mkfs_opts ('ext2', '/dev/VG/LV3', blocksize => 2048); # Cleanup +$g->shutdown (); +$g->close (); + unlink ("fstab.tmp.$$") or die; foreach my $img (@images) { $img =~ /^(.*)\.tmp\.\d+$/ or die; diff --git a/tests/selinux/run-test.pl b/tests/selinux/run-test.pl index 6b0ffb5c..bbe3a2f5 100755 --- a/tests/selinux/run-test.pl +++ b/tests/selinux/run-test.pl @@ -154,6 +154,7 @@ if ($test_via eq "direct") { } # Finish up. +$g->shutdown (); $g->close (); unlink $testimg or die "$testimg: $!"; diff --git a/tools/virt-make-fs b/tools/virt-make-fs index 7d032804..b53e8607 100755 --- a/tools/virt-make-fs +++ b/tools/virt-make-fs @@ -539,9 +539,8 @@ eval { } print STDERR "finishing off\n" if $debug; - $g->umount_all (); - $g->sync (); - undef $g; + $g->shutdown (); + $g->close () }; if ($@) { # Error: delete the output before exiting. diff --git a/tools/virt-tar b/tools/virt-tar index 777dbbdd..801104fe 100755 --- a/tools/virt-tar +++ b/tools/virt-tar @@ -279,10 +279,8 @@ if ($mode eq "x") { } } -$g->sync (); -$g->umount_all (); - -undef $g; +$g->shutdown (); +$g->close (); exit 0; diff --git a/tools/virt-win-reg b/tools/virt-win-reg index ab5daa71..2caa954c 100755 --- a/tools/virt-win-reg +++ b/tools/virt-win-reg @@ -337,9 +337,9 @@ else { # Import mode. upload_hive ($hiveshortname, $hives{$hiveshortname}->{hivefile}) } - # Sync everything. - $g->umount_all (); - $g->sync (); + # Close. + $g->shutdown (); + $g->close (); } exit 0; |