#!/bin/bash -eu

. shell-error
. initrd-sh-functions
. uevent-sh-functions
. /.initrd/initenv

PROG="${QUEUE:--}: session=${SESSION:-0}: $PROG"
message_time=1

delay="${RAID_MEMBER_DELAY-}"

is_raid()
{
	local MD_UUID='' MD_DEVICES='' MD_METADATA='' MD_DEVNAME='' MD_NAME=''

	# shellcheck disable=SC2046
	eval $(mdadm --detail --export "/dev/block/$1")

	[ -n "$MD_UUID" ] && [ -f "/etc/initrd/md/${MD_UUID//:}" ] ||
		return 1
}

process_timeout()
{
	# inactive mdraid salvation (#28879)
	inactive=
	for md in /sys/block/*/md/array_state; do
		[ -e "$md" ] ||
			break

		dev=
		readline dev "${md%/md/array_state}/dev"

		is_raid "$dev" ||
			continue

		state=
		readline state "$md"

		[ "$state" != "inactive" ] ||
			inactive=1
	done

	[ -z "$inactive" ] ||
		mdadm -IRs ||:

	for md in /sys/block/*/md/array_state; do
		[ -e "$md" ] ||
			break

		state=
		readline state "$md"

		[ "$state" = "read-auto" ] ||
			continue

		dev=
		readline dev "${md%/md/array_state}/dev"

		is_raid "$dev" ||
			continue

		mdadm -w "/dev/block/$dev" ||:
	done
}

has_member_events=
for e in "$1"/md-raid-member.*; do
	[ -f "$e" ] || continue
	has_member_events=1
	done_event "$e" ||:
done

if [ -n "$has_member_events" ]; then
	for e in "$1"/timeout.member.*; do
		[ -f "$e" ] || continue
		done_event "$e" ||:
	done

	queue_cancel_timeouts md-raid-member member

	[ -n "$delay" ] && [ "$delay" -gt 0 ] ||
		exit 0

	queue_timeout_after md-raid-member "$delay" member REASON=raid-activation
	exit 0
fi

has_timeout_events=
for e in "$1"/timeout.member.*; do
	[ -f "$e" ] || continue
	has_timeout_events=1
	done_event "$e" ||:
done

[ -z "$has_timeout_events" ] ||
	process_timeout
