X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fflocks_test.c;h=c2086489d68fe58d5daac21fedc0923044d0feb6;hb=41b9a48c344fb0822b2c956162b5d262f267b3a1;hp=a4a00a862656c0f8f2b4ffecc3ce0a4cd099fbdf;hpb=381604c5c45c7f7394185f434bb8ad1dd4ed88af;p=fs%2Flustre-release.git diff --git a/lustre/tests/flocks_test.c b/lustre/tests/flocks_test.c index a4a00a8..c208648 100644 --- a/lustre/tests/flocks_test.c +++ b/lustre/tests/flocks_test.c @@ -371,7 +371,8 @@ int t4(int argc, char *argv[]) }; int fd, fd2; - int pid; + pid_t child_pid; + int child_status; int rc = EXIT_SUCCESS; if (argc != 4) { @@ -389,18 +390,19 @@ int t4(int argc, char *argv[]) goto out; } - pid = fork(); - if (pid == -1) { + child_pid = fork(); + if (child_pid < 0) { perror("fork"); rc = EXIT_FAILURE; goto out; } - if (pid == 0) { + if (child_pid == 0) { printf("%d: get lock1\n", getpid()); fflush(stdout); if (t_fcntl(fd, F_SETLKW, &lock) < 0) { - perror("first flock failed"); + fprintf(stderr, "%d: cannot get lock1: %s\n", + getpid(), strerror(errno)); rc = EXIT_FAILURE; goto out_child; } @@ -409,8 +411,14 @@ int t4(int argc, char *argv[]) printf("%d: get lock2\n", getpid()); fflush(stdout); if (t_fcntl(fd2, F_SETLKW, &lock) < 0) { - perror("first flock failed"); - rc = EXIT_FAILURE; + fprintf(stderr, "%d: cannot get lock2: %s\n", + getpid(), strerror(errno)); + + if (errno == EDEADLK) + rc = EXIT_SUCCESS; + else + rc = EXIT_FAILURE; + goto out_child; } printf("%d: done\n", getpid()); @@ -421,7 +429,8 @@ out_child: printf("%d: get lock2\n", getpid()); fflush(stdout); if (t_fcntl(fd2, F_SETLKW, &lock) < 0) { - perror("first flock failed"); + fprintf(stderr, "%d: cannot get lock2: %s\n", + getpid(), strerror(errno)); rc = EXIT_FAILURE; goto out; } @@ -430,13 +439,43 @@ out_child: printf("%d: get lock1\n", getpid()); fflush(stdout); if (t_fcntl(fd, F_SETLKW, &lock) < 0) { - perror("first flock failed"); - rc = EXIT_FAILURE; - goto out; + fprintf(stderr, "%d: cannot get lock1: %s\n", + getpid(), strerror(errno)); + + if (errno != EDEADLK) { + rc = EXIT_FAILURE; + goto out; + } } printf("%d: done\n", getpid()); } + sleep(1); + + if (close(fd) < 0) { + fprintf(stderr, "%d: error closing file1: %s\n", + getpid(), strerror(errno)); + rc = EXIT_FAILURE; + } + + if (close(fd2) < 0) { + fprintf(stderr, "%d: error closing file2: %s\n", + getpid(), strerror(errno)); + rc = EXIT_FAILURE; + } + + if (waitpid(child_pid, &child_status, 0) < 0) { + fprintf(stderr, "%d: cannot get termination status of %d: %s\n", + getpid(), child_pid, strerror(errno)); + rc = EXIT_FAILURE; + } else if (!WIFEXITED(child_status)) { + fprintf(stderr, "%d: child %d terminated with status %d\n", + getpid(), child_pid, child_status); + rc = EXIT_FAILURE; + } else { + rc = WEXITSTATUS(child_status); + } + out: printf("%d: exit rc=%d\n", getpid(), rc); return rc;