archrelease: copy trunk to extra-x86_64
[arch-packages.git] / dracut / trunk / dracut-systemd-253.patch
blobbf40eace053f38480899ddd9c97d401e9e0dc89a
1 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2 From: Antonio Alvarez Feijoo <antonio.feijoo@suse.com>
3 Date: Mon, 9 Jan 2023 11:47:06 +0100
4 Subject: [PATCH 1/4] fix(dracut-systemd): remove unused argument
6 The `generator_wait_for_dev` function of the dracut rootfs systemd generator
7 only uses the first argument. Moreover, RDRETRY is unset at this point.
9 (cherry picked from commit eb75861c2a1c05eb142616da1891a7fa5a2a34e1)
10 ---
11 modules.d/98dracut-systemd/rootfs-generator.sh | 2 +-
12 1 file changed, 1 insertion(+), 1 deletion(-)
14 diff --git a/modules.d/98dracut-systemd/rootfs-generator.sh b/modules.d/98dracut-systemd/rootfs-generator.sh
15 index e1d365df..3238b495 100755
16 --- a/modules.d/98dracut-systemd/rootfs-generator.sh
17 +++ b/modules.d/98dracut-systemd/rootfs-generator.sh
18 @@ -104,7 +104,7 @@ esac
19 GENERATOR_DIR="$1"
21 if [ "$rootok" = "1" ]; then
22 - generator_wait_for_dev "${root#block:}" "$RDRETRY"
23 + generator_wait_for_dev "${root#block:}"
24 generator_fsck_after_pre_mount "${root#block:}"
25 strstr "$(cat /proc/cmdline)" 'root=' || generator_mount_rootfs "${root#block:}" "$(getarg rootfstype=)" "$(getarg rootflags=)"
28 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
29 From: Antonio Alvarez Feijoo <antonio.feijoo@suse.com>
30 Date: Wed, 1 Mar 2023 11:21:16 +0100
31 Subject: [PATCH 2/4] fix(dracut-systemd): do not hardcode the systemd
32 generator directory
34 The normal directory is the first argument passed to the systemd generator,
35 so use it instead of hardcoding /run/systemd/generator.
37 (cherry picked from commit a2b32ed976898188bc98d9b6c7eec3dc45f4abf0)
38 ---
39 modules.d/98dracut-systemd/rootfs-generator.sh | 8 ++++----
40 1 file changed, 4 insertions(+), 4 deletions(-)
42 diff --git a/modules.d/98dracut-systemd/rootfs-generator.sh b/modules.d/98dracut-systemd/rootfs-generator.sh
43 index 3238b495..5b85d8c5 100755
44 --- a/modules.d/98dracut-systemd/rootfs-generator.sh
45 +++ b/modules.d/98dracut-systemd/rootfs-generator.sh
46 @@ -17,7 +17,7 @@ generator_wait_for_dev() {
47 # after remote-fs-pre.target since the initqueue is ordered before it so
48 # it will never actually show up (think Tang-pinned rootfs).
49 cat > "$hookdir/initqueue/finished/devexists-${_name}.sh" << EOF
50 -if ! grep -q After=remote-fs-pre.target /run/systemd/generator/systemd-cryptsetup@*.service 2>/dev/null; then
51 +if ! grep -q After=remote-fs-pre.target "$GENERATOR_DIR"/systemd-cryptsetup@*.service 2>/dev/null; then
52 [ -e "$1" ]
54 EOF
55 @@ -77,12 +77,12 @@ generator_fsck_after_pre_mount() {
56 [ -z "$1" ] && return 0
58 _name=$(dev_unit_name "$1")
59 - [ -d /run/systemd/generator/systemd-fsck@"${_name}".service.d ] || mkdir -p /run/systemd/generator/systemd-fsck@"${_name}".service.d
60 - if ! [ -f /run/systemd/generator/systemd-fsck@"${_name}".service.d/after-pre-mount.conf ]; then
61 + [ -d "$GENERATOR_DIR"/systemd-fsck@"${_name}".service.d ] || mkdir -p "$GENERATOR_DIR"/systemd-fsck@"${_name}".service.d
62 + if ! [ -f "$GENERATOR_DIR"/systemd-fsck@"${_name}".service.d/after-pre-mount.conf ]; then
64 echo "[Unit]"
65 echo "After=dracut-pre-mount.service"
66 - } > /run/systemd/generator/systemd-fsck@"${_name}".service.d/after-pre-mount.conf
67 + } > "$GENERATOR_DIR"/systemd-fsck@"${_name}".service.d/after-pre-mount.conf
72 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
73 From: Antonio Alvarez Feijoo <antonio.feijoo@suse.com>
74 Date: Wed, 1 Mar 2023 12:07:29 +0100
75 Subject: [PATCH 3/4] fix(dracut-systemd): check and create generator dir
76 outside of inner function
78 (cherry picked from commit e21f8f7d5abaae37ada8c7a6dc91c2d878e0b501)
79 ---
80 modules.d/98dracut-systemd/rootfs-generator.sh | 7 ++++---
81 1 file changed, 4 insertions(+), 3 deletions(-)
83 diff --git a/modules.d/98dracut-systemd/rootfs-generator.sh b/modules.d/98dracut-systemd/rootfs-generator.sh
84 index 5b85d8c5..c3f60ad4 100755
85 --- a/modules.d/98dracut-systemd/rootfs-generator.sh
86 +++ b/modules.d/98dracut-systemd/rootfs-generator.sh
87 @@ -51,7 +51,6 @@ generator_mount_rootfs() {
88 [ -z "$1" ] && return 0
90 _name=$(dev_unit_name "$1")
91 - [ -d "$GENERATOR_DIR" ] || mkdir -p "$GENERATOR_DIR"
92 if ! [ -f "$GENERATOR_DIR"/sysroot.mount ]; then
94 echo "[Unit]"
95 @@ -101,9 +100,11 @@ case "${root#block:}" in
97 esac
99 -GENERATOR_DIR="$1"
101 if [ "$rootok" = "1" ]; then
102 + GENERATOR_DIR="$1"
103 + [ -z "$GENERATOR_DIR" ] && exit 1
104 + [ -d "$GENERATOR_DIR" ] || mkdir -p "$GENERATOR_DIR"
106 generator_wait_for_dev "${root#block:}"
107 generator_fsck_after_pre_mount "${root#block:}"
108 strstr "$(cat /proc/cmdline)" 'root=' || generator_mount_rootfs "${root#block:}" "$(getarg rootfstype=)" "$(getarg rootflags=)"
110 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
111 From: Antonio Alvarez Feijoo <antonio.feijoo@suse.com>
112 Date: Fri, 3 Mar 2023 16:06:30 +0100
113 Subject: [PATCH 4/4] fix(dracut-systemd): rootfs-generator cannot write
114 outside of generator dir
116 Altough it was already documented in systemd.generator(7) that generators must
117 not write to locations other than those passed as arguments, since
118 https://github.com/systemd/systemd/commit/ca6ce62d systemd executes generators
119 in a mount namespace "sandbox", so now the hooks created by the rootfs-generator
120 are lost.
122 These hooks are created using the root= cmdline argument, so this patch moves
123 the creation of these hooks to a cmdline hook.
125 Fixes issue #2211
126 Fixes issue #2225
128 (cherry picked from commit 4bde75fabe31a5c048fd75e533b94e91c3faa83b)
130 modules.d/98dracut-systemd/module-setup.sh | 2 +
131 .../98dracut-systemd/parse-root.sh (new +x) | 38 +++++++++++++++++++
132 .../98dracut-systemd/rootfs-generator.sh | 20 +---------
133 3 files changed, 41 insertions(+), 19 deletions(-)
135 diff --git a/modules.d/98dracut-systemd/module-setup.sh b/modules.d/98dracut-systemd/module-setup.sh
136 index b7da86db..e66fc956 100755
137 --- a/modules.d/98dracut-systemd/module-setup.sh
138 +++ b/modules.d/98dracut-systemd/module-setup.sh
139 @@ -37,6 +37,8 @@ install() {
141 inst_script "$moddir/rootfs-generator.sh" "$systemdutildir"/system-generators/dracut-rootfs-generator
143 + inst_hook cmdline 10 "$moddir/parse-root.sh"
145 for i in \
146 dracut-cmdline.service \
147 dracut-cmdline-ask.service \
148 diff --git a/modules.d/98dracut-systemd/parse-root.sh b/modules.d/98dracut-systemd/parse-root.sh
149 new file mode 100755
150 index 00000000..deeeff3f
151 --- /dev/null
152 +++ b/modules.d/98dracut-systemd/parse-root.sh
153 @@ -0,0 +1,38 @@
154 +#!/bin/sh
156 +type getarg > /dev/null 2>&1 || . /lib/dracut-lib.sh
158 +root=$(getarg root=)
159 +case "${root#block:}" in
160 + LABEL=* | UUID=* | PARTUUID=* | PARTLABEL=*)
161 + root="block:$(label_uuid_to_dev "$root")"
162 + rootok=1
163 + ;;
164 + /dev/nfs) # ignore legacy /dev/nfs
165 + ;;
166 + /dev/*)
167 + root="block:${root}"
168 + rootok=1
169 + ;;
170 +esac
172 +if [ "$rootok" = "1" ]; then
173 + root_dev="${root#block:}"
174 + root_name="$(str_replace "$root_dev" '/' '\x2f')"
175 + if ! [ -e "$hookdir/initqueue/finished/devexists-${root_name}.sh" ]; then
177 + # If a LUKS device needs unlocking via systemd in the initrd, assume
178 + # it's for the root device. In that case, don't block on it if it's
179 + # after remote-fs-pre.target since the initqueue is ordered before it so
180 + # it will never actually show up (think Tang-pinned rootfs).
181 + cat > "$hookdir/initqueue/finished/devexists-${root_name}.sh" << EOF
182 +if ! grep -q After=remote-fs-pre.target /run/systemd/generator/systemd-cryptsetup@*.service 2>/dev/null; then
183 + [ -e "$root_dev" ]
185 +EOF
187 + printf '[ -e "%s" ] || ' "$root_dev"
188 + printf 'warn "\"%s\" does not exist"\n' "$root_dev"
189 + } >> "$hookdir/emergency/80-${root_name}.sh"
190 + fi
192 diff --git a/modules.d/98dracut-systemd/rootfs-generator.sh b/modules.d/98dracut-systemd/rootfs-generator.sh
193 index c3f60ad4..bcfd2b89 100755
194 --- a/modules.d/98dracut-systemd/rootfs-generator.sh
195 +++ b/modules.d/98dracut-systemd/rootfs-generator.sh
196 @@ -6,28 +6,10 @@ generator_wait_for_dev() {
197 local _name
198 local _timeout
200 - _name="$(str_replace "$1" '/' '\x2f')"
201 + _name=$(dev_unit_name "$1")
202 _timeout=$(getarg rd.timeout)
203 _timeout=${_timeout:-0}
205 - if ! [ -e "$hookdir/initqueue/finished/devexists-${_name}.sh" ]; then
207 - # If a LUKS device needs unlocking via systemd in the initrd, assume
208 - # it's for the root device. In that case, don't block on it if it's
209 - # after remote-fs-pre.target since the initqueue is ordered before it so
210 - # it will never actually show up (think Tang-pinned rootfs).
211 - cat > "$hookdir/initqueue/finished/devexists-${_name}.sh" << EOF
212 -if ! grep -q After=remote-fs-pre.target "$GENERATOR_DIR"/systemd-cryptsetup@*.service 2>/dev/null; then
213 - [ -e "$1" ]
215 -EOF
217 - printf '[ -e "%s" ] || ' "$1"
218 - printf 'warn "\"%s\" does not exist"\n' "$1"
219 - } >> "$hookdir/emergency/80-${_name}.sh"
220 - fi
222 - _name=$(dev_unit_name "$1")
223 if ! [ -L "$GENERATOR_DIR"/initrd.target.wants/"${_name}".device ]; then
224 [ -d "$GENERATOR_DIR"/initrd.target.wants ] || mkdir -p "$GENERATOR_DIR"/initrd.target.wants
225 ln -s ../"${_name}".device "$GENERATOR_DIR"/initrd.target.wants/"${_name}".device