[1/3] test: static,file_locks01 -- Use fdinfo output

Submitted by Cyrill Gorcunov on Aug. 3, 2017, 6:28 p.m.

Details

Message ID 1501784920-18039-2-git-send-email-gorcunov@openvz.org
State New
Series "test: static, file_locks01-03 -- Use fdinfo output"
Headers show

Commit Message

Cyrill Gorcunov Aug. 3, 2017, 6:28 p.m.
Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
---
 test/zdtm/static/file_locks01.c | 118 ++++++++++++++++++++--------------------
 1 file changed, 59 insertions(+), 59 deletions(-)

Patch hide | download patch | download mbox

diff --git a/test/zdtm/static/file_locks01.c b/test/zdtm/static/file_locks01.c
index aadc5e422222..bcfaa41d2e5b 100644
--- a/test/zdtm/static/file_locks01.c
+++ b/test/zdtm/static/file_locks01.c
@@ -19,7 +19,7 @@  TEST_OPTION(filename, string, "file name", 1);
 char file0[PATH_MAX];
 char file1[PATH_MAX];
 char file2[PATH_MAX];
-unsigned int inodes[3];
+unsigned long inodes[3];
 static mnt_info_t *m;
 dev_t dev;
 
@@ -64,91 +64,80 @@  static int open_all_files(int *fd_0, int *fd_1, int *fd_2)
 		pr_perror("Unable to open file %s", file1);
 		return -1;
 	}
-
 	fstat(*fd_2, &buf);
 	inodes[2] = buf.st_ino;
 
 	return 0;
 }
 
-static int check_file_locks()
+static int check_file_lock(int fd, char *expected_type,
+			   char *expected_option,
+			   unsigned int expected_dev,
+			   unsigned long expected_ino)
 {
-	FILE		*fp_locks = NULL;
-	char		buf[100];
-
-	long long	fl_id = 0;
-	char		fl_flag[10], fl_type[15], fl_option[10];
-	pid_t		fl_owner;
-	int		maj, min;
-	unsigned long	i_no;
-	long long	start;
-	char		end[32];
-
-	int		num;
-	int		count = 3;
-
-	fp_locks = fopen("/proc/locks", "r");
-	if (!fp_locks)
+	char buf[100], fl_flag[16], fl_type[16], fl_option[16];
+	int found = 0, num, fl_owner;
+	FILE *fp_locks = NULL;
+	char path[PATH_MAX];
+	unsigned long i_no;
+	int maj, min;
+
+	test_msg("check_file_lock: (fsname %s) expecting fd %d type %s option %s dev %u ino %lu\n",
+		 m->fsname, fd, expected_type, expected_option, expected_dev, expected_ino);
+
+	snprintf(path, sizeof(path), "/proc/self/fdinfo/%d", fd);
+	fp_locks = fopen(path, "r");
+	if (!fp_locks) {
+		pr_err("Can't open %s\n", path);
 		return -1;
-
-	test_msg("C: %d/%d/%d\n", inodes[0], inodes[1], inodes[2]);
+	}
 
 	while (fgets(buf, sizeof(buf), fp_locks)) {
-		test_msg("c: %s", buf);
-
-		if (strstr(buf, "->"))
+		if (strncmp(buf, "lock:\t", 6) != 0)
 			continue;
+		test_msg("c: %s", buf);
 
-		num = sscanf(buf,
-			"%lld:%s %s %s %d %x:%x:%ld %lld %s",
-			&fl_id, fl_flag, fl_type, fl_option,
-			&fl_owner, &maj, &min, &i_no, &start, end);
+		memset(fl_flag, 0, sizeof(fl_flag));
+		memset(fl_type, 0, sizeof(fl_type));
+		memset(fl_option, 0, sizeof(fl_option));
 
-		if (num < 10) {
+		num = sscanf(buf, "%*s %*d:%s %s %s %d %02x:%02x:%ld %*d %*s",
+			     fl_flag, fl_type, fl_option, &fl_owner,
+			     &maj, &min, &i_no);
+		if (num < 7) {
 			pr_perror("Invalid lock info.");
 			break;
 		}
 
-		if (i_no != inodes[0] && i_no != inodes[1] && i_no != inodes[2])
-			continue;
-
 		if (!strcmp(m->fsname, "btrfs")) {
-			if (MKKDEV(major(maj), minor(min)) != dev)
+			if (MKKDEV(major(maj), minor(min)) != expected_dev)
 				continue;
 		} else {
-			if (makedev(maj, min) != dev)
+			if (makedev(maj, min) != expected_dev)
 				continue;
 		}
 
-		if (!strcmp(fl_flag, "FLOCK") && !strcmp(fl_type, "ADVISORY")) {
-			if (!strcmp(fl_option, "READ"))
-				count--;
-			else if (!strcmp(fl_option, "WRITE"))
-				count--;
-		}
-
-		if (!strcmp(fl_flag, "FLOCK") &&
-		    !strcmp(fl_type, "MSNFS") &&
-		    !strcmp(fl_option, "READ"))
-			count--;
-
-		memset(fl_flag, 0, sizeof(fl_flag));
-		memset(fl_type, 0, sizeof(fl_type));
-		memset(fl_option, 0, sizeof(fl_option));
+		if (fl_owner != getpid())
+			continue;
+		if (i_no != expected_ino)
+			continue;
+		if (strcmp(fl_flag, "FLOCK"))
+			continue;
+		if (strcmp(fl_type, expected_type))
+			continue;
+		if (strcmp(fl_option, expected_option))
+			continue;
+		found++;
 	}
 
 	fclose(fp_locks);
 
-	/*
-	 * If we find all three matched file locks, count would be 0,
-	 * return 0 for success.
-	 */
-	return count;
+	return found == 1 ? 0 : -1;
 }
 
 int main(int argc, char **argv)
 {
-	int fd_0, fd_1, fd_2;
+	int fd_0, fd_1, fd_2, ret = 0;
 
 	test_init(argc, argv);
 
@@ -170,9 +159,20 @@  int main(int argc, char **argv)
 	test_daemon();
 	test_waitsig();
 
-	if (check_file_locks())
-		fail("Flock file locks check failed");
-	else
+	if (check_file_lock(fd_0, "ADVISORY", "READ", dev, inodes[0])) {
+		fail("Failed on fd %d", fd_0);
+		ret |= 1;
+	}
+	if (check_file_lock(fd_1, "ADVISORY", "WRITE", dev, inodes[1])) {
+		fail("Failed on fd %d", fd_1);
+		ret |= 1;
+	}
+	if (check_file_lock(fd_2, "MSNFS", "READ", dev, inodes[2])) {
+		fail("Failed on fd %d", fd_2);
+		ret |= 1;
+	}
+
+	if (!ret)
 		pass();
 
 	close(fd_0);
@@ -182,5 +182,5 @@  int main(int argc, char **argv)
 	unlink(file1);
 	unlink(file2);
 
-	return 0;
+	return ret;
 }