[PATCH] Revert "kbuild: create deterministic initramfs directory listings"

From: Andrzej Pietrasiewicz
Date: Thu Aug 16 2018 - 12:18:40 EST


This reverts commit 9e6e0d5f2a2713402cf9dce69b9f9b516e4185d2.

The reverted commit introduces broken builds. Even though the cpio archive
does contain all the specified files, it seems that the kernel, while
populating rootfs, scans the cpio buffer linearly and fails to create
files whose parent directories are nonexistent at the moment of this failed
creation. As a result, such files are not accessible when kernel boots into
initramfs.

Here is how to reproduce, from inside kernel source directory, with the
patch in question not reverted:

$ mkdir -p ../test/find/me/if/you/can
$ touch ../test/find/me/if/you/can/file.txt
$ cat ../initramfs.list
file /busybox-x86_64 ../initramfs/busybox-x86_64 0755 0 0
dir /sbin 0755 0 0
dir /proc 0755 0 0
dir /sys 0755 0 0
dir /bin 0755 0 0
dir /usr 0755 0 0
dir /usr/sbin 0755 0 0
dir /usr/bin 0755 0 0
dir /etc 0755 0 0
dir /etc/init.d 0755 0 0
file /etc/inittab ../initramfs/inittab 0755 0 0
file /etc/init.d/rcS ../initramfs/rcS-x86_64 0755 0 0
dir /lib 0755 0 0
dir /lib/modules 0755 0 0
$ ls ../initramfs
busybox-x86_64 inittab rcS-x86_64
$ cat ../initramfs/inittab
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/sbin/swapoff -a
::shutdown:/sbin/umount -a -r
::restart:/sbin/init
$ cat ../initramfs/rcS-x86_64
#!/busybox-x86_64 sh

/busybox-x86_64 --install

mount -t proc none /proc
mount -t sysfs none /sys

mdev -s
echo /sbin/mdev > /proc/sys/kernel/hotplug
$ scripts/gen_initramfs_list.sh ../test/ ../initramfs.list

#####################
# ../test/
# Last modified: 1534428527.0818855150

file /find/me/if/you/can/file.txt ../test/find/me/if/you/can/file.txt 664 1000 1000
dir /find/me/if/you/can 775 1000 1000
dir /find/me/if/you 775 1000 1000
dir /find/me/if 775 1000 1000
dir /find/me 775 1000 1000
dir /find 775 1000 1000

#####################
# ../initramfs.list
# Last modified: 1534433777.8384497600

file /busybox-x86_64 ../initramfs/busybox-x86_64 0755 0 0
dir /sbin 0755 0 0
dir /proc 0755 0 0
dir /sys 0755 0 0
dir /bin 0755 0 0
dir /usr 0755 0 0
dir /usr/sbin 0755 0 0
dir /usr/bin 0755 0 0
dir /etc 0755 0 0
dir /etc/init.d 0755 0 0
file /etc/inittab ../initramfs/inittab 0755 0 0
file /etc/init.d/rcS ../initramfs/rcS-x86_64 0755 0 0
dir /lib 0755 0 0
dir /lib/modules 0755 0 0

$ cat ../initramfs.cpio | cpio -t
find/me/if/you/can/file.txt
find/me/if/you/can
find/me/if/you
find/me/if
find/me
find
busybox-x86_64
sbin
proc
sys
bin
usr
usr/sbin
usr/bin
etc
etc/init.d
etc/inittab
etc/init.d/rcS
lib
lib/modules
1961 blokÃw

BUT:

$ qemu-system-x86_64 -nographic -serial mon:stdio \
-kernel arch/x86/boot/bzImage \
-append "root=/dev/ram console=ttyS0 rdinit=/busybox-x86_64 init" \
-M q35 -initrd ../initramfs.cpio

# ls
bin etc linuxrc sbin
busybox-x86_64 find proc sys
dev lib root usr
/ # ls -l find
total 0

With the patch reverted the file /find/me/if/you/can/file.txt
is accessible:

$ scripts/gen_initramfs_list.sh ../test/ ../initramfs.list

#####################
# ../test/
# Last modified: 1534428527.0818855150

dir /find 775 1000 1000
dir /find/me 775 1000 1000
dir /find/me/if 775 1000 1000
dir /find/me/if/you 775 1000 1000
dir /find/me/if/you/can 775 1000 1000
file /find/me/if/you/can/file.txt ../test/find/me/if/you/can/file.txt 664 1000 1000

#####################
# ../initramfs.list
# Last modified: 1534433777.8384497600

file /busybox-x86_64 ../initramfs/busybox-x86_64 0755 0 0
dir /sbin 0755 0 0
dir /proc 0755 0 0
dir /sys 0755 0 0
dir /bin 0755 0 0
dir /usr 0755 0 0
dir /usr/sbin 0755 0 0
dir /usr/bin 0755 0 0
dir /etc 0755 0 0
dir /etc/init.d 0755 0 0
file /etc/inittab ../initramfs/inittab 0755 0 0
file /etc/init.d/rcS ../initramfs/rcS-x86_64 0755 0 0
dir /lib 0755 0 0
dir /lib/modules 0755 0 0

$ cat ../initramfs.cpio | cpio -t
find
find/me
find/me/if
find/me/if/you
find/me/if/you/can
find/me/if/you/can/file.txt
busybox-x86_64
sbin
proc
sys
bin
usr
usr/sbin
usr/bin
etc
etc/init.d
etc/inittab
etc/init.d/rcS
lib
lib/modules
1961 blokÃw

$ qemu-system-x86_64 -nographic -serial mon:stdio \
-kernel arch/x86/boot/bzImage \
-append "root=/dev/ram console=ttyS0 rdinit=/busybox-x86_64 init" \
-M q35 -initrd ../initramfs.cpio

# find find/
find/
find/me
find/me/if
find/me/if/you
find/me/if/you/can
find/me/if/you/can/file.txt
/ #

Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@xxxxxxxxxxx>
---
scripts/gen_initramfs_list.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scripts/gen_initramfs_list.sh b/scripts/gen_initramfs_list.sh
index 10e528b..e5d7b03 100755
--- a/scripts/gen_initramfs_list.sh
+++ b/scripts/gen_initramfs_list.sh
@@ -174,7 +174,7 @@ dir_filelist() {
${dep_list}header "$1"

srcdir=$(echo "$1" | sed -e 's://*:/:g')
- dirlist=$(find "${srcdir}" -printf "%p %m %U %G\n" | sort)
+ dirlist=$(find "${srcdir}" -printf "%p %m %U %G\n")

# If $dirlist is only one line, then the directory is empty
if [ "$(echo "${dirlist}" | wc -l)" -gt 1 ]; then
--
2.7.4