diff --git a/README.md b/README.md index e62299c..334ff9d 100644 --- a/README.md +++ b/README.md @@ -10,24 +10,29 @@ currently-supported upstream scoutfs version. Three patches against each supported scoutfs release: 1. **Kmod core** — a per-mount 64 KiB ring of 64-byte notification records and - a single-reader drain ioctl (`SCOUTFS_IOC_READ_NOTIFY`, nr 25). Emit is + a single-reader drain ioctl (`SCOUTFS_IOC_READ_NOTIFY`, nr 26). Emit is non-blocking, drop-on-full; the monotonic `seq` field exposes drops to consumers. Three percpu counters (`notify_emitted`, `notify_dropped_ring_full`, `notify_reader_attached`). No mount option, no sysfs toggle. 2. **Kmod hooks** — `->open` wrapper and READ emit in - `scoutfs_file_aio_read` / `scoutfs_file_read_iter`. Every hook is a - single predicted-false branch when no reader is attached. Nothing in - the data-waiter state machine is touched. + `scoutfs_file_read_iter`. Every hook is a single predicted-false + branch when no reader is attached. Nothing in the data-waiter state + machine is touched. (Branches up to `v1.32` also hooked + `scoutfs_file_aio_read`; scoutfs v1.33 removed the + `KC_LINUX_HAVE_FOP_AIO_READ` compat paths, so `read_iter` is now the + only read path.) 3. **scoutfs-notifyd (Go)** — userspace daemon that binds `/run/scoutfs//notify.sock` (AF_UNIX SOCK_SEQPACKET, mode 0600, root-only), drains the ring, and broadcasts each record to connected clients. Pure-stdlib Go; no external module dependencies. Shipped with a systemd template unit `scoutfs-notifyd@.service`. -The notify ABI (`SCOUTFS_IOC_READ_NOTIFY` nr 25, 64-byte event record) is -identical across all three supported scoutfs versions, so consumers and -the daemon do not need per-version branching in their own code. +The 64-byte event record layout is identical on every branch, so +consumers and the daemon do not need per-version branching in their own +code. The ioctl number is not: it is nr 25 on `v1.28`-`v1.30` and nr 26 +from `v1.32` on, because upstream v1.32 took nr 25 for +`SCOUTFS_IOC_INJECT_TOTL_DELTA`. scoutfs v1.33 did not renumber again. ## Repository layout @@ -39,7 +44,9 @@ NOT apply cross-version without rebasing. |----------------|-----------------|------------------| | `v1.28` | `v1.28` | `v1.28-notify-1` | | `v1.29` | `v1.29` | `v1.29-notify-1` | -| `main` / `v1.30` | `v1.30` | `v1.30-notify-1` | +| `v1.30` | `v1.30` | `v1.30-notify-1` | +| `v1.32` | `v1.32` | `v1.32-notify-1` | +| `v1.33` | `v1.33` | `v1.33-notify-1` | `main` tracks the newest supported scoutfs version. When a new scoutfs release ships, a new branch is created and the patches are rebased onto diff --git a/base.txt b/base.txt index 181891c..2f2ce0d 100644 --- a/base.txt +++ b/base.txt @@ -1 +1 @@ -v1.32 +v1.33 diff --git a/patches/0001-notify-core-file-access-notification-infrastructure.patch b/patches/0001-notify-core-file-access-notification-infrastructure.patch index b1ce8b5..3a66183 100644 --- a/patches/0001-notify-core-file-access-notification-infrastructure.patch +++ b/patches/0001-notify-core-file-access-notification-infrastructure.patch @@ -1,4 +1,4 @@ -From 50eba28d24c3b98c71d851c8093abc27a1835cce Mon Sep 17 00:00:00 2001 +From 0e703364da5efe4a3b2e96e5513204dd8a1a79ac Mon Sep 17 00:00:00 2001 From: William Gill Date: Wed, 22 Apr 2026 14:38:51 -0500 Subject: [PATCH 1/3] notify: core file-access notification infrastructure @@ -70,10 +70,10 @@ index fa632aa..de14c74 100644 options.o \ per_task.o \ diff --git a/kmod/src/counters.h b/kmod/src/counters.h -index 9088496..94e4f44 100644 +index cb7a2e1..83c0976 100644 --- a/kmod/src/counters.h +++ b/kmod/src/counters.h -@@ -156,6 +156,9 @@ +@@ -157,6 +157,9 @@ EXPAND_COUNTER(net_recv_invalid_message) \ EXPAND_COUNTER(net_recv_messages) \ EXPAND_COUNTER(net_unknown_request) \ @@ -84,7 +84,7 @@ index 9088496..94e4f44 100644 EXPAND_COUNTER(orphan_scan_attempts) \ EXPAND_COUNTER(orphan_scan_cached) \ diff --git a/kmod/src/ioctl.c b/kmod/src/ioctl.c -index 156538a..4740ff0 100644 +index 903033b..3a09e2e 100644 --- a/kmod/src/ioctl.c +++ b/kmod/src/ioctl.c @@ -47,6 +47,7 @@ @@ -95,7 +95,7 @@ index 156538a..4740ff0 100644 #include "scoutfs_trace.h" #include "util.h" -@@ -1829,6 +1830,8 @@ long scoutfs_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +@@ -1827,6 +1828,8 @@ long scoutfs_ioctl(struct file *file, unsigned int cmd, unsigned long arg) return scoutfs_ioc_punch_offline(file, arg); case SCOUTFS_IOC_INJECT_TOTL_DELTA: return scoutfs_ioc_inject_totl_delta(file, arg); @@ -622,7 +622,7 @@ index 0000000..fe6a2d9 + +#endif /* _SCOUTFS_NOTIFY_H_ */ diff --git a/kmod/src/super.c b/kmod/src/super.c -index 3c83716..3c028b0 100644 +index f2e1420..94922be 100644 --- a/kmod/src/super.c +++ b/kmod/src/super.c @@ -51,6 +51,7 @@ diff --git a/patches/0002-notify-file-open-read-hook-sites.patch b/patches/0002-notify-file-open-read-hook-sites.patch index 6d5fa38..d68c8af 100644 --- a/patches/0002-notify-file-open-read-hook-sites.patch +++ b/patches/0002-notify-file-open-read-hook-sites.patch @@ -1,10 +1,7 @@ -From 482c0be372e2982cd7ca9ad7c0ea3522437886c6 Mon Sep 17 00:00:00 2001 +From 9eb38690d14d631a0dd96f464caa588bee86278d Mon Sep 17 00:00:00 2001 From: William Gill Date: Wed, 22 Apr 2026 14:40:04 -0500 Subject: [PATCH 2/3] notify: file open/read hook sites -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit Wires the notification emit path into the two scoutfs file operations that carry user-visible activity we want to observe. @@ -13,18 +10,22 @@ OPEN (data.c): A new scoutfs_file_open() wrapper is installed as ->open in scoutfs_file_fops. The wrapper calls generic_file_open() to preserve existing VFS default semantics for regular files, - then — only on success and only when notifications are enabled - — emits a SCOUTFS_NOTIFY_TYPE_OPEN record. File mode is + then - only on success and only when notifications are enabled + - emits a SCOUTFS_NOTIFY_TYPE_OPEN record. File mode is inspected for FMODE_WRITE to set SCOUTFS_NOTIFY_F_WRITE_OPEN. READ (file.c): - Both the aio_read (KC_LINUX_HAVE_FOP_AIO_READ) and read_iter - paths get an emit placed past the existing data-waiter retry - check, guarded on (ret > 0) so only successful reads are - reported and retries never double-count. start_pos is captured - at entry of read_iter before generic_file_read_iter advances + scoutfs_file_read_iter() gets an emit placed past the existing + data-waiter retry check, guarded on (ret > 0) so only successful + reads are reported and retries never double-count. start_pos is + captured at function entry before generic_file_read_iter advances iocb->ki_pos. +Rebased onto v1.33: upstream removed the KC_LINUX_HAVE_FOP_AIO_READ +compat paths, so scoutfs_file_aio_read/aio_write no longer exist and +the second READ hook and the fops table's #ifdef arm went with them. +read_iter is now the only read path. The hook body is unchanged. + Every hook is behind unlikely(READ_ONCE(sbi->notify_enabled)), so when no userspace reader is attached the hook reduces to a single predicted-false branch. No scoutfs state is mutated, no error is @@ -33,14 +34,14 @@ propagated, and no existing control flow is altered. Nothing in the data-waiter state machine is touched. --- kmod/src/data.c | 28 ++++++++++++++++++++++++++++ - kmod/src/file.c | 11 +++++++++++ - 2 files changed, 39 insertions(+) + kmod/src/file.c | 7 +++++++ + 2 files changed, 35 insertions(+) diff --git a/kmod/src/data.c b/kmod/src/data.c -index b6ca5eb..439ce09 100644 +index 1d3168f..5611dd8 100644 --- a/kmod/src/data.c +++ b/kmod/src/data.c -@@ -41,6 +41,7 @@ +@@ -42,6 +42,7 @@ #include "msg.h" #include "ext.h" #include "util.h" @@ -48,7 +49,7 @@ index b6ca5eb..439ce09 100644 /* * We want to amortize work done after dirtying the shared transaction -@@ -2312,6 +2313,32 @@ const struct address_space_operations scoutfs_file_aops = { +@@ -2242,11 +2243,38 @@ const struct address_space_operations scoutfs_file_aops = { .write_end = scoutfs_write_end, }; @@ -79,18 +80,16 @@ index b6ca5eb..439ce09 100644 +} + const struct file_operations scoutfs_file_fops = { - #ifdef KC_LINUX_HAVE_FOP_AIO_READ - .read = do_sync_read, -@@ -2324,6 +2351,7 @@ const struct file_operations scoutfs_file_fops = { + .read_iter = scoutfs_file_read_iter, + .write_iter = scoutfs_file_write_iter, .splice_read = generic_file_splice_read, .splice_write = iter_file_splice_write, - #endif + .open = scoutfs_file_open, .mmap = scoutfs_file_mmap, .unlocked_ioctl = scoutfs_ioctl, .fsync = scoutfs_file_fsync, diff --git a/kmod/src/file.c b/kmod/src/file.c -index 15158a2..44f1bc4 100644 +index 0f2e7b8..fb7eace 100644 --- a/kmod/src/file.c +++ b/kmod/src/file.c @@ -29,6 +29,7 @@ @@ -99,20 +98,9 @@ index 15158a2..44f1bc4 100644 #include "quota.h" +#include "notify.h" - #ifdef KC_LINUX_HAVE_FOP_AIO_READ - /* -@@ -84,6 +85,10 @@ out: - goto retry; - } - -+ if (ret > 0 && unlikely(READ_ONCE(SCOUTFS_SB(sb)->notify_enabled))) -+ scoutfs_notify_emit(sb, SCOUTFS_NOTIFY_TYPE_READ, -+ scoutfs_ino(inode), pos, ret, 0); -+ - return ret; - } - -@@ -166,6 +171,7 @@ ssize_t scoutfs_file_read_iter(struct kiocb *iocb, struct iov_iter *to) + ssize_t scoutfs_file_read_iter(struct kiocb *iocb, struct iov_iter *to) + { +@@ -39,6 +40,7 @@ ssize_t scoutfs_file_read_iter(struct kiocb *iocb, struct iov_iter *to) struct scoutfs_lock *scoutfs_inode_lock = NULL; SCOUTFS_DECLARE_PER_TASK_ENTRY(pt_ent); DECLARE_DATA_WAIT(dw); @@ -120,7 +108,7 @@ index 15158a2..44f1bc4 100644 int ret; retry: -@@ -200,6 +206,11 @@ out: +@@ -73,6 +75,11 @@ out: if (ret == 0) goto retry; } diff --git a/patches/0003-notify-scoutfs-notifyd-userspace-relay-daemon-Go-1.2.patch b/patches/0003-notify-scoutfs-notifyd-userspace-relay-daemon-Go-1.2.patch index c465e89..d796823 100644 --- a/patches/0003-notify-scoutfs-notifyd-userspace-relay-daemon-Go-1.2.patch +++ b/patches/0003-notify-scoutfs-notifyd-userspace-relay-daemon-Go-1.2.patch @@ -1,4 +1,4 @@ -From 31ef1c5ff1522a6de4501ff41fed0d72ecb57e8d Mon Sep 17 00:00:00 2001 +From e7d50bb7b4e2fa0a88e7b4b8f4be75bb07e37351 Mon Sep 17 00:00:00 2001 From: William Gill Date: Wed, 22 Apr 2026 14:40:34 -0500 Subject: [PATCH 3/3] notify: scoutfs-notifyd userspace relay daemon (Go 1.26)