summaryrefslogtreecommitdiff
path: root/tools/testing/selftests
diff options
context:
space:
mode:
authorMark Brown <broonie@kernel.org>2026-11-13 13:03:45 +0000
committerMark Brown <broonie@kernel.org>2026-11-13 13:03:45 +0000
commit48d7d1c219806ad354744647c33ce35a7cc15bf4 (patch)
tree86d53cac4a54c2f9f0bc6c643f0e608826f5069c /tools/testing/selftests
parente896801285ee3cc166792c6e79a3af1ef5be522c (diff)
parent748739f3171ed1c44a30a98b0e0341b1a8d62d31 (diff)
downloadlinux-next-fs-current.tar.gz
linux-next-fs-current.zip
Merge branch 'ovl-fixes' of https://git.kernel.org/pub/scm/linux/kernel/git/overlayfs/vfs.gitfs-current
Diffstat (limited to 'tools/testing/selftests')
-rw-r--r--tools/testing/selftests/filesystems/overlayfs/idmapped_mounts.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/tools/testing/selftests/filesystems/overlayfs/idmapped_mounts.c b/tools/testing/selftests/filesystems/overlayfs/idmapped_mounts.c
index 44a75839f4ed..5df42cf3e688 100644
--- a/tools/testing/selftests/filesystems/overlayfs/idmapped_mounts.c
+++ b/tools/testing/selftests/filesystems/overlayfs/idmapped_mounts.c
@@ -498,4 +498,49 @@ TEST_F(idmapped_overlay, nfs_export_handles)
EXPECT_EQ(close(ovl), 0);
}
+/* With index=on, same-superblock lower layers must not use different idmaps. */
+TEST_F(idmapped_overlay, reject_same_sb_mixed_idmaps)
+{
+ char lower1[PATH_MAX], lower2[PATH_MAX];
+ char upper[PATH_MAX], work[PATH_MAX];
+ int fd_lower1, fd_lower2, fsfd;
+
+ if (!ovl_supported())
+ SKIP(return, "overlayfs not supported");
+
+ snprintf(lower1, sizeof(lower1), "%s/l", self->base);
+ snprintf(lower2, sizeof(lower2), "%s/l2", self->base);
+ snprintf(upper, sizeof(upper), "%s/u", self->base);
+ snprintf(work, sizeof(work), "%s/w", self->base);
+ ASSERT_EQ(mkdir(lower2, 0755), 0);
+ ASSERT_EQ(chown(lower2, ID_HOST, ID_HOST), 0);
+
+ fd_lower1 = idmapped_layer_fd(lower1, ID_HOST, ID_NS, ID_RANGE);
+ ASSERT_GE(fd_lower1, 0);
+ fd_lower2 = sys_open_tree(AT_FDCWD, lower2,
+ OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC);
+ ASSERT_GE(fd_lower2, 0);
+ fsfd = sys_fsopen("overlay", 0);
+ ASSERT_GE(fsfd, 0);
+ ASSERT_EQ(sys_fsconfig(fsfd, FSCONFIG_SET_STRING,
+ "source", "test", 0), 0);
+ ASSERT_EQ(sys_fsconfig(fsfd, FSCONFIG_SET_STRING,
+ "upperdir", upper, 0), 0);
+ ASSERT_EQ(sys_fsconfig(fsfd, FSCONFIG_SET_STRING,
+ "workdir", work, 0), 0);
+ ASSERT_EQ(sys_fsconfig(fsfd, FSCONFIG_SET_STRING,
+ "index", "on", 0), 0);
+ ASSERT_EQ(sys_fsconfig(fsfd, FSCONFIG_SET_FD,
+ "lowerdir+", NULL, fd_lower1), 0);
+ ASSERT_EQ(sys_fsconfig(fsfd, FSCONFIG_SET_FD,
+ "lowerdir+", NULL, fd_lower2), 0);
+
+ errno = 0;
+ EXPECT_EQ(sys_fsconfig(fsfd, FSCONFIG_CMD_CREATE, NULL, NULL, 0), -1);
+ EXPECT_EQ(errno, EINVAL);
+ EXPECT_EQ(close(fd_lower1), 0);
+ EXPECT_EQ(close(fd_lower2), 0);
+ EXPECT_EQ(close(fsfd), 0);
+}
+
TEST_HARNESS_MAIN