From 84cb7ffff8b4daca24bbdfd637578626195fe64e Mon Sep 17 00:00:00 2001 From: David Ward Date: Sun, 29 Apr 2012 09:35:48 -0400 Subject: [PATCH] service: fix auto-restart handling in service_stop() When service_stop() handles a service in the SERVICE_AUTO_RESTART state, it calls service_set_state() to transition it to the SERVICE_DEAD state. However if the service failed, it should transition it to SERVICE_FAILED instead, which will trigger its OnFailure units. To achieve this, we now call service_enter_dead() in place of service_set_state(), which will transition the service to either SERVICE_DEAD or SERVICE_FAILED as is appropriate. Also, some misleading comments are adjusted: service_stop() is not only called on a user request, but also during an automatic restart in order to handle dependencies. Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=45511 --- src/core/service.c | 7 +++---- 1 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/core/service.c b/src/core/service.c index e9fbd6d..5aa1c0f 100644 --- a/src/core/service.c +++ b/src/core/service.c @@ -2448,8 +2448,7 @@ static int service_stop(Unit *u) { assert(s); - /* This is a user request, so don't do restarts on this - * shutdown. */ + /* Don't create restart jobs from here. */ s->forbid_restart = true; /* Already on it */ @@ -2461,9 +2460,9 @@ static int service_stop(Unit *u) { s->state == SERVICE_FINAL_SIGKILL) return 0; - /* Don't allow a restart */ + /* A restart will be scheduled or is in progress. */ if (s->state == SERVICE_AUTO_RESTART) { - service_set_state(s, SERVICE_DEAD); + service_enter_dead(s, SERVICE_SUCCESS, false); return 0; } -- 1.7.1