selftests/filesystems: create get_unique_mnt_id() helper
authorAmir Goldstein <amir73il@gmail.com>
Fri, 9 May 2025 13:32:38 +0000 (15:32 +0200)
committerChristian Brauner <brauner@kernel.org>
Mon, 12 May 2025 09:40:12 +0000 (11:40 +0200)
Add helper to utils.c and use it in mount-notify and statmount tests.

Linking with utils.c drags in a dependecy with libcap, so add it to the
Makefile of the tests.

Reviewed-by: John Hubbard <jhubbard@nvidia.com>
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Link: https://lore.kernel.org/20250509133240.529330-7-amir73il@gmail.com
Reviewed-by: Christian Brauner <brauner@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
tools/testing/selftests/filesystems/mount-notify/Makefile
tools/testing/selftests/filesystems/mount-notify/mount-notify_test.c
tools/testing/selftests/filesystems/statmount/Makefile
tools/testing/selftests/filesystems/statmount/statmount_test_ns.c
tools/testing/selftests/filesystems/utils.c
tools/testing/selftests/filesystems/utils.h

index 41ebfe5..55a2e53 100644 (file)
@@ -1,7 +1,10 @@
 # SPDX-License-Identifier: GPL-2.0-or-later
 
 CFLAGS += -Wall -O2 -g $(KHDR_INCLUDES) $(TOOLS_INCLUDES)
+LDLIBS += -lcap
 
 TEST_GEN_PROGS := mount-notify_test
 
 include ../../lib.mk
+
+$(OUTPUT)/mount-notify_test: ../utils.c
index 4f0f325..63ce708 100644 (file)
@@ -13,6 +13,7 @@
 
 #include "../../kselftest_harness.h"
 #include "../statmount/statmount.h"
+#include "../utils.h"
 
 // Needed for linux/fanotify.h
 #ifndef __kernel_fsid_t
@@ -23,16 +24,6 @@ typedef struct {
 
 #include <sys/fanotify.h>
 
-static uint64_t get_mnt_id(struct __test_metadata *const _metadata,
-                          const char *path)
-{
-       struct statx sx;
-
-       ASSERT_EQ(statx(AT_FDCWD, path, 0, STATX_MNT_ID_UNIQUE, &sx), 0);
-       ASSERT_TRUE(!!(sx.stx_mask & STATX_MNT_ID_UNIQUE));
-       return sx.stx_mnt_id;
-}
-
 static const char root_mntpoint_templ[] = "/tmp/mount-notify_test_root.XXXXXX";
 
 static const int mark_cmds[] = {
@@ -81,7 +72,7 @@ FIXTURE_SETUP(fanotify)
 
        ASSERT_EQ(mkdir("b", 0700), 0);
 
-       self->root_id = get_mnt_id(_metadata, "/");
+       self->root_id = get_unique_mnt_id("/");
        ASSERT_NE(self->root_id, 0);
 
        for (i = 0; i < NUM_FAN_FDS; i++) {
index 19adebf..8e354fe 100644 (file)
@@ -1,7 +1,10 @@
 # SPDX-License-Identifier: GPL-2.0-or-later
 
 CFLAGS += -Wall -O2 -g $(KHDR_INCLUDES) $(TOOLS_INCLUDES)
+LDLIBS += -lcap
 
 TEST_GEN_PROGS := statmount_test statmount_test_ns listmount_test
 
 include ../../lib.mk
+
+$(OUTPUT)/statmount_test_ns: ../utils.c
index 70cb0c8..375a521 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/stat.h>
 
 #include "statmount.h"
+#include "../utils.h"
 #include "../../kselftest.h"
 
 #define NSID_PASS 0
@@ -78,27 +79,6 @@ static int get_mnt_ns_id(const char *mnt_ns, uint64_t *mnt_ns_id)
        return NSID_PASS;
 }
 
-static int get_mnt_id(const char *path, uint64_t *mnt_id)
-{
-       struct statx sx;
-       int ret;
-
-       ret = statx(AT_FDCWD, path, 0, STATX_MNT_ID_UNIQUE, &sx);
-       if (ret == -1) {
-               ksft_print_msg("retrieving unique mount ID for %s: %s\n", path,
-                              strerror(errno));
-               return NSID_ERROR;
-       }
-
-       if (!(sx.stx_mask & STATX_MNT_ID_UNIQUE)) {
-               ksft_print_msg("no unique mount ID available for %s\n", path);
-               return NSID_ERROR;
-       }
-
-       *mnt_id = sx.stx_mnt_id;
-       return NSID_PASS;
-}
-
 static int write_file(const char *path, const char *val)
 {
        int fd = open(path, O_WRONLY);
@@ -174,9 +154,9 @@ static int _test_statmount_mnt_ns_id(void)
        if (ret != NSID_PASS)
                return ret;
 
-       ret = get_mnt_id("/", &root_id);
-       if (ret != NSID_PASS)
-               return ret;
+       root_id = get_unique_mnt_id("/");
+       if (!root_id)
+               return NSID_ERROR;
 
        ret = statmount(root_id, 0, STATMOUNT_MNT_NS_ID, &sm, sizeof(sm), 0);
        if (ret == -1) {
index e553c89..5a114af 100644 (file)
@@ -19,6 +19,8 @@
 #include <sys/wait.h>
 #include <sys/xattr.h>
 
+#include "../kselftest.h"
+#include "wrappers.h"
 #include "utils.h"
 
 #define MAX_USERNS_LEVEL 32
@@ -499,3 +501,23 @@ out:
        cap_free(caps);
        return fret;
 }
+
+uint64_t get_unique_mnt_id(const char *path)
+{
+       struct statx sx;
+       int ret;
+
+       ret = statx(AT_FDCWD, path, 0, STATX_MNT_ID_UNIQUE, &sx);
+       if (ret == -1) {
+               ksft_print_msg("retrieving unique mount ID for %s: %s\n", path,
+                        strerror(errno));
+               return 0;
+       }
+
+       if (!(sx.stx_mask & STATX_MNT_ID_UNIQUE)) {
+               ksft_print_msg("no unique mount ID available for %s\n", path);
+               return 0;
+       }
+
+       return sx.stx_mnt_id;
+}
index 7f1df2a..d9cf145 100644 (file)
@@ -42,4 +42,6 @@ static inline bool switch_userns(int fd, uid_t uid, gid_t gid, bool drop_caps)
        return true;
 }
 
+extern uint64_t get_unique_mnt_id(const char *path);
+
 #endif /* __IDMAP_UTILS_H */