Commit 5a557f2e authored by Andrew Vagin's avatar Andrew Vagin Committed by Pavel Emelyanov

zdtm/mnt_ext_*: don't affect the host mount namespace

Currently all test mounts are mounted in the host mount namespace,
so on restore we get root with some mounts.

Cc: Tycho Andersen <tycho.andersen@canonical.com>
Signed-off-by: 's avatarAndrew Vagin <avagin@virtuozzo.com>
Acked-by: 's avatarTycho Andersen <tycho.andersen@canonical.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent 5e86697c
#define _GNU_SOURCE
#include <sched.h>
#include <sys/mount.h> #include <sys/mount.h>
#include <unistd.h> #include <unistd.h>
#include <sys/stat.h> #include <sys/stat.h>
...@@ -9,8 +11,8 @@ ...@@ -9,8 +11,8 @@
#include "zdtmtst.h" #include "zdtmtst.h"
const char *test_doc = "Run busy loop while migrating"; const char *test_doc = "Check --mnt-ext-map auto";
const char *test_author = "Roman Kagan <rkagan@parallels.com>"; const char *test_author = "Andrew Vagin <avagin@gmail.com>";
char *dirname = "mnt_ext_auto.test"; char *dirname = "mnt_ext_auto.test";
TEST_OPTION(dirname, string, "directory name", 1); TEST_OPTION(dirname, string, "directory name", 1);
...@@ -19,8 +21,7 @@ int main(int argc, char ** argv) ...@@ -19,8 +21,7 @@ int main(int argc, char ** argv)
{ {
char src[PATH_MAX], dst[PATH_MAX], *root; char src[PATH_MAX], dst[PATH_MAX], *root;
char *dname = "/tmp/zdtm_ext_auto.XXXXXX"; char *dname = "/tmp/zdtm_ext_auto.XXXXXX";
int status; struct stat sta, stb;
pid_t pid;
root = getenv("ZDTM_ROOT"); root = getenv("ZDTM_ROOT");
if (root == NULL) { if (root == NULL) {
...@@ -28,42 +29,45 @@ int main(int argc, char ** argv) ...@@ -28,42 +29,45 @@ int main(int argc, char ** argv)
return 1; return 1;
} }
sprintf(dst, "%s/ext_mounts", getenv("ZDTM_ROOT")); sprintf(dst, "%s/%s", get_current_dir_name(), dirname);
if (strcmp(getenv("ZDTM_NEWNS"), "1")) if (strcmp(getenv("ZDTM_NEWNS"), "1"))
goto test; goto test;
pid = fork(); mkdir(dname, 755);
if (pid < 0) sprintf(src, "%s/test", dname);
if (mount("zdtm_auto_ext_mnt", dname, "tmpfs", 0, NULL)) {
pr_perror("mount");
return 1; return 1;
if (pid == 0) {
test_ext_init(argc, argv);
mkdir(dname, 755);
sprintf(src, "%s/test", dname);
if (mount("zdtm_auto_ext_mnt", dname, "tmpfs", 0, NULL)) {
pr_perror("mount");
return 1;
}
mkdir(src, 755);
mkdir(dst, 755);
if (mount(src, dst, NULL, MS_BIND, NULL)) {
pr_perror("bind");
return 1;
}
return 0;
} }
mkdir(src, 755);
wait(&status); unshare(CLONE_NEWNS);
if (status != 0) mkdir(dst, 755);
if (mount(src, dst, NULL, MS_BIND, NULL)) {
pr_perror("bind");
return 1; return 1;
}
test: test:
test_init(argc, argv); test_init(argc, argv);
if (stat(dirname, &stb)) {
pr_perror("stat");
sleep(100);
return 1;
}
test_daemon(); test_daemon();
test_waitsig(); test_waitsig();
if (stat(dirname, &sta)) {
pr_perror("stat");
return 1;
}
if (sta.st_dev != stb.st_dev) {
fail();
return 1;
}
pass(); pass();
......
#define _GNU_SOURCE
#include <sched.h>
#include <sys/mount.h> #include <sys/mount.h>
#include <unistd.h> #include <unistd.h>
#include <sys/stat.h> #include <sys/stat.h>
...@@ -19,8 +22,6 @@ int main(int argc, char ** argv) ...@@ -19,8 +22,6 @@ int main(int argc, char ** argv)
{ {
char src[PATH_MAX], dst[PATH_MAX], *root; char src[PATH_MAX], dst[PATH_MAX], *root;
char *dname = "/tmp/zdtm_ext_auto.XXXXXX"; char *dname = "/tmp/zdtm_ext_auto.XXXXXX";
int status;
pid_t pid;
root = getenv("ZDTM_ROOT"); root = getenv("ZDTM_ROOT");
if (root == NULL) { if (root == NULL) {
...@@ -33,37 +34,27 @@ int main(int argc, char ** argv) ...@@ -33,37 +34,27 @@ int main(int argc, char ** argv)
if (strcmp(getenv("ZDTM_NEWNS"), "1")) if (strcmp(getenv("ZDTM_NEWNS"), "1"))
goto test; goto test;
pid = fork(); mkdir(dname, 755);
if (pid < 0) sprintf(src, "%s/test", dname);
if (mount("zdtm_auto_ext_mnt", dname, "tmpfs", 0, NULL)) {
pr_perror("mount");
return 1; return 1;
if (pid == 0) {
test_ext_init(argc, argv);
mkdir(dname, 755);
sprintf(src, "%s/test", dname);
if (mount("zdtm_auto_ext_mnt", dname, "tmpfs", 0, NULL)) {
pr_perror("mount");
return 1;
}
mkdir(src, 755);
mkdir(dst, 755);
if (mount(src, dst, NULL, MS_BIND, NULL)) {
pr_perror("bind");
return 1;
}
if (mount(src, dst, NULL, MS_SLAVE, NULL)) {
pr_perror("slave");
return 1;
}
return 0;
} }
wait(&status); mkdir(src, 755);
if (status != 0) mkdir(dst, 755);
unshare(CLONE_NEWNS);
if (mount(src, dst, NULL, MS_BIND, NULL)) {
pr_perror("bind");
return 1; return 1;
}
if (mount(src, dst, NULL, MS_SLAVE, NULL)) {
pr_perror("slave");
return 1;
}
test: test:
test_init(argc, argv); test_init(argc, argv);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment