X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fflocks_test.c;h=ab38fa0c46d31bd10863a37f1419bc4c685b74ed;hb=b498499104af17da081f1c22b9c07951104846a3;hp=945095894ffa180a59cd1ba1a5d45cb025c65677;hpb=e3a7c58aebafce40323db54bf6056029e5af4a70;p=fs%2Flustre-release.git diff --git a/lustre/tests/flocks_test.c b/lustre/tests/flocks_test.c index 9450958..ab38fa0 100644 --- a/lustre/tests/flocks_test.c +++ b/lustre/tests/flocks_test.c @@ -27,7 +27,7 @@ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, Whamcloud, Inc. + * Copyright (c) 2011, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -132,6 +132,7 @@ int t1(int argc, char *argv[]) int fd; int mount_with_flock = 0; int error = 0; + int rc = 0; if (argc != 5) { t1_usage(); @@ -167,13 +168,19 @@ int t1(int argc, char *argv[]) error = flock(fd, LOCK_EX); } else { t1_usage(); - return EXIT_FAILURE; + rc = EXIT_FAILURE; + goto out; } if (mount_with_flock) - return((error == 0) ? EXIT_SUCCESS : EXIT_FAILURE); + rc = ((error == 0) ? EXIT_SUCCESS : EXIT_FAILURE); else - return((error == 0) ? EXIT_FAILURE : EXIT_SUCCESS); + rc = ((error == 0) ? EXIT_FAILURE : EXIT_SUCCESS); + +out: + if (fd >= 0) + close(fd); + return rc; } /** =============================================================== @@ -244,7 +251,8 @@ int t2(int argc, char* argv[]) rc = t_fcntl(fd, F_GETFL); if ((rc & O_APPEND) == 0) { fprintf(stderr, "error get flag: ret %x\n", rc); - return EXIT_FAILURE; + rc = EXIT_FAILURE; + goto out; } ta.lock = &lock; @@ -349,6 +357,86 @@ out: return rc; } +int t4(int argc, char *argv[]) +{ + struct flock lock = { + .l_type = F_WRLCK, + .l_whence = SEEK_SET, + .l_start = 0, + .l_len = 10, + }; + + int fd, fd2; + int pid; + int rc = EXIT_SUCCESS; + + if (argc != 4) { + fprintf(stderr, "Usage: ./flocks_test 4 file1 file2\n"); + return EXIT_FAILURE; + } + + if ((fd = open(argv[2], O_RDWR)) < 0) { + fprintf(stderr, "Couldn't open file: %s\n", argv[2]); + return EXIT_FAILURE; + } + if ((fd2 = open(argv[3], O_RDWR)) < 0) { + fprintf(stderr, "Couldn't open file: %s\n", argv[3]); + rc = EXIT_FAILURE; + goto out; + } + + pid = fork(); + if (pid == -1) { + perror("fork"); + rc = EXIT_FAILURE; + goto out; + } + + if (pid == 0) { + 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_child; + } + printf("%d: done\n", getpid()); + sleep(3); + printf("%d: get lock2\n", getpid()); + fflush(stdout); + if (t_fcntl(fd2, F_SETLKW, &lock) < 0) { + perror("first flock failed"); + rc = EXIT_FAILURE; + goto out_child; + } + printf("%d: done\n", getpid()); +out_child: + printf("%d: exit rc=%d\n", getpid(), rc); + exit(rc); + } else { + printf("%d: get lock2\n", getpid()); + fflush(stdout); + if (t_fcntl(fd2, F_SETLKW, &lock) < 0) { + perror("first flock failed"); + rc = EXIT_FAILURE; + goto out; + } + printf("%d: done\n", getpid()); + sleep(3); + 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; + } + printf("%d: done\n", getpid()); + } + +out: + printf("%d: exit rc=%d\n", getpid(), rc); + return rc; +} /** ============================================================== * program entry @@ -379,6 +467,9 @@ int main(int argc, char* argv[]) case 3: rc = t3(argc, argv); break; + case 4: + rc = t4(argc, argv); + break; default: fprintf(stderr, "unknow test number %s\n", argv[1]); break;