mirror of
https://github.com/libguestfs/libguestfs.git
synced 2026-03-22 07:03:38 +00:00
daemon/parted: work around part table type misreporting by "parted"
"parted" incorrectly reports "loop" rather than "msdos" for the partition table type, when the (fake) partition table comes from the "--mbr" option of "mkfs.fat" (in dosfstools-4.2+), and the FAT variant in question is FAT16 or FAT32. (See RHBZ#2026224.) Work this around by - parsing the partition table ourselves, and - overriding "loop" with "msdos" when appropriate. Note that when the FAT variant is FAT12, "parted" fails to parse the fake MBR partition table completely (see RHBZ#2026220), which we cannot work around. However, FAT12 should be a rare corner case in libguestfs usage -- "mkfs.fat" auto-chooses FAT12 only below 9MB disk size, and even "-F 12" can only be forced up to and including 255MB disk size. Add the helper function "has_bogus_mbr" to the Utils module; we'll use it elsewhere too. Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1931821 Signed-off-by: Laszlo Ersek <lersek@redhat.com> Acked-by: Richard W.M. Jones <rjones@redhat.com> Message-Id: <20211125094954.9713-5-lersek@redhat.com> [lersek@redhat.com: drop "fun" keyword, and use partial application, in the definition of "sec0at" [Rich]]
This commit is contained in:
@@ -118,7 +118,12 @@ let part_get_parttype device =
|
||||
let fields = String.nsplit ":" device_line in
|
||||
match fields with
|
||||
| _::_::_::_::_::"loop"::_ -> (* If "loop" return an error (RHBZ#634246). *)
|
||||
failwithf "%s: not a partitioned device" device
|
||||
(* ... Unless parted failed to recognize the fake MBR that mkfs.fat from
|
||||
* dosfstools-4.2+ created. In that case, return "msdos" for MBR
|
||||
* (RHBZ#1931821).
|
||||
*)
|
||||
if Utils.has_bogus_mbr device then "msdos"
|
||||
else failwithf "%s: not a partitioned device" device
|
||||
| _::_::_::_::_::ret::_ -> ret
|
||||
| _ ->
|
||||
failwithf "%s: cannot parse the output of parted" device
|
||||
|
||||
Reference in New Issue
Block a user