fcntl17.c revision d6d11d08678aac1ed2c370ea8e42e5f45aea07be
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{ 16356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak close(file_fd); 164865695bbc89088b9526ea9045410e5afb70a985cplars tst_rmdir(); 1652c28215423293e443469a07ae7011135d058b671Garrett Cooper 166865695bbc89088b9526ea9045410e5afb70a985cplars} 167865695bbc89088b9526ea9045410e5afb70a985cplars 168c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid do_child1(void) 169865695bbc89088b9526ea9045410e5afb70a985cplars{ 17056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak int err; 171db63921767012310af15f29035a334e50486292cmridge 172865695bbc89088b9526ea9045410e5afb70a985cplars close(parent_pipe[0]); 173865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe1[1]); 174865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe2[0]); 175865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe2[1]); 176865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe3[0]); 177865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe3[1]); 178865695bbc89088b9526ea9045410e5afb70a985cplars 179865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe1[0]); 18056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 1 starting"); 181865695bbc89088b9526ea9045410e5afb70a985cplars if (fcntl(file_fd, F_SETLK, &lock1) < 0) { 18256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak err = errno; 18356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 1 lock err %d", err); 184db63921767012310af15f29035a334e50486292cmridge parent_free(err); 185865695bbc89088b9526ea9045410e5afb70a985cplars } else { 18656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 1 pid %d locked", getpid()); 187865695bbc89088b9526ea9045410e5afb70a985cplars parent_free(0); 188865695bbc89088b9526ea9045410e5afb70a985cplars } 189865695bbc89088b9526ea9045410e5afb70a985cplars 190865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe1[0]); 19156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 1 resuming"); 192865695bbc89088b9526ea9045410e5afb70a985cplars fcntl(file_fd, F_SETLK, &unlock); 19356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 1 unlocked"); 194865695bbc89088b9526ea9045410e5afb70a985cplars 195865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe1[0]); 19656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 1 exiting"); 197865695bbc89088b9526ea9045410e5afb70a985cplars exit(1); 198865695bbc89088b9526ea9045410e5afb70a985cplars} 199865695bbc89088b9526ea9045410e5afb70a985cplars 200c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid do_child2(void) 201865695bbc89088b9526ea9045410e5afb70a985cplars{ 20256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak int err; 203db63921767012310af15f29035a334e50486292cmridge 204865695bbc89088b9526ea9045410e5afb70a985cplars close(parent_pipe[0]); 205865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe1[0]); 206865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe1[1]); 207865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe2[1]); 208865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe3[0]); 209865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe3[1]); 210865695bbc89088b9526ea9045410e5afb70a985cplars 211865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe2[0]); 21256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 2 starting"); 213865695bbc89088b9526ea9045410e5afb70a985cplars if (fcntl(file_fd, F_SETLK, &lock2) < 0) { 21456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak err = errno; 21556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 2 lock err %d", err); 216db63921767012310af15f29035a334e50486292cmridge parent_free(err); 217865695bbc89088b9526ea9045410e5afb70a985cplars } else { 21856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 2 pid %d locked", getpid()); 219865695bbc89088b9526ea9045410e5afb70a985cplars parent_free(0); 220865695bbc89088b9526ea9045410e5afb70a985cplars } 221865695bbc89088b9526ea9045410e5afb70a985cplars 222865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe2[0]); 22356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 2 resuming"); 224865695bbc89088b9526ea9045410e5afb70a985cplars if (fcntl(file_fd, F_SETLKW, &lock4) < 0) { 22556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak err = errno; 22656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 2 lockw err %d", err); 227db63921767012310af15f29035a334e50486292cmridge parent_free(err); 228865695bbc89088b9526ea9045410e5afb70a985cplars } else { 22956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 2 lockw locked"); 230865695bbc89088b9526ea9045410e5afb70a985cplars parent_free(0); 231865695bbc89088b9526ea9045410e5afb70a985cplars } 232865695bbc89088b9526ea9045410e5afb70a985cplars 233865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe2[0]); 23456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 2 exiting"); 235865695bbc89088b9526ea9045410e5afb70a985cplars exit(1); 236865695bbc89088b9526ea9045410e5afb70a985cplars} 237865695bbc89088b9526ea9045410e5afb70a985cplars 238c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid do_child3(void) 239865695bbc89088b9526ea9045410e5afb70a985cplars{ 24056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak int err; 241db63921767012310af15f29035a334e50486292cmridge 242865695bbc89088b9526ea9045410e5afb70a985cplars close(parent_pipe[0]); 243865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe1[0]); 244865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe1[1]); 245865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe2[0]); 246865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe2[1]); 247865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe3[1]); 248865695bbc89088b9526ea9045410e5afb70a985cplars 249865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe3[0]); 25056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 3 starting"); 251865695bbc89088b9526ea9045410e5afb70a985cplars if (fcntl(file_fd, F_SETLK, &lock3) < 0) { 25256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak err = errno; 25356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 3 lock err %d", err); 254db63921767012310af15f29035a334e50486292cmridge parent_free(err); 255865695bbc89088b9526ea9045410e5afb70a985cplars } else { 25656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 3 pid %d locked", getpid()); 257865695bbc89088b9526ea9045410e5afb70a985cplars parent_free(0); 258865695bbc89088b9526ea9045410e5afb70a985cplars } 259865695bbc89088b9526ea9045410e5afb70a985cplars 260865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe3[0]); 26156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 3 resuming"); 262865695bbc89088b9526ea9045410e5afb70a985cplars if (fcntl(file_fd, F_SETLKW, &lock5) < 0) { 26356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak err = errno; 26456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 3 lockw err %d", err); 265db63921767012310af15f29035a334e50486292cmridge parent_free(err); 266865695bbc89088b9526ea9045410e5afb70a985cplars } else { 26756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 3 lockw locked"); 268865695bbc89088b9526ea9045410e5afb70a985cplars parent_free(0); 269865695bbc89088b9526ea9045410e5afb70a985cplars } 270865695bbc89088b9526ea9045410e5afb70a985cplars 271865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe3[0]); 27256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "child 3 exiting"); 273865695bbc89088b9526ea9045410e5afb70a985cplars exit(1); 274865695bbc89088b9526ea9045410e5afb70a985cplars} 275865695bbc89088b9526ea9045410e5afb70a985cplars 27656207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint do_test(struct flock *lock, pid_t pid) 277865695bbc89088b9526ea9045410e5afb70a985cplars{ 278865695bbc89088b9526ea9045410e5afb70a985cplars struct flock fl; 279865695bbc89088b9526ea9045410e5afb70a985cplars 280db63921767012310af15f29035a334e50486292cmridge fl.l_type = /* lock->l_type */ F_RDLCK; 281865695bbc89088b9526ea9045410e5afb70a985cplars fl.l_whence = lock->l_whence; 282865695bbc89088b9526ea9045410e5afb70a985cplars fl.l_start = lock->l_start; 283865695bbc89088b9526ea9045410e5afb70a985cplars fl.l_len = lock->l_len; 28456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak fl.l_pid = (short)0; 285865695bbc89088b9526ea9045410e5afb70a985cplars if (fcntl(file_fd, F_GETLK, &fl) < 0) { 28656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TFAIL, "fcntl on file failed, errno =%d", errno); 287134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 288865695bbc89088b9526ea9045410e5afb70a985cplars } 289865695bbc89088b9526ea9045410e5afb70a985cplars 290865695bbc89088b9526ea9045410e5afb70a985cplars if (fl.l_type != lock->l_type) { 291865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "lock type is wrong should be %s is %s", 292865695bbc89088b9526ea9045410e5afb70a985cplars str_type(lock->l_type), str_type(fl.l_type)); 293134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 294865695bbc89088b9526ea9045410e5afb70a985cplars } 295865695bbc89088b9526ea9045410e5afb70a985cplars 296865695bbc89088b9526ea9045410e5afb70a985cplars if (fl.l_whence != lock->l_whence) { 297865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "lock whence is wrong should be %d is %d", 298865695bbc89088b9526ea9045410e5afb70a985cplars lock->l_whence, fl.l_whence); 299134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 300865695bbc89088b9526ea9045410e5afb70a985cplars } 301865695bbc89088b9526ea9045410e5afb70a985cplars 302865695bbc89088b9526ea9045410e5afb70a985cplars if (fl.l_start != lock->l_start) { 303865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "region starts in wrong place, " 304354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "should be %" PRId64 " is %" PRId64, 305354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao (int64_t) lock->l_start, (int64_t) fl.l_start); 306134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 307865695bbc89088b9526ea9045410e5afb70a985cplars } 308865695bbc89088b9526ea9045410e5afb70a985cplars 309865695bbc89088b9526ea9045410e5afb70a985cplars if (fl.l_len != lock->l_len) { 310354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL, 311354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "region length is wrong, should be %" PRId64 " is %" 312354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao PRId64, (int64_t) lock->l_len, (int64_t) fl.l_len); 313134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 314865695bbc89088b9526ea9045410e5afb70a985cplars } 315865695bbc89088b9526ea9045410e5afb70a985cplars 316865695bbc89088b9526ea9045410e5afb70a985cplars if (fl.l_pid != pid) { 317865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "locking pid is wrong, should be %d is %d", 318865695bbc89088b9526ea9045410e5afb70a985cplars pid, fl.l_pid); 319134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 320865695bbc89088b9526ea9045410e5afb70a985cplars } 32143337a3cf6f8809647cf9fc6c0054241f44b1fb1subrata_modak return 0; 322865695bbc89088b9526ea9045410e5afb70a985cplars} 323865695bbc89088b9526ea9045410e5afb70a985cplars 32456207cec7732e09c216c751c0b5f88a242bacae6subrata_modakchar *str_type(int type) 325865695bbc89088b9526ea9045410e5afb70a985cplars{ 326865695bbc89088b9526ea9045410e5afb70a985cplars static char buf[20]; 327865695bbc89088b9526ea9045410e5afb70a985cplars 328865695bbc89088b9526ea9045410e5afb70a985cplars switch (type) { 329db63921767012310af15f29035a334e50486292cmridge case F_RDLCK: 33056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak return ("F_RDLCK"); 331db63921767012310af15f29035a334e50486292cmridge case F_WRLCK: 33256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak return ("F_WRLCK"); 333db63921767012310af15f29035a334e50486292cmridge case F_UNLCK: 33456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak return ("F_UNLCK"); 335865695bbc89088b9526ea9045410e5afb70a985cplars default: 336865695bbc89088b9526ea9045410e5afb70a985cplars sprintf(buf, "BAD VALUE: %d", type); 33756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak return (buf); 338865695bbc89088b9526ea9045410e5afb70a985cplars } 339865695bbc89088b9526ea9045410e5afb70a985cplars} 340865695bbc89088b9526ea9045410e5afb70a985cplars 34156207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid parent_free(int arg) 342865695bbc89088b9526ea9045410e5afb70a985cplars{ 343865695bbc89088b9526ea9045410e5afb70a985cplars if (write(parent_pipe[1], &arg, sizeof(arg)) != sizeof(arg)) { 344865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "couldn't send message to parent"); 345865695bbc89088b9526ea9045410e5afb70a985cplars exit(1); 346865695bbc89088b9526ea9045410e5afb70a985cplars } 347865695bbc89088b9526ea9045410e5afb70a985cplars} 348865695bbc89088b9526ea9045410e5afb70a985cplars 349c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingerint parent_wait(void) 350865695bbc89088b9526ea9045410e5afb70a985cplars{ 351865695bbc89088b9526ea9045410e5afb70a985cplars int arg; 352865695bbc89088b9526ea9045410e5afb70a985cplars 353865695bbc89088b9526ea9045410e5afb70a985cplars if (read(parent_pipe[0], &arg, sizeof(arg)) != sizeof(arg)) { 354865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "parent_wait() failed"); 35556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak return (errno); 356865695bbc89088b9526ea9045410e5afb70a985cplars } 35756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak return (arg); 358865695bbc89088b9526ea9045410e5afb70a985cplars} 359865695bbc89088b9526ea9045410e5afb70a985cplars 36056207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid child_free(int fd, int arg) 361865695bbc89088b9526ea9045410e5afb70a985cplars{ 362865695bbc89088b9526ea9045410e5afb70a985cplars if (write(fd, &arg, sizeof(arg)) != sizeof(arg)) { 363865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "couldn't send message to child"); 364865695bbc89088b9526ea9045410e5afb70a985cplars exit(1); 365865695bbc89088b9526ea9045410e5afb70a985cplars } 366865695bbc89088b9526ea9045410e5afb70a985cplars} 367865695bbc89088b9526ea9045410e5afb70a985cplars 36856207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid child_wait(int fd) 369865695bbc89088b9526ea9045410e5afb70a985cplars{ 370865695bbc89088b9526ea9045410e5afb70a985cplars int arg; 371865695bbc89088b9526ea9045410e5afb70a985cplars 372865695bbc89088b9526ea9045410e5afb70a985cplars if (read(fd, &arg, sizeof(arg)) != sizeof(arg)) { 373865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "couldn't get message from parent"); 374865695bbc89088b9526ea9045410e5afb70a985cplars exit(1); 375865695bbc89088b9526ea9045410e5afb70a985cplars } else if (arg == (short)STOP) { 376865695bbc89088b9526ea9045410e5afb70a985cplars exit(0); 377865695bbc89088b9526ea9045410e5afb70a985cplars } 378865695bbc89088b9526ea9045410e5afb70a985cplars} 379865695bbc89088b9526ea9045410e5afb70a985cplars 380c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid stop_children(void) 381865695bbc89088b9526ea9045410e5afb70a985cplars{ 382865695bbc89088b9526ea9045410e5afb70a985cplars int arg; 383865695bbc89088b9526ea9045410e5afb70a985cplars 384e61ddbaf9b02e1f4f94f4708551ecc825c1ac1d7Mike Frysinger signal(SIGCLD, SIG_DFL); 385865695bbc89088b9526ea9045410e5afb70a985cplars arg = STOP; 386865695bbc89088b9526ea9045410e5afb70a985cplars child_free(child_pipe1[1], arg); 387865695bbc89088b9526ea9045410e5afb70a985cplars child_free(child_pipe2[1], arg); 388865695bbc89088b9526ea9045410e5afb70a985cplars child_free(child_pipe3[1], arg); 389865695bbc89088b9526ea9045410e5afb70a985cplars wait(0); 390865695bbc89088b9526ea9045410e5afb70a985cplars} 391865695bbc89088b9526ea9045410e5afb70a985cplars 392c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid catch_child(void) 393865695bbc89088b9526ea9045410e5afb70a985cplars{ 394865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "Unexpected death of child process"); 395865695bbc89088b9526ea9045410e5afb70a985cplars cleanup(); 396354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao} 397865695bbc89088b9526ea9045410e5afb70a985cplars 398c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid catch_alarm(void) 399865695bbc89088b9526ea9045410e5afb70a985cplars{ 40056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak sighold(SIGCHLD); 401865695bbc89088b9526ea9045410e5afb70a985cplars /* 402865695bbc89088b9526ea9045410e5afb70a985cplars * Timer has runout and the children have not detected the deadlock. 403865695bbc89088b9526ea9045410e5afb70a985cplars * Need to kill the kids and exit 404865695bbc89088b9526ea9045410e5afb70a985cplars */ 40556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (child_pid1 != 0 && (kill(child_pid1, SIGKILL)) < 0) { 406865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "Attempt to signal child 1 failed."); 407865695bbc89088b9526ea9045410e5afb70a985cplars } 408865695bbc89088b9526ea9045410e5afb70a985cplars 40956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (child_pid2 != 0 && (kill(child_pid2, SIGKILL)) < 0) { 410db63921767012310af15f29035a334e50486292cmridge tst_resm(TFAIL, "Attempt to signal child 2 failed."); 411db63921767012310af15f29035a334e50486292cmridge } 41256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (child_pid3 != 0 && (kill(child_pid3, SIGKILL)) < 0) { 413865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "Attempt to signal child 2 failed."); 414865695bbc89088b9526ea9045410e5afb70a985cplars } 41556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TFAIL, "Alarm expired, deadlock not detected"); 41656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TWARN, "You may need to kill child processes by hand"); 417865695bbc89088b9526ea9045410e5afb70a985cplars cleanup(); 418354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao} 4195aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 4205aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewint main(int ac, char **av) 4215aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{ 4225aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew int ans; 42389af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis int lc; 4245aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew int fail = 0; 4255aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 426d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis tst_parse_opts(ac, av, NULL, NULL); 427d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX 428d34d581c6a320e356a6cda923c7aa399479e812crobbiew maybe_run_child(&do_child1, "nddddddddd", 1, &file_fd, 429d34d581c6a320e356a6cda923c7aa399479e812crobbiew &parent_pipe[0], &parent_pipe[1], 430d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe1[0], &child_pipe1[1], 431d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe2[0], &child_pipe2[1], 432d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe3[0], &child_pipe3[1]); 433d34d581c6a320e356a6cda923c7aa399479e812crobbiew maybe_run_child(&do_child2, "nddddddddd", 2, &file_fd, 434d34d581c6a320e356a6cda923c7aa399479e812crobbiew &parent_pipe[0], &parent_pipe[1], 435d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe1[0], &child_pipe1[1], 436d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe2[0], &child_pipe2[1], 437d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe3[0], &child_pipe3[1]); 438d34d581c6a320e356a6cda923c7aa399479e812crobbiew maybe_run_child(&do_child3, "nddddddddd", 3, &file_fd, 439d34d581c6a320e356a6cda923c7aa399479e812crobbiew &parent_pipe[0], &parent_pipe[1], 440d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe1[0], &child_pipe1[1], 441d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe2[0], &child_pipe2[1], 442d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe3[0], &child_pipe3[1]); 443d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif 444d34d581c6a320e356a6cda923c7aa399479e812crobbiew 44556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (setup()) { /* global testup */ 4465aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "setup failed"); 4475aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew cleanup(); 448354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 4495aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 4505aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* check for looping state if -i option is given */ 4515aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew for (lc = 0; TEST_LOOPING(lc); lc++) { 452d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang /* reset tst_count in case we are looping */ 453d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count = 0; 4545aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 4555aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "Enter preparation phase"); 456d34d581c6a320e356a6cda923c7aa399479e812crobbiew if ((child_pid1 = FORK_OR_VFORK()) == 0) { /* first child */ 457d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX 458d34d581c6a320e356a6cda923c7aa399479e812crobbiew if (self_exec(av[0], "nddddddddd", 1, file_fd, 459d34d581c6a320e356a6cda923c7aa399479e812crobbiew parent_pipe[0], parent_pipe[1], 460d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe1[0], child_pipe1[1], 461d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe2[0], child_pipe2[1], 462d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe3[0], child_pipe3[1]) < 0) { 463d34d581c6a320e356a6cda923c7aa399479e812crobbiew perror("self_exec failed, child 1"); 464d34d581c6a320e356a6cda923c7aa399479e812crobbiew cleanup(); 465d34d581c6a320e356a6cda923c7aa399479e812crobbiew } 466d34d581c6a320e356a6cda923c7aa399479e812crobbiew#else 4675aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew do_child1(); 468d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif 4695aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } else if (child_pid1 < 0) { 4705aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew perror("Fork failed: child 1"); 4715aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew cleanup(); 472354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 4735aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 4745aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* parent */ 4755aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 4765aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if ((child_pid2 = fork()) == 0) { /* second child */ 477d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX 478d34d581c6a320e356a6cda923c7aa399479e812crobbiew if (self_exec(av[0], "nddddddddd", 2, file_fd, 479d34d581c6a320e356a6cda923c7aa399479e812crobbiew parent_pipe[0], parent_pipe[1], 480d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe1[0], child_pipe1[1], 481d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe2[0], child_pipe2[1], 482d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe3[0], child_pipe3[1]) < 0) { 483d34d581c6a320e356a6cda923c7aa399479e812crobbiew perror("self_exec failed, child 2"); 484d34d581c6a320e356a6cda923c7aa399479e812crobbiew cleanup(); 485d34d581c6a320e356a6cda923c7aa399479e812crobbiew } 486d34d581c6a320e356a6cda923c7aa399479e812crobbiew#else 4875aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew do_child2(); 488d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif 4895aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } else if (child_pid2 < 0) { 4905aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew perror("Fork failed: child 2"); 4915aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if ((kill(child_pid1, SIGKILL)) < 0) { 4925aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TFAIL, "Attempt to signal child " 4935aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew "1 failed"); 4945aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 4955aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew cleanup(); 496354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 4975aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 4985aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* parent */ 4995aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 5005aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if ((child_pid3 = fork()) == 0) { /* third child */ 501d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX 502d34d581c6a320e356a6cda923c7aa399479e812crobbiew if (self_exec(av[0], "nddddddddd", 3, file_fd, 503d34d581c6a320e356a6cda923c7aa399479e812crobbiew parent_pipe[0], parent_pipe[1], 504d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe1[0], child_pipe1[1], 505d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe2[0], child_pipe2[1], 506d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe3[0], child_pipe3[1]) < 0) { 507d34d581c6a320e356a6cda923c7aa399479e812crobbiew perror("self_exec failed, child 3"); 508d34d581c6a320e356a6cda923c7aa399479e812crobbiew cleanup(); 509d34d581c6a320e356a6cda923c7aa399479e812crobbiew } 510d34d581c6a320e356a6cda923c7aa399479e812crobbiew#else 511d34d581c6a320e356a6cda923c7aa399479e812crobbiew do_child3(); 512d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif 5135aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew do_child3(); 5145aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } else if (child_pid3 < 0) { 5155aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew perror("Fork failed: child 3"); 5165aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if ((kill(child_pid1, SIGKILL)) < 0) { 5175aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TFAIL, "Attempt to signal child " 5185aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew "1 failed"); 5195aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 5205aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if ((kill(child_pid2, SIGKILL)) < 0) { 5215aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TFAIL, "Attempt to signal child 2 " 5225aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew "failed"); 5235aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 5245aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew cleanup(); 525354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao } 5265aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* parent */ 5275aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 5285aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew close(parent_pipe[1]); 5295aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew close(child_pipe1[0]); 5305aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew close(child_pipe2[0]); 5315aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew close(child_pipe3[0]); 5325aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "Exit preparation phase"); 5335aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 534db63921767012310af15f29035a334e50486292cmridge/* //block1: */ 5355aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "Enter block 1"); 5365aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 0; 5375aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 5385aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * child 1 puts first lock (bytes 2-7) 5395aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 5405aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew child_free(child_pipe1[1], 0); 5415aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (parent_wait()) { 5425aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TFAIL, "didn't set first child's lock, " 5435aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew "errno: %d", errno); 5445aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 5455aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (do_test(&lock1, child_pid1)) { 5465aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "do_test failed child 1"); 5475aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 1; 5485aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 5495aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 5505aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 5515aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * child 2 puts second lock (bytes 9-14) 5525aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 5535aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew child_free(child_pipe2[1], 0); 5545aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (parent_wait()) { 5555aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "didn't set second child's lock, " 5565aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew "errno: %d", errno); 5575aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 1; 5585aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 5595aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (do_test(&lock2, child_pid2)) { 5605aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "do_test failed child 2"); 5615aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 1; 5625aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 5635aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 5645aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 5655aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * child 3 puts third lock (bytes 17-22) 5665aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 5675aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew child_free(child_pipe3[1], 0); 5685aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (parent_wait()) { 5695aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TFAIL, "didn't set third child's lock, " 5705aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew "errno: %d", errno); 5715aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 1; 5725aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 5735aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (do_test(&lock3, child_pid3)) { 5745aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "do_test failed child 3"); 5755aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 1; 5765aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 5775aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 5785aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 5795aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * child 2 tries to lock same range as 5805aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * child 3's first lock. 5815aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 5825aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew child_free(child_pipe2[1], 0); 5835aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 5845aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 5855aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * child 3 tries to lock same range as 5865aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * child 1 and child 2's first locks. 5875aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 5885aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew child_free(child_pipe3[1], 0); 5895aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 5905aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 5915aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * Tell child 1 to release its lock. This should cause a 5925aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * delayed deadlock between child 2 and child 3. 5935aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 5945aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew child_free(child_pipe1[1], 0); 5955aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 5965aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 5975aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * Setup an alarm to go off in case the deadlock is not 5985aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * detected 5995aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 6005aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew alarm(TIME_OUT); 6015aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 6025aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 6035aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * should get a message from child 3 telling that its 6045aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * second lock EDEADLOCK 6055aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 6065aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if ((ans = parent_wait()) != EDEADLK) { 6075aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TFAIL, "child 2 didn't deadlock, " 6085aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew "returned: %d", ans); 6095aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 1; 6105aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 6115aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 6125aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 6135aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * Double check that lock 2 and lock 3 are still right 6145aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 6155aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew do_test(&lock2, child_pid2); 6165aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew do_test(&lock3, child_pid3); 6175aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 6185aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew stop_children(); 6195aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (fail) { 6205aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "Block 1 FAILED"); 6215aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } else { 6225aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "Block 1 PASSED"); 6235aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 6245aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "Exit block 1"); 6255aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 6265aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew waitpid(child_pid1, &child_stat, 0); 6275aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew waitpid(child_pid2, &child_stat, 0); 6285aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew waitpid(child_pid3, &child_stat, 0); 6295aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew cleanup(); 6302c28215423293e443469a07ae7011135d058b671Garrett Cooper tst_exit(); 631ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman} 632