Re: [BUG] OpenRISC exec init fails, bisected to 0886551 ("initramfs: finish fput() before accessing any binary from initramfs")

From: Lokesh Vutla
Date: Thu May 04 2017 - 03:48:10 EST




On Thursday 04 May 2017 12:41 PM, Stafford Horne wrote:
> Hello,
>
> While booting the v4.11 kernel I found the below issue.
>
> The summary of the issue mentions
>
> Commit 4a9d4b024a31 ("switch fput to task_work_add") implements a
> schedule_work() for completing fput(), but did not guarantee calling
> __fput() after unpacking initramfs. Because of this, there is a
> possibility that during boot a driver can see ETXTBSY when it tries to
> load a binary from initramfs as fput() is still pending on that binary.
>
> It seems this patch (0886551) introduces that issue though?
>
> I am looking into it, but any suggestions would be helpful.

Can you check if flush_delayed_fput() is being called? Do you have
CONFIG_INITRAMFS_FORCE enabled?

Can I see complete boot log?

Thanks and regards,
Lokesh

>
> BOOT LOG
>
> Compiled-in FDT at c03b9100
> Linux version 4.10.0-10351-g0886551 (shorne@xxxxxxxxxxxxxxxxxxxxx) (gcc version 5.4.0 (GCC) ) #223 Thu May 4 16:01:02 JST 2017
> CPU: OpenRISC-0 (revision 0) @20 MHz
> ...
> Freeing unused kernel memory: 2856K
> This architecture does not have kernel memory protection.
> Failed to execute /init (error -26)
> Starting init: /sbin/init exists but couldn't execute it (error -26)
> Starting init: /bin/sh exists but couldn't execute it (error -26)
> Kernel panic - not syncing: No working init found. Try passing init= option to kernel. See Linux Documentation/admin-guide/init.rst for guidance.
> ---[ end Kernel panic - not syncing: No working init found. Try passing init= option to kernel. See Linux Documentation/admin-guide/init.rst for guidance.
>
>
> TO REPRODUCE
>
> The failure is intermittent.
>
> Using some tools:
> - initramfs: https://github.com/stffrdhrn/or1k-utils
> - compiler: https://github.com/openrisc/or1k-gcc/releases (or1k-linux-5.4.0-20170218.tar.xz)
> - qemu: version 2.9
>
> Make and run using:
> make ARCH=openrisc defconfig
> make -j5 ARCH=openrisc CROSS_COMPILE=or1k-linux- \
> CONFIG_INITRAMFS_SOURCE="../openrisc/or1k-utils/initramfs ../openrisc/or1k-utils/initramfs.devnodes"
>
> qemu-system-or1k -cpu or1200 -M or1k-sim -kernel vmlinux -serial stdio \
> -nographic -monitor none
>
> -Stafford
>