summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-03-03 01:49:11 -0500
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-03-03 08:55:53 -0500
commit28a79bd28b706e33825ec01fc651dbd76a252ea3 (patch)
tree487c71cc457f20b78733bd872a87a092434a7b4d
parente0207c8d91514350c6a1bf0dda9337823004c371 (diff)
core/path: catch errors when adding watches
Errors because of oom conditions or descriptor exhaustion should not be ignored. We probably cannot recover from those conditions. Current behaviour wrt. insufficient permissions is described in the man page. It might make sense in case of user sessions, so I left it as is.
-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: