Bug 853763
| Summary: | virt-sparsify should use a more robust method to detect the input format | ||
|---|---|---|---|
| Product: | Red Hat Enterprise Linux 6 | Reporter: | Richard W.M. Jones <rjones> |
| Component: | libguestfs | Assignee: | Richard W.M. Jones <rjones> |
| Status: | CLOSED ERRATA | QA Contact: | Virtualization Bugs <virt-bugs> |
| Severity: | unspecified | Docs Contact: | |
| Priority: | unspecified | ||
| Version: | 6.4 | CC: | dyasny, leiwang, mbooth, moli, qguan, wshi |
| Target Milestone: | rc | ||
| Target Release: | --- | ||
| Hardware: | Unspecified | ||
| OS: | Unspecified | ||
| Whiteboard: | |||
| Fixed In Version: | libguestfs-1.16.31-2.el6 | Doc Type: | Bug Fix |
| Doc Text: | Story Points: | --- | |
| Clone Of: | 853762 | Environment: | |
| Last Closed: | 2013-02-21 08:38:42 UTC | Type: | Bug |
| Regression: | --- | Mount Type: | --- |
| Documentation: | --- | CRM: | |
| Verified Versions: | Category: | --- | |
| oVirt Team: | --- | RHEL 7.3 requirements from Atomic Host: | |
| Cloudforms Team: | --- | Target Upstream Version: | |
| Embargoed: | |||
| Bug Depends On: | 853762 | ||
| Bug Blocks: | |||
|
Description
Richard W.M. Jones
2012-09-02 18:34:36 UTC
hi Rich,
i could found this commit in master branch, but didn't find in 1.16 branch, if we forget to backport this commit?
index 379ccf4..fa729f3 100644
--- a/sparsify/sparsify.ml
+++ b/sparsify/sparsify.ml
@@ -351,25 +351,10 @@ let output_format =
| Some fmt -> fmt (* user specified input format, use that *)
| None ->
(* Don't know, so we must autodetect. *)
- let cmd = sprintf "file -bsL %s" (Filename.quote indisk) in
- let chan = open_process_in cmd in
- let line = input_line chan in
- let stat = close_process_in chan in
- (match stat with
- | WEXITED 0 -> ()
- | WEXITED _ ->
- error (f_"external command failed: %s") cmd
- | WSIGNALED i ->
- error (f_"external command '%s' killed by signal %d") cmd i
- | WSTOPPED i ->
- error (f_"external command '%s' stopped by signal %d") cmd i
- );
- if string_prefix line "QEMU QCOW Image (v2)" then
- "qcow2"
- else if string_find line "VirtualBox" >= 0 then
- "vdi"
- else
- "raw" (* XXX guess *)
+ match g#disk_format indisk with
+ | "unknown" ->
+ error (f_"cannot detect input disk format; use the --format parameter")
+ | fmt -> fmt
(* Now run qemu-img convert which copies the overlay to the
* destination and automatically does sparsification.
but in 1.16, still get this,
*)
let output_format =
match convert with
| Some fmt -> fmt (* user specified output conversion *)
| None ->
match format with
| Some fmt -> fmt (* user specified input format, use that *)
| None ->
(* Don't know, so we must autodetect. *)
let cmd = sprintf "file -bsL %s" (Filename.quote indisk) in
let chan = open_process_in cmd in
let line = input_line chan in
let stat = close_process_in chan in
(match stat with
| WEXITED 0 -> ()
| WEXITED _ ->
error "external command failed: %s" cmd
| WSIGNALED i ->
error "external command '%s' killed by signal %d" cmd i
| WSTOPPED i ->
error "external command '%s' stopped by signal %d" cmd i
);
if string_prefix line "QEMU QCOW Image (v2)" then
"qcow2"
else if string_find line "VirtualBox" >= 0 then
"vdi"
else
"raw" (* XXX guess *)
This is the patch that I added to RHEL 6. Note it fixes
the problem (different 'file' command output), but it does
not use the guestfs_disk_format method. The reason for not
using the guestfs_disk_format method is that it doesn't exist
in RHEL 6 / libguestfs 1.16. Backporting that method would
be possible, but I opted for the simple (safer?) one-line
fix instead.
commit 9a772e90efef6b0313367600f3ff71916fee0ecc
Author: Richard W.M. Jones <rjones>
Date: Thu Sep 27 16:36:56 2012 +0100
RHEL 6: Change virt-sparsify to work with old 'file' command (RHBZ#853763).
The old 'file' command in RHEL produces different output from
upstream / Fedora:
rhel$ file -bsL /tmp/disk.qcow2
Qemu Image, Format: Qcow , Version: 2
fedora$ file -bsL /tmp/disk.qcow2
QEMU QCOW Image (v2), 10485760 bytes
Upstream solves this in a more robust way, but that would involve
difficult backporting of a new API.
diff --git a/sparsify/sparsify.ml b/sparsify/sparsify.ml
index 544c8ab..bf0d3d0 100644
--- a/sparsify/sparsify.ml
+++ b/sparsify/sparsify.ml
@@ -299,7 +299,7 @@ let output_format =
| WSTOPPED i ->
error "external command '%s' stopped by signal %d" cmd i
);
- if string_prefix line "QEMU QCOW Image (v2)" then
+ if string_prefix line "Qemu Image, Format: Qcow , Version: 2" then
"qcow2"
else if string_find line "VirtualBox" >= 0 then
"vdi"
Since the problem described in this bug report should be resolved in a recent advisory, it has been closed with a resolution of ERRATA. For information on the advisory, and where to find the updated files, follow the link below. If the solution does not work for you, open a new bug report. http://rhn.redhat.com/errata/RHBA-2013-0324.html |