68 lines
2.4 KiB
Diff
68 lines
2.4 KiB
Diff
From d7cf8c24d4ef6ed4c9d711ee82ba57a529baad34 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
|
Date: Mon, 18 Nov 2019 14:20:05 +0100
|
|
Subject: [PATCH 0644/1760] core/path: fix spurious triggering of PathExists=
|
|
on restart/reload
|
|
|
|
Our handling of the condition was inconsistent. Normally, we'd only fire when
|
|
the file was created (or removed and subsequently created again). But on restarts,
|
|
we'd do a "recheck" from path_coldplug(), and if the file existed, we'd
|
|
always trigger. Daemon restarts and reloads should not be observeable, in
|
|
the sense that they should not trigger units which were already triggered and
|
|
would not be started again under normal circumstances.
|
|
|
|
Note that the mechanism for checks is racy: we get a notification from inotify,
|
|
and by the time we check, the file could have been created and removed again,
|
|
or removed and created again. It would be better if we inotify would give as
|
|
an unambiguous signal that the file was created, but it doesn't: IN_DELETE_SELF
|
|
triggers on inode removal, not directory entry, so we need to include IN_ATTRIB,
|
|
which obviously triggers on other conditions.
|
|
|
|
Fixes #12801.
|
|
Reference: https://github.com/systemd/systemd/commit/d7cf8c24d4ef6ed4c9d711ee82ba57a529baad34
|
|
Conflict: NA
|
|
---
|
|
src/core/path.c | 11 +++++------
|
|
1 file changed, 5 insertions(+), 6 deletions(-)
|
|
|
|
diff --git a/src/core/path.c b/src/core/path.c
|
|
index ed3a013..1491a07 100644
|
|
--- a/src/core/path.c
|
|
+++ b/src/core/path.c
|
|
@@ -175,12 +175,14 @@ int path_spec_fd_event(PathSpec *s, uint32_t revents) {
|
|
}
|
|
|
|
static bool path_spec_check_good(PathSpec *s, bool initial) {
|
|
- bool good = false;
|
|
+ bool b, good = false;
|
|
|
|
switch (s->type) {
|
|
|
|
case PATH_EXISTS:
|
|
- good = access(s->path, F_OK) >= 0;
|
|
+ b = access(s->path, F_OK) >= 0;
|
|
+ good = b && !s->previous_exists;
|
|
+ s->previous_exists = b;
|
|
break;
|
|
|
|
case PATH_EXISTS_GLOB:
|
|
@@ -196,14 +198,11 @@ static bool path_spec_check_good(PathSpec *s, bool initial) {
|
|
}
|
|
|
|
case PATH_CHANGED:
|
|
- case PATH_MODIFIED: {
|
|
- bool b;
|
|
-
|
|
+ case PATH_MODIFIED:
|
|
b = access(s->path, F_OK) >= 0;
|
|
good = !initial && b != s->previous_exists;
|
|
s->previous_exists = b;
|
|
break;
|
|
- }
|
|
|
|
default:
|
|
;
|
|
--
|
|
1.8.3.1
|
|
|