Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/checkpoint-restore/criu.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavel Tikhomirov <ptikhomirov@virtuozzo.com>2022-05-20 12:11:49 +0300
committerAndrei Vagin <avagin@gmail.com>2022-06-13 09:11:04 +0300
commit58a2d982db258afe7d727a0477b4416753808a6c (patch)
tree79087969c010a4543066fee1700b861e091c3f0e
parent7e376186512b7b83bb5a73d6e9ce75e5dc28c835 (diff)
zdtm: test multiple ext bindmounts with no common root and same master
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
-rw-r--r--test/zdtm/static/Makefile1
-rw-r--r--test/zdtm/static/mnt_ext_multiple.c118
-rw-r--r--test/zdtm/static/mnt_ext_multiple.desc5
3 files changed, 124 insertions, 0 deletions
diff --git a/test/zdtm/static/Makefile b/test/zdtm/static/Makefile
index aafc63f04..5b88dfa1a 100644
--- a/test/zdtm/static/Makefile
+++ b/test/zdtm/static/Makefile
@@ -407,6 +407,7 @@ TST_DIR = \
mntns_pivot_root \
mntns_pivot_root_ro \
mnt_ext_sharing \
+ mnt_ext_multiple \
mount_complex_sharing \
mnt_tracefs \
mntns_deleted \
diff --git a/test/zdtm/static/mnt_ext_multiple.c b/test/zdtm/static/mnt_ext_multiple.c
new file mode 100644
index 000000000..7014927ac
--- /dev/null
+++ b/test/zdtm/static/mnt_ext_multiple.c
@@ -0,0 +1,118 @@
+#include <sched.h>
+#include <sys/mount.h>
+#include <sys/stat.h>
+#include <linux/limits.h>
+
+#include "zdtmtst.h"
+
+const char *test_doc = "Check multiple non-common root external mounts with same external master";
+const char *test_author = "Pavel Tikhomirov <ptikhomirov@virtuozzo.com>";
+
+char *dirname = "mnt_ext_multiple.test";
+char *source = "zdtm_ext_multiple";
+char *ext_source = "zdtm_ext_multiple.ext";
+TEST_OPTION(dirname, string, "directory name", 1);
+
+int main(int argc, char **argv)
+{
+ char *root, testdir[PATH_MAX];
+ char dst_a[PATH_MAX], dst_b[PATH_MAX];
+ char src[PATH_MAX], src_a[PATH_MAX], src_b[PATH_MAX];
+ char nsdst_a[PATH_MAX], nsdst_b[PATH_MAX];
+ char *tmp = "/tmp/zdtm_ext_multiple.tmp";
+ char *zdtm_newns = getenv("ZDTM_NEWNS");
+
+ root = getenv("ZDTM_ROOT");
+ if (root == NULL) {
+ pr_perror("root");
+ return 1;
+ }
+
+ if (!zdtm_newns) {
+ pr_perror("ZDTM_NEWNS is not set");
+ return 1;
+ } else if (strcmp(zdtm_newns, "1")) {
+ goto test;
+ }
+
+ /* Prepare directories in test root */
+ sprintf(testdir, "%s/%s", root, dirname);
+ mkdir(testdir, 0755);
+ sprintf(dst_a, "%s/%s/dst_a", root, dirname);
+ mkdir(dst_a, 0755);
+ sprintf(dst_b, "%s/%s/dst_b", root, dirname);
+ mkdir(dst_b, 0755);
+
+ /* Prepare directories in criu root */
+ mkdir(tmp, 0755);
+ if (mount(source, tmp, "tmpfs", 0, NULL)) {
+ pr_perror("mount tmpfs");
+ return 1;
+ }
+ if (mount(NULL, tmp, NULL, MS_PRIVATE, NULL)) {
+ pr_perror("make private");
+ return 1;
+ }
+ sprintf(src, "%s/src", tmp);
+ mkdir(src, 0755);
+
+ /* Create a shared mount in criu mntns */
+ if (mount(ext_source, src, "tmpfs", 0, NULL)) {
+ pr_perror("mount tmpfs");
+ return 1;
+ }
+ if (mount(NULL, src, NULL, MS_PRIVATE, NULL)) {
+ pr_perror("make private");
+ return 1;
+ }
+ if (mount(NULL, src, NULL, MS_SHARED, NULL)) {
+ pr_perror("make shared");
+ return 1;
+ }
+
+ /*
+ * Create temporary mntns, next mounts will not show up in criu mntns
+ */
+ if (unshare(CLONE_NEWNS)) {
+ pr_perror("unshare");
+ return 1;
+ }
+
+ /*
+ * Populate to the tests root subdirectories of the src mount
+ */
+ sprintf(src_a, "%s/src/a", tmp);
+ mkdir(src_a, 0755);
+ if (mount(src_a, dst_a, NULL, MS_BIND, NULL)) {
+ pr_perror("bind");
+ return 1;
+ }
+ sprintf(src_b, "%s/src/b", tmp);
+ mkdir(src_b, 0755);
+ if (mount(src_b, dst_b, NULL, MS_BIND, NULL)) {
+ pr_perror("bind");
+ return 1;
+ }
+
+test:
+ test_init(argc, argv);
+
+ /* Make "external" mounts to have external master */
+ sprintf(nsdst_a, "/%s/dst_a", dirname);
+ if (mount(NULL, nsdst_a, NULL, MS_SLAVE, NULL)) {
+ pr_perror("make slave");
+ return 1;
+ }
+ sprintf(nsdst_b, "/%s/dst_b", dirname);
+ if (mount(NULL, nsdst_b, NULL, MS_SLAVE, NULL)) {
+ pr_perror("make slave");
+ return 1;
+ }
+
+ test_daemon();
+ test_waitsig();
+
+ pass();
+
+ return 0;
+}
diff --git a/test/zdtm/static/mnt_ext_multiple.desc b/test/zdtm/static/mnt_ext_multiple.desc
new file mode 100644
index 000000000..fd413ed15
--- /dev/null
+++ b/test/zdtm/static/mnt_ext_multiple.desc
@@ -0,0 +1,5 @@
+{ 'dopts': '--external mnt[/mnt_ext_multiple.test/dst_a]:MNT_A --external mnt[/mnt_ext_multiple.test/dst_b]:MNT_B',
+ 'feature': 'mnt_id move_mount_set_group',
+ 'flavor': 'ns uns',
+ 'flags': 'suid',
+ 'ropts': '--external mnt[MNT_A]:/tmp/zdtm_ext_multiple.tmp/src/a --external mnt[MNT_B]:/tmp/zdtm_ext_multiple.tmp/src/b --no-mntns-compat-mode'}