Skip to content

Commit

Permalink
selftests/filesystems: create get_unique_mnt_id() helper
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Amir Goldstein authored and Christian Brauner committed May 12, 2025
1 parent c6d9775 commit e897b9b
Show file tree
Hide file tree
Showing 6 changed files with 36 additions and 35 deletions.
3 changes: 3 additions & 0 deletions tools/testing/selftests/filesystems/mount-notify/Makefile
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

#include "../../kselftest_harness.h"
#include "../statmount/statmount.h"
#include "../utils.h"

// Needed for linux/fanotify.h
#ifndef __kernel_fsid_t
Expand All @@ -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[] = {
Expand Down Expand Up @@ -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++) {
Expand Down
3 changes: 3 additions & 0 deletions tools/testing/selftests/filesystems/statmount/Makefile
Original file line number Diff line number Diff line change
@@ -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
28 changes: 4 additions & 24 deletions tools/testing/selftests/filesystems/statmount/statmount_test_ns.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <linux/stat.h>

#include "statmount.h"
#include "../utils.h"
#include "../../kselftest.h"

#define NSID_PASS 0
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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) {
Expand Down
22 changes: 22 additions & 0 deletions tools/testing/selftests/filesystems/utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -499,3 +501,23 @@ int cap_down(cap_value_t down)
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;
}
2 changes: 2 additions & 0 deletions tools/testing/selftests/filesystems/utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */

0 comments on commit e897b9b

Please sign in to comment.