diff options
-rw-r--r-- | man/systemd.path.xml | 23 | ||||
-rw-r--r-- | src/core/path.c | 17 |
2 files changed, 32 insertions, 8 deletions
diff --git a/man/systemd.path.xml b/man/systemd.path.xml index cc2d366198..1975142d2c 100644 --- a/man/systemd.path.xml +++ b/man/systemd.path.xml @@ -88,16 +88,15 @@ point in the file system hierarchy, a dependency between both units is created automatically.</para> - <para>Unless <varname>DefaultDependencies=</varname> - is set to <option>false</option>, path units will - implicitly have dependencies of type - <varname>Conflicts=</varname> and + <para>Unless <varname>DefaultDependencies=false</varname> + is used, path units will implicitly have dependencies of + type <varname>Conflicts=</varname> and <varname>Before=</varname> on <filename>shutdown.target</filename>. These ensure that path units are terminated cleanly prior to system shutdown. Only path units involved with early boot or - late system shutdown should disable this - option.</para> + late system shutdown should disable this option. + </para> </refsect1> <refsect1> @@ -157,7 +156,7 @@ assignments of these options will not have any effect.</para> - <para>If a path is already existing + <para>If a path already exists (in case of <varname>PathExists=</varname> and <varname>PathExistsGlob=</varname>) or @@ -168,7 +167,15 @@ activated, then the configured unit is immediately activated as well. Something similar does not apply - to <varname>PathChanged=</varname>. + to <varname>PathChanged=</varname> and + <varname>PathModified=</varname>.</para> + + <para>If the path itself or any of the + containing directories are not + accessible, <command>systemd</command> + will watch for permission changes and + notice that conditions are satisfied + when permissions allow that. </para></listitem> </varlistentry> <varlistentry> diff --git a/src/core/path.c b/src/core/path.c index dcb3b1ff60..fc101280a1 100644 --- a/src/core/path.c +++ b/src/core/path.c @@ -79,6 +79,11 @@ int path_spec_watch(PathSpec *s, Unit *u) { s->primary_wd = inotify_add_watch(s->inotify_fd, k, flags_table[s->type]); if (s->primary_wd >= 0) exists = true; + else if (errno != EACCES && errno != ENOENT) { + log_error("Failed to add watch on %s: %m", k); + r = -errno; + goto fail; + } do { int flags; @@ -97,8 +102,20 @@ int path_spec_watch(PathSpec *s, Unit *u) { if (inotify_add_watch(s->inotify_fd, k, flags) >= 0) exists = true; + else if (errno != EACCES && errno != ENOENT) { + log_error("Failed to add watch on %s: %m", k); + r = -errno; + goto fail; + } } while (slash != k); + if (!exists) { + log_error("Failed to add watch on any of the components of %s: %m", + s->path); + r = -errno; + goto fail; + } + return 0; fail: |