]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
path: drop IN_ATTRIB from parent directory watches
authorRonan Pigott <ronan@rjp.ie>
Mon, 1 Jul 2024 21:07:28 +0000 (14:07 -0700)
committerLennart Poettering <lennart@poettering.net>
Mon, 8 Jul 2024 09:58:15 +0000 (11:58 +0200)
When watching a given pathspec, systemd unconditionally installs
IN_ATTRIB watches to track the link count of the resolved file. This
way, we are notified if the watched path disappears, even if the
resolved file inode is not removed.

Similarly, systemd installs inotify watches on each parent directory, to
be notified when the specified path appears. However, for these watches
IN_ATTRIB is an unnecessary addition to the mask. In inotify, IN_ATTRIB
on a directory is emitted whenever the attributes of any child changes,
which, for many paths, has the potential to cause a high number of
spurious wakeups in systemd. Let's remove IN_ATTRIB from the mask when
installing watches on the parent directories of the specified path.

src/core/path.c

index fdb6ca4cc9db22b08bac5d2b738da97cd066d2ec..50f6db14709d305d8966a10d10efea9045f6b215 100644 (file)
@@ -81,7 +81,7 @@ int path_spec_watch(PathSpec *s, sd_event_io_handler_t handler) {
                         tmp = *cut;
                         *cut = '\0';
 
-                        flags = IN_MOVE_SELF | IN_DELETE_SELF | IN_ATTRIB | IN_CREATE | IN_MOVED_TO;
+                        flags = IN_MOVE_SELF | IN_DELETE_SELF | IN_CREATE | IN_MOVED_TO;
                 } else {
                         cut = NULL;
                         flags = flags_table[s->type];