Skip to content
  • Florian Fainelli's avatar
    initramfs: fix disabling of initramfs (and its compression) · 57ddfdaa
    Florian Fainelli authored
    Commit db2aa7fd ("initramfs: allow again choice of the embedded
    initram compression algorithm") introduced the possibility to select the
    initramfs compression algorithm from Kconfig and while this is a nice
    feature it broke the use case described below.
    
    Here is what my build system does:
    
     - kernel is initially configured not to have an initramfs included
    
     - build the user space root file system
    
     - re-configure the kernel to have an initramfs included
       (CONFIG_INITRAMFS_SOURCE="/path/to/romfs") and set relevant
       CONFIG_INITRAMFS options, in my case, no compression option
       (CONFIG_INITRAMFS_COMPRESSION_NONE)
    
     - kernel is re-built with these options -> kernel+initramfs image is
       copied
    
     - kernel is re-built again without these options -> kernel image is
       copied
    
    Building a kernel without an initramfs means setting this option:
    
      CONFIG_INITRAMFS_SOURCE="" (and this one only)
    
    whereas building a kernel with an initramfs means setting these options:
    
      CONFIG_INITRAMFS_SOURCE="/home/fainelli/work/uclinux-rootfs/romfs /home/fainelli/work/uclinux-rootfs/misc/initramfs.dev"
      CONFIG_INITRAMFS_ROOT_UID=1000
      CONFIG_INITRAMFS_ROOT_GID=1000
      CONFIG_INITRAMFS_COMPRESSION_NONE=y
      CONFIG_INITRAMFS_COMPRESSION=""
    
    Commit db2aa7fd ("initramfs: allow again choice of the embedded
    initram compression algorithm") is problematic because
    CONFIG_INITRAMFS_COMPRESSION which is used to determine the
    initramfs_data.cpio extension/compression is a string, and due to how
    Kconfig works it will evaluate in order, how to assign it.
    
    Setting CONFIG_INITRAMFS_COMPRESSION_NONE with CONFIG_INITRAMFS_SOURCE=""
    cannot possibly work (because of the depends on INITRAMFS_SOURCE!=""
    imposed on CONFIG_INITRAMFS_COMPRESSION ) yet we still get
    CONFIG_INITRAMFS_COMPRESSION assigned to ".gz" because CONFIG_RD_GZIP=y
    is set in my kernel, even when there is no initramfs being built.
    
    So we basically end-up generating two initramfs_data.cpio* files, one
    without extension, and one with .gz.  This causes usr/Makefile to track
    usr/initramfs_data.cpio.gz, and not usr/initramfs_data.cpio anymore,
    that is also largely problematic after 9e3596b0 ("kbuild:
    initramfs cleanup, set target from Kconfig") because we used to track
    all possible initramfs_data files in the $(targets) variable before that
    commit.
    
    The end result is that the kernel with an initramfs clearly does not
    contain what we expect it to, it has a stale initramfs_data.cpio file
    built into it, and we keep re-generating an initramfs_data.cpio.gz file
    which is not the one that we want to include in the kernel image proper.
    
    The fix consists in hiding CONFIG_INITRAMFS_COMPRESSION when
    CONFIG_INITRAMFS_SOURCE="".  This puts us back in a state to the
    pre-4.10 behavior where we can properly disable and re-enable initramfs
    within the same kernel .config file, and be in control of what
    CONFIG_INITRAMFS_COMPRESSION is set to.
    
    Fixes: db2aa7fd ("initramfs: allow again choice of the embedded initram compression algorithm")
    Fixes: 9e3596b0 ("kbuild: initramfs cleanup, set target from Kconfig")
    Link: http://lkml.kernel.org/r/20170521033337.6197-1-f.fainelli@gmail.com
    
    
    Signed-off-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
    Acked-by: default avatarNicholas Piggin <npiggin@gmail.com>
    Cc: P J P <ppandit@redhat.com>
    Cc: Paul Bolle <pebolle@tiscali.nl>
    Cc: Michal Marek <mmarek@suse.cz>
    Cc: Daniel Thompson <daniel.thompson@linaro.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    57ddfdaa