Commit d44276c1 authored by Andrew Vagin's avatar Andrew Vagin Committed by Pavel Emelyanov

zdtm: check mounts of external devices

Signed-off-by: 's avatarAndrew Vagin <avagin@virtuozzo.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent 022e3b9b
......@@ -11,7 +11,7 @@ all:
$(MAKE) zdtm-freezer
.PHONY: all
TESTS = unix-callback mem-snap rpc libcriu mounts/ext security pipes crit socketpairs overlayfs
TESTS = unix-callback mem-snap rpc libcriu mounts/ext security pipes crit socketpairs overlayfs mnt-ext-dev
other:
for t in $(TESTS); do \
......
#!/bin/sh
set -e -x
# construct root
python ../../zdtm.py run -t zdtm/static/env00 --iter 0 -f ns
truncate -s 0 zdtm.loop
truncate -s 50M zdtm.loop
mkfs.ext4 zdtm.loop
dev=`losetup --find --show zdtm.loop`
mkdir -p ../../dev
cp -ap $dev ../../dev
export ZDTM_MNT_EXT_DEV=$dev
python ../../zdtm.py run -t zdtm/static/mnt_ext_dev || ret=$?
losetup -d $dev
unlink zdtm.loop
exit $ret
......@@ -413,10 +413,10 @@ class zdtm_test:
return opts
def getdopts(self):
return self.__getcropts() + self.__freezer.getdopts()
return self.__getcropts() + self.__freezer.getdopts() + self.__desc.get('dopts', '').split()
def getropts(self):
return self.__getcropts() + self.__freezer.getropts()
return self.__getcropts() + self.__freezer.getropts() + self.__desc.get('ropts', '').split()
def gone(self, force = True):
if not self.auto_reap:
......
......@@ -230,6 +230,7 @@ TST_DIR = \
mntns_shared_vs_private \
mnt_ext_auto \
mnt_ext_master \
mnt_ext_dev \
mntns_deleted \
unlink_regular00 \
......
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mount.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <linux/limits.h>
#include "zdtmtst.h"
const char *test_doc = "Check mounts of external devices";
const char *test_author = "Andrei Vagin <avagin@virtuozzo.com";
char *dirname;
TEST_OPTION(dirname, string, "directory name", 1);
int main(int argc, char **argv)
{
char *loop, fd, dfd, fd2;
test_init(argc, argv);
struct stat st, stp, st2;
char dname[PATH_MAX], dname2[PATH_MAX];
snprintf(dname, sizeof(dname), "%s/test_dir", dirname);
snprintf(dname2, sizeof(dname2), "%s/test_dir2", dirname);
mkdir(dirname, 0777);
loop = getenv("ZDTM_MNT_EXT_DEV");
if (loop == NULL)
return 1;
if (mount(loop, dirname, "ext4", 0, NULL) == -1) {
pr_perror("mount");
return -1;
}
dfd = open(dirname, O_RDONLY);
if (dfd < 0) {
pr_perror("open");
return -1;
}
fd = openat(dfd, "test_file", O_RDWR | O_CREAT, 0666);
if (fd < 0) {
pr_perror("open");
return -1;
}
if (fstat(fd, &st) < 0) {
pr_perror("stat");
return 1;
}
mkdir(dname, 0777);
mkdir(dname2, 0777);
if (mount(dname, dname2, NULL, MS_BIND, NULL)) {
pr_perror("mount");
return 1;
}
fd2 = openat(dfd, "test_dir2/test_file2", O_RDWR | O_CREAT, 0666);
if (fd2 < 0) {
pr_perror("open");
return -1;
}
if (fstat(fd2, &st2) < 0) {
pr_perror("stat");
return 1;
}
test_daemon();
test_waitsig();
if (fstat(fd, &stp) < 0) {
pr_perror("stat");
return 1;
}
if (st.st_ino != stp.st_ino) {
fail("file1");
return 1;
}
if (fstat(fd2, &stp) < 0) {
pr_perror("stat");
return 1;
}
if (st2.st_ino != stp.st_ino) {
fail("file2");
return 1;
}
if (umount2(dname2, MNT_DETACH)) {
pr_perror("umount");
return 1;
}
pass();
return 0;
}
os.getenv("ZDTM_MNT_EXT_DEV") and \
( lambda dev, rdev:
{'flavor': 'ns', 'feature': 'mnt_id', "flags": "suid",
"dopts": "--external dev[%d/%d]:loop" % (os.major(rdev), os.minor(rdev)),
"ropts": "--external dev[loop]:%s" % dev,
} ) (os.getenv("ZDTM_MNT_EXT_DEV"), os.stat(os.getenv("ZDTM_MNT_EXT_DEV")).st_rdev) or {'flags': 'noauto'}
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