mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-08-09 06:14:34 +02:00
Add a test that reproduces the stale ACL bug fixed by:
"fs: preserve ACL_DONT_CACHE state in forget_cached_acl()"
A FUSE mount that does not negotiate FUSE_POSIX_ACL initialises inodes
with i_acl = ACL_DONT_CACHE. Before the fix, calling
forget_all_cached_acls() (e.g. from fuse_update_get_attr() on a
statx(AT_STATX_FORCE_SYNC)) would silently replace ACL_DONT_CACHE with
ACL_NOT_CACHED, enabling the kernel ACL cache. A subsequent getxattr
would populate the cache, and because fuse_set_acl() skips
forget_all_cached_acls() for !fc->posix_acl, later ACL changes were
not visible to callers — getxattr returned stale data.
The test mounts a minimal libfuse3 lowlevel filesystem (no
FUSE_POSIX_ACL negotiated) and:
1. Issues two getxattrs — both must reach the daemon, proving
ACL_DONT_CACHE suppresses caching before any trigger.
2. Calls statx(AT_STATX_FORCE_SYNC) to trigger forget_all_cached_acls().
3. Issues another getxattr (populates the cache on a buggy kernel).
4. Switches the daemon to a different-sized ACL (ACL_B).
5. Issues a final getxattr — expects ACL_B (44 bytes) and daemon
call count 4; a buggy kernel returns stale ACL_A (28 bytes).
fuse_acl_cache_test is only built when libfuse3 is detected via
pkg-config.
Christian Brauner <brauner@kernel.org> says:
Changed do_force_statx() to call the statx() libc wrapper instead of
syscall(SYS_statx, ...) as requested by Amir after review feedback from
Luis Henriques, and dropped the now unused <sys/syscall.h> include.
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Link: https://patch.msgid.link/20260713220932.413004-3-amir73il@gmail.com
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
32 lines
899 B
Makefile
32 lines
899 B
Makefile
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
CFLAGS += -Wall -O2 -g $(KHDR_INCLUDES)
|
|
|
|
TEST_GEN_PROGS := fusectl_test
|
|
TEST_GEN_FILES := fuse_mnt
|
|
|
|
# fuse_acl_cache_test requires libfuse3; add it only when the library is present.
|
|
ACL_CFLAGS := $(shell pkg-config fuse3 --cflags 2>/dev/null)
|
|
ACL_LDLIBS := $(shell pkg-config fuse3 --libs 2>/dev/null)
|
|
ifneq ($(ACL_CFLAGS),)
|
|
TEST_GEN_PROGS += fuse_acl_cache_test
|
|
endif
|
|
|
|
include ../../lib.mk
|
|
|
|
VAR_CFLAGS := $(shell pkg-config fuse --cflags 2>/dev/null)
|
|
ifeq ($(VAR_CFLAGS),)
|
|
VAR_CFLAGS := -D_FILE_OFFSET_BITS=64 -I/usr/include/fuse
|
|
endif
|
|
|
|
VAR_LDLIBS := $(shell pkg-config fuse --libs 2>/dev/null)
|
|
ifeq ($(VAR_LDLIBS),)
|
|
VAR_LDLIBS := -lfuse -pthread
|
|
endif
|
|
|
|
$(OUTPUT)/fuse_mnt: CFLAGS += $(VAR_CFLAGS)
|
|
$(OUTPUT)/fuse_mnt: LDLIBS += $(VAR_LDLIBS)
|
|
|
|
$(OUTPUT)/fuse_acl_cache_test: CFLAGS += $(ACL_CFLAGS)
|
|
$(OUTPUT)/fuse_acl_cache_test: LDLIBS += $(ACL_LDLIBS)
|