aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2022-03-31 13:19:20 +0200
committerZorro Lang <zlang@kernel.org>2022-04-27 02:42:54 +0800
commit95c10ab90c2865d0283421e542feec14d46fc597 (patch)
tree53633704a7c13c4d53cfc94131bc0646650cdece
parent858a19c5e9b08a6b8dde818e4452e329664af1fb (diff)
downloadxfstests-dev-95c10ab90c2865d0283421e542feec14d46fc597.tar.gz
generic/633: Avoid failure without CONFIG_USER_NS
Some tests in idmapped_mounts fail without CONFIG_USER_NS because they have implicit dependence on user namespaces and these tests are run despite idmapped mount support not being detected. Detect whether at least user namespaces are supported and skip tests needing them when they are not. Signed-off-by: Jan Kara <jack@suse.cz> Tested-by: Christian Brauner (Microsoft) <brauner@kernel.org> Reviewed-by: Christian Brauner (Microsoft) <brauner@kernel.org> Signed-off-by: Zorro Lang <zlang@kernel.org>
-rw-r--r--src/idmapped-mounts/idmapped-mounts.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/src/idmapped-mounts/idmapped-mounts.c b/src/idmapped-mounts/idmapped-mounts.c
index d3b27da6c0..93c4451034 100644
--- a/src/idmapped-mounts/idmapped-mounts.c
+++ b/src/idmapped-mounts/idmapped-mounts.c
@@ -127,6 +127,8 @@ char t_buf[PATH_MAX];
/* whether the underlying filesystem supports idmapped mounts */
bool t_fs_allow_idmap;
+/* whether the system supports user namespaces */
+bool t_has_userns;
static void stash_overflowuid(void)
{
@@ -13831,6 +13833,7 @@ static const struct option longopts[] = {
/* Flags for which functionality is required by the test */
#define T_REQUIRE_IDMAPPED_MOUNTS (1U << 0)
+#define T_REQUIRE_USERNS (1U << 1)
struct t_idmapped_mounts {
int (*test)(void);
@@ -13841,7 +13844,7 @@ struct t_idmapped_mounts {
{ create_in_userns, T_REQUIRE_IDMAPPED_MOUNTS, "create operations in user namespace", },
{ device_node_in_userns, T_REQUIRE_IDMAPPED_MOUNTS, "device node in user namespace", },
{ expected_uid_gid_idmapped_mounts, T_REQUIRE_IDMAPPED_MOUNTS, "expected ownership on idmapped mounts", },
- { fscaps, 0, "fscaps on regular mounts", },
+ { fscaps, T_REQUIRE_USERNS, "fscaps on regular mounts", },
{ fscaps_idmapped_mounts, T_REQUIRE_IDMAPPED_MOUNTS, "fscaps on idmapped mounts", },
{ fscaps_idmapped_mounts_in_userns, T_REQUIRE_IDMAPPED_MOUNTS, "fscaps on idmapped mounts in user namespace", },
{ fscaps_idmapped_mounts_in_userns_separate_userns, T_REQUIRE_IDMAPPED_MOUNTS, "fscaps on idmapped mounts in user namespace with different id mappings", },
@@ -13853,7 +13856,7 @@ struct t_idmapped_mounts {
{ hardlink_from_idmapped_mount_in_userns, T_REQUIRE_IDMAPPED_MOUNTS, "hardlinks from idmapped mounts in user namespace", },
#ifdef HAVE_LIBURING_H
{ io_uring, 0, "io_uring", },
- { io_uring_userns, 0, "io_uring in user namespace", },
+ { io_uring_userns, T_REQUIRE_USERNS, "io_uring in user namespace", },
{ io_uring_idmapped, T_REQUIRE_IDMAPPED_MOUNTS, "io_uring from idmapped mounts", },
{ io_uring_idmapped_userns, T_REQUIRE_IDMAPPED_MOUNTS, "io_uring from idmapped mounts in user namespace", },
{ io_uring_idmapped_unmapped, T_REQUIRE_IDMAPPED_MOUNTS, "io_uring from idmapped mounts with unmapped ids", },
@@ -13939,8 +13942,9 @@ static bool run_test(struct t_idmapped_mounts suite[], size_t suite_size)
* If the underlying filesystems does not support idmapped
* mounts only run vfs generic tests.
*/
- if (t->support_flags & T_REQUIRE_IDMAPPED_MOUNTS &&
- !t_fs_allow_idmap) {
+ if ((t->support_flags & T_REQUIRE_IDMAPPED_MOUNTS &&
+ !t_fs_allow_idmap) ||
+ (t->support_flags & T_REQUIRE_USERNS && !t_has_userns)) {
log_debug("Skipping test %s", t->description);
continue;
}
@@ -13998,6 +14002,16 @@ static bool fs_allow_idmap(void)
return ret == 0;
}
+static bool sys_has_userns(void)
+{
+ int fd = get_userns_fd(0, 1000, 1);
+
+ if (fd < 0)
+ return false;
+ close(fd);
+ return true;
+}
+
int main(int argc, char *argv[])
{
int fret, ret;
@@ -14084,6 +14098,7 @@ int main(int argc, char *argv[])
exit(EXIT_SUCCESS);
}
+ t_has_userns = sys_has_userns();
stash_overflowuid();
stash_overflowgid();