From dfeccaddf727b9e054dbf578780697b75ae8440d Mon Sep 17 00:00:00 2001 From: Andrey Vagin Date: Fri, 19 Dec 2014 16:37:00 +0300 Subject: [PATCH] zdtm: add a test to check non-root shared bind-mounts Signed-off-by: Andrey Vagin Signed-off-by: Pavel Emelyanov --- test/zdtm.sh | 4 + test/zdtm/live/static/Makefile | 1 + test/zdtm/live/static/mntns_root_bind.c | 108 ++++++++++++++++++++++++ 3 files changed, 113 insertions(+) create mode 100644 test/zdtm/live/static/mntns_root_bind.c diff --git a/test/zdtm.sh b/test/zdtm.sh index 7f3ef542c..8b8bcb4b4 100755 --- a/test/zdtm.sh +++ b/test/zdtm.sh @@ -183,6 +183,7 @@ static/cgroup01 static/cgroup02 ns/static/clean_mntns static/remap_dead_pid +ns/static/mntns_root_bind " TEST_CR_KERNEL=" @@ -198,6 +199,7 @@ ns/static/mntns_link_remap ns/static/mntns_link_ghost ns/static/mntns_shared_bind ns/static/mntns_shared_bind02 +ns/static/mntns_root_bind " else export ZDTM_NOSUBNS=1 @@ -247,6 +249,7 @@ ns/static/console ns/static/rtc ns/static/mntns_shared_bind ns/static/mntns_shared_bind02 +ns/static/mntns_root_bind " source $(readlink -f `dirname $0`/env.sh) || exit 1 @@ -306,6 +309,7 @@ mntns_link_remap mntns_link_ghost mntns_shared_bind mntns_shared_bind02 +mntns_root_bind sockets00 " diff --git a/test/zdtm/live/static/Makefile b/test/zdtm/live/static/Makefile index e2431f5ce..2e918e53a 100644 --- a/test/zdtm/live/static/Makefile +++ b/test/zdtm/live/static/Makefile @@ -179,6 +179,7 @@ TST_DIR = \ mntns_link_ghost \ mntns_shared_bind \ mntns_shared_bind02 \ + mntns_root_bind \ TST_DIR_FILE = \ chroot \ diff --git a/test/zdtm/live/static/mntns_root_bind.c b/test/zdtm/live/static/mntns_root_bind.c new file mode 100644 index 000000000..682682039 --- /dev/null +++ b/test/zdtm/live/static/mntns_root_bind.c @@ -0,0 +1,108 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "zdtmtst.h" + +#ifndef CLONE_NEWNS +#define CLONE_NEWNS 0x00020000 +#endif + +const char *test_doc = "Check bind-mouns of the root mount"; +const char *test_author = "Andrew Vagin "; + +char *dirname; +TEST_OPTION(dirname, string, "directory name", 1); + + +int main(int argc, char **argv) +{ + char path[PATH_MAX], bpath[PATH_MAX], spath[PATH_MAX], bspath[PATH_MAX]; + pid_t pid; + int status; + task_waiter_t t; + + test_init(argc, argv); + + task_waiter_init(&t); + + mount(NULL, "/", NULL, MS_SHARED, NULL); + + snprintf(path, sizeof(path), "%s/test", dirname); + snprintf(bpath, sizeof(bpath), "%s/test.bind", dirname); + snprintf(spath, sizeof(spath), "%s/test/sub", dirname); + snprintf(bspath, sizeof(bspath), "%s/test.bind/sub", dirname); + + if (mkdir(dirname, 0700) || + mkdir(path, 0700) || + mkdir(spath, 0700) || + mkdir(bpath, 0700)) { + err("mkdir"); + return 1; + } + + pid = fork(); + if (pid < 0) { + err("fork"); + return 1; + } + if (pid == 0) { + unshare(CLONE_NEWNS); + if (mount(path, bpath, NULL, MS_BIND, NULL)) { + err("mount"); + return 1; + } + + task_waiter_complete(&t, 1); + task_waiter_wait4(&t, 2); + + if (access(bspath, F_OK)) { + fail("%s isn't accessiable", bspath); + return 1; + } + + + if (umount2(bpath, MNT_DETACH)) { + fail("umount"); + return 1; + } + + return 0; + } + + task_waiter_wait4(&t, 1); + + if (mount("test", spath, "tmpfs", 0, NULL)) { + err("mount"); + return 1; + } + + test_daemon(); + test_waitsig(); + + task_waiter_complete(&t, 2); + + if (waitpid(pid, &status, 0) != pid) { + err("waitpid %d", pid); + return 1; + } + + if (status) { + err("%d/%d/%d/%d", WIFEXITED(status), WEXITSTATUS(status), WIFSIGNALED(status), WTERMSIG(status)); + return 1; + } + + pass(); + + return 0; +}