git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v9 00/12] fsmonitor: implement filesystem change listener for Linux

From
PGPaul Tarjan via GitGitGadget <gitgitgadget@gmail.com>
Date
Mar 5, 2026, 00:51 UTC
Message-ID
<pull.2147.v9.git.git.1772671920.gitgitgadget@gmail.com>
In-Reply-To
<pull.2147.v8.git.git.1772648125.gitgitgadget@gmail.com>

This series implements the built-in fsmonitor daemon for Linux using the inotify API, bringing it to feature parity with the existing Windows and macOS implementations. It also fixes two memory leaks in the platform-independent daemon code and deduplicates the IPC and settings logic that is now shared between macOS and Linux.

The implementation uses inotify rather than fanotify because fanotify requires either CAP_SYS_ADMIN or CAP_PERFMON capabilities, making it unsuitable for an unprivileged user-space daemon. While inotify has the limitation of requiring a separate watch on every directory (unlike macOS FSEvents, which can monitor an entire directory tree with a single watch), it operates without elevated privileges and provides the per-file event granularity needed for fsmonitor.

The listener uses inotify_init1(O_NONBLOCK) with a poll loop that checks for events with a 50-millisecond timeout, keeping the inotify queue well-drained to minimize the risk of overflows. Bidirectional hashmaps map between watch descriptors and directory paths for efficient event resolution. Directory renames are tracked using inotify cookie mechanism to correlate IN_MOVED_FROM and IN_MOVED_TO event pairs; a periodic check detects stale renames where the matching IN_MOVED_TO never arrived, forcing a resync.

New directory creation triggers recursive watch registration to ensure all subdirectories are monitored. The IN_MASK_CREATE flag is used where available to prevent modifying existing watches, with a fallback for older kernels. When IN_MASK_CREATE is available and inotify_add_watch returns EEXIST, it means another thread or recursive scan has already registered the watch, so it is safe to ignore.

Remote filesystem detection uses statfs() to identify network-mounted filesystems (NFS, CIFS, SMB, FUSE, etc.) via their magic numbers. Mount point information is read from /proc/mounts and matched against the statfs f_fsid to get accurate, human-readable filesystem type names for logging. When the .git directory is on a remote filesystem, the IPC socket falls back to $HOME or a user-configured directory via the fsmonitor.socketDir setting.

This series builds on work from https://github.com/git/git/pull/1352 by Eric DeCosta and https://github.com/git/git/pull/1667 by Marziyeh Esipreh, updated to work with the current codebase and address all review feedback.

Changes since v8:
 * Replaced close_fd_above_stderr flag with generic pre_exec_cb callback in
   struct child_process per Junio's review
 * Provided close_fd_above_stderr() as a ready-made callback function
Changes since v7:
 * Added patch 12: convert khash to strset in do_handle_client (Patrick's
   #leftoverbit suggestion)
 * Fixed "Forcing shutdown" trace message to start with lowercase
 * Fixed redundant statfs() call in find_mount() (caller already had the
   result)
 * Fixed CMakeLists.txt GIT-BUILD-OPTIONS: was hardcoded to "win32" for
   FSMONITOR_DAEMON_BACKEND and FSMONITOR_OS_SETTINGS, now uses the CMake
   variables
 * Fixed uninitialized strset on trivial response path (STRSET_INIT)
 * Removed V9FS_MAGIC from get_fs_typename() to match is_remote_fs() (9p is
   local VM mounts)
 * Split 30-second stop timeout into its own commit per review request
 * Fixed misleading indentation on shutdown assignment in handle_events()
 * Updated commit messages to describe all changes (test hardening,
   fsmonitor-ipc.c spawn changes)
 * Updated Makefile comment for FSMONITOR_OS_SETTINGS to mention fsm-ipc
Changes since v6:
 * Introduced FSMONITOR_OS_SETTINGS build variable (set to "unix" for macOS
   and Linux, "win32" for Windows) to eliminate if/else conditionals in
   Makefile, meson.build, and CMakeLists.txt per Junio's review
 * Moved fsm-path-utils from FSMONITOR_OS_SETTINGS to
   FSMONITOR_DAEMON_BACKEND since path-utils files are platform-specific
 * Removed V9FS_MAGIC from remote filesystem detection (9p is used for local
   VM/container host mounts where fsmonitor works fine)
 * Removed redundant #include <libgen.h> (already provided by
   compat/posix.h)
 * Fixed cookie wait comment wording ("see" to "observe")
 * Rewrote commit messages for IPC and settings dedup patches
Changes since v5:
 * Split monolithic commit into 10-patch series per Patrick's review
 * Deduplicated fsm-ipc and fsm-settings into shared Unix implementations
 * Rewrote commit message with prose paragraphs, explain inotify vs
   fanotify, removed "Issues addressed" sections, added Based-on-patch-by
   trailers
 * Removed redundant includes already provided by compat/posix.h
 * Fixed error/trace message capitalization per coding guidelines
 * Fixed stale rename check interval from 1000 seconds to 1 second
 * Changed poll timeout from 1ms to 50ms to reduce idle CPU wake-ups
 * Replaced infinite pthread_cond_wait cookie loop with one-second
   pthread_cond_timedwait (prevents daemon hangs on overlay filesystems
   where events are never delivered)
 * Added pthread_cond_timedwait to Windows pthread compatibility layer
 * Separated test into its own commit with smoke test that skips when
   inotify events are not delivered (e.g., overlayfs with older kernels)
 * Fixed test hang on Fedora CI: stop_git() looped forever when ps was
   unavailable because bash in POSIX/sh mode returns exit 0 from kill with
   an empty process group argument. Fixed by falling back to /proc/$pid/stat
   for process group ID and guarding stop_git against empty pgid.
 * Redirect spawn_daemon() stdout/stderr to /dev/null and close inherited
   file descriptors to prevent the intermediate process from holding test
   pipe file descriptors
 * Call setsid() on daemon detach to prevent shells with job control from
   waiting on the daemon process group
 * Close inherited file descriptors 3-7 in the test watchdog subprocess
 * Added 30-second timeout to "fsmonitor--daemon stop" to prevent indefinite
   blocking
 * Added helpful error message when inotify watch limit (max_user_watches)
   is reached
 * Initialize fd_inotify to -1 and use fd >= 0 check for correct fd 0
   handling
 * Use sysconf(_SC_OPEN_MAX) instead of hardcoded 1024 for fd close limit
 * Check setsid() return value
Changes since v4:
 * Added Meson build support
Changes since v3:
 * Fix crash on rapid nested directory creation (EEXIST from
   inotify_add_watch with IN_MASK_CREATE)
 * Extensive stress testing
Changes since v2:
 * Fix khash memory leak in do_handle_client
Changes since v1:
 * Fix hashmap memory leak in fsmonitor_run_daemon()
Paul Tarjan (12):
  fsmonitor: fix khash memory leak in do_handle_client
  fsmonitor: fix hashmap memory leak in fsmonitor_run_daemon
  compat/win32: add pthread_cond_timedwait
  fsmonitor: use pthread_cond_timedwait for cookie wait
  fsmonitor: rename fsm-ipc-darwin.c to fsm-ipc-unix.c
  fsmonitor: rename fsm-settings-darwin.c to fsm-settings-unix.c
  fsmonitor: implement filesystem change listener for Linux
  run-command: add pre-exec callback for child processes
  fsmonitor: close inherited file descriptors and detach in daemon
  fsmonitor: add timeout to daemon stop command
  fsmonitor: add tests for Linux
  fsmonitor: convert shown khash to strset in do_handle_client
 Documentation/config/fsmonitor--daemon.adoc   |   4 +-
 Documentation/git-fsmonitor--daemon.adoc      |  28 +-
 Makefile                                      |   6 +-
 builtin/fsmonitor--daemon.c                   |  92 ++-
 compat/fsmonitor/fsm-health-linux.c           |  33 +
 .../{fsm-ipc-darwin.c => fsm-ipc-unix.c}      |   0
 compat/fsmonitor/fsm-listen-linux.c           | 746 ++++++++++++++++++
 compat/fsmonitor/fsm-path-utils-linux.c       | 217 +++++
 ...-settings-darwin.c => fsm-settings-unix.c} |   0
 compat/win32/pthread.c                        |  26 +
 compat/win32/pthread.h                        |   2 +
 config.mak.uname                              |  12 +-
 contrib/buildsystems/CMakeLists.txt           |  33 +-
 fsmonitor-ipc.c                               |   3 +
 meson.build                                   |  13 +-
 run-command.c                                 |  15 +
 run-command.h                                 |  15 +
 t/t7527-builtin-fsmonitor.sh                  |  89 ++-
 18 files changed, 1271 insertions(+), 63 deletions(-)
 create mode 100644 compat/fsmonitor/fsm-health-linux.c
 rename compat/fsmonitor/{fsm-ipc-darwin.c => fsm-ipc-unix.c} (100%)
 create mode 100644 compat/fsmonitor/fsm-listen-linux.c
 create mode 100644 compat/fsmonitor/fsm-path-utils-linux.c
 rename compat/fsmonitor/{fsm-settings-darwin.c => fsm-settings-unix.c} (100%)
base-commit: 3e0db84c88c57e70ac8be8c196dfa92c5d656fbc
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-2147%2Fptarjan%2Fclaude%2Fupdate-pr-1352-current-85Gk8-v9
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-2147/ptarjan/claude/update-pr-1352-current-85Gk8-v9
Pull-Request: https://github.com/git/git/pull/2147
Range-diff vs v8:
  1:  4d4dec8fa1 =  1:  4d4dec8fa1 fsmonitor: fix khash memory leak in do_handle_client
  2:  cb270120f0 =  2:  cb270120f0 fsmonitor: fix hashmap memory leak in fsmonitor_run_daemon
  3:  44a063074d =  3:  44a063074d compat/win32: add pthread_cond_timedwait
  4:  b1081d1e13 =  4:  b1081d1e13 fsmonitor: use pthread_cond_timedwait for cookie wait
  5:  dec0fb144f =  5:  dec0fb144f fsmonitor: rename fsm-ipc-darwin.c to fsm-ipc-unix.c
  6:  b2aaadb4ae =  6:  b2aaadb4ae fsmonitor: rename fsm-settings-darwin.c to fsm-settings-unix.c
  7:  03cf12d01b =  7:  03cf12d01b fsmonitor: implement filesystem change listener for Linux
  8:  29a6461915 !  8:  31fa1fb324 run-command: add close_fd_above_stderr option
     @@ Metadata
      Author: Paul Tarjan <github@paulisageek.com>
      
       ## Commit message ##
     -    run-command: add close_fd_above_stderr option
     +    run-command: add pre-exec callback for child processes
      
     -    Add a new option to struct child_process that closes file descriptors
     -    3 and above in the child after forking but before exec.  Without this,
     -    long-running child processes inherit pipe endpoints and other
     -    descriptors from the parent environment.
     +    Add a pre_exec_cb function pointer to struct child_process that is
     +    invoked in the child between fork and exec.  This gives callers a
     +    place to perform setup that must happen in the child's context,
     +    such as closing inherited file descriptors.
      
     -    The upper bound for the fd scan comes from sysconf(_SC_OPEN_MAX),
     -    capped at 4096 to avoid excessive iteration when the limit is set
     -    very high.
     +    Provide close_fd_above_stderr() as a ready-made callback that
     +    closes file descriptors 3 and above (skipping the child-notifier
     +    pipe), capped at sysconf(_SC_OPEN_MAX) or 4096, whichever is
     +    smaller.
      
          Signed-off-by: Paul Tarjan <github@paulisageek.com>
      
       ## run-command.c ##
     +@@ run-command.c: static void trace_run_command(const struct child_process *cp)
     + 	strbuf_release(&buf);
     + }
     + 
     ++void close_fd_above_stderr(void)
     ++{
     ++	long max_fd = sysconf(_SC_OPEN_MAX);
     ++	int fd;
     ++	if (max_fd < 0 || max_fd > 4096)
     ++		max_fd = 4096;
     ++	for (fd = 3; fd < max_fd; fd++) {
     ++		if (fd != child_notifier)
     ++			close(fd);
     ++	}
     ++}
     ++
     + int start_command(struct child_process *cmd)
     + {
     + 	int need_in, need_out, need_err;
      @@ run-command.c: fail_pipe:
       			child_close(cmd->out);
       		}
       
     -+		if (cmd->close_fd_above_stderr) {
     -+			long max_fd = sysconf(_SC_OPEN_MAX);
     -+			int fd;
     -+			if (max_fd < 0 || max_fd > 4096)
     -+				max_fd = 4096;
     -+			for (fd = 3; fd < max_fd; fd++) {
     -+				if (fd != child_notifier)
     -+					close(fd);
     -+			}
     -+		}
     ++		if (cmd->pre_exec_cb)
     ++			cmd->pre_exec_cb();
      +
       		if (cmd->dir && chdir(cmd->dir))
       			child_die(CHILD_ERR_CHDIR);
     @@ run-command.h: struct child_process {
       	unsigned wait_after_clean:1;
      +
      +	/**
     -+	 * Close file descriptors 3 and above in the child after forking
     -+	 * but before exec.  This prevents the long-running child from
     -+	 * inheriting pipe endpoints or other descriptors from the parent
     -+	 * environment (e.g., the test harness).
     ++	 * If set, the callback is invoked in the child between fork and
     ++	 * exec.  It can be used, for example, to close inherited file
     ++	 * descriptors that the child should not keep open.
      +	 */
     -+	unsigned close_fd_above_stderr:1;
     ++	void (*pre_exec_cb)(void);
      +
       	void (*clean_on_exit_handler)(struct child_process *process);
       };
       
     +@@ run-command.h: struct child_process {
     + 	.env = STRVEC_INIT, \
     + }
     + 
     ++/**
     ++ * Close file descriptors 3 and above.  Suitable for use as a
     ++ * pre_exec_cb to prevent the child from inheriting pipe endpoints
     ++ * or other descriptors from the parent environment.
     ++ */
     ++void close_fd_above_stderr(void);
     ++
     + /**
     +  * The functions: start_command, finish_command, run_command do the following:
     +  *
  9:  b596c5004d !  9:  c963074cbd fsmonitor: close inherited file descriptors and detach in daemon
     @@ builtin/fsmonitor--daemon.c: static int try_to_start_background_daemon(void)
       	cp.no_stdin = 1;
       	cp.no_stdout = 1;
       	cp.no_stderr = 1;
     -+	cp.close_fd_above_stderr = 1;
     ++	cp.pre_exec_cb = close_fd_above_stderr;
       
       	sbgr = start_bg_command(&cp, bg_wait_cb, NULL,
       				fsmonitor__start_timeout_sec);
     @@ fsmonitor-ipc.c: static int spawn_daemon(void)
       	cmd.no_stdin = 1;
      +	cmd.no_stdout = 1;
      +	cmd.no_stderr = 1;
     -+	cmd.close_fd_above_stderr = 1;
     ++	cmd.pre_exec_cb = close_fd_above_stderr;
       	cmd.trace2_child_class = "fsmonitor";
       	strvec_pushl(&cmd.args, "fsmonitor--daemon", "start", NULL);
       
 10:  72125ac20f = 10:  ee3ee75c94 fsmonitor: add timeout to daemon stop command
 11:  76b171ab5c = 11:  54bd8f604a fsmonitor: add tests for Linux
 12:  6c36c9e11e = 12:  e603fc7dde fsmonitor: convert shown khash to strset in do_handle_client
-- 
gitgitgadget
Previous: Paul Tarjan via GitGitGadgetNext: Paul Tarjan via GitGitGadget
Message 87 of 211 in “fsmonitor: implement filesystem change listener for Linux”
  1. fsmonitor: implement filesystem change listener for LinuxPaul Tarjan via GitGitGadget, Dec 30, 2025
  2. Junio C HamanoDec 30, 2025
  3. fsmonitor: implement filesystem change listener for LinuxPaul Tarjan via GitGitGadget, Dec 30, 2025
  4. fsmonitor: implement filesystem change listener for LinuxPaul Tarjan via GitGitGadget, Dec 30, 2025
  5. fsmonitor: implement filesystem change listener for LinuxPaul Tarjan via GitGitGadget, Dec 31, 2025
  6. Patrick SteinhardtJan 5, 2026
  7. Junio C HamanoFeb 20, 2026
  8. Paul TarjanFeb 21, 2026
  9. Junio C HamanoFeb 21, 2026
  10. Patrick SteinhardtFeb 23, 2026
  11. Junio C HamanoFeb 23, 2026
  12. Patrick SteinhardtFeb 23, 2026
  13. Paul TarjanFeb 24, 2026
  14. Patrick SteinhardtFeb 24, 2026
  15. fsmonitor: implement filesystem change listener for LinuxPaul Tarjan via GitGitGadget, Feb 24, 2026
  16. Patrick SteinhardtFeb 24, 2026
  17. 00/10 fsmonitor: implement filesystem change listener for LinuxPaul Tarjan via GitGitGadget, Feb 25, 2026
  18. 01/10 fsmonitor: fix khash memory leak in do_handle_clientPaul Tarjan via GitGitGadget, Feb 25, 2026
  19. Junio C HamanoFeb 25, 2026
  20. 02/10 fsmonitor: fix hashmap memory leak in fsmonitor_run_daemonPaul Tarjan via GitGitGadget, Feb 25, 2026
  21. 03/10 compat/win32: add pthread_cond_timedwaitPaul Tarjan via GitGitGadget, Feb 25, 2026
  22. 04/10 fsmonitor: use pthread_cond_timedwait for cookie waitPaul Tarjan via GitGitGadget, Feb 25, 2026
  23. Junio C HamanoFeb 25, 2026
  24. Paul TarjanFeb 27, 2026
  25. Junio C HamanoFeb 27, 2026
  26. Paul TarjanFeb 28, 2026
  27. Junio C HamanoFeb 25, 2026
  28. Paul TarjanFeb 27, 2026
  29. 05/10 fsmonitor: deduplicate IPC path logic for Unix platformsPaul Tarjan via GitGitGadget, Feb 25, 2026
  30. Junio C HamanoFeb 25, 2026
  31. Paul TarjanFeb 27, 2026
  32. 06/10 fsmonitor: deduplicate settings logic for Unix platformsPaul Tarjan via GitGitGadget, Feb 25, 2026
  33. Junio C HamanoFeb 25, 2026
  34. Paul TarjanFeb 27, 2026
  35. 07/10 fsmonitor: implement filesystem change listener for LinuxPaul Tarjan via GitGitGadget, Feb 25, 2026
  36. 08/10 fsmonitor: add tests for LinuxPaul Tarjan via GitGitGadget, Feb 25, 2026
  37. 09/10 run-command: add close_fd_above_stderr optionPaul Tarjan via GitGitGadget, Feb 25, 2026
  38. Junio C HamanoFeb 25, 2026
  39. 10/10 fsmonitor: close inherited file descriptors and detach in daemonPaul Tarjan via GitGitGadget, Feb 25, 2026
  40. 00/10 fsmonitor: implement filesystem change listener for LinuxPaul Tarjan via GitGitGadget, Feb 26, 2026
  41. 01/10 fsmonitor: fix khash memory leak in do_handle_clientPaul Tarjan via GitGitGadget, Feb 26, 2026
  42. Patrick SteinhardtMar 4, 2026
  43. Paul TarjanMar 4, 2026
  44. 02/10 fsmonitor: fix hashmap memory leak in fsmonitor_run_daemonPaul Tarjan via GitGitGadget, Feb 26, 2026
  45. Patrick SteinhardtMar 4, 2026
  46. Paul TarjanMar 4, 2026
  47. 03/10 compat/win32: add pthread_cond_timedwaitPaul Tarjan via GitGitGadget, Feb 26, 2026
  48. Patrick SteinhardtMar 4, 2026
  49. Paul TarjanMar 4, 2026
  50. 04/10 fsmonitor: use pthread_cond_timedwait for cookie waitPaul Tarjan via GitGitGadget, Feb 26, 2026
  51. Patrick SteinhardtMar 4, 2026
  52. Paul TarjanMar 4, 2026
  53. 05/10 fsmonitor: deduplicate IPC path logic for Unix platformsPaul Tarjan via GitGitGadget, Feb 26, 2026
  54. Patrick SteinhardtMar 4, 2026
  55. Paul TarjanMar 4, 2026
  56. 06/10 fsmonitor: deduplicate settings logic for Unix platformsPaul Tarjan via GitGitGadget, Feb 26, 2026
  57. Patrick SteinhardtMar 4, 2026
  58. Paul TarjanMar 4, 2026
  59. 07/10 fsmonitor: implement filesystem change listener for LinuxPaul Tarjan via GitGitGadget, Feb 26, 2026
  60. Patrick SteinhardtMar 4, 2026
  61. Paul TarjanMar 4, 2026
  62. 08/10 fsmonitor: add tests for LinuxPaul Tarjan via GitGitGadget, Feb 26, 2026
  63. Patrick SteinhardtMar 4, 2026
  64. Paul TarjanMar 4, 2026
  65. 09/10 run-command: add close_fd_above_stderr optionPaul Tarjan via GitGitGadget, Feb 26, 2026
  66. 10/10 fsmonitor: close inherited file descriptors and detach in daemonPaul Tarjan via GitGitGadget, Feb 26, 2026
  67. Patrick SteinhardtMar 4, 2026
  68. Paul TarjanMar 4, 2026
  69. Junio C HamanoFeb 26, 2026
  70. 00/12 fsmonitor: implement filesystem change listener for LinuxPaul Tarjan via GitGitGadget, Mar 4, 2026
  71. 01/12 fsmonitor: fix khash memory leak in do_handle_clientPaul Tarjan via GitGitGadget, Mar 4, 2026
  72. 02/12 fsmonitor: fix hashmap memory leak in fsmonitor_run_daemonPaul Tarjan via GitGitGadget, Mar 4, 2026
  73. 03/12 compat/win32: add pthread_cond_timedwaitPaul Tarjan via GitGitGadget, Mar 4, 2026
  74. 04/12 fsmonitor: use pthread_cond_timedwait for cookie waitPaul Tarjan via GitGitGadget, Mar 4, 2026
  75. 05/12 fsmonitor: rename fsm-ipc-darwin.c to fsm-ipc-unix.cPaul Tarjan via GitGitGadget, Mar 4, 2026
  76. 06/12 fsmonitor: rename fsm-settings-darwin.c to fsm-settings-unix.cPaul Tarjan via GitGitGadget, Mar 4, 2026
  77. 07/12 fsmonitor: implement filesystem change listener for LinuxPaul Tarjan via GitGitGadget, Mar 4, 2026
  78. 08/12 run-command: add close_fd_above_stderr optionPaul Tarjan via GitGitGadget, Mar 4, 2026
  79. Junio C HamanoMar 4, 2026
  80. Paul TarjanMar 5, 2026
  81. Junio C HamanoMar 5, 2026
  82. Paul TarjanMar 5, 2026
  83. 09/12 fsmonitor: close inherited file descriptors and detach in daemonPaul Tarjan via GitGitGadget, Mar 4, 2026
  84. 10/12 fsmonitor: add timeout to daemon stop commandPaul Tarjan via GitGitGadget, Mar 4, 2026
  85. 11/12 fsmonitor: add tests for LinuxPaul Tarjan via GitGitGadget, Mar 4, 2026
  86. 12/12 fsmonitor: convert shown khash to strset in do_handle_clientPaul Tarjan via GitGitGadget, Mar 4, 2026
  87. 00/12 fsmonitor: implement filesystem change listener for LinuxPaul Tarjan via GitGitGadget, Mar 5, 2026
  88. 01/12 fsmonitor: fix khash memory leak in do_handle_clientPaul Tarjan via GitGitGadget, Mar 5, 2026
  89. 02/12 fsmonitor: fix hashmap memory leak in fsmonitor_run_daemonPaul Tarjan via GitGitGadget, Mar 5, 2026
  90. 03/12 compat/win32: add pthread_cond_timedwaitPaul Tarjan via GitGitGadget, Mar 5, 2026
  91. 04/12 fsmonitor: use pthread_cond_timedwait for cookie waitPaul Tarjan via GitGitGadget, Mar 5, 2026
  92. 05/12 fsmonitor: rename fsm-ipc-darwin.c to fsm-ipc-unix.cPaul Tarjan via GitGitGadget, Mar 5, 2026
  93. 06/12 fsmonitor: rename fsm-settings-darwin.c to fsm-settings-unix.cPaul Tarjan via GitGitGadget, Mar 5, 2026
  94. 07/12 fsmonitor: implement filesystem change listener for LinuxPaul Tarjan via GitGitGadget, Mar 5, 2026
  95. 08/12 run-command: add pre-exec callback for child processesPaul Tarjan via GitGitGadget, Mar 5, 2026
  96. 09/12 fsmonitor: close inherited file descriptors and detach in daemonPaul Tarjan via GitGitGadget, Mar 5, 2026
  97. 10/12 fsmonitor: add timeout to daemon stop commandPaul Tarjan via GitGitGadget, Mar 5, 2026
  98. 11/12 fsmonitor: add tests for LinuxPaul Tarjan via GitGitGadget, Mar 5, 2026
  99. 12/12 fsmonitor: convert shown khash to strset in do_handle_clientPaul Tarjan via GitGitGadget, Mar 5, 2026
  100. 00/12 fsmonitor: implement filesystem change listener for LinuxPaul Tarjan via GitGitGadget, Mar 5, 2026
  101. 01/12 fsmonitor: fix khash memory leak in do_handle_clientPaul Tarjan via GitGitGadget, Mar 5, 2026
  102. 02/12 fsmonitor: fix hashmap memory leak in fsmonitor_run_daemonPaul Tarjan via GitGitGadget, Mar 5, 2026
  103. 03/12 compat/win32: add pthread_cond_timedwaitPaul Tarjan via GitGitGadget, Mar 5, 2026
  104. 04/12 fsmonitor: use pthread_cond_timedwait for cookie waitPaul Tarjan via GitGitGadget, Mar 5, 2026
  105. 05/12 fsmonitor: rename fsm-ipc-darwin.c to fsm-ipc-unix.cPaul Tarjan via GitGitGadget, Mar 5, 2026
  106. 06/12 fsmonitor: rename fsm-settings-darwin.c to fsm-settings-unix.cPaul Tarjan via GitGitGadget, Mar 5, 2026
  107. 07/12 fsmonitor: implement filesystem change listener for LinuxPaul Tarjan via GitGitGadget, Mar 5, 2026
  108. 08/12 run-command: add pre-exec callback for child processesPaul Tarjan via GitGitGadget, Mar 5, 2026
  109. 09/12 fsmonitor: close inherited file descriptors and detach in daemonPaul Tarjan via GitGitGadget, Mar 5, 2026
  110. 10/12 fsmonitor: add timeout to daemon stop commandPaul Tarjan via GitGitGadget, Mar 5, 2026
  111. 11/12 fsmonitor: add tests for LinuxPaul Tarjan via GitGitGadget, Mar 5, 2026
  112. 12/12 fsmonitor: convert shown khash to strset in do_handle_clientPaul Tarjan via GitGitGadget, Mar 5, 2026
  113. 00/12 fsmonitor: implement filesystem change listener for LinuxPaul Tarjan via GitGitGadget, Mar 5, 2026
  114. 01/12 fsmonitor: fix khash memory leak in do_handle_clientPaul Tarjan via GitGitGadget, Mar 5, 2026
  115. 02/12 fsmonitor: fix hashmap memory leak in fsmonitor_run_daemonPaul Tarjan via GitGitGadget, Mar 5, 2026
  116. 03/12 compat/win32: add pthread_cond_timedwaitPaul Tarjan via GitGitGadget, Mar 5, 2026
  117. 04/12 fsmonitor: use pthread_cond_timedwait for cookie waitPaul Tarjan via GitGitGadget, Mar 5, 2026
  118. 05/12 fsmonitor: rename fsm-ipc-darwin.c to fsm-ipc-unix.cPaul Tarjan via GitGitGadget, Mar 5, 2026
  119. 06/12 fsmonitor: rename fsm-settings-darwin.c to fsm-settings-unix.cPaul Tarjan via GitGitGadget, Mar 5, 2026
  120. 07/12 fsmonitor: implement filesystem change listener for LinuxPaul Tarjan via GitGitGadget, Mar 5, 2026
  121. 08/12 run-command: add close_fd_above_stderr optionPaul Tarjan via GitGitGadget, Mar 5, 2026
  122. 09/12 fsmonitor: close inherited file descriptors and detach in daemonPaul Tarjan via GitGitGadget, Mar 5, 2026
  123. 10/12 fsmonitor: add timeout to daemon stop commandPaul Tarjan via GitGitGadget, Mar 5, 2026
  124. 11/12 fsmonitor: add tests for LinuxPaul Tarjan via GitGitGadget, Mar 5, 2026
  125. 12/12 fsmonitor: convert shown khash to strset in do_handle_clientPaul Tarjan via GitGitGadget, Mar 5, 2026
  126. Patrick SteinhardtMar 5, 2026
  127. Paul TarjanMar 5, 2026
  128. Junio C HamanoMar 25, 2026
  129. Paul TarjanMar 29, 2026
  130. Patrick SteinhardtMar 30, 2026
  131. Junio C HamanoMar 31, 2026
  132. Paul TarjanMar 31, 2026
  133. Junio C HamanoMar 31, 2026
  134. 00/13 fsmonitor: implement filesystem change listener for LinuxPaul Tarjan via GitGitGadget, Mar 31, 2026
  135. 01/13 fsmonitor: fix khash memory leak in do_handle_clientPaul Tarjan via GitGitGadget, Mar 31, 2026
  136. 02/13 fsmonitor: fix hashmap memory leak in fsmonitor_run_daemonPaul Tarjan via GitGitGadget, Mar 31, 2026
  137. 03/13 compat/win32: add pthread_cond_timedwaitPaul Tarjan via GitGitGadget, Mar 31, 2026
  138. 04/13 fsmonitor: use pthread_cond_timedwait for cookie waitPaul Tarjan via GitGitGadget, Mar 31, 2026
  139. 05/13 fsmonitor: rename fsm-ipc-darwin.c to fsm-ipc-unix.cPaul Tarjan via GitGitGadget, Mar 31, 2026
  140. 06/13 fsmonitor: rename fsm-settings-darwin.c to fsm-settings-unix.cPaul Tarjan via GitGitGadget, Mar 31, 2026
  141. 07/13 fsmonitor: implement filesystem change listener for LinuxPaul Tarjan via GitGitGadget, Mar 31, 2026
  142. 08/13 run-command: add close_fd_above_stderr optionPaul Tarjan via GitGitGadget, Mar 31, 2026
  143. 09/13 fsmonitor: close inherited file descriptors and detach in daemonPaul Tarjan via GitGitGadget, Mar 31, 2026
  144. 10/13 fsmonitor: add timeout to daemon stop commandPaul Tarjan via GitGitGadget, Mar 31, 2026
  145. 11/13 fsmonitor: add tests for LinuxPaul Tarjan via GitGitGadget, Mar 31, 2026
  146. 12/13 fsmonitor: convert shown khash to strset in do_handle_clientPaul Tarjan via GitGitGadget, Mar 31, 2026
  147. 13/13 fsmonitor: fix split-index bitmap bounds in tweak_fsmonitor()Paul Tarjan via GitGitGadget, Mar 31, 2026
  148. Junio C HamanoMar 31, 2026
  149. Junio C HamanoMar 31, 2026
  150. Paul TarjanApr 1, 2026
  151. Paul TarjanApr 8, 2026
  152. Johannes SchindelinApr 4, 2026
  153. Paul TarjanApr 5, 2026
  154. Johannes SchindelinApr 5, 2026
  155. Paul TarjanApr 5, 2026
  156. Junio C HamanoApr 6, 2026
  157. 00/13 fsmonitor: implement filesystem change listener for LinuxPaul Tarjan via GitGitGadget, Apr 6, 2026
  158. 01/13 t9210: disable GIT_TEST_SPLIT_INDEX for scalar clone testsPaul Tarjan via GitGitGadget, Apr 6, 2026
  159. Junio C HamanoApr 7, 2026
  160. Junio C HamanoApr 7, 2026
  161. 02/13 fsmonitor: fix khash memory leak in do_handle_clientPaul Tarjan via GitGitGadget, Apr 6, 2026
  162. 03/13 fsmonitor: fix hashmap memory leak in fsmonitor_run_daemonPaul Tarjan via GitGitGadget, Apr 6, 2026
  163. 04/13 compat/win32: add pthread_cond_timedwaitPaul Tarjan via GitGitGadget, Apr 6, 2026
  164. 05/13 fsmonitor: use pthread_cond_timedwait for cookie waitPaul Tarjan via GitGitGadget, Apr 6, 2026
  165. 06/13 fsmonitor: rename fsm-ipc-darwin.c to fsm-ipc-unix.cPaul Tarjan via GitGitGadget, Apr 6, 2026
  166. 07/13 fsmonitor: rename fsm-settings-darwin.c to fsm-settings-unix.cPaul Tarjan via GitGitGadget, Apr 6, 2026
  167. 08/13 fsmonitor: implement filesystem change listener for LinuxPaul Tarjan via GitGitGadget, Apr 6, 2026
  168. 09/13 run-command: add close_fd_above_stderr optionPaul Tarjan via GitGitGadget, Apr 6, 2026
  169. 10/13 fsmonitor: close inherited file descriptors and detach in daemonPaul Tarjan via GitGitGadget, Apr 6, 2026
  170. 11/13 fsmonitor: add timeout to daemon stop commandPaul Tarjan via GitGitGadget, Apr 6, 2026
  171. 12/13 fsmonitor: add tests for LinuxPaul Tarjan via GitGitGadget, Apr 6, 2026
  172. 13/13 fsmonitor: convert shown khash to strset in do_handle_clientPaul Tarjan via GitGitGadget, Apr 6, 2026
  173. 00/13 fsmonitor: implement filesystem change listener for LinuxPaul Tarjan via GitGitGadget, Apr 9, 2026
  174. 01/13 t9210, t9211: disable GIT_TEST_SPLIT_INDEX for scalar clone testsPaul Tarjan via GitGitGadget, Apr 9, 2026
  175. 02/13 fsmonitor: fix khash memory leak in do_handle_clientPaul Tarjan via GitGitGadget, Apr 9, 2026
  176. 03/13 fsmonitor: fix hashmap memory leak in fsmonitor_run_daemonPaul Tarjan via GitGitGadget, Apr 9, 2026
  177. 04/13 compat/win32: add pthread_cond_timedwaitPaul Tarjan via GitGitGadget, Apr 9, 2026
  178. 05/13 fsmonitor: use pthread_cond_timedwait for cookie waitPaul Tarjan via GitGitGadget, Apr 9, 2026
  179. 06/13 fsmonitor: rename fsm-ipc-darwin.c to fsm-ipc-unix.cPaul Tarjan via GitGitGadget, Apr 9, 2026
  180. 07/13 fsmonitor: rename fsm-settings-darwin.c to fsm-settings-unix.cPaul Tarjan via GitGitGadget, Apr 9, 2026
  181. 08/13 fsmonitor: implement filesystem change listener for LinuxPaul Tarjan via GitGitGadget, Apr 9, 2026
  182. 09/13 run-command: add close_fd_above_stderr optionPaul Tarjan via GitGitGadget, Apr 9, 2026
  183. 10/13 fsmonitor: close inherited file descriptors and detach in daemonPaul Tarjan via GitGitGadget, Apr 9, 2026
  184. 11/13 fsmonitor: add timeout to daemon stop commandPaul Tarjan via GitGitGadget, Apr 9, 2026
  185. 12/13 fsmonitor: add tests for LinuxPaul Tarjan via GitGitGadget, Apr 9, 2026
  186. SZEDER GáborApr 14, 2026
  187. Junio C HamanoApr 14, 2026
  188. Jeff KingApr 14, 2026
  189. 13/13 fsmonitor: convert shown khash to strset in do_handle_clientPaul Tarjan via GitGitGadget, Apr 9, 2026
  190. Junio C HamanoApr 9, 2026
  191. 00/13 fsmonitor: implement filesystem change listener for LinuxPaul Tarjan via GitGitGadget, Apr 15, 2026
  192. 01/13 t9210, t9211: disable GIT_TEST_SPLIT_INDEX for scalar clone testsPaul Tarjan via GitGitGadget, Apr 15, 2026
  193. 02/13 fsmonitor: fix khash memory leak in do_handle_clientPaul Tarjan via GitGitGadget, Apr 15, 2026
  194. 03/13 fsmonitor: fix hashmap memory leak in fsmonitor_run_daemonPaul Tarjan via GitGitGadget, Apr 15, 2026
  195. 04/13 compat/win32: add pthread_cond_timedwaitPaul Tarjan via GitGitGadget, Apr 15, 2026
  196. 05/13 fsmonitor: use pthread_cond_timedwait for cookie waitPaul Tarjan via GitGitGadget, Apr 15, 2026
  197. 06/13 fsmonitor: rename fsm-ipc-darwin.c to fsm-ipc-unix.cPaul Tarjan via GitGitGadget, Apr 15, 2026
  198. 07/13 fsmonitor: rename fsm-settings-darwin.c to fsm-settings-unix.cPaul Tarjan via GitGitGadget, Apr 15, 2026
  199. 08/13 fsmonitor: implement filesystem change listener for LinuxPaul Tarjan via GitGitGadget, Apr 15, 2026
  200. 09/13 run-command: add close_fd_above_stderr optionPaul Tarjan via GitGitGadget, Apr 15, 2026
  201. 10/13 fsmonitor: close inherited file descriptors and detach in daemonPaul Tarjan via GitGitGadget, Apr 15, 2026
  202. 11/13 fsmonitor: add timeout to daemon stop commandPaul Tarjan via GitGitGadget, Apr 15, 2026
  203. 12/13 fsmonitor: add tests for LinuxPaul Tarjan via GitGitGadget, Apr 15, 2026
  204. 13/13 fsmonitor: convert shown khash to strset in do_handle_clientPaul Tarjan via GitGitGadget, Apr 15, 2026
  205. Ben KnobleApr 15, 2026
  206. Junio C HamanoApr 15, 2026
  207. Ben KnobleApr 15, 2026
  208. Junio C HamanoMay 12, 2026
  209. D. Ben KnobleMay 12, 2026
  210. Junio C HamanoApr 15, 2026
  211. Junio C HamanoDec 30, 2025

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.