Re: [PATCH v3 RESEND] selftests: filesystems: Add functional test for the abort file in fusectl
From: Miklos Szeredi
Date: Thu Jun 12 2025 - 04:56:51 EST
On Tue, 10 Jun 2025 at 04:10, Chen Linxuan <chenlinxuan@xxxxxxxxxxxxx> wrote:
>
> This patch add a simple functional test for the "abort" file
> in fusectlfs (/sys/fs/fuse/connections/ID/about).
>
> A simple fuse daemon is added for testing.
>
> Related discussion can be found in the link below.
>
> Link: https://lore.kernel.org/all/CAOQ4uxjKFXOKQxPpxtS6G_nR0tpw95w0GiO68UcWg_OBhmSY=Q@xxxxxxxxxxxxxx/
> Signed-off-by: Chen Linxuan <chenlinxuan@xxxxxxxxxxxxx>
> Acked-by: Shuah Khan <skhan@xxxxxxxxxxxxxxxxxxx>
> Reviewed-by: Amir Goldstein <amir73il@xxxxxxxxx>
Thanks.
I suggest setting up a userns environment, see attached patch (also
fixes a EBUSY on umount/rmdir).
Thanks,
Miklos
diff --git a/tools/testing/selftests/filesystems/fuse/fusectl_test.c b/tools/testing/selftests/filesystems/fuse/fusectl_test.c
index 7050fbe0970e..8d124d1cacb2 100644
--- a/tools/testing/selftests/filesystems/fuse/fusectl_test.c
+++ b/tools/testing/selftests/filesystems/fuse/fusectl_test.c
@@ -14,6 +14,7 @@
#include <sys/wait.h>
#include <unistd.h>
#include <dirent.h>
+#include <sched.h>
#include <linux/limits.h>
#include "../../kselftest_harness.h"
@@ -23,6 +24,17 @@
#define FUSE_DEVICE "/dev/fuse"
#define FUSECTL_TEST_VALUE "1"
+static void write_file(struct __test_metadata *const _metadata,
+ const char *path, const char *val)
+{
+ int fd = open(path, O_WRONLY);
+ size_t len = strlen(val);
+
+ ASSERT_GE(fd, 0);
+ ASSERT_EQ(write(fd, val, len), len);
+ ASSERT_EQ(close(fd), 0);
+}
+
FIXTURE(fusectl){
char fuse_mountpoint[sizeof(FUSE_MOUNTPOINT)];
int connection;
@@ -33,6 +45,18 @@ FIXTURE_SETUP(fusectl)
const char *fuse_mnt_prog = "./fuse_mnt";
int status, pid;
struct stat statbuf;
+ uid_t uid = getuid();
+ gid_t gid = getgid();
+ char buf[32];
+
+ /* Setup userns */
+ ASSERT_EQ(unshare(CLONE_NEWNS|CLONE_NEWUSER), 0);
+ sprintf(buf, "0 %d 1", uid);
+ write_file(_metadata, "/proc/self/uid_map", buf);
+ write_file(_metadata, "/proc/self/setgroups", "deny");
+ sprintf(buf, "0 %d 1", gid);
+ write_file(_metadata, "/proc/self/gid_map", buf);
+ ASSERT_EQ(mount("", "/", NULL, MS_REC|MS_PRIVATE, NULL), 0);
strcpy(self->fuse_mountpoint, FUSE_MOUNTPOINT);
@@ -73,7 +97,7 @@ FIXTURE_SETUP(fusectl)
FIXTURE_TEARDOWN(fusectl)
{
- umount(self->fuse_mountpoint);
+ umount2(self->fuse_mountpoint, MNT_DETACH);
rmdir(self->fuse_mountpoint);
}