forked from pool/systemd
Accepting request 89336 from home:fcrozat:systemd
- Add avoid-random-seed-cycle.patch: fix dependency cycle between cryptsetup and random-seed-load (bnc#721666). - Add crash-isolating.patch: fix crash when isolating a service. - Fix bootsplash being killed too early. - Fix some manpages not being redirected properly. - Add storage-after-cryptsetup.service to restart lvm after cryptsetup. Fixes lvm on top of LUKS (bnc#724238). - Add avoid-random-seed-cycle.patch: fix dependency cycle between cryptsetup and random-seed-load (bnc#721666). - Add crash-isolating.patch: fix crash when isolating a service. - Fix bootsplash being killed too early. - Fix some manpages not being redirected properly. - Add storage-after-cryptsetup.service to restart lvm after cryptsetup. Fixes lvm on top of LUKS (bnc#724238). OBS-URL: https://build.opensuse.org/request/show/89336 OBS-URL: https://build.opensuse.org/package/show/Base:System/systemd?expand=0&rev=219
This commit is contained in:
parent
1962b7c419
commit
f02af58b62
40
avoid-random-seed-cycle.patch
Normal file
40
avoid-random-seed-cycle.patch
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
|
||||||
|
Devices with random keys (swap), should not be ordered before local-fs.target,
|
||||||
|
as this creates a cycle with systemd-load-random-seed.service (and also it
|
||||||
|
does not make sense, a swap device is not a local-fs).
|
||||||
|
---
|
||||||
|
src/cryptsetup-generator.c | 6 ++++--
|
||||||
|
1 files changed, 4 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/cryptsetup-generator.c b/src/cryptsetup-generator.c
|
||||||
|
index 6f3aa78..a48b7a4 100644
|
||||||
|
--- a/src/cryptsetup-generator.c
|
||||||
|
+++ b/src/cryptsetup-generator.c
|
||||||
|
@@ -112,8 +112,7 @@ static int create_disk(
|
||||||
|
"DefaultDependencies=no\n"
|
||||||
|
"BindTo=%s dev-mapper-%%i.device\n"
|
||||||
|
"After=systemd-readahead-collect.service systemd-readahead-replay.service %s\n"
|
||||||
|
- "Before=umount.target\n"
|
||||||
|
- "Before=local-fs.target\n",
|
||||||
|
+ "Before=umount.target\n",
|
||||||
|
d, d);
|
||||||
|
|
||||||
|
if (!nofail)
|
||||||
|
@@ -125,6 +124,9 @@ static int create_disk(
|
||||||
|
streq(password, "/dev/hw_random")))
|
||||||
|
fprintf(f,
|
||||||
|
"After=systemd-random-seed-load.service\n");
|
||||||
|
+ else
|
||||||
|
+ fprintf(f,
|
||||||
|
+ "Before=local-fs.target\n");
|
||||||
|
|
||||||
|
fprintf(f,
|
||||||
|
"\n[Service]\n"
|
||||||
|
--
|
||||||
|
1.7.7
|
||||||
|
|
||||||
|
_______________________________________________
|
||||||
|
systemd-devel mailing list
|
||||||
|
systemd-devel@lists.freedesktop.org
|
||||||
|
http://lists.freedesktop.org/mailman/listinfo/systemd-devel
|
||||||
|
|
@ -1,6 +1,7 @@
|
|||||||
[Unit]
|
[Unit]
|
||||||
Description=Terminate bootsplash
|
Description=Terminate bootsplash
|
||||||
After=xdm.service rc-local.service bootsplash-startup.service
|
After=xdm.service rc-local.service bootsplash-startup.service
|
||||||
|
Before=getty@tty1.service
|
||||||
DefaultDependencies=no
|
DefaultDependencies=no
|
||||||
Names=plymout-quit-wait.service
|
Names=plymout-quit-wait.service
|
||||||
|
|
||||||
|
117
crash-isolating.patch
Normal file
117
crash-isolating.patch
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
From 563ba9ea6e60774086555998b957edf923e24b46 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Michal Schmidt <mschmidt@redhat.com>
|
||||||
|
Date: Mon, 17 Oct 2011 11:12:12 +0200
|
||||||
|
Subject: [PATCH] manager: fix a crash in isolating
|
||||||
|
|
||||||
|
HASHMAP_FOREACH is safe against the removal of the current entry, but
|
||||||
|
not against the removal of other entries. job_finish_and_invalidate()
|
||||||
|
can recursively remove other entries.
|
||||||
|
|
||||||
|
It triggered an assertion failure:
|
||||||
|
Assertion 'j->installed' failed at src/manager.c:1218, function
|
||||||
|
transaction_apply(). Aborting.
|
||||||
|
|
||||||
|
Fix the crash by iterating from the beginning when there is a
|
||||||
|
possibility that the iterator could be invalid.
|
||||||
|
|
||||||
|
It is O(n^2) in the worst case, but that's better than a crash.
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=717325
|
||||||
|
---
|
||||||
|
src/job.c | 19 ++++++++++++++-----
|
||||||
|
src/manager.c | 7 ++++++-
|
||||||
|
2 files changed, 20 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/job.c b/src/job.c
|
||||||
|
index 5c0913b..20971da 100644
|
||||||
|
--- a/src/job.c
|
||||||
|
+++ b/src/job.c
|
||||||
|
@@ -527,6 +527,7 @@ int job_finish_and_invalidate(Job *j, JobResult result) {
|
||||||
|
Unit *other;
|
||||||
|
JobType t;
|
||||||
|
Iterator i;
|
||||||
|
+ bool recursed = false;
|
||||||
|
|
||||||
|
assert(j);
|
||||||
|
assert(j->installed);
|
||||||
|
@@ -573,23 +574,29 @@ int job_finish_and_invalidate(Job *j, JobResult result) {
|
||||||
|
if (other->meta.job &&
|
||||||
|
(other->meta.job->type == JOB_START ||
|
||||||
|
other->meta.job->type == JOB_VERIFY_ACTIVE ||
|
||||||
|
- other->meta.job->type == JOB_RELOAD_OR_START))
|
||||||
|
+ other->meta.job->type == JOB_RELOAD_OR_START)) {
|
||||||
|
job_finish_and_invalidate(other->meta.job, JOB_DEPENDENCY);
|
||||||
|
+ recursed = true;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
SET_FOREACH(other, u->meta.dependencies[UNIT_BOUND_BY], i)
|
||||||
|
if (other->meta.job &&
|
||||||
|
(other->meta.job->type == JOB_START ||
|
||||||
|
other->meta.job->type == JOB_VERIFY_ACTIVE ||
|
||||||
|
- other->meta.job->type == JOB_RELOAD_OR_START))
|
||||||
|
+ other->meta.job->type == JOB_RELOAD_OR_START)) {
|
||||||
|
job_finish_and_invalidate(other->meta.job, JOB_DEPENDENCY);
|
||||||
|
+ recursed = true;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
SET_FOREACH(other, u->meta.dependencies[UNIT_REQUIRED_BY_OVERRIDABLE], i)
|
||||||
|
if (other->meta.job &&
|
||||||
|
!other->meta.job->override &&
|
||||||
|
(other->meta.job->type == JOB_START ||
|
||||||
|
other->meta.job->type == JOB_VERIFY_ACTIVE ||
|
||||||
|
- other->meta.job->type == JOB_RELOAD_OR_START))
|
||||||
|
+ other->meta.job->type == JOB_RELOAD_OR_START)) {
|
||||||
|
job_finish_and_invalidate(other->meta.job, JOB_DEPENDENCY);
|
||||||
|
+ recursed = true;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
} else if (t == JOB_STOP) {
|
||||||
|
|
||||||
|
@@ -597,8 +604,10 @@ int job_finish_and_invalidate(Job *j, JobResult result) {
|
||||||
|
if (other->meta.job &&
|
||||||
|
(other->meta.job->type == JOB_START ||
|
||||||
|
other->meta.job->type == JOB_VERIFY_ACTIVE ||
|
||||||
|
- other->meta.job->type == JOB_RELOAD_OR_START))
|
||||||
|
+ other->meta.job->type == JOB_RELOAD_OR_START)) {
|
||||||
|
job_finish_and_invalidate(other->meta.job, JOB_DEPENDENCY);
|
||||||
|
+ recursed = true;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -626,7 +635,7 @@ finish:
|
||||||
|
|
||||||
|
manager_check_finished(u->meta.manager);
|
||||||
|
|
||||||
|
- return 0;
|
||||||
|
+ return recursed;
|
||||||
|
}
|
||||||
|
|
||||||
|
int job_start_timer(Job *j) {
|
||||||
|
diff --git a/src/manager.c b/src/manager.c
|
||||||
|
index e626347..6d20258 100644
|
||||||
|
--- a/src/manager.c
|
||||||
|
+++ b/src/manager.c
|
||||||
|
@@ -1214,13 +1214,18 @@ static int transaction_apply(Manager *m, JobMode mode) {
|
||||||
|
|
||||||
|
/* When isolating first kill all installed jobs which
|
||||||
|
* aren't part of the new transaction */
|
||||||
|
+ rescan:
|
||||||
|
HASHMAP_FOREACH(j, m->jobs, i) {
|
||||||
|
assert(j->installed);
|
||||||
|
|
||||||
|
if (hashmap_get(m->transaction_jobs, j->unit))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
- job_finish_and_invalidate(j, JOB_CANCELED);
|
||||||
|
+ /* 'j' itself is safe to remove, but if other jobs
|
||||||
|
+ are invalidated recursively, our iterator may become
|
||||||
|
+ invalid and we need to start over. */
|
||||||
|
+ if (job_finish_and_invalidate(j, JOB_CANCELED) > 0)
|
||||||
|
+ goto rescan;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
1.7.3.4
|
||||||
|
|
12
storage-after-cryptsetup.service
Normal file
12
storage-after-cryptsetup.service
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Restart storage after crypsetup
|
||||||
|
DefaultDependencies=no
|
||||||
|
Before=local-fs.target shutdown.target
|
||||||
|
After=cryptsetup.target
|
||||||
|
Wants=cryptsetup.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
RemainAfterExit=true
|
||||||
|
Type=oneshot
|
||||||
|
TimeoutSec=0
|
||||||
|
ExecStart=/bin/systemctl restart lvm.service
|
@ -3,6 +3,17 @@
|
|||||||
export RUNLEVEL=$1
|
export RUNLEVEL=$1
|
||||||
export PREVLEVEL=N
|
export PREVLEVEL=N
|
||||||
if [ "$1" == "5" ]; then
|
if [ "$1" == "5" ]; then
|
||||||
|
/bin/systemctl status --no-pager default.target | grep -q graphical.target
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
declare -i timeout
|
||||||
|
timeout=0
|
||||||
|
console=`fgconsole`
|
||||||
|
while [ $console -eq 1 -a $timeout -lt 30 ] ; do
|
||||||
|
sleep 1
|
||||||
|
timeout+=1
|
||||||
|
console=`fgconsole`
|
||||||
|
done
|
||||||
|
fi
|
||||||
splashtrigger "rlreached $1"
|
splashtrigger "rlreached $1"
|
||||||
else
|
else
|
||||||
splashtrigger "rlchange $1"
|
splashtrigger "rlchange $1"
|
||||||
|
@ -1,3 +1,14 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Wed Oct 19 13:18:54 UTC 2011 - fcrozat@suse.com
|
||||||
|
|
||||||
|
- Add avoid-random-seed-cycle.patch: fix dependency cycle between
|
||||||
|
cryptsetup and random-seed-load (bnc#721666).
|
||||||
|
- Add crash-isolating.patch: fix crash when isolating a service.
|
||||||
|
- Fix bootsplash being killed too early.
|
||||||
|
- Fix some manpages not being redirected properly.
|
||||||
|
- Add storage-after-cryptsetup.service to restart lvm after
|
||||||
|
cryptsetup. Fixes lvm on top of LUKS (bnc#724238).
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Fri Oct 14 13:07:07 UTC 2011 - fcrozat@suse.com
|
Fri Oct 14 13:07:07 UTC 2011 - fcrozat@suse.com
|
||||||
|
|
||||||
|
@ -1,3 +1,14 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Wed Oct 19 13:18:54 UTC 2011 - fcrozat@suse.com
|
||||||
|
|
||||||
|
- Add avoid-random-seed-cycle.patch: fix dependency cycle between
|
||||||
|
cryptsetup and random-seed-load (bnc#721666).
|
||||||
|
- Add crash-isolating.patch: fix crash when isolating a service.
|
||||||
|
- Fix bootsplash being killed too early.
|
||||||
|
- Fix some manpages not being redirected properly.
|
||||||
|
- Add storage-after-cryptsetup.service to restart lvm after
|
||||||
|
cryptsetup. Fixes lvm on top of LUKS (bnc#724238).
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Fri Oct 14 13:07:07 UTC 2011 - fcrozat@suse.com
|
Fri Oct 14 13:07:07 UTC 2011 - fcrozat@suse.com
|
||||||
|
|
||||||
|
11
systemd.spec
11
systemd.spec
@ -61,6 +61,7 @@ Source7: systemd-bootsplash
|
|||||||
Source8: bootsplash-startup.service
|
Source8: bootsplash-startup.service
|
||||||
Source9: bootsplash-quit.service
|
Source9: bootsplash-quit.service
|
||||||
Source10: bootsplash-shutdown.service
|
Source10: bootsplash-shutdown.service
|
||||||
|
Source11: storage-after-cryptsetup.service
|
||||||
Patch1: 0001-Add-bootsplash-handling-for-password-dialogs.patch
|
Patch1: 0001-Add-bootsplash-handling-for-password-dialogs.patch
|
||||||
# handle SUSE specific kbd settings
|
# handle SUSE specific kbd settings
|
||||||
Patch6: 0001-handle-disable_caplock-and-compose_table-and-kbd_rat.patch
|
Patch6: 0001-handle-disable_caplock-and-compose_table-and-kbd_rat.patch
|
||||||
@ -72,11 +73,13 @@ Patch15: support-sysvinit.patch
|
|||||||
Patch16: modules_on_boot.patch
|
Patch16: modules_on_boot.patch
|
||||||
Patch17: private_tmp_crash.patch
|
Patch17: private_tmp_crash.patch
|
||||||
Patch18: systemctl-completion-fix.patch
|
Patch18: systemctl-completion-fix.patch
|
||||||
|
Patch19: avoid-random-seed-cycle.patch
|
||||||
|
|
||||||
# Upstream First - Policy:
|
# Upstream First - Policy:
|
||||||
# Never add any patches to this package without the upstream commit id
|
# Never add any patches to this package without the upstream commit id
|
||||||
# in the patch. Any patches added here without a very good reason to make
|
# in the patch. Any patches added here without a very good reason to make
|
||||||
# an exception will be silently removed with the next version update.
|
# an exception will be silently removed with the next version update.
|
||||||
|
Patch20: crash-isolating.patch
|
||||||
|
|
||||||
%description
|
%description
|
||||||
Systemd is a system and service manager, compatible with SysV and LSB
|
Systemd is a system and service manager, compatible with SysV and LSB
|
||||||
@ -129,6 +132,8 @@ Plymouth integration for systemd
|
|||||||
%patch16 -p1
|
%patch16 -p1
|
||||||
%patch17 -p1
|
%patch17 -p1
|
||||||
%patch18 -p1
|
%patch18 -p1
|
||||||
|
%patch19 -p1
|
||||||
|
%patch20 -p1
|
||||||
|
|
||||||
%build
|
%build
|
||||||
autoreconf -fiv
|
autoreconf -fiv
|
||||||
@ -147,6 +152,9 @@ make %{?_smp_mflags}
|
|||||||
%install
|
%install
|
||||||
%makeinstall
|
%makeinstall
|
||||||
|
|
||||||
|
#fix manpages
|
||||||
|
sed -i -e 's,^\(\.so \)\(.*\.\)\([0-9]\),\1man\3/\2\3,g' %{buildroot}/%{_mandir}/*/*
|
||||||
|
|
||||||
#workaround for 716939
|
#workaround for 716939
|
||||||
chmod 644 %{buildroot}%{_bindir}/systemd-analyze
|
chmod 644 %{buildroot}%{_bindir}/systemd-analyze
|
||||||
mkdir -p %{buildroot}%{_sysconfdir}/rpm
|
mkdir -p %{buildroot}%{_sysconfdir}/rpm
|
||||||
@ -157,11 +165,12 @@ install -m755 %{S:3} -D %{buildroot}%{_sbindir}/systemd-sysv-convert
|
|||||||
# do not install, code has been fixed, might be useful in the future
|
# do not install, code has been fixed, might be useful in the future
|
||||||
#install -m755 %{S:5} %{buildroot}/lib/systemd/system-generators
|
#install -m755 %{S:5} %{buildroot}/lib/systemd/system-generators
|
||||||
install -m755 %{S:7} %{buildroot}/lib/systemd/
|
install -m755 %{S:7} %{buildroot}/lib/systemd/
|
||||||
install -m644 %{S:8} %{S:9} %{S:10} %{buildroot}/lib/systemd/system/
|
install -m644 %{S:8} %{S:9} %{S:10} %{S:11} %{buildroot}/lib/systemd/system/
|
||||||
ln -s ../bootsplash-startup.service %{buildroot}/lib/systemd/system/basic.target.wants/
|
ln -s ../bootsplash-startup.service %{buildroot}/lib/systemd/system/basic.target.wants/
|
||||||
ln -s ../bootsplash-quit.service %{buildroot}/lib/systemd/system/multi-user.target.wants/
|
ln -s ../bootsplash-quit.service %{buildroot}/lib/systemd/system/multi-user.target.wants/
|
||||||
ln -s ../bootsplash-shutdown.service %{buildroot}/lib/systemd/system/shutdown.target.wants/
|
ln -s ../bootsplash-shutdown.service %{buildroot}/lib/systemd/system/shutdown.target.wants/
|
||||||
ln -s ../bootsplash-shutdown.service %{buildroot}/lib/systemd/system/reboot.target.wants/
|
ln -s ../bootsplash-shutdown.service %{buildroot}/lib/systemd/system/reboot.target.wants/
|
||||||
|
ln -s ../storage-after-cryptsetup.service %{buildroot}/lib/systemd/system/local-fs.target.wants/
|
||||||
ln -s ../bin/systemd %{buildroot}/sbin/init
|
ln -s ../bin/systemd %{buildroot}/sbin/init
|
||||||
ln -s ../bin/systemctl %{buildroot}/sbin/reboot
|
ln -s ../bin/systemctl %{buildroot}/sbin/reboot
|
||||||
ln -s ../bin/systemctl %{buildroot}/sbin/halt
|
ln -s ../bin/systemctl %{buildroot}/sbin/halt
|
||||||
|
Loading…
Reference in New Issue
Block a user