summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man/systemd.path.xml23
-rw-r--r--src/core/path.c17
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: