[5/5] zdtm: test dumping file on overmounted mount fails

Submitted by Pavel Tikhomirov on Sept. 27, 2018, 9:17 a.m.

Details

Message ID 20180927091736.10727-6-ptikhomirov@virtuozzo.com
State New
Series "support restoring ghost files on readonly mounts"
Headers show

Commit Message

Pavel Tikhomirov Sept. 27, 2018, 9:17 a.m.
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
---
 test/zdtm/static/Makefile              |   1 +
 test/zdtm/static/overmounted_file.c    | 109 +++++++++++++++++++++++++
 test/zdtm/static/overmounted_file.desc |   1 +
 3 files changed, 111 insertions(+)
 create mode 100644 test/zdtm/static/overmounted_file.c
 create mode 100644 test/zdtm/static/overmounted_file.desc

Patch hide | download patch | download mbox

diff --git a/test/zdtm/static/Makefile b/test/zdtm/static/Makefile
index 12544d91c..e227d3250 100644
--- a/test/zdtm/static/Makefile
+++ b/test/zdtm/static/Makefile
@@ -342,6 +342,7 @@  TST_DIR		=				\
 		non_uniform_share_propagation	\
 		private_bind_propagation	\
 		ghost_on_rofs			\
+		overmounted_file		\
 
 TST_DIR_FILE	=				\
 		chroot				\
diff --git a/test/zdtm/static/overmounted_file.c b/test/zdtm/static/overmounted_file.c
new file mode 100644
index 000000000..ee1d1c58f
--- /dev/null
+++ b/test/zdtm/static/overmounted_file.c
@@ -0,0 +1,109 @@ 
+#include <sys/mount.h>
+#include <sys/stat.h>
+#include <limits.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "zdtmtst.h"
+
+const char *test_doc	= "Check open file on overmounted mounts doesn't dump";
+const char *test_author	= "Pavel Tikhomirov <ptikhomirov@virtuozzo.com>";
+
+#define DATA "Data"
+
+char *dirname;
+TEST_OPTION(dirname, string, "directory name", 1);
+
+int main(int argc, char **argv)
+{
+	char overmounted[PATH_MAX];
+	char buf[sizeof(DATA)];
+	char file[PATH_MAX];
+	int fd;
+
+	test_init(argc, argv);
+
+	if (mkdir(dirname, 0700)) {
+		pr_perror("mkdir");
+		return 1;
+	}
+
+	if (mount("zdtm_fs", dirname, "tmpfs", 0, NULL)) {
+		pr_perror("mount");
+		return 1;
+	}
+
+	if (mount(NULL, dirname, NULL, MS_PRIVATE, NULL)) {
+		pr_perror("mount");
+		return 1;
+	}
+
+	ssprintf(overmounted, "%s/overmounted", dirname);
+	if (mkdir(overmounted, 0700)) {
+		pr_perror("mkdir");
+		return 1;
+	}
+
+	if (mount("overmounted", overmounted, "tmpfs", 0, NULL)) {
+		pr_perror("mount");
+		return 1;
+	}
+
+	ssprintf(file, "%s/file", overmounted);
+	fd = open(file, O_CREAT|O_WRONLY, 0600);
+	if (fd < 0) {
+		pr_perror("open");
+		return 1;
+	}
+
+	if (write(fd, DATA, sizeof(DATA)) != sizeof(DATA)) {
+		pr_perror("write");
+		return 1;
+	}
+	close(fd);
+
+	fd = open(file, O_RDONLY);
+	if (fd < 0) {
+		pr_perror("open");
+		return 1;
+	}
+
+	if (mount(overmounted, overmounted, NULL, MS_BIND, NULL)) {
+		pr_perror("mount");
+		return 1;
+	}
+
+	test_daemon();
+	test_waitsig();
+
+	if (read(fd, buf, sizeof(DATA)) != sizeof(DATA)) {
+		fail("Can't read from file");
+		return 1;
+	}
+
+	if (strcmp(buf, DATA)) {
+		fail("Wrong data in a file");
+		return 1;
+	}
+
+	close(fd);
+
+	if (umount(overmounted)) {
+		pr_perror("umount");
+		return 1;
+	}
+
+	if (umount(overmounted)) {
+		pr_perror("umount");
+		return 1;
+	}
+
+	if (umount(dirname)) {
+		pr_perror("umount");
+		return 1;
+	}
+
+	pass();
+
+	return 0;
+}
diff --git a/test/zdtm/static/overmounted_file.desc b/test/zdtm/static/overmounted_file.desc
new file mode 100644
index 000000000..0d8b7f2b4
--- /dev/null
+++ b/test/zdtm/static/overmounted_file.desc
@@ -0,0 +1 @@ 
+{'flavor': 'ns uns', 'flags': 'suid crfail'}