With the scoutfs-build multi-version pipeline landing, each
supported scoutfs version (v1.28, v1.29, v1.30) has its own
long-lived branch here. The tag history section is replaced by a
table showing which branch targets which scoutfs version, and the
rebase-for-new-upstream walkthrough is updated to describe creating
a new branch rather than overwriting main.
Upstream released v1.30 (ad65116 on 2026-04-16 per the scoutfs tag).
The CI's daily cron picked the new tag and failed because our patch
series targeted v1.29.
Rebase was clean: scoutfs v1.30's diff against v1.29 touches btree,
forest, quota, totl, triggers, wkic, and xattr — none of the files
our series modifies. No daemon, Makefile, or packaging changes;
this is a pure retag.
git checkout v1.30
git am --3way <the three existing patches> # clean apply
git format-patch v1.30..HEAD
Base bumped: v1.29 -> v1.30.
The file was committed with mode 100644 so Linux clones couldn't
execute it directly; the CI path that invokes it as
/tmp/scoutfs-notify/apply.sh <target>
was getting 'Permission denied'. The ci/apply-notify-patches.sh
shim now also chmod +x defensively, but fixing the stored mode
is the right place to handle it.
Raises the minimum Go required to build scoutfs-notifyd to 1.26
(current upstream Go as of Feb 2026). The source uses no language
features beyond basic stdlib; the bump is a policy decision to
track current Go rather than a technical need.
No distro currently packages Go 1.26 in its stable repos, so
scoutfs-build's CI now fetches the official linux tarball from
go.dev and caches it in /var/cache/scoutfs on the runner host
(keyed by version + arch). Builds remain hermetic after that
single fetch: CGO_ENABLED=0, GOPROXY=off, no module dependencies.
Changes:
utils/notifyd/go.mod go 1.21 -> go 1.26
utils/scoutfs-utils.spec.in golang >= 1.21 -> golang >= 1.26
The kmod patches (1 and 2) and the daemon source are unchanged.
Two changes from v1.29-notify-2:
1. kmod: fix a latent ring-size compile error. The record struct was
56 bytes with an _pad[6] trailer, which meant
NOTIFY_RING_BYTES / sizeof(record) = 1170 events per ring —
not a power of two, so the BUILD_BUG_ON in notify_setup would
have fired. Bumped _pad to 14 bytes so the record is 64 bytes,
capacity is 1024, and every record is cache-line aligned. Wire
ABI bumped accordingly; no deployed consumers yet.
2. scoutfs-notifyd: rewritten in Go using the standard library
only. Three goroutines (reader / accept / broadcaster) with
channel communication replace the single-thread epoll + ioctl
loop from the C version. Slow-client handling is done by
setting an in-the-past write deadline; the broadcaster drops
clients whose kernel send buffer is full.
Packaging changes: utils/Makefile now invokes "go build" with
CGO_ENABLED=0 and GOPROXY=off; utils/scoutfs-utils.spec.in adds
BuildRequires: golang >= 1.21.
Reworks the series to Option B from the design discussion: no mount
options, no sysfs toggles, single well-known socket per scoutfs
volume at /run/scoutfs/<fsid>/notify.sock.
Changes vs v1.29-notify-1:
- Kmod: dropped notify_events / notify_ring_kb mount options and
their sysfs attrs. Ring is always allocated at mount with a
compile-time 64 KiB size. notify_enabled is now flipped by the
ioctl handler on reader attach / detach, so emit hooks are
zero-cost unless a watcher is connected.
- New third patch: scoutfs-notifyd userspace relay. Single-threaded
epoll daemon that drains the ioctl and broadcasts each record as
a SOCK_SEQPACKET message to connected clients. Shipped with a
systemd template unit and man page.
- Packaging: utils/Makefile and scoutfs-utils.spec.in install the
daemon at /usr/sbin/scoutfs-notifyd and the unit at
/usr/lib/systemd/system/scoutfs-notifyd@.service.
Patches 1 and 2 have been re-scoped; re-apply expected to succeed
on scoutfs v1.29.
Two-patch series that layers an observer-only file-access
notification stream onto scoutfs. See README.md for the design
summary and rebase workflow.
Base: scoutfs v1.29