diff options
Diffstat (limited to 'tools/testing/selftests/bpf/prog_tests')
| -rw-r--r-- | tools/testing/selftests/bpf/prog_tests/netcnt.c | 2 | ||||
| -rw-r--r-- | tools/testing/selftests/bpf/prog_tests/test_bpffs.c | 85 | 
2 files changed, 75 insertions, 12 deletions
diff --git a/tools/testing/selftests/bpf/prog_tests/netcnt.c b/tools/testing/selftests/bpf/prog_tests/netcnt.c index 6ede48bde91b..954964f0ac3d 100644 --- a/tools/testing/selftests/bpf/prog_tests/netcnt.c +++ b/tools/testing/selftests/bpf/prog_tests/netcnt.c @@ -8,7 +8,7 @@  #define CG_NAME "/netcnt" -void test_netcnt(void) +void serial_test_netcnt(void)  {  	union percpu_net_cnt *percpu_netcnt = NULL;  	struct bpf_cgroup_storage_key key; diff --git a/tools/testing/selftests/bpf/prog_tests/test_bpffs.c b/tools/testing/selftests/bpf/prog_tests/test_bpffs.c index 172c999e523c..d29ebfeef9c5 100644 --- a/tools/testing/selftests/bpf/prog_tests/test_bpffs.c +++ b/tools/testing/selftests/bpf/prog_tests/test_bpffs.c @@ -1,6 +1,7 @@  // SPDX-License-Identifier: GPL-2.0  /* Copyright (c) 2020 Facebook */  #define _GNU_SOURCE +#include <stdio.h>  #include <sched.h>  #include <sys/mount.h>  #include <sys/stat.h> @@ -29,44 +30,106 @@ static int read_iter(char *file)  static int fn(void)  { -	int err, duration = 0; +	struct stat a, b, c; +	int err, map;  	err = unshare(CLONE_NEWNS); -	if (CHECK(err, "unshare", "failed: %d\n", errno)) +	if (!ASSERT_OK(err, "unshare"))  		goto out;  	err = mount("", "/", "", MS_REC | MS_PRIVATE, NULL); -	if (CHECK(err, "mount /", "failed: %d\n", errno)) +	if (!ASSERT_OK(err, "mount /"))  		goto out;  	err = umount(TDIR); -	if (CHECK(err, "umount " TDIR, "failed: %d\n", errno)) +	if (!ASSERT_OK(err, "umount " TDIR))  		goto out;  	err = mount("none", TDIR, "tmpfs", 0, NULL); -	if (CHECK(err, "mount", "mount root failed: %d\n", errno)) +	if (!ASSERT_OK(err, "mount tmpfs"))  		goto out;  	err = mkdir(TDIR "/fs1", 0777); -	if (CHECK(err, "mkdir "TDIR"/fs1", "failed: %d\n", errno)) +	if (!ASSERT_OK(err, "mkdir " TDIR "/fs1"))  		goto out;  	err = mkdir(TDIR "/fs2", 0777); -	if (CHECK(err, "mkdir "TDIR"/fs2", "failed: %d\n", errno)) +	if (!ASSERT_OK(err, "mkdir " TDIR "/fs2"))  		goto out;  	err = mount("bpf", TDIR "/fs1", "bpf", 0, NULL); -	if (CHECK(err, "mount bpffs "TDIR"/fs1", "failed: %d\n", errno)) +	if (!ASSERT_OK(err, "mount bpffs " TDIR "/fs1"))  		goto out;  	err = mount("bpf", TDIR "/fs2", "bpf", 0, NULL); -	if (CHECK(err, "mount bpffs " TDIR "/fs2", "failed: %d\n", errno)) +	if (!ASSERT_OK(err, "mount bpffs " TDIR "/fs2"))  		goto out;  	err = read_iter(TDIR "/fs1/maps.debug"); -	if (CHECK(err, "reading " TDIR "/fs1/maps.debug", "failed\n")) +	if (!ASSERT_OK(err, "reading " TDIR "/fs1/maps.debug"))  		goto out;  	err = read_iter(TDIR "/fs2/progs.debug"); -	if (CHECK(err, "reading " TDIR "/fs2/progs.debug", "failed\n")) +	if (!ASSERT_OK(err, "reading " TDIR "/fs2/progs.debug"))  		goto out; + +	err = mkdir(TDIR "/fs1/a", 0777); +	if (!ASSERT_OK(err, "creating " TDIR "/fs1/a")) +		goto out; +	err = mkdir(TDIR "/fs1/a/1", 0777); +	if (!ASSERT_OK(err, "creating " TDIR "/fs1/a/1")) +		goto out; +	err = mkdir(TDIR "/fs1/b", 0777); +	if (!ASSERT_OK(err, "creating " TDIR "/fs1/b")) +		goto out; + +	map = bpf_create_map(BPF_MAP_TYPE_ARRAY, 4, 4, 1, 0); +	if (!ASSERT_GT(map, 0, "create_map(ARRAY)")) +		goto out; +	err = bpf_obj_pin(map, TDIR "/fs1/c"); +	if (!ASSERT_OK(err, "pin map")) +		goto out; +	close(map); + +	/* Check that RENAME_EXCHANGE works for directories. */ +	err = stat(TDIR "/fs1/a", &a); +	if (!ASSERT_OK(err, "stat(" TDIR "/fs1/a)")) +		goto out; +	err = renameat2(0, TDIR "/fs1/a", 0, TDIR "/fs1/b", RENAME_EXCHANGE); +	if (!ASSERT_OK(err, "renameat2(/fs1/a, /fs1/b, RENAME_EXCHANGE)")) +		goto out; +	err = stat(TDIR "/fs1/b", &b); +	if (!ASSERT_OK(err, "stat(" TDIR "/fs1/b)")) +		goto out; +	if (!ASSERT_EQ(a.st_ino, b.st_ino, "b should have a's inode")) +		goto out; +	err = access(TDIR "/fs1/b/1", F_OK); +	if (!ASSERT_OK(err, "access(" TDIR "/fs1/b/1)")) +		goto out; + +	/* Check that RENAME_EXCHANGE works for mixed file types. */ +	err = stat(TDIR "/fs1/c", &c); +	if (!ASSERT_OK(err, "stat(" TDIR "/fs1/map)")) +		goto out; +	err = renameat2(0, TDIR "/fs1/c", 0, TDIR "/fs1/b", RENAME_EXCHANGE); +	if (!ASSERT_OK(err, "renameat2(/fs1/c, /fs1/b, RENAME_EXCHANGE)")) +		goto out; +	err = stat(TDIR "/fs1/b", &b); +	if (!ASSERT_OK(err, "stat(" TDIR "/fs1/b)")) +		goto out; +	if (!ASSERT_EQ(c.st_ino, b.st_ino, "b should have c's inode")) +		goto out; +	err = access(TDIR "/fs1/c/1", F_OK); +	if (!ASSERT_OK(err, "access(" TDIR "/fs1/c/1)")) +		goto out; + +	/* Check that RENAME_NOREPLACE works. */ +	err = renameat2(0, TDIR "/fs1/b", 0, TDIR "/fs1/a", RENAME_NOREPLACE); +	if (!ASSERT_ERR(err, "renameat2(RENAME_NOREPLACE)")) { +		err = -EINVAL; +		goto out; +	} +	err = access(TDIR "/fs1/b", F_OK); +	if (!ASSERT_OK(err, "access(" TDIR "/fs1/b)")) +		goto out; +  out:  	umount(TDIR "/fs1");  	umount(TDIR "/fs2");  | 
