]> Git Repo - linux.git/commitdiff
x86/boot: Fix make hdimage with older versions of mtools
authorH. Peter Anvin (Intel) <[email protected]>
Sat, 11 Sep 2021 00:39:06 +0000 (17:39 -0700)
committerBorislav Petkov <[email protected]>
Wed, 29 Sep 2021 09:06:47 +0000 (11:06 +0200)
Some versions of mtools (fixed somewhere between 4.0.31 and 4.0.35)
generate bad output for mformat when used with the partition= option.
Use the offset= option instead. An mtools.conf entry is *also* needed
with partition= to support mpartition; combining them in one entry does
not work either.

Don't specify the -t option to mpartition; it is unnecessary and seems
to confuse mpartition under some circumstances.

Also do a few minor optimizations:

Use a larger cluster size; there is no reason for the typical 4K
clusters when we are dealing mainly with comparatively huge files.

Start the partition at 32K. There is no reason to align it more than
that, since the internal FAT filesystem structures will at best be
cluster-aligned, and 32K is the maximum FAT cluster size.

 [ bp: Remove "we". ]

Signed-off-by: H. Peter Anvin (Intel) <[email protected]>
Signed-off-by: Borislav Petkov <[email protected]>
Link: https://lkml.kernel.org/r/[email protected]
arch/x86/boot/genimage.sh
arch/x86/boot/mtools.conf.in

index 0673fdfc1a11abdd6a12be8b4f324d009065e6f5..c9299aeb7333e64b98cdcc112a45ed87f715c148 100644 (file)
@@ -120,12 +120,13 @@ efiarch() {
 }
 
 # Get the combined sizes in bytes of the files given, counting sparse
-# files as full length, and padding each file to a 4K block size
+# files as full length, and padding each file to cluster size
+cluster=16384
 filesizes() {
        local t=0
        local s
        for s in $(ls -lnL "$@" 2>/dev/null | awk '/^-/{ print $5; }'); do
-               t=$((t + ((s+4095)/4096)*4096))
+               t=$((t + ((s+cluster-1)/cluster)*cluster))
        done
        echo $t
 }
@@ -230,14 +231,14 @@ genhdimage() {
                ptype='-T 0xef' # EFI system partition, no GPT
        fi
        sizes=$(filesizes "$FBZIMAGE" "${FDINITRDS[@]}" "$efishell")
-       # Allow 1% + 1 MiB for filesystem and partition table overhead,
-       # syslinux, and config files
+       # Allow 1% + 2 MiB for filesystem and partition table overhead,
+       # syslinux, and config files; this is probably excessive...
        megs=$(((sizes + sizes/100 + 2*1024*1024 - 1)/(1024*1024)))
        $dd if=/dev/zero of="$FIMAGE" bs=$((1024*1024)) count=$megs 2>/dev/null
-       mpartition -I -c -s 32 -h 64 -t $megs $ptype -b 512 -a h:
+       mpartition -I -c -s 32 -h 64 $ptype -b 64 -a p:
        $dd if="$mbr" of="$FIMAGE" bs=440 count=1 conv=notrunc 2>/dev/null
-       mformat -v 'LINUX_BOOT' -s 32 -h 64 -t $megs h:
-       syslinux --offset $((512*512)) "$FIMAGE"
+       mformat -v 'LINUX_BOOT' -s 32 -h 64 -c $((cluster/512)) -t $megs h:
+       syslinux --offset $((64*512)) "$FIMAGE"
        do_mcopy h:
 }
 
index 9e2662d013641b8dbd65e2f5bf44ec38ad78cf25..174c60508766cf1ba0a8bb53ee1a5a532af4e276 100644 (file)
@@ -14,7 +14,8 @@ drive v:
 drive w:
   file="@OBJ@/fdimage" cylinders=80 heads=2 sectors=36 filter
 
-# Hard disk
+# Hard disk (h: for the filesystem, p: for format - old mtools bug?)
 drive h:
+  file="@OBJ@/hdimage" offset=32768 mformat_only
+drive p:
   file="@OBJ@/hdimage" partition=1 mformat_only
-
This page took 0.058626 seconds and 4 git commands to generate.