mergerfs/vendored/libfuse/include
Antonio S. Musumeci 8eed256747 Restore splice zero-copy I/O as runtime options
Reinstate the splice read/write/move paths removed in 84592a9f, now
gated behind runtime options with negotiated pipe sizing and fallback
logging.

- Transport: msgbuf-piped splice receive, fd-referenced splice reply
  (vmsplice + splice), splice-move pipe-bounce, and restored
  fuse_buf_copy/fuse_buf_flags plumbing for copy fallbacks
- Negotiation: new pipe-max-size option (auto-raised at INIT when
  possible; the sysctl read/write is factored into src/pipe_max_size.cpp
  so fuse_init.cpp and option_parser.cpp share one implementation);
  fuse-msg-size clamped to what the pipe can hold; splice is disabled
  at INIT with a warning if the sysctl can't fit even the minimum,
  retracting the FUSE_CAP_SPLICE_* bits already advertised to the
  kernel in that case
- Read replies and splice-move are gated at 128 KiB (below that the
  syscalls cost more than the copy they avoid); every fallback path
  degrades to the copy path and logs once per process via SysLog
- msgbuf pipe cache is process-global and mutex-guarded (mutex_lockguard)
  so pipes can move between read and worker threads under
  process-thread mode
- API simplified after review: collapsed the three per-axis options
  (splice-read/write/move) into a single splice boolean (default on);
  no-splice-read/write/move and the bare splice-read/write/move
  spellings stay registered as accepted no-ops so existing mount
  options don't fail the mount, but they do NOT alter the splice
  knob - upgraders with no-splice-* in their config get splice
  enabled and must set splice=false explicitly (see
  deprecated_options.md)
- Fixed several correctness issues found in parallel review: a
  dropped write_buf registration that silently corrupted writes, a
  dirty-pipe reuse bug in msgbuf_free, an iov double-send in
  fuse_reply_data's splice-move fallback, and pipe-capacity math that
  assumed a 4096-byte page size
- Modernized the transport/negotiation code to this codebase's C++
  style: RAII (unique_ptr/DEFER) instead of malloc/free and manual fd
  close(), std::from_chars/to_chars instead of stoul/snprintf,
  _ReplyPipe's pipe ops as methods instead of free functions closing
  over a thread_local global, and vendored/libfuse/lib/buffer.cpp (a
  near-verbatim port of upstream's buffer.c) brought in line with the
  rest of the fork
- Documented splice and pipe-max-size options (mkdocs, FAQ,
  deprecated-options list); added tools/bench-splice.sh
- Benchmarked on tmpfs: seq_write +21%, seq_read +52%, small_write
  +5%, small_read +12%; validated with a 1h soak (~271 GiB
  hash-verified I/O, zero integrity failures), a live-mount round-trip
  of I/O above the splice threshold, and the existing unit/smoke
  suites at their pre-existing baseline

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-07 11:24:16 -04:00
..
base_types.h Add support for FUSE_COPY_FILE_RANGE_64 2026-04-01 23:20:05 -05:00
bounded_queue.hpp Misc fixes and improvements to thread pool 2026-03-24 21:13:34 -04:00
debug.hpp Rework readlink to not depend on cstr nul termination 2026-04-26 01:37:08 -04:00
extern_c.h Move 3rd party libraries to "vendored" directory 2026-03-02 01:09:16 -05:00
fatal.hpp Use fatal::abort() rather than assert in places 2026-03-24 21:13:34 -04:00
fs_dirent64.hpp Move 3rd party libraries to "vendored" directory 2026-03-02 01:09:16 -05:00
fuse.h Restore splice zero-copy I/O as runtime options 2026-09-07 11:24:16 -04:00
fuse_attr.h Move 3rd party libraries to "vendored" directory 2026-03-02 01:09:16 -05:00
fuse_cfg.hpp Restore splice zero-copy I/O as runtime options 2026-09-07 11:24:16 -04:00
fuse_common.h Restore splice zero-copy I/O as runtime options 2026-09-07 11:24:16 -04:00
fuse_conn_info.hpp Move 3rd party libraries to "vendored" directory 2026-03-02 01:09:16 -05:00
fuse_dirent.h Move 3rd party libraries to "vendored" directory 2026-03-02 01:09:16 -05:00
fuse_direntplus.h Move 3rd party libraries to "vendored" directory 2026-03-02 01:09:16 -05:00
fuse_dirents.hpp Move 3rd party libraries to "vendored" directory 2026-03-02 01:09:16 -05:00
fuse_entry.h Move 3rd party libraries to "vendored" directory 2026-03-02 01:09:16 -05:00
fuse_kernel.h Add support for FUSE_COPY_FILE_RANGE_64 2026-04-01 23:20:05 -05:00
fuse_lowlevel.h Restore splice zero-copy I/O as runtime options 2026-09-07 11:24:16 -04:00
fuse_msgbuf.hpp Restore splice zero-copy I/O as runtime options 2026-09-07 11:24:16 -04:00
fuse_msgbuf_t.h Restore splice zero-copy I/O as runtime options 2026-09-07 11:24:16 -04:00
fuse_opt.h Move 3rd party libraries to "vendored" directory 2026-03-02 01:09:16 -05:00
fuse_pollhandle.h Move 3rd party libraries to "vendored" directory 2026-03-02 01:09:16 -05:00
fuse_req.hpp Restore splice zero-copy I/O as runtime options 2026-09-07 11:24:16 -04:00
fuse_req_ctx.h Move 3rd party libraries to "vendored" directory 2026-03-02 01:09:16 -05:00
fuse_timeouts.h Move 3rd party libraries to "vendored" directory 2026-03-02 01:09:16 -05:00
invocable.h Move 3rd party libraries to "vendored" directory 2026-03-02 01:09:16 -05:00
kvec.h Move 3rd party libraries to "vendored" directory 2026-03-02 01:09:16 -05:00
maintenance_thread.hpp Move maintainence thread func take u64 rather than int 2026-03-24 21:13:34 -04:00
mutex.hpp Move scope_guard to vendored/ 2026-03-24 21:13:34 -04:00
mutex_debug.hpp Move 3rd party libraries to "vendored" directory 2026-03-02 01:09:16 -05:00
mutex_ndebug.hpp Move 3rd party libraries to "vendored" directory 2026-03-02 01:09:16 -05:00
objpool.hpp libfuse: thread_pool/objpool/fuse_loop - safer memory and iteration 2026-04-18 13:47:23 -05:00
stat_utils.h Move 3rd party libraries to "vendored" directory 2026-03-02 01:09:16 -05:00
syslog.hpp Restore splice zero-copy I/O as runtime options 2026-09-07 11:24:16 -04:00
thread_pool.hpp libfuse: thread_pool/objpool/fuse_loop - safer memory and iteration 2026-04-18 13:47:23 -05:00