[CRIU] [PATCH 2/2] test: add mandatory-lock test

Dmitry Safonov dsafonov at virtuozzo.com
Tue Jul 12 07:51:30 PDT 2016


Cc: Andrey Vagin <avagin at openvz.org>
Signed-off-by: Dmitry Safonov <dsafonov at virtuozzo.com>
---
 test/zdtm/.gitignore               |   1 +
 test/zdtm/static/Makefile          |   3 +-
 test/zdtm/static/file_locks06.c    | 110 +++++++++++++++++++++++++++++++++++++
 test/zdtm/static/file_locks06.desc |   1 +
 test/zdtm/static/file_locks06.opts |   1 +
 5 files changed, 115 insertions(+), 1 deletion(-)
 create mode 100644 test/zdtm/static/file_locks06.c
 create mode 100644 test/zdtm/static/file_locks06.desc
 create mode 100644 test/zdtm/static/file_locks06.opts

diff --git a/test/zdtm/.gitignore b/test/zdtm/.gitignore
index 85e39a2099e5..cd3dfb24069b 100644
--- a/test/zdtm/.gitignore
+++ b/test/zdtm/.gitignore
@@ -227,6 +227,7 @@
 /static/file_locks03
 /static/file_locks04
 /static/file_locks05
+/static/file_locks06
 /static/mlock_setuid
 /static/mntns_root_bind
 /static/mntns_root_bind02
diff --git a/test/zdtm/static/Makefile b/test/zdtm/static/Makefile
index 407a80f56400..842329634469 100644
--- a/test/zdtm/static/Makefile
+++ b/test/zdtm/static/Makefile
@@ -224,7 +224,8 @@ TST_DIR		=				\
 		cgroup02			\
 		cgroup03			\
 		cgroup04			\
-		cgroup_stray		\
+		cgroup_stray			\
+		file_locks06			\
 		unlink_fstat04			\
 		mntns_open			\
 		mntns_link_remap		\
diff --git a/test/zdtm/static/file_locks06.c b/test/zdtm/static/file_locks06.c
new file mode 100644
index 000000000000..054f816e2b0d
--- /dev/null
+++ b/test/zdtm/static/file_locks06.c
@@ -0,0 +1,110 @@
+#include <fcntl.h>
+#include <errno.h>
+
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/mount.h>
+#include <sys/wait.h>
+
+#include "zdtmtst.h"
+
+const char *test_doc	= "Mandatory locking mounting with exclusive locks";
+const char *test_author	= "Dmitry Safonov <dsafonov at virtuozzo.com>";
+
+char *dirname;
+TEST_OPTION(dirname, string, "tmpfs mountpoint directory", 1);
+const char *test_file	= "test";
+
+int main(int argc, char **argv)
+{
+	pid_t pid;
+	int fd, status, ret;
+
+	test_init(argc, argv);
+
+	if (mkdir(dirname, 0755) == -1 && errno != EEXIST) {
+		pr_perror("mkdir %s failed", dirname);
+		return 1;
+	}
+
+	if (mount("zdtm", dirname, "tmpfs", MS_MANDLOCK, 0)) {
+		pr_perror("can't mount tmpfs with mandatory locking at %s",
+				dirname);
+		ret = 1;
+		goto out_rmdir;
+	}
+
+	chdir(dirname);
+	fd = open(test_file, O_CREAT | O_RDWR | O_TRUNC, 02600);
+	if (fd < 0) {
+		pr_perror("failed to open test file at %s", dirname);
+		ret = 1;
+		goto out_umount;
+	}
+
+	if (lockf(fd, F_LOCK, 0) == -1) {
+		pr_perror("lockf %s/%s failed", dirname, test_file);
+		ret = 1;
+		goto out_close;
+	}
+
+	if (write(fd, test_file, strlen(test_file)) != strlen(test_file)) {
+		pr_perror("failed to write to test file %s/%s",
+				dirname, test_file);
+		ret = 1;
+		goto out_close;
+	}
+
+	test_daemon();
+	test_waitsig();
+
+	pid = fork();
+	if (pid < 0) {
+		pr_perror("failed to fork");
+		ret = 1;
+		goto out_close;
+	}
+
+	if (pid == 0) {
+		errno = 0;
+		if (lockf(fd, F_TLOCK, 0) == -1) {
+			if (errno == EWOULDBLOCK || errno == EAGAIN)
+				return 0;
+
+			pr_perror("failed to open %s/%s", dirname, test_file);
+			return 1;
+		}
+
+		fail("locked %s/%s, which is under exclusive lock\n",
+				fd, dirname, test_file);
+		close(fd);
+		return 1;
+	}
+
+	status = -1;
+	if (waitpid(pid, &status, 0) != pid) {
+		pr_perror("waitpid(%d) failed", pid);
+		ret = 1;
+		goto out_close;
+	}
+	if (!WEXITSTATUS(status)) {
+		pass();
+	} else {
+		pr_perror("child returned non-zero code: 0x%x\n",
+				WEXITSTATUS(status));
+		ret = 1;
+	}
+
+out_close:
+	if (close(fd))
+		pr_perror("close on %d failed", fd);
+out_umount:
+	chdir("..");
+	if (umount(dirname))
+		pr_perror("umount on %s failed", dirname);
+out_rmdir:
+	if (rmdir(dirname))
+		pr_perror("rmdir on %s failed", dirname);
+
+	return ret;
+}
diff --git a/test/zdtm/static/file_locks06.desc b/test/zdtm/static/file_locks06.desc
new file mode 100644
index 000000000000..00e9ab1cfc4a
--- /dev/null
+++ b/test/zdtm/static/file_locks06.desc
@@ -0,0 +1 @@
+{'flags': 'suid', 'opts': '--file-locks'}
diff --git a/test/zdtm/static/file_locks06.opts b/test/zdtm/static/file_locks06.opts
new file mode 100644
index 000000000000..738083ade329
--- /dev/null
+++ b/test/zdtm/static/file_locks06.opts
@@ -0,0 +1 @@
+--file-locks
-- 
2.9.0



More information about the CRIU mailing list