From a088aeb475ad7f3a78e1d4fe68e4de9032c54f22 Mon Sep 17 00:00:00 2001 From: Cyrill Gorcunov Date: Thu, 3 Aug 2017 21:28:40 +0300 Subject: [PATCH] test: static,file_locks03 -- Use fdinfo output Also use task_waiter_t syncpoint to make sure fd won't escape while we're reading output. Signed-off-by: Cyrill Gorcunov Signed-off-by: Andrei Vagin --- test/zdtm/static/file_locks03.c | 74 +++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 31 deletions(-) diff --git a/test/zdtm/static/file_locks03.c b/test/zdtm/static/file_locks03.c index 9d5f198ef..19c11dbb6 100644 --- a/test/zdtm/static/file_locks03.c +++ b/test/zdtm/static/file_locks03.c @@ -5,6 +5,7 @@ #include #include #include +#include #include "zdtmtst.h" @@ -14,57 +15,63 @@ const char *test_author = "Pavel Emelyanov "; char *filename; TEST_OPTION(filename, string, "file name", 1); -static int check_file_locks(int alt_pid) +static int check_file_lock(pid_t pid, pid_t child, int fd, char *expected_type, + char *expected_option) { - FILE *fp_locks = NULL; - char buf[100], fl_flag[16], fl_type[16], fl_option[16]; - pid_t pid = getpid(); - int found = 0, num, fl_owner; + 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]; - fp_locks = fopen("/proc/locks", "r"); - if (!fp_locks) + test_msg("check_file_lock: (pid %d child %d) expecting fd %d type %s option %s\n", + pid, child, fd, expected_type, expected_option); + + snprintf(path, sizeof(path), "/proc/%d/fdinfo/%d", child, fd); + fp_locks = fopen(path, "r"); + if (!fp_locks) { + pr_err("Can't open %s\n", path); return -1; - - test_msg("C: %d/%d\n", pid, alt_pid); + } while (fgets(buf, sizeof(buf), fp_locks)) { + if (strncmp(buf, "lock:\t", 6) != 0) + continue; test_msg("c: %s", buf); - if (strstr(buf, "->")) - continue; - - num = sscanf(buf, - "%*d:%s %s %s %d %*02x:%*02x:%*d %*d %*s", - fl_flag, fl_type, fl_option, &fl_owner); + memset(fl_flag, 0, sizeof(fl_flag)); + memset(fl_type, 0, sizeof(fl_type)); + memset(fl_option, 0, sizeof(fl_option)); + num = sscanf(buf, "%*s %*d:%s %s %s %d", + fl_flag, fl_type, fl_option, &fl_owner); if (num < 4) { pr_perror("Invalid lock info."); break; } - if (fl_owner != pid && fl_owner != alt_pid) + if (fl_owner != pid && fl_owner != child) continue; - - if (!strcmp(fl_flag, "FLOCK") && - !strcmp(fl_type, "ADVISORY") && - !strcmp(fl_option, "WRITE")) - found++; - - memset(fl_flag, 0, sizeof(fl_flag)); - memset(fl_type, 0, sizeof(fl_type)); - memset(fl_option, 0, sizeof(fl_option)); + if (strcmp(fl_flag, "FLOCK")) + continue; + if (strcmp(fl_type, expected_type)) + continue; + if (strcmp(fl_option, expected_option)) + continue; + found++; } fclose(fp_locks); - return found == 1; + return found == 1 ? 0 : -1; } int main(int argc, char **argv) { - int fd, pid; + int fd, pid, ret = 0; + task_waiter_t t; test_init(argc, argv); + task_waiter_init(&t); fd = open(filename, O_CREAT | O_RDWR, 0600); if (fd < 0) { @@ -77,6 +84,7 @@ int main(int argc, char **argv) pid = fork(); if (pid == 0) { test_waitsig(); + task_waiter_wait4(&t, 1); exit(0); } @@ -85,14 +93,18 @@ int main(int argc, char **argv) test_daemon(); test_waitsig(); - if (check_file_locks(pid)) - pass(); - else + if (check_file_lock(getpid(), pid, fd, "ADVISORY", "WRITE")) { fail("Flock file locks check failed"); + ret |= 1; + } + + task_waiter_complete(&t, 1); + + if (!ret) + pass(); kill(pid, SIGTERM); waitpid(pid, NULL, 0); - close(fd); unlink(filename); return 0;