fcntl17.c revision b536a817c0a84c7d320c429f86c4a0c1427a0667
1865695bbc89088b9526ea9045410e5afb70a985cplars/* 2865695bbc89088b9526ea9045410e5afb70a985cplars * 3865695bbc89088b9526ea9045410e5afb70a985cplars * Copyright (c) International Business Machines Corp., 2001 4865695bbc89088b9526ea9045410e5afb70a985cplars * 5865695bbc89088b9526ea9045410e5afb70a985cplars * This program is free software; you can redistribute it and/or modify 6865695bbc89088b9526ea9045410e5afb70a985cplars * it under the terms of the GNU General Public License as published by 7865695bbc89088b9526ea9045410e5afb70a985cplars * the Free Software Foundation; either version 2 of the License, or 8865695bbc89088b9526ea9045410e5afb70a985cplars * (at your option) any later version. 9865695bbc89088b9526ea9045410e5afb70a985cplars * 10865695bbc89088b9526ea9045410e5afb70a985cplars * This program is distributed in the hope that it will be useful, 11865695bbc89088b9526ea9045410e5afb70a985cplars * but WITHOUT ANY WARRANTY; without even the implied warranty of 12865695bbc89088b9526ea9045410e5afb70a985cplars * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 13865695bbc89088b9526ea9045410e5afb70a985cplars * the GNU General Public License for more details. 14865695bbc89088b9526ea9045410e5afb70a985cplars * 15865695bbc89088b9526ea9045410e5afb70a985cplars * You should have received a copy of the GNU General Public License 16865695bbc89088b9526ea9045410e5afb70a985cplars * along with this program; if not, write to the Free Software 174548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 18865695bbc89088b9526ea9045410e5afb70a985cplars */ 19865695bbc89088b9526ea9045410e5afb70a985cplars 20865695bbc89088b9526ea9045410e5afb70a985cplars/* 21865695bbc89088b9526ea9045410e5afb70a985cplars * NAME 2256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * fcntl17.c 23865695bbc89088b9526ea9045410e5afb70a985cplars * 24865695bbc89088b9526ea9045410e5afb70a985cplars * DESCRIPTION 2556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * Check deadlock detection for file locking 26865695bbc89088b9526ea9045410e5afb70a985cplars * 27865695bbc89088b9526ea9045410e5afb70a985cplars * ALGORITHM 2856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * The parent forks off 3 children. The parent controls the children 2956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * with messages via pipes to create a delayed deadlock between the 3056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * second and third child. 31865695bbc89088b9526ea9045410e5afb70a985cplars * 32865695bbc89088b9526ea9045410e5afb70a985cplars * USAGE 3356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * fcntl17 34865695bbc89088b9526ea9045410e5afb70a985cplars * 35865695bbc89088b9526ea9045410e5afb70a985cplars * HISTORY 36865695bbc89088b9526ea9045410e5afb70a985cplars * 07/2001 Ported by Wayne Boyer 374bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 04/2002 Minor fixes by William Jay Huie (testcase name 3807635bca720b53e75ffe5b6cb3502e8954cad0bcplars fcntl05 => fcntl17, check signal return for SIG_ERR) 39865695bbc89088b9526ea9045410e5afb70a985cplars * 40865695bbc89088b9526ea9045410e5afb70a985cplars * RESTRICTIONS 41865695bbc89088b9526ea9045410e5afb70a985cplars * None 42865695bbc89088b9526ea9045410e5afb70a985cplars */ 43865695bbc89088b9526ea9045410e5afb70a985cplars 445b31d1bb1f8c30e3cb6555d4f88ffff96ba04352vapier#ifndef _GNU_SOURCE 45354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#define _GNU_SOURCE 465b31d1bb1f8c30e3cb6555d4f88ffff96ba04352vapier#endif 475b31d1bb1f8c30e3cb6555d4f88ffff96ba04352vapier 48865695bbc89088b9526ea9045410e5afb70a985cplars#include <fcntl.h> 49865695bbc89088b9526ea9045410e5afb70a985cplars#include <errno.h> 50865695bbc89088b9526ea9045410e5afb70a985cplars#include <signal.h> 515aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew#include <sys/stat.h> 525aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew#include <sys/types.h> 53db63921767012310af15f29035a334e50486292cmridge#include <sys/wait.h> 54923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak#include <inttypes.h> 55923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak 565aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew#include "test.h" 57865695bbc89088b9526ea9045410e5afb70a985cplars 5807635bca720b53e75ffe5b6cb3502e8954cad0bcplarschar *TCID = "fcntl17"; 59865695bbc89088b9526ea9045410e5afb70a985cplarsint TST_TOTAL = 1; 60865695bbc89088b9526ea9045410e5afb70a985cplars 61865695bbc89088b9526ea9045410e5afb70a985cplars#define STRINGSIZE 27 62865695bbc89088b9526ea9045410e5afb70a985cplars#define STRING "abcdefghijklmnopqrstuvwxyz\n" 63865695bbc89088b9526ea9045410e5afb70a985cplars#define STOP 0xFFF0 64865695bbc89088b9526ea9045410e5afb70a985cplars#define TIME_OUT 10 65865695bbc89088b9526ea9045410e5afb70a985cplars 66865695bbc89088b9526ea9045410e5afb70a985cplars/* global variables */ 67865695bbc89088b9526ea9045410e5afb70a985cplarsint parent_pipe[2]; 68865695bbc89088b9526ea9045410e5afb70a985cplarsint child_pipe1[2]; 69865695bbc89088b9526ea9045410e5afb70a985cplarsint child_pipe2[2]; 70865695bbc89088b9526ea9045410e5afb70a985cplarsint child_pipe3[2]; 71865695bbc89088b9526ea9045410e5afb70a985cplarsint file_fd; 724673685b374a826ed5a8397366deba4722ab5bf8robbiewpid_t parent_pid, child_pid1, child_pid2, child_pid3; 73874b4225b16598f2afb24655de584b770f2b522bplarsint child_stat; 7456207cec7732e09c216c751c0b5f88a242bacae6subrata_modakstruct flock lock1 = { (short)F_WRLCK, (short)0, 2, 5, (short)0 }; 7556207cec7732e09c216c751c0b5f88a242bacae6subrata_modakstruct flock lock2 = { (short)F_WRLCK, (short)0, 9, 5, (short)0 }; 7656207cec7732e09c216c751c0b5f88a242bacae6subrata_modakstruct flock lock3 = { (short)F_WRLCK, (short)0, 17, 5, (short)0 }; 7756207cec7732e09c216c751c0b5f88a242bacae6subrata_modakstruct flock lock4 = { (short)F_WRLCK, (short)0, 17, 5, (short)0 }; 7856207cec7732e09c216c751c0b5f88a242bacae6subrata_modakstruct flock lock5 = { (short)F_WRLCK, (short)0, 2, 14, (short)0 }; 7956207cec7732e09c216c751c0b5f88a242bacae6subrata_modakstruct flock unlock = { (short)F_UNLCK, (short)0, 0, 0, (short)0 }; 80865695bbc89088b9526ea9045410e5afb70a985cplars 81865695bbc89088b9526ea9045410e5afb70a985cplars/* prototype declarations */ 82865695bbc89088b9526ea9045410e5afb70a985cplarsint setup(); 83865695bbc89088b9526ea9045410e5afb70a985cplarsvoid cleanup(); 84865695bbc89088b9526ea9045410e5afb70a985cplarsint parent_wait(); 85865695bbc89088b9526ea9045410e5afb70a985cplarsvoid parent_free(); 86865695bbc89088b9526ea9045410e5afb70a985cplarsvoid child_wait(); 87865695bbc89088b9526ea9045410e5afb70a985cplarsvoid child_free(); 88865695bbc89088b9526ea9045410e5afb70a985cplarsvoid do_child1(); 89865695bbc89088b9526ea9045410e5afb70a985cplarsvoid do_child2(); 90865695bbc89088b9526ea9045410e5afb70a985cplarsvoid do_child3(); 91f08488fd49050c1ac0c29014433db13714b7170asubrata_modakint do_test(struct flock *, pid_t); 92865695bbc89088b9526ea9045410e5afb70a985cplarsvoid stop_children(); 93865695bbc89088b9526ea9045410e5afb70a985cplarsvoid catch_child(); 94865695bbc89088b9526ea9045410e5afb70a985cplarsvoid catch_alarm(); 95865695bbc89088b9526ea9045410e5afb70a985cplarschar *str_type(); 96865695bbc89088b9526ea9045410e5afb70a985cplars 97c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingerint setup(void) 98865695bbc89088b9526ea9045410e5afb70a985cplars{ 99865695bbc89088b9526ea9045410e5afb70a985cplars char *buf = STRING; 10056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak char template[PATH_MAX]; 1011e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew struct sigaction act; 102865695bbc89088b9526ea9045410e5afb70a985cplars 1032c28215423293e443469a07ae7011135d058b671Garrett Cooper tst_sig(FORK, DEF_HANDLER, NULL); 104865695bbc89088b9526ea9045410e5afb70a985cplars umask(0); 1052c28215423293e443469a07ae7011135d058b671Garrett Cooper TEST_PAUSE; 10656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_tmpdir(); /* make temp dir and cd to it */ 107865695bbc89088b9526ea9045410e5afb70a985cplars 10856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (pipe(parent_pipe) < 0) { 1094bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak tst_resm(TFAIL, "Couldn't create parent_pipe! errno = %d", 110caccaf23298a7d0f34d4b68cd6619435def51a7eplars errno); 111134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 112caccaf23298a7d0f34d4b68cd6619435def51a7eplars } 11356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (pipe(child_pipe1) < 0) { 1144bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak tst_resm(TFAIL, "Couldn't create child_pipe1! errno = %d", 115caccaf23298a7d0f34d4b68cd6619435def51a7eplars errno); 116134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 117caccaf23298a7d0f34d4b68cd6619435def51a7eplars } 11856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (pipe(child_pipe2) < 0) { 1194bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak tst_resm(TFAIL, "Couldn't create child_pipe2! errno = %d", 120caccaf23298a7d0f34d4b68cd6619435def51a7eplars errno); 121134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 122caccaf23298a7d0f34d4b68cd6619435def51a7eplars } 12356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (pipe(child_pipe3) < 0) { 1244bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak tst_resm(TFAIL, "Couldn't create child_pipe3! errno = %d", 125caccaf23298a7d0f34d4b68cd6619435def51a7eplars errno); 126134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 127caccaf23298a7d0f34d4b68cd6619435def51a7eplars } 128865695bbc89088b9526ea9045410e5afb70a985cplars parent_pid = getpid(); 129dad2271b03625d8d549ede28a8792c6a7836cc54robbiew snprintf(template, PATH_MAX, "fcntl17XXXXXX"); 130865695bbc89088b9526ea9045410e5afb70a985cplars 13156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if ((file_fd = mkstemp(template)) < 0) { 13256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TFAIL, "Couldn't open temp file! errno = %d", errno); 13356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 134865695bbc89088b9526ea9045410e5afb70a985cplars 13556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (write(file_fd, buf, STRINGSIZE) < 0) { 13656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TFAIL, "Couldn't write to temp file! errno = %d", 13756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak errno); 13856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 139865695bbc89088b9526ea9045410e5afb70a985cplars 1401e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew memset(&act, 0, sizeof(act)); 1411e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew act.sa_handler = catch_alarm; 1421e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew sigemptyset(&act.sa_mask); 1431e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew sigaddset(&act.sa_mask, SIGALRM); 1441e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew if (sigaction(SIGALRM, &act, NULL) < 0) { 145865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "SIGALRM signal setup failed, errno: %d", 146865695bbc89088b9526ea9045410e5afb70a985cplars errno); 147134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 148865695bbc89088b9526ea9045410e5afb70a985cplars } 149865695bbc89088b9526ea9045410e5afb70a985cplars 1501e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew memset(&act, 0, sizeof(act)); 1511e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew act.sa_handler = catch_child; 1521e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew sigemptyset(&act.sa_mask); 1531e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew sigaddset(&act.sa_mask, SIGCLD); 1541e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew if (sigaction(SIGCLD, &act, NULL) < 0) { 15556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TFAIL, "SIGCLD signal setup failed, errno: %d", errno); 156134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 157865695bbc89088b9526ea9045410e5afb70a985cplars } 15843337a3cf6f8809647cf9fc6c0054241f44b1fb1subrata_modak return 0; 159865695bbc89088b9526ea9045410e5afb70a985cplars} 160865695bbc89088b9526ea9045410e5afb70a985cplars 161c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid cleanup(void) 162865695bbc89088b9526ea9045410e5afb70a985cplars{ 163c61531636bd84b5b35bd3d46cc26aff29fb36964Han Pingtian if (child_pid1 > 0) 164c61531636bd84b5b35bd3d46cc26aff29fb36964Han Pingtian kill(child_pid1, 9); 165c61531636bd84b5b35bd3d46cc26aff29fb36964Han Pingtian 166c61531636bd84b5b35bd3d46cc26aff29fb36964Han Pingtian if (child_pid2 > 0) 167c61531636bd84b5b35bd3d46cc26aff29fb36964Han Pingtian kill(child_pid2, 9); 168c61531636bd84b5b35bd3d46cc26aff29fb36964Han Pingtian 169c61531636bd84b5b35bd3d46cc26aff29fb36964Han Pingtian if (child_pid3 > 0) 170c61531636bd84b5b35bd3d46cc26aff29fb36964Han Pingtian kill(child_pid3, 9); 171c61531636bd84b5b35bd3d46cc26aff29fb36964Han Pingtian 17256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak close(file_fd); 173865695bbc89088b9526ea9045410e5afb70a985cplars tst_rmdir(); 1742c28215423293e443469a07ae7011135d058b671Garrett Cooper 175865695bbc89088b9526ea9045410e5afb70a985cplars} 176865695bbc89088b9526ea9045410e5afb70a985cplars 177c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid do_child1(void) 178865695bbc89088b9526ea9045410e5afb70a985cplars{ 17956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak int err; 180db63921767012310af15f29035a334e50486292cmridge 181865695bbc89088b9526ea9045410e5afb70a985cplars close(parent_pipe[0]); 182865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe1[1]); 183865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe2[0]); 184865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe2[1]); 185865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe3[0]); 186865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe3[1]); 187865695bbc89088b9526ea9045410e5afb70a985cplars 188865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe1[0]); 18956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 1 starting"); 190865695bbc89088b9526ea9045410e5afb70a985cplars if (fcntl(file_fd, F_SETLK, &lock1) < 0) { 19156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak err = errno; 19256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 1 lock err %d", err); 193db63921767012310af15f29035a334e50486292cmridge parent_free(err); 194865695bbc89088b9526ea9045410e5afb70a985cplars } else { 19556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 1 pid %d locked", getpid()); 196865695bbc89088b9526ea9045410e5afb70a985cplars parent_free(0); 197865695bbc89088b9526ea9045410e5afb70a985cplars } 198865695bbc89088b9526ea9045410e5afb70a985cplars 199865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe1[0]); 20056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 1 resuming"); 201865695bbc89088b9526ea9045410e5afb70a985cplars fcntl(file_fd, F_SETLK, &unlock); 20256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 1 unlocked"); 203865695bbc89088b9526ea9045410e5afb70a985cplars 204865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe1[0]); 20556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 1 exiting"); 206865695bbc89088b9526ea9045410e5afb70a985cplars exit(1); 207865695bbc89088b9526ea9045410e5afb70a985cplars} 208865695bbc89088b9526ea9045410e5afb70a985cplars 209c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid do_child2(void) 210865695bbc89088b9526ea9045410e5afb70a985cplars{ 21156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak int err; 212db63921767012310af15f29035a334e50486292cmridge 213865695bbc89088b9526ea9045410e5afb70a985cplars close(parent_pipe[0]); 214865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe1[0]); 215865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe1[1]); 216865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe2[1]); 217865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe3[0]); 218865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe3[1]); 219865695bbc89088b9526ea9045410e5afb70a985cplars 220865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe2[0]); 22156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 2 starting"); 222865695bbc89088b9526ea9045410e5afb70a985cplars if (fcntl(file_fd, F_SETLK, &lock2) < 0) { 22356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak err = errno; 22456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 2 lock err %d", err); 225db63921767012310af15f29035a334e50486292cmridge parent_free(err); 226865695bbc89088b9526ea9045410e5afb70a985cplars } else { 22756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 2 pid %d locked", getpid()); 228865695bbc89088b9526ea9045410e5afb70a985cplars parent_free(0); 229865695bbc89088b9526ea9045410e5afb70a985cplars } 230865695bbc89088b9526ea9045410e5afb70a985cplars 231865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe2[0]); 23256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 2 resuming"); 233865695bbc89088b9526ea9045410e5afb70a985cplars if (fcntl(file_fd, F_SETLKW, &lock4) < 0) { 23456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak err = errno; 23556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 2 lockw err %d", err); 236db63921767012310af15f29035a334e50486292cmridge parent_free(err); 237865695bbc89088b9526ea9045410e5afb70a985cplars } else { 23856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 2 lockw locked"); 239865695bbc89088b9526ea9045410e5afb70a985cplars parent_free(0); 240865695bbc89088b9526ea9045410e5afb70a985cplars } 241865695bbc89088b9526ea9045410e5afb70a985cplars 242865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe2[0]); 24356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 2 exiting"); 244865695bbc89088b9526ea9045410e5afb70a985cplars exit(1); 245865695bbc89088b9526ea9045410e5afb70a985cplars} 246865695bbc89088b9526ea9045410e5afb70a985cplars 247c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid do_child3(void) 248865695bbc89088b9526ea9045410e5afb70a985cplars{ 24956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak int err; 250db63921767012310af15f29035a334e50486292cmridge 251865695bbc89088b9526ea9045410e5afb70a985cplars close(parent_pipe[0]); 252865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe1[0]); 253865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe1[1]); 254865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe2[0]); 255865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe2[1]); 256865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe3[1]); 257865695bbc89088b9526ea9045410e5afb70a985cplars 258865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe3[0]); 25956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 3 starting"); 260865695bbc89088b9526ea9045410e5afb70a985cplars if (fcntl(file_fd, F_SETLK, &lock3) < 0) { 26156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak err = errno; 26256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 3 lock err %d", err); 263db63921767012310af15f29035a334e50486292cmridge parent_free(err); 264865695bbc89088b9526ea9045410e5afb70a985cplars } else { 26556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 3 pid %d locked", getpid()); 266865695bbc89088b9526ea9045410e5afb70a985cplars parent_free(0); 267865695bbc89088b9526ea9045410e5afb70a985cplars } 268865695bbc89088b9526ea9045410e5afb70a985cplars 269865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe3[0]); 27056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 3 resuming"); 271865695bbc89088b9526ea9045410e5afb70a985cplars if (fcntl(file_fd, F_SETLKW, &lock5) < 0) { 27256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak err = errno; 27356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 3 lockw err %d", err); 274db63921767012310af15f29035a334e50486292cmridge parent_free(err); 275865695bbc89088b9526ea9045410e5afb70a985cplars } else { 27656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 3 lockw locked"); 277865695bbc89088b9526ea9045410e5afb70a985cplars parent_free(0); 278865695bbc89088b9526ea9045410e5afb70a985cplars } 279865695bbc89088b9526ea9045410e5afb70a985cplars 280865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe3[0]); 28156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 3 exiting"); 282865695bbc89088b9526ea9045410e5afb70a985cplars exit(1); 283865695bbc89088b9526ea9045410e5afb70a985cplars} 284865695bbc89088b9526ea9045410e5afb70a985cplars 28556207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint do_test(struct flock *lock, pid_t pid) 286865695bbc89088b9526ea9045410e5afb70a985cplars{ 287865695bbc89088b9526ea9045410e5afb70a985cplars struct flock fl; 288865695bbc89088b9526ea9045410e5afb70a985cplars 289db63921767012310af15f29035a334e50486292cmridge fl.l_type = /* lock->l_type */ F_RDLCK; 290865695bbc89088b9526ea9045410e5afb70a985cplars fl.l_whence = lock->l_whence; 291865695bbc89088b9526ea9045410e5afb70a985cplars fl.l_start = lock->l_start; 292865695bbc89088b9526ea9045410e5afb70a985cplars fl.l_len = lock->l_len; 29356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak fl.l_pid = (short)0; 294865695bbc89088b9526ea9045410e5afb70a985cplars if (fcntl(file_fd, F_GETLK, &fl) < 0) { 29556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TFAIL, "fcntl on file failed, errno =%d", errno); 296134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 297865695bbc89088b9526ea9045410e5afb70a985cplars } 298865695bbc89088b9526ea9045410e5afb70a985cplars 299865695bbc89088b9526ea9045410e5afb70a985cplars if (fl.l_type != lock->l_type) { 300865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "lock type is wrong should be %s is %s", 301865695bbc89088b9526ea9045410e5afb70a985cplars str_type(lock->l_type), str_type(fl.l_type)); 302134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 303865695bbc89088b9526ea9045410e5afb70a985cplars } 304865695bbc89088b9526ea9045410e5afb70a985cplars 305865695bbc89088b9526ea9045410e5afb70a985cplars if (fl.l_whence != lock->l_whence) { 306865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "lock whence is wrong should be %d is %d", 307865695bbc89088b9526ea9045410e5afb70a985cplars lock->l_whence, fl.l_whence); 308134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 309865695bbc89088b9526ea9045410e5afb70a985cplars } 310865695bbc89088b9526ea9045410e5afb70a985cplars 311865695bbc89088b9526ea9045410e5afb70a985cplars if (fl.l_start != lock->l_start) { 312865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "region starts in wrong place, " 313354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "should be %" PRId64 " is %" PRId64, 314354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao (int64_t) lock->l_start, (int64_t) fl.l_start); 315134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 316865695bbc89088b9526ea9045410e5afb70a985cplars } 317865695bbc89088b9526ea9045410e5afb70a985cplars 318865695bbc89088b9526ea9045410e5afb70a985cplars if (fl.l_len != lock->l_len) { 319354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL, 320354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "region length is wrong, should be %" PRId64 " is %" 321354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PRId64, (int64_t) lock->l_len, (int64_t) fl.l_len); 322134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 323865695bbc89088b9526ea9045410e5afb70a985cplars } 324865695bbc89088b9526ea9045410e5afb70a985cplars 325865695bbc89088b9526ea9045410e5afb70a985cplars if (fl.l_pid != pid) { 326865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "locking pid is wrong, should be %d is %d", 327865695bbc89088b9526ea9045410e5afb70a985cplars pid, fl.l_pid); 328134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 329865695bbc89088b9526ea9045410e5afb70a985cplars } 33043337a3cf6f8809647cf9fc6c0054241f44b1fb1subrata_modak return 0; 331865695bbc89088b9526ea9045410e5afb70a985cplars} 332865695bbc89088b9526ea9045410e5afb70a985cplars 33356207cec7732e09c216c751c0b5f88a242bacae6subrata_modakchar *str_type(int type) 334865695bbc89088b9526ea9045410e5afb70a985cplars{ 335865695bbc89088b9526ea9045410e5afb70a985cplars static char buf[20]; 336865695bbc89088b9526ea9045410e5afb70a985cplars 337865695bbc89088b9526ea9045410e5afb70a985cplars switch (type) { 338db63921767012310af15f29035a334e50486292cmridge case F_RDLCK: 33956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak return ("F_RDLCK"); 340db63921767012310af15f29035a334e50486292cmridge case F_WRLCK: 34156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak return ("F_WRLCK"); 342db63921767012310af15f29035a334e50486292cmridge case F_UNLCK: 34356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak return ("F_UNLCK"); 344865695bbc89088b9526ea9045410e5afb70a985cplars default: 345865695bbc89088b9526ea9045410e5afb70a985cplars sprintf(buf, "BAD VALUE: %d", type); 34656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak return (buf); 347865695bbc89088b9526ea9045410e5afb70a985cplars } 348865695bbc89088b9526ea9045410e5afb70a985cplars} 349865695bbc89088b9526ea9045410e5afb70a985cplars 35056207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid parent_free(int arg) 351865695bbc89088b9526ea9045410e5afb70a985cplars{ 352865695bbc89088b9526ea9045410e5afb70a985cplars if (write(parent_pipe[1], &arg, sizeof(arg)) != sizeof(arg)) { 353865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "couldn't send message to parent"); 354865695bbc89088b9526ea9045410e5afb70a985cplars exit(1); 355865695bbc89088b9526ea9045410e5afb70a985cplars } 356865695bbc89088b9526ea9045410e5afb70a985cplars} 357865695bbc89088b9526ea9045410e5afb70a985cplars 358c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingerint parent_wait(void) 359865695bbc89088b9526ea9045410e5afb70a985cplars{ 360865695bbc89088b9526ea9045410e5afb70a985cplars int arg; 361865695bbc89088b9526ea9045410e5afb70a985cplars 362865695bbc89088b9526ea9045410e5afb70a985cplars if (read(parent_pipe[0], &arg, sizeof(arg)) != sizeof(arg)) { 363865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "parent_wait() failed"); 36456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak return (errno); 365865695bbc89088b9526ea9045410e5afb70a985cplars } 36656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak return (arg); 367865695bbc89088b9526ea9045410e5afb70a985cplars} 368865695bbc89088b9526ea9045410e5afb70a985cplars 36956207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid child_free(int fd, int arg) 370865695bbc89088b9526ea9045410e5afb70a985cplars{ 371865695bbc89088b9526ea9045410e5afb70a985cplars if (write(fd, &arg, sizeof(arg)) != sizeof(arg)) { 372865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "couldn't send message to child"); 373865695bbc89088b9526ea9045410e5afb70a985cplars exit(1); 374865695bbc89088b9526ea9045410e5afb70a985cplars } 375865695bbc89088b9526ea9045410e5afb70a985cplars} 376865695bbc89088b9526ea9045410e5afb70a985cplars 37756207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid child_wait(int fd) 378865695bbc89088b9526ea9045410e5afb70a985cplars{ 379865695bbc89088b9526ea9045410e5afb70a985cplars int arg; 380865695bbc89088b9526ea9045410e5afb70a985cplars 381865695bbc89088b9526ea9045410e5afb70a985cplars if (read(fd, &arg, sizeof(arg)) != sizeof(arg)) { 382865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "couldn't get message from parent"); 383865695bbc89088b9526ea9045410e5afb70a985cplars exit(1); 384865695bbc89088b9526ea9045410e5afb70a985cplars } else if (arg == (short)STOP) { 385865695bbc89088b9526ea9045410e5afb70a985cplars exit(0); 386865695bbc89088b9526ea9045410e5afb70a985cplars } 387865695bbc89088b9526ea9045410e5afb70a985cplars} 388865695bbc89088b9526ea9045410e5afb70a985cplars 389c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid stop_children(void) 390865695bbc89088b9526ea9045410e5afb70a985cplars{ 391865695bbc89088b9526ea9045410e5afb70a985cplars int arg; 392865695bbc89088b9526ea9045410e5afb70a985cplars 393e61ddbaf9b02e1f4f94f4708551ecc825c1ac1d7Mike Frysinger signal(SIGCLD, SIG_DFL); 394865695bbc89088b9526ea9045410e5afb70a985cplars arg = STOP; 395865695bbc89088b9526ea9045410e5afb70a985cplars child_free(child_pipe1[1], arg); 396865695bbc89088b9526ea9045410e5afb70a985cplars child_free(child_pipe2[1], arg); 397865695bbc89088b9526ea9045410e5afb70a985cplars child_free(child_pipe3[1], arg); 398c61531636bd84b5b35bd3d46cc26aff29fb36964Han Pingtian waitpid(child_pid1, &child_stat, 0); 399c61531636bd84b5b35bd3d46cc26aff29fb36964Han Pingtian child_pid1 = 0; 400c61531636bd84b5b35bd3d46cc26aff29fb36964Han Pingtian waitpid(child_pid2, &child_stat, 0); 401c61531636bd84b5b35bd3d46cc26aff29fb36964Han Pingtian child_pid2 = 0; 402c61531636bd84b5b35bd3d46cc26aff29fb36964Han Pingtian waitpid(child_pid3, &child_stat, 0); 403c61531636bd84b5b35bd3d46cc26aff29fb36964Han Pingtian child_pid3 = 0; 404865695bbc89088b9526ea9045410e5afb70a985cplars} 405865695bbc89088b9526ea9045410e5afb70a985cplars 406c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid catch_child(void) 407865695bbc89088b9526ea9045410e5afb70a985cplars{ 408865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "Unexpected death of child process"); 409865695bbc89088b9526ea9045410e5afb70a985cplars cleanup(); 410354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao} 411865695bbc89088b9526ea9045410e5afb70a985cplars 412c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid catch_alarm(void) 413865695bbc89088b9526ea9045410e5afb70a985cplars{ 41456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak sighold(SIGCHLD); 415865695bbc89088b9526ea9045410e5afb70a985cplars /* 416865695bbc89088b9526ea9045410e5afb70a985cplars * Timer has runout and the children have not detected the deadlock. 417865695bbc89088b9526ea9045410e5afb70a985cplars * Need to kill the kids and exit 418865695bbc89088b9526ea9045410e5afb70a985cplars */ 41956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (child_pid1 != 0 && (kill(child_pid1, SIGKILL)) < 0) { 420865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "Attempt to signal child 1 failed."); 421865695bbc89088b9526ea9045410e5afb70a985cplars } 422865695bbc89088b9526ea9045410e5afb70a985cplars 42356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (child_pid2 != 0 && (kill(child_pid2, SIGKILL)) < 0) { 424db63921767012310af15f29035a334e50486292cmridge tst_resm(TFAIL, "Attempt to signal child 2 failed."); 425db63921767012310af15f29035a334e50486292cmridge } 42656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (child_pid3 != 0 && (kill(child_pid3, SIGKILL)) < 0) { 427865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "Attempt to signal child 2 failed."); 428865695bbc89088b9526ea9045410e5afb70a985cplars } 42956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TFAIL, "Alarm expired, deadlock not detected"); 43056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TWARN, "You may need to kill child processes by hand"); 431865695bbc89088b9526ea9045410e5afb70a985cplars cleanup(); 432354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao} 4335aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 4345aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewint main(int ac, char **av) 4355aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{ 4365aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew int ans; 43789af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis int lc; 4385aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew int fail = 0; 4395aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 440d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis tst_parse_opts(ac, av, NULL, NULL); 441d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX 442d34d581c6a320e356a6cda923c7aa399479e812crobbiew maybe_run_child(&do_child1, "nddddddddd", 1, &file_fd, 443d34d581c6a320e356a6cda923c7aa399479e812crobbiew &parent_pipe[0], &parent_pipe[1], 444d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe1[0], &child_pipe1[1], 445d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe2[0], &child_pipe2[1], 446d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe3[0], &child_pipe3[1]); 447d34d581c6a320e356a6cda923c7aa399479e812crobbiew maybe_run_child(&do_child2, "nddddddddd", 2, &file_fd, 448d34d581c6a320e356a6cda923c7aa399479e812crobbiew &parent_pipe[0], &parent_pipe[1], 449d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe1[0], &child_pipe1[1], 450d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe2[0], &child_pipe2[1], 451d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe3[0], &child_pipe3[1]); 452d34d581c6a320e356a6cda923c7aa399479e812crobbiew maybe_run_child(&do_child3, "nddddddddd", 3, &file_fd, 453d34d581c6a320e356a6cda923c7aa399479e812crobbiew &parent_pipe[0], &parent_pipe[1], 454d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe1[0], &child_pipe1[1], 455d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe2[0], &child_pipe2[1], 456d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe3[0], &child_pipe3[1]); 457d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif 458d34d581c6a320e356a6cda923c7aa399479e812crobbiew 45956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (setup()) { /* global testup */ 4605aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "setup failed"); 4615aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew cleanup(); 462354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 4635aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 4645aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* check for looping state if -i option is given */ 4655aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew for (lc = 0; TEST_LOOPING(lc); lc++) { 466d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang /* reset tst_count in case we are looping */ 467d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count = 0; 4685aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 4695aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "Enter preparation phase"); 470d34d581c6a320e356a6cda923c7aa399479e812crobbiew if ((child_pid1 = FORK_OR_VFORK()) == 0) { /* first child */ 471d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX 472d34d581c6a320e356a6cda923c7aa399479e812crobbiew if (self_exec(av[0], "nddddddddd", 1, file_fd, 473d34d581c6a320e356a6cda923c7aa399479e812crobbiew parent_pipe[0], parent_pipe[1], 474d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe1[0], child_pipe1[1], 475d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe2[0], child_pipe2[1], 476d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe3[0], child_pipe3[1]) < 0) { 477d34d581c6a320e356a6cda923c7aa399479e812crobbiew perror("self_exec failed, child 1"); 478d34d581c6a320e356a6cda923c7aa399479e812crobbiew cleanup(); 479d34d581c6a320e356a6cda923c7aa399479e812crobbiew } 480d34d581c6a320e356a6cda923c7aa399479e812crobbiew#else 4815aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew do_child1(); 482d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif 483c61531636bd84b5b35bd3d46cc26aff29fb36964Han Pingtian } else if (child_pid1 < 0) 484c61531636bd84b5b35bd3d46cc26aff29fb36964Han Pingtian tst_brkm(TBROK|TERRNO, cleanup, "Fork failed: child 1"); 4855aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 4865aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* parent */ 4875aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 4885aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if ((child_pid2 = fork()) == 0) { /* second child */ 489d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX 490d34d581c6a320e356a6cda923c7aa399479e812crobbiew if (self_exec(av[0], "nddddddddd", 2, file_fd, 491d34d581c6a320e356a6cda923c7aa399479e812crobbiew parent_pipe[0], parent_pipe[1], 492d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe1[0], child_pipe1[1], 493d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe2[0], child_pipe2[1], 494d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe3[0], child_pipe3[1]) < 0) { 495d34d581c6a320e356a6cda923c7aa399479e812crobbiew perror("self_exec failed, child 2"); 496d34d581c6a320e356a6cda923c7aa399479e812crobbiew cleanup(); 497d34d581c6a320e356a6cda923c7aa399479e812crobbiew } 498d34d581c6a320e356a6cda923c7aa399479e812crobbiew#else 4995aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew do_child2(); 500d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif 5015aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } else if (child_pid2 < 0) { 502c61531636bd84b5b35bd3d46cc26aff29fb36964Han Pingtian tst_brkm(TBROK|TERRNO, cleanup, "Fork failed: child 2"); 503354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 5045aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 5055aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* parent */ 5065aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 5075aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if ((child_pid3 = fork()) == 0) { /* third child */ 508d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX 509d34d581c6a320e356a6cda923c7aa399479e812crobbiew if (self_exec(av[0], "nddddddddd", 3, file_fd, 510d34d581c6a320e356a6cda923c7aa399479e812crobbiew parent_pipe[0], parent_pipe[1], 511d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe1[0], child_pipe1[1], 512d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe2[0], child_pipe2[1], 513d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe3[0], child_pipe3[1]) < 0) { 514d34d581c6a320e356a6cda923c7aa399479e812crobbiew perror("self_exec failed, child 3"); 515d34d581c6a320e356a6cda923c7aa399479e812crobbiew cleanup(); 516d34d581c6a320e356a6cda923c7aa399479e812crobbiew } 517d34d581c6a320e356a6cda923c7aa399479e812crobbiew#else 518d34d581c6a320e356a6cda923c7aa399479e812crobbiew do_child3(); 519d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif 5205aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew do_child3(); 5215aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } else if (child_pid3 < 0) { 522c61531636bd84b5b35bd3d46cc26aff29fb36964Han Pingtian tst_brkm(TBROK|TERRNO, cleanup, "Fork failed: child 3"); 523354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 5245aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* parent */ 5255aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 5265aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew close(parent_pipe[1]); 5275aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew close(child_pipe1[0]); 5285aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew close(child_pipe2[0]); 5295aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew close(child_pipe3[0]); 5305aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "Exit preparation phase"); 5315aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 532db63921767012310af15f29035a334e50486292cmridge/* //block1: */ 5335aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "Enter block 1"); 5345aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 0; 5355aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 5365aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * child 1 puts first lock (bytes 2-7) 5375aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 5385aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew child_free(child_pipe1[1], 0); 5395aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (parent_wait()) { 5405aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TFAIL, "didn't set first child's lock, " 5415aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew "errno: %d", errno); 5425aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 5435aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (do_test(&lock1, child_pid1)) { 5445aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "do_test failed child 1"); 5455aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 1; 5465aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 5475aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 5485aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 5495aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * child 2 puts second lock (bytes 9-14) 5505aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 5515aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew child_free(child_pipe2[1], 0); 5525aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (parent_wait()) { 5535aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "didn't set second child's lock, " 5545aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew "errno: %d", errno); 5555aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 1; 5565aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 5575aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (do_test(&lock2, child_pid2)) { 5585aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "do_test failed child 2"); 5595aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 1; 5605aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 5615aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 5625aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 5635aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * child 3 puts third lock (bytes 17-22) 5645aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 5655aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew child_free(child_pipe3[1], 0); 5665aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (parent_wait()) { 5675aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TFAIL, "didn't set third child's lock, " 5685aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew "errno: %d", errno); 5695aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 1; 5705aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 5715aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (do_test(&lock3, child_pid3)) { 5725aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "do_test failed child 3"); 5735aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 1; 5745aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 5755aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 5765aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 5775aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * child 2 tries to lock same range as 5785aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * child 3's first lock. 5795aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 5805aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew child_free(child_pipe2[1], 0); 5815aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 5825aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 5835aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * child 3 tries to lock same range as 5845aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * child 1 and child 2's first locks. 5855aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 5865aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew child_free(child_pipe3[1], 0); 5875aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 5885aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 5895aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * Tell child 1 to release its lock. This should cause a 5905aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * delayed deadlock between child 2 and child 3. 5915aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 5925aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew child_free(child_pipe1[1], 0); 5935aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 5945aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 5955aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * Setup an alarm to go off in case the deadlock is not 5965aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * detected 5975aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 5985aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew alarm(TIME_OUT); 5995aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 6005aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 6015aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * should get a message from child 3 telling that its 6025aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * second lock EDEADLOCK 6035aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 6045aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if ((ans = parent_wait()) != EDEADLK) { 6055aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TFAIL, "child 2 didn't deadlock, " 6065aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew "returned: %d", ans); 6075aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 1; 6085aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 6095aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 6105aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 6115aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * Double check that lock 2 and lock 3 are still right 6125aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 6135aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew do_test(&lock2, child_pid2); 6145aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew do_test(&lock3, child_pid3); 6155aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 6165aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew stop_children(); 617c61531636bd84b5b35bd3d46cc26aff29fb36964Han Pingtian 6185aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (fail) { 619b536a817c0a84c7d320c429f86c4a0c1427a0667Cyril Hrubis tst_resm(TFAIL, "Block 1 FAILED"); 6205aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } else { 621b536a817c0a84c7d320c429f86c4a0c1427a0667Cyril Hrubis tst_resm(TPASS, "Block 1 PASSED"); 6225aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 6235aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "Exit block 1"); 6245aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 6255aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew cleanup(); 6262c28215423293e443469a07ae7011135d058b671Garrett Cooper tst_exit(); 627ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman} 628