forked from pool/systemd
22e9bed03a
- Add systemctl-options.patch: handle SYSTEMCTL_OPTIONS internaly (bnc#798620). - Update crypt-loop-file.patch to correctly detect crypto loop files (bnc#799514). - Add journalctl-remove-leftover-message.patch: remove debug message in systemctl. - Add job-avoid-recursion-when-cancelling.patch: prevent potential recursion when cancelling a service. - Add sysctl-parse-all-keys.patch: ensure sysctl file is fully parsed. - Add journal-fix-cutoff-max-date.patch: fix computation of cutoff max date for journal. - Add reword-rescue-mode-hints.patch: reword rescue prompt. - Add improve-overflow-checks.patch: improve time overflow checks. - Add fix-swap-behaviour-with-symlinks.patch: fix swap behaviour with symlinks. - Add hostnamectl-fix-set-hostname-with-no-argument.patch: ensure hostnamectl requires an argument when called with set-hostname option. - Add agetty-overrides-term.patch: pass correctly terminal type to agetty. - Add check-for-empty-strings-in-strto-conversions.patch: better check for empty strings in strto* conversions. - Add strv-cleanup-error-path-loops.patch: cleanup strv on error path. - Add cryptsetup-handle-plain.patch: correctly handle "plain" option in cryptsetup. - Add fstab-generator-improve-error-message.patch: improve error message in fstab-generator. - Add delta-accept-t-option.patch: accept -t option in (forwarded request 149703 from fcrozat) OBS-URL: https://build.opensuse.org/request/show/149704 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/systemd?expand=0&rev=122
49 lines
2.0 KiB
Diff
49 lines
2.0 KiB
Diff
From 1abc85b8d026a2d72442b0edaee5213d0ee73c1f Mon Sep 17 00:00:00 2001
|
|
From: Michal Schmidt <mschmidt@redhat.com>
|
|
Date: Thu, 25 Oct 2012 02:31:49 +0200
|
|
Subject: [PATCH] job: avoid recursion into transaction code from job
|
|
cancelation
|
|
|
|
I hit an "assert(j->installed)" failure in transaction_apply(). Looking
|
|
into the backtrace I saw what happened:
|
|
1. The system was booting. var.mount/start was an installed job.
|
|
2. I pressed Ctrl+Alt+Del.
|
|
3. reboot.target was going to be isolated.
|
|
4. transaction_apply() proceeded to install a var.mount/stop job.
|
|
5. job_install() canceled the conflicting start job.
|
|
6. Depending jobs ended recursively with JOB_DEPENDENCY, among them was
|
|
local-fs.target/start.
|
|
7. Its OnFailure action triggered - emergency.target was now going to be
|
|
isolated.
|
|
8. We recursed back into transaction_apply() where the half-installed
|
|
var.mount/stop job confused us.
|
|
|
|
Recursing from job installation back into the transaction code cannot be
|
|
a good idea. Avoid the problem by canceling the conflicting job
|
|
non-recursively in job_install(). I don't think we'll miss anything by
|
|
not recursing here. After all, we are called from transaction_apply().
|
|
We will not be installing just this one job, but all jobs from a
|
|
transaction. All requirement dependencies will be included in it and
|
|
will be installed separately. Every transaction job will get a chance
|
|
to cancel its own conflicting installed job.
|
|
---
|
|
src/core/job.c | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/src/core/job.c b/src/core/job.c
|
|
index cb5674b..f08b8cb 100644
|
|
--- a/src/core/job.c
|
|
+++ b/src/core/job.c
|
|
@@ -180,7 +180,7 @@ Job* job_install(Job *j) {
|
|
|
|
if (uj) {
|
|
if (j->type != JOB_NOP && job_type_is_conflicting(uj->type, j->type))
|
|
- job_finish_and_invalidate(uj, JOB_CANCELED, true);
|
|
+ job_finish_and_invalidate(uj, JOB_CANCELED, false);
|
|
else {
|
|
/* not conflicting, i.e. mergeable */
|
|
|
|
--
|
|
1.7.10.4
|
|
|