X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fpath.c;h=f7878b56ae0cb9ca55d2f844219f8a9cce447847;hb=7c3b203c5c69fc37c8d143851cd395cbf8920786;hp=bd40ab6f99bfa1fc41583e67125abedcf496dc50;hpb=e2f3b44cfc8864bfea7c77ff4c383ce9b535f27e;p=elogind.git diff --git a/src/path.c b/src/path.c index bd40ab6f9..f7878b56a 100644 --- a/src/path.c +++ b/src/path.c @@ -223,9 +223,9 @@ static int path_watch_one(Path *p, PathSpec *s) { /* Trim the path at the last slash. Keep the slash if it's the root dir. */ slash[slash == k] = 0; - flags = IN_DELETE_SELF|IN_MOVE_SELF|IN_ATTRIB; + flags = IN_MOVE_SELF; if (!exists) - flags |= IN_CREATE | IN_MOVED_TO; + flags |= IN_DELETE_SELF | IN_ATTRIB | IN_CREATE | IN_MOVED_TO; if (inotify_add_watch(s->inotify_fd, k, flags) >= 0) exists = true; @@ -282,7 +282,7 @@ static void path_set_state(Path *p, PathState state) { unit_notify(UNIT(p), state_translation_table[old_state], state_translation_table[state], true); } -static void path_enter_waiting(Path *p, bool initial, bool recheck); +static void path_enter_waiting(Path *p, bool initial, bool recheck, bool skip_watch); static int path_coldplug(Unit *u) { Path *p = PATH(u); @@ -294,7 +294,7 @@ static int path_coldplug(Unit *u) { if (p->deserialized_state == PATH_WAITING || p->deserialized_state == PATH_RUNNING) - path_enter_waiting(p, true, true); + path_enter_waiting(p, true, true, false); else path_set_state(p, p->deserialized_state); } @@ -341,7 +341,7 @@ fail: } -static void path_enter_waiting(Path *p, bool initial, bool recheck) { +static void path_enter_waiting(Path *p, bool initial, bool recheck, bool skip_watch) { PathSpec *s; int r; bool good = false; @@ -389,8 +389,16 @@ static void path_enter_waiting(Path *p, bool initial, bool recheck) { } waiting: - if ((r = path_watch(p)) < 0) - goto fail; + if (!skip_watch) { + if ((r = path_watch(p)) < 0) + goto fail; + + /* Hmm, so now we have created inotify watches, but the file + * might have appeared/been removed by now, so we must + * recheck */ + path_enter_waiting(p, false, true, true); + return; + } path_set_state(p, PATH_WAITING); return; @@ -410,7 +418,7 @@ static int path_start(Unit *u) { return -ENOENT; p->failure = false; - path_enter_waiting(p, true, true); + path_enter_waiting(p, true, true, false); return 0; } @@ -541,7 +549,7 @@ static void path_fd_event(Unit *u, int fd, uint32_t events, Watch *w) { if (changed) path_enter_running(p); else - path_enter_waiting(p, false, true); + path_enter_waiting(p, false, true, false); free(buf); @@ -590,7 +598,7 @@ void path_unit_notify(Unit *u, UnitActiveState new_state) { /* Hmm, so inotify was triggered since the * last activation, so I guess we need to * recheck what is going on. */ - path_enter_waiting(p, false, p->inotify_triggered); + path_enter_waiting(p, false, p->inotify_triggered, false); } }