Also skip the test in this case instead of failing. --- sparsify/cmdline.ml | 2 +- sparsify/in_place.ml | 13 ++++++++++++- sparsify/test-virt-sparsify-in-place.sh | 8 +++++++- sparsify/virt-sparsify.pod | 19 +++++++++++++++++++ 4 files changed, 39 insertions(+), 3 deletions(-) diff --git a/sparsify/cmdline.ml b/sparsify/cmdline.ml index d25e9e9..c96de57 100644 --- a/sparsify/cmdline.ml +++ b/sparsify/cmdline.ml @@ -24,7 +24,7 @@ open Common_gettext.Gettext open Common_utils let prog = Filename.basename Sys.executable_name -let error fs = error ~prog fs +let error ?exit_code fs = error ~prog ?exit_code fs type mode_t = | Mode_copying of string * check_t * bool * string option * string option diff --git a/sparsify/in_place.ml b/sparsify/in_place.ml index 9f46ad3..624f676 100644 --- a/sparsify/in_place.ml +++ b/sparsify/in_place.ml @@ -28,12 +28,23 @@ module G = Guestfs open Common_utils open Cmdline -let run disk format ignores machine_readable quiet verbose trace zeroes = +let rec run disk format ignores machine_readable quiet verbose trace zeroes = (* Connect to libguestfs. *) let g = new G.guestfs () in if trace then g#set_trace true; if verbose then g#set_verbose true; + try + perform g disk format ignores machine_readable quiet zeroes + with + G.Error msg as exn -> + if g#last_errno () = G.Errno.errno_ENOTSUP then ( + (* for exit code 3, see man page *) + error ~exit_code:3 (f_"discard/trim is not supported: %s") msg; + ) + else raise exn + +and perform g disk format ignores machine_readable quiet zeroes = (* XXX Current limitation of the API. Can remove this hunk in future. *) let format = match format with diff --git a/sparsify/test-virt-sparsify-in-place.sh b/sparsify/test-virt-sparsify-in-place.sh index 56311a0..dd32963 100755 --- a/sparsify/test-virt-sparsify-in-place.sh +++ b/sparsify/test-virt-sparsify-in-place.sh @@ -49,7 +49,13 @@ EOF size_before=$(du -s test-virt-sparsify-in-place.img | awk '{print $1}') -$VG ./virt-sparsify --debug-gc --in-place test-virt-sparsify-in-place.img +$VG ./virt-sparsify --debug-gc --in-place test-virt-sparsify-in-place.img || { + if [ "$?" -eq 3 ]; then + echo "$0: discard not supported in virt-sparsify" + exit 77 + fi + exit 1 +} size_after=$(du -s test-virt-sparsify-in-place.img | awk '{print $1}') diff --git a/sparsify/virt-sparsify.pod b/sparsify/virt-sparsify.pod index c12a15f..de07439 100644 --- a/sparsify/virt-sparsify.pod +++ b/sparsify/virt-sparsify.pod @@ -381,6 +381,25 @@ temporary space are B<not> required. For other environment variables, see L<guestfs(3)/ENVIRONMENT VARIABLES>. +=head1 EXIT STATUS + +This program returns 0 if the operation completed without errors. +(This doesn't necessarily mean that space could be freed up.) + +A non-zero exit code indicates an error. + +If the exit code is C<3> and the I<--in-place> option was used, that +indicates that discard support is not available in libguestfs, so +copying mode must be used instead. + +=over 4 + +=item 0 + +successful exit + +=back + =head1 SEE ALSO L<virt-filesystems(1)>, -- 1.8.5.3