#!/usr/bin/ash
# Derived from grub-btrfs-overlayfs in Antynea/grub-btrfs.
# shellcheck shell=dash disable=SC2154

run_latehook() {
    # root is provided by mkinitcpio's init script.
    local root_mnt=/new_root
    local current_dev property lower_dir ram_dir overlay_options

    current_dev=$(resolve_device "$root") || return 0
    [ "$(blkid "$current_dev" -s TYPE -o value 2>/dev/null)" = btrfs ] || return 0

    property=$(btrfs property get "$root_mnt" ro 2>/dev/null) || return 0
    [ "$property" = ro=true ] || return 0

    lower_dir=$(mktemp -d -p /) || return 1
    ram_dir=$(mktemp -d -p /) || {
        rmdir "$lower_dir"
        return 1
    }

    if ! mount -t tmpfs cowspace "$ram_dir"; then
        rmdir "$lower_dir" "$ram_dir"
        return 1
    fi
    if ! mkdir -p "$ram_dir/upper" "$ram_dir/work"; then
        umount "$ram_dir" || true
        rmdir "$lower_dir" "$ram_dir"
        return 1
    fi
    if ! mount --move "$root_mnt" "$lower_dir"; then
        umount "$ram_dir" || true
        rmdir "$ram_dir/upper" "$ram_dir/work" "$lower_dir" "$ram_dir"
        return 1
    fi

    overlay_options="lowerdir=$lower_dir,upperdir=$ram_dir/upper,workdir=$ram_dir/work"
    if ! mount -t overlay -o "$overlay_options" rootfs "$root_mnt"; then
        # Restore the original root mount so initramfs recovery still has a
        # valid /new_root even when OverlayFS setup fails.
        mount --move "$lower_dir" "$root_mnt" || true
        umount "$ram_dir" || true
        rmdir "$ram_dir/upper" "$ram_dir/work" "$lower_dir" "$ram_dir" 2>/dev/null || true
        return 1
    fi
}
