fcntl17.c revision 4bb656a129f7507823e9e6d6b98b1a02fd80ef89
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 17865695bbc89088b9526ea9045410e5afb70a985cplars * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18865695bbc89088b9526ea9045410e5afb70a985cplars */ 19865695bbc89088b9526ea9045410e5afb70a985cplars 20865695bbc89088b9526ea9045410e5afb70a985cplars/* 21865695bbc89088b9526ea9045410e5afb70a985cplars * NAME 2207635bca720b53e75ffe5b6cb3502e8954cad0bcplars * fcntl17.c 23865695bbc89088b9526ea9045410e5afb70a985cplars * 24865695bbc89088b9526ea9045410e5afb70a985cplars * DESCRIPTION 25865695bbc89088b9526ea9045410e5afb70a985cplars * Check deadlock detection for file locking 26865695bbc89088b9526ea9045410e5afb70a985cplars * 27865695bbc89088b9526ea9045410e5afb70a985cplars * ALGORITHM 28865695bbc89088b9526ea9045410e5afb70a985cplars * The parent forks off 3 children. The parent controls the children 29865695bbc89088b9526ea9045410e5afb70a985cplars * with messages via pipes to create a delayed deadlock between the 30865695bbc89088b9526ea9045410e5afb70a985cplars * second and third child. 31865695bbc89088b9526ea9045410e5afb70a985cplars * 32865695bbc89088b9526ea9045410e5afb70a985cplars * USAGE 3307635bca720b53e75ffe5b6cb3502e8954cad0bcplars * 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 455b31d1bb1f8c30e3cb6555d4f88ffff96ba04352vapier# 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> 545aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew#include "test.h" 555aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew#include "usctest.h" 56865695bbc89088b9526ea9045410e5afb70a985cplars 5707635bca720b53e75ffe5b6cb3502e8954cad0bcplarschar *TCID = "fcntl17"; 58865695bbc89088b9526ea9045410e5afb70a985cplarsint TST_TOTAL = 1; 59865695bbc89088b9526ea9045410e5afb70a985cplarsextern int Tst_count; 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; 74865695bbc89088b9526ea9045410e5afb70a985cplarsstruct flock lock1 = { (short)F_WRLCK, (short)0, 2, 5, (short)0 }; 75865695bbc89088b9526ea9045410e5afb70a985cplarsstruct flock lock2 = { (short)F_WRLCK, (short)0, 9, 5, (short)0 }; 76865695bbc89088b9526ea9045410e5afb70a985cplarsstruct flock lock3 = { (short)F_WRLCK, (short)0, 17, 5, (short)0 }; 77865695bbc89088b9526ea9045410e5afb70a985cplarsstruct flock lock4 = { (short)F_WRLCK, (short)0, 17, 5, (short)0 }; 78865695bbc89088b9526ea9045410e5afb70a985cplarsstruct flock lock5 = { (short)F_WRLCK, (short)0, 2, 14, (short)0 }; 79865695bbc89088b9526ea9045410e5afb70a985cplarsstruct 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 975aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewint setup() 98865695bbc89088b9526ea9045410e5afb70a985cplars{ 99865695bbc89088b9526ea9045410e5afb70a985cplars char *buf = STRING; 100dad2271b03625d8d549ede28a8792c6a7836cc54robbiew char template[PATH_MAX]; 1011e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew struct sigaction act; 102865695bbc89088b9526ea9045410e5afb70a985cplars 103865695bbc89088b9526ea9045410e5afb70a985cplars tst_sig(FORK, DEF_HANDLER, NULL); /* capture signals */ 104865695bbc89088b9526ea9045410e5afb70a985cplars umask(0); 105865695bbc89088b9526ea9045410e5afb70a985cplars TEST_PAUSE; /* Pause if that option is specified */ 106865695bbc89088b9526ea9045410e5afb70a985cplars tst_tmpdir(); /* make temp dir and cd to it */ 107865695bbc89088b9526ea9045410e5afb70a985cplars 108caccaf23298a7d0f34d4b68cd6619435def51a7eplars if(pipe(parent_pipe) < 0) { 1094bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak tst_resm(TFAIL, "Couldn't create parent_pipe! errno = %d", 110caccaf23298a7d0f34d4b68cd6619435def51a7eplars errno); 111134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 112caccaf23298a7d0f34d4b68cd6619435def51a7eplars } 113caccaf23298a7d0f34d4b68cd6619435def51a7eplars if(pipe(child_pipe1) < 0) { 1144bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak tst_resm(TFAIL, "Couldn't create child_pipe1! errno = %d", 115caccaf23298a7d0f34d4b68cd6619435def51a7eplars errno); 116134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 117caccaf23298a7d0f34d4b68cd6619435def51a7eplars } 118caccaf23298a7d0f34d4b68cd6619435def51a7eplars if(pipe(child_pipe2) < 0) { 1194bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak tst_resm(TFAIL, "Couldn't create child_pipe2! errno = %d", 120caccaf23298a7d0f34d4b68cd6619435def51a7eplars errno); 121134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 122caccaf23298a7d0f34d4b68cd6619435def51a7eplars } 123caccaf23298a7d0f34d4b68cd6619435def51a7eplars 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 131dad2271b03625d8d549ede28a8792c6a7836cc54robbiew if ((file_fd = mkstemp(template)) < 0) { 132dad2271b03625d8d549ede28a8792c6a7836cc54robbiew tst_resm(TFAIL, "Couldn't open temp file! errno = %d", errno); 133dad2271b03625d8d549ede28a8792c6a7836cc54robbiew } 134865695bbc89088b9526ea9045410e5afb70a985cplars 135dad2271b03625d8d549ede28a8792c6a7836cc54robbiew if (write(file_fd, buf, STRINGSIZE) < 0) { 136dad2271b03625d8d549ede28a8792c6a7836cc54robbiew tst_resm(TFAIL, "Couldn't write to temp file! errno = %d", errno); 137dad2271b03625d8d549ede28a8792c6a7836cc54robbiew } 138865695bbc89088b9526ea9045410e5afb70a985cplars 1391e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew memset(&act, 0, sizeof(act)); 1401e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew act.sa_handler = catch_alarm; 1411e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew sigemptyset(&act.sa_mask); 1421e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew sigaddset(&act.sa_mask, SIGALRM); 1431e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew if (sigaction(SIGALRM, &act, NULL) < 0) { 144865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "SIGALRM signal setup failed, errno: %d", 145865695bbc89088b9526ea9045410e5afb70a985cplars errno); 146134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 147865695bbc89088b9526ea9045410e5afb70a985cplars } 148865695bbc89088b9526ea9045410e5afb70a985cplars 1491e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew memset(&act, 0, sizeof(act)); 1501e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew act.sa_handler = catch_child; 1511e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew sigemptyset(&act.sa_mask); 1521e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew sigaddset(&act.sa_mask, SIGCLD); 1531e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew if (sigaction(SIGCLD, &act, NULL) < 0) { 154865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "SIGCLD signal setup failed, errno: %d", 155865695bbc89088b9526ea9045410e5afb70a985cplars errno); 156134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 157865695bbc89088b9526ea9045410e5afb70a985cplars } 15843337a3cf6f8809647cf9fc6c0054241f44b1fb1subrata_modak return 0; 159865695bbc89088b9526ea9045410e5afb70a985cplars} 160865695bbc89088b9526ea9045410e5afb70a985cplars 161865695bbc89088b9526ea9045410e5afb70a985cplarsvoid 162865695bbc89088b9526ea9045410e5afb70a985cplarscleanup() 163865695bbc89088b9526ea9045410e5afb70a985cplars{ 16422c9044a80985480b6e10f9d46af8f7828457d70mridge close(file_fd); 165865695bbc89088b9526ea9045410e5afb70a985cplars tst_rmdir(); 166865695bbc89088b9526ea9045410e5afb70a985cplars tst_exit(); 167865695bbc89088b9526ea9045410e5afb70a985cplars} 168865695bbc89088b9526ea9045410e5afb70a985cplars 169865695bbc89088b9526ea9045410e5afb70a985cplarsvoid 170865695bbc89088b9526ea9045410e5afb70a985cplarsdo_child1() 171865695bbc89088b9526ea9045410e5afb70a985cplars{ 172db63921767012310af15f29035a334e50486292cmridge int err; 173db63921767012310af15f29035a334e50486292cmridge 174865695bbc89088b9526ea9045410e5afb70a985cplars close(parent_pipe[0]); 175865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe1[1]); 176865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe2[0]); 177865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe2[1]); 178865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe3[0]); 179865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe3[1]); 180865695bbc89088b9526ea9045410e5afb70a985cplars 181865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe1[0]); 182db63921767012310af15f29035a334e50486292cmridge tst_resm(TINFO, "child 1 starting"); 183865695bbc89088b9526ea9045410e5afb70a985cplars if (fcntl(file_fd, F_SETLK, &lock1) < 0) { 184db63921767012310af15f29035a334e50486292cmridge err = errno; 185db63921767012310af15f29035a334e50486292cmridge tst_resm(TINFO, "child 1 lock err %d", err); 186db63921767012310af15f29035a334e50486292cmridge parent_free(err); 187865695bbc89088b9526ea9045410e5afb70a985cplars } else { 188db63921767012310af15f29035a334e50486292cmridge tst_resm(TINFO, "child 1 pid %d locked", getpid()); 189865695bbc89088b9526ea9045410e5afb70a985cplars parent_free(0); 190865695bbc89088b9526ea9045410e5afb70a985cplars } 191865695bbc89088b9526ea9045410e5afb70a985cplars 192865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe1[0]); 193db63921767012310af15f29035a334e50486292cmridge tst_resm(TINFO, "child 1 resuming"); 194865695bbc89088b9526ea9045410e5afb70a985cplars fcntl(file_fd, F_SETLK, &unlock); 195db63921767012310af15f29035a334e50486292cmridge tst_resm(TINFO, "child 1 unlocked"); 196865695bbc89088b9526ea9045410e5afb70a985cplars 197865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe1[0]); 198db63921767012310af15f29035a334e50486292cmridge tst_resm(TINFO, "child 1 exiting"); 199865695bbc89088b9526ea9045410e5afb70a985cplars exit(1); 200865695bbc89088b9526ea9045410e5afb70a985cplars} 201865695bbc89088b9526ea9045410e5afb70a985cplars 202865695bbc89088b9526ea9045410e5afb70a985cplarsvoid 203865695bbc89088b9526ea9045410e5afb70a985cplarsdo_child2() 204865695bbc89088b9526ea9045410e5afb70a985cplars{ 205db63921767012310af15f29035a334e50486292cmridge int err; 206db63921767012310af15f29035a334e50486292cmridge 207865695bbc89088b9526ea9045410e5afb70a985cplars close(parent_pipe[0]); 208865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe1[0]); 209865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe1[1]); 210865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe2[1]); 211865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe3[0]); 212865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe3[1]); 213865695bbc89088b9526ea9045410e5afb70a985cplars 214865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe2[0]); 215db63921767012310af15f29035a334e50486292cmridge tst_resm(TINFO, "child 2 starting"); 216865695bbc89088b9526ea9045410e5afb70a985cplars if (fcntl(file_fd, F_SETLK, &lock2) < 0) { 217db63921767012310af15f29035a334e50486292cmridge err = errno; 218db63921767012310af15f29035a334e50486292cmridge tst_resm(TINFO, "child 2 lock err %d", err); 219db63921767012310af15f29035a334e50486292cmridge parent_free(err); 220865695bbc89088b9526ea9045410e5afb70a985cplars } else { 221db63921767012310af15f29035a334e50486292cmridge tst_resm(TINFO, "child 2 pid %d locked", getpid()); 222865695bbc89088b9526ea9045410e5afb70a985cplars parent_free(0); 223865695bbc89088b9526ea9045410e5afb70a985cplars } 224865695bbc89088b9526ea9045410e5afb70a985cplars 225865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe2[0]); 226db63921767012310af15f29035a334e50486292cmridge tst_resm(TINFO, "child 2 resuming"); 227865695bbc89088b9526ea9045410e5afb70a985cplars if (fcntl(file_fd, F_SETLKW, &lock4) < 0) { 228db63921767012310af15f29035a334e50486292cmridge err = errno; 229db63921767012310af15f29035a334e50486292cmridge tst_resm(TINFO, "child 2 lockw err %d", err); 230db63921767012310af15f29035a334e50486292cmridge parent_free(err); 231865695bbc89088b9526ea9045410e5afb70a985cplars } else { 232db63921767012310af15f29035a334e50486292cmridge tst_resm(TINFO, "child 2 lockw locked"); 233865695bbc89088b9526ea9045410e5afb70a985cplars parent_free(0); 234865695bbc89088b9526ea9045410e5afb70a985cplars } 235865695bbc89088b9526ea9045410e5afb70a985cplars 236865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe2[0]); 237db63921767012310af15f29035a334e50486292cmridge tst_resm(TINFO, "child 2 exiting"); 238865695bbc89088b9526ea9045410e5afb70a985cplars exit(1); 239865695bbc89088b9526ea9045410e5afb70a985cplars} 240865695bbc89088b9526ea9045410e5afb70a985cplars 241865695bbc89088b9526ea9045410e5afb70a985cplarsvoid 242865695bbc89088b9526ea9045410e5afb70a985cplarsdo_child3() 243865695bbc89088b9526ea9045410e5afb70a985cplars{ 244db63921767012310af15f29035a334e50486292cmridge int err; 245db63921767012310af15f29035a334e50486292cmridge 246865695bbc89088b9526ea9045410e5afb70a985cplars close(parent_pipe[0]); 247865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe1[0]); 248865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe1[1]); 249865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe2[0]); 250865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe2[1]); 251865695bbc89088b9526ea9045410e5afb70a985cplars close(child_pipe3[1]); 252865695bbc89088b9526ea9045410e5afb70a985cplars 253865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe3[0]); 254db63921767012310af15f29035a334e50486292cmridge tst_resm(TINFO, "child 3 starting"); 255865695bbc89088b9526ea9045410e5afb70a985cplars if (fcntl(file_fd, F_SETLK, &lock3) < 0) { 256db63921767012310af15f29035a334e50486292cmridge err = errno; 257db63921767012310af15f29035a334e50486292cmridge tst_resm(TINFO, "child 3 lock err %d", err); 258db63921767012310af15f29035a334e50486292cmridge parent_free(err); 259865695bbc89088b9526ea9045410e5afb70a985cplars } else { 260db63921767012310af15f29035a334e50486292cmridge tst_resm(TINFO, "child 3 pid %d locked", getpid()); 261865695bbc89088b9526ea9045410e5afb70a985cplars parent_free(0); 262865695bbc89088b9526ea9045410e5afb70a985cplars } 263865695bbc89088b9526ea9045410e5afb70a985cplars 264865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe3[0]); 265db63921767012310af15f29035a334e50486292cmridge tst_resm(TINFO, "child 3 resuming"); 266865695bbc89088b9526ea9045410e5afb70a985cplars if (fcntl(file_fd, F_SETLKW, &lock5) < 0) { 267db63921767012310af15f29035a334e50486292cmridge err = errno; 268db63921767012310af15f29035a334e50486292cmridge tst_resm(TINFO, "child 3 lockw err %d", err); 269db63921767012310af15f29035a334e50486292cmridge parent_free(err); 270865695bbc89088b9526ea9045410e5afb70a985cplars } else { 271db63921767012310af15f29035a334e50486292cmridge tst_resm(TINFO, "child 3 lockw locked"); 272865695bbc89088b9526ea9045410e5afb70a985cplars parent_free(0); 273865695bbc89088b9526ea9045410e5afb70a985cplars } 274865695bbc89088b9526ea9045410e5afb70a985cplars 275865695bbc89088b9526ea9045410e5afb70a985cplars child_wait(child_pipe3[0]); 276db63921767012310af15f29035a334e50486292cmridge tst_resm(TINFO, "child 3 exiting"); 277865695bbc89088b9526ea9045410e5afb70a985cplars exit(1); 278865695bbc89088b9526ea9045410e5afb70a985cplars} 279865695bbc89088b9526ea9045410e5afb70a985cplars 280865695bbc89088b9526ea9045410e5afb70a985cplarsint 281f08488fd49050c1ac0c29014433db13714b7170asubrata_modakdo_test(struct flock *lock, pid_t pid) 282865695bbc89088b9526ea9045410e5afb70a985cplars{ 283865695bbc89088b9526ea9045410e5afb70a985cplars struct flock fl; 284865695bbc89088b9526ea9045410e5afb70a985cplars 285db63921767012310af15f29035a334e50486292cmridge fl.l_type = /* lock->l_type */ F_RDLCK; 286865695bbc89088b9526ea9045410e5afb70a985cplars fl.l_whence = lock->l_whence; 287865695bbc89088b9526ea9045410e5afb70a985cplars fl.l_start = lock->l_start; 288865695bbc89088b9526ea9045410e5afb70a985cplars fl.l_len = lock->l_len; 289865695bbc89088b9526ea9045410e5afb70a985cplars fl.l_pid = (short) 0; 290865695bbc89088b9526ea9045410e5afb70a985cplars if (fcntl(file_fd, F_GETLK, &fl) < 0) { 2914bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak tst_resm(TFAIL, "fcntl on file failed, errno =%d", 292865695bbc89088b9526ea9045410e5afb70a985cplars errno); 293134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 294865695bbc89088b9526ea9045410e5afb70a985cplars } 295865695bbc89088b9526ea9045410e5afb70a985cplars 296865695bbc89088b9526ea9045410e5afb70a985cplars if (fl.l_type != lock->l_type) { 297865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "lock type is wrong should be %s is %s", 298865695bbc89088b9526ea9045410e5afb70a985cplars str_type(lock->l_type), str_type(fl.l_type)); 299134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 300865695bbc89088b9526ea9045410e5afb70a985cplars } 301865695bbc89088b9526ea9045410e5afb70a985cplars 302865695bbc89088b9526ea9045410e5afb70a985cplars if (fl.l_whence != lock->l_whence) { 303865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "lock whence is wrong should be %d is %d", 304865695bbc89088b9526ea9045410e5afb70a985cplars lock->l_whence, fl.l_whence); 305134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 306865695bbc89088b9526ea9045410e5afb70a985cplars } 307865695bbc89088b9526ea9045410e5afb70a985cplars 308865695bbc89088b9526ea9045410e5afb70a985cplars if (fl.l_start != lock->l_start) { 309865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "region starts in wrong place, " 310865695bbc89088b9526ea9045410e5afb70a985cplars "should be %d is %d", lock->l_start, fl.l_start); 311134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 312865695bbc89088b9526ea9045410e5afb70a985cplars } 313865695bbc89088b9526ea9045410e5afb70a985cplars 314865695bbc89088b9526ea9045410e5afb70a985cplars if (fl.l_len != lock->l_len) { 315865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "region length is wrong, should be %d is %d", 316865695bbc89088b9526ea9045410e5afb70a985cplars lock->l_len, fl.l_len); 317134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 318865695bbc89088b9526ea9045410e5afb70a985cplars } 319865695bbc89088b9526ea9045410e5afb70a985cplars 320865695bbc89088b9526ea9045410e5afb70a985cplars if (fl.l_pid != pid) { 321865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "locking pid is wrong, should be %d is %d", 322865695bbc89088b9526ea9045410e5afb70a985cplars pid, fl.l_pid); 323134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak return 1; 324865695bbc89088b9526ea9045410e5afb70a985cplars } 32543337a3cf6f8809647cf9fc6c0054241f44b1fb1subrata_modak return 0; 326865695bbc89088b9526ea9045410e5afb70a985cplars} 327865695bbc89088b9526ea9045410e5afb70a985cplars 328865695bbc89088b9526ea9045410e5afb70a985cplarschar * 329865695bbc89088b9526ea9045410e5afb70a985cplarsstr_type(int type) 330865695bbc89088b9526ea9045410e5afb70a985cplars{ 331865695bbc89088b9526ea9045410e5afb70a985cplars static char buf[20]; 332865695bbc89088b9526ea9045410e5afb70a985cplars 333865695bbc89088b9526ea9045410e5afb70a985cplars switch (type) { 334db63921767012310af15f29035a334e50486292cmridge case F_RDLCK: 335865695bbc89088b9526ea9045410e5afb70a985cplars return("F_RDLCK"); 336db63921767012310af15f29035a334e50486292cmridge case F_WRLCK: 337865695bbc89088b9526ea9045410e5afb70a985cplars return("F_WRLCK"); 338db63921767012310af15f29035a334e50486292cmridge case F_UNLCK: 339865695bbc89088b9526ea9045410e5afb70a985cplars return("F_UNLCK"); 340865695bbc89088b9526ea9045410e5afb70a985cplars default: 341865695bbc89088b9526ea9045410e5afb70a985cplars sprintf(buf, "BAD VALUE: %d", type); 342865695bbc89088b9526ea9045410e5afb70a985cplars return(buf); 343865695bbc89088b9526ea9045410e5afb70a985cplars } 344865695bbc89088b9526ea9045410e5afb70a985cplars} 345865695bbc89088b9526ea9045410e5afb70a985cplars 346865695bbc89088b9526ea9045410e5afb70a985cplarsvoid 347865695bbc89088b9526ea9045410e5afb70a985cplarsparent_free(int arg) 348865695bbc89088b9526ea9045410e5afb70a985cplars{ 349865695bbc89088b9526ea9045410e5afb70a985cplars if (write(parent_pipe[1], &arg, sizeof(arg)) != sizeof(arg)) { 350865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "couldn't send message to parent"); 351865695bbc89088b9526ea9045410e5afb70a985cplars exit(1); 352865695bbc89088b9526ea9045410e5afb70a985cplars } 353865695bbc89088b9526ea9045410e5afb70a985cplars} 354865695bbc89088b9526ea9045410e5afb70a985cplars 3555aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewint parent_wait() 356865695bbc89088b9526ea9045410e5afb70a985cplars{ 357865695bbc89088b9526ea9045410e5afb70a985cplars int arg; 358865695bbc89088b9526ea9045410e5afb70a985cplars 359865695bbc89088b9526ea9045410e5afb70a985cplars if (read(parent_pipe[0], &arg, sizeof(arg)) != sizeof(arg)) { 360865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "parent_wait() failed"); 361865695bbc89088b9526ea9045410e5afb70a985cplars return(errno); 362865695bbc89088b9526ea9045410e5afb70a985cplars } 363865695bbc89088b9526ea9045410e5afb70a985cplars return(arg); 364865695bbc89088b9526ea9045410e5afb70a985cplars} 365865695bbc89088b9526ea9045410e5afb70a985cplars 366865695bbc89088b9526ea9045410e5afb70a985cplarsvoid 367865695bbc89088b9526ea9045410e5afb70a985cplarschild_free(int fd, int arg) 368865695bbc89088b9526ea9045410e5afb70a985cplars{ 369865695bbc89088b9526ea9045410e5afb70a985cplars if (write(fd, &arg, sizeof(arg)) != sizeof(arg)) { 370865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "couldn't send message to child"); 371865695bbc89088b9526ea9045410e5afb70a985cplars exit(1); 372865695bbc89088b9526ea9045410e5afb70a985cplars } 373865695bbc89088b9526ea9045410e5afb70a985cplars} 374865695bbc89088b9526ea9045410e5afb70a985cplars 375865695bbc89088b9526ea9045410e5afb70a985cplarsvoid 376865695bbc89088b9526ea9045410e5afb70a985cplarschild_wait(int fd) 377865695bbc89088b9526ea9045410e5afb70a985cplars{ 378865695bbc89088b9526ea9045410e5afb70a985cplars int arg; 379865695bbc89088b9526ea9045410e5afb70a985cplars 380865695bbc89088b9526ea9045410e5afb70a985cplars if (read(fd, &arg, sizeof(arg)) != sizeof(arg)) { 381865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "couldn't get message from parent"); 382865695bbc89088b9526ea9045410e5afb70a985cplars exit(1); 383865695bbc89088b9526ea9045410e5afb70a985cplars } else if (arg == (short)STOP) { 384865695bbc89088b9526ea9045410e5afb70a985cplars exit(0); 385865695bbc89088b9526ea9045410e5afb70a985cplars } 386865695bbc89088b9526ea9045410e5afb70a985cplars} 387865695bbc89088b9526ea9045410e5afb70a985cplars 388865695bbc89088b9526ea9045410e5afb70a985cplarsvoid 389865695bbc89088b9526ea9045410e5afb70a985cplarsstop_children() 390865695bbc89088b9526ea9045410e5afb70a985cplars{ 391865695bbc89088b9526ea9045410e5afb70a985cplars int arg; 392865695bbc89088b9526ea9045410e5afb70a985cplars 393865695bbc89088b9526ea9045410e5afb70a985cplars (void) signal(SIGCLD, (void (*)())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); 398865695bbc89088b9526ea9045410e5afb70a985cplars wait(0); 399865695bbc89088b9526ea9045410e5afb70a985cplars} 400865695bbc89088b9526ea9045410e5afb70a985cplars 401865695bbc89088b9526ea9045410e5afb70a985cplarsvoid 402865695bbc89088b9526ea9045410e5afb70a985cplarscatch_child() 403865695bbc89088b9526ea9045410e5afb70a985cplars{ 404865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "Unexpected death of child process"); 405865695bbc89088b9526ea9045410e5afb70a985cplars cleanup(); 406865695bbc89088b9526ea9045410e5afb70a985cplars /*NOTREACHED*/ 407865695bbc89088b9526ea9045410e5afb70a985cplars} 408865695bbc89088b9526ea9045410e5afb70a985cplars 409865695bbc89088b9526ea9045410e5afb70a985cplarsvoid 410865695bbc89088b9526ea9045410e5afb70a985cplarscatch_alarm() 411865695bbc89088b9526ea9045410e5afb70a985cplars{ 412db63921767012310af15f29035a334e50486292cmridge sighold(SIGCHLD); 413865695bbc89088b9526ea9045410e5afb70a985cplars /* 414865695bbc89088b9526ea9045410e5afb70a985cplars * Timer has runout and the children have not detected the deadlock. 415865695bbc89088b9526ea9045410e5afb70a985cplars * Need to kill the kids and exit 416865695bbc89088b9526ea9045410e5afb70a985cplars */ 4174bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak if (child_pid1 != 0 && 418db63921767012310af15f29035a334e50486292cmridge (kill(child_pid1, SIGKILL)) < 0) { 419865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "Attempt to signal child 1 failed."); 420865695bbc89088b9526ea9045410e5afb70a985cplars } 421865695bbc89088b9526ea9045410e5afb70a985cplars 4224bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak if (child_pid2 != 0 && 423db63921767012310af15f29035a334e50486292cmridge (kill(child_pid2, SIGKILL)) < 0) { 424db63921767012310af15f29035a334e50486292cmridge tst_resm(TFAIL, "Attempt to signal child 2 failed."); 425db63921767012310af15f29035a334e50486292cmridge } 426db63921767012310af15f29035a334e50486292cmridge if (child_pid3 != 0 && 427db63921767012310af15f29035a334e50486292cmridge (kill(child_pid3, SIGKILL)) < 0) { 428865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "Attempt to signal child 2 failed."); 429865695bbc89088b9526ea9045410e5afb70a985cplars } 430db63921767012310af15f29035a334e50486292cmridge tst_resm(TFAIL, "Alarm expired, deadlock not detected"); 431db63921767012310af15f29035a334e50486292cmridge tst_resm(TWARN, "You may need to kill child processes by hand"); 432865695bbc89088b9526ea9045410e5afb70a985cplars cleanup(); 433865695bbc89088b9526ea9045410e5afb70a985cplars /*NOTREACHED*/ 434865695bbc89088b9526ea9045410e5afb70a985cplars} 4355aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 4365aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewint main(int ac, char **av) 4375aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{ 4385aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew int ans; 4395aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew int lc; /* loop counter */ 4405aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew char *msg; /* message returned from parse_opts */ 4415aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew int fail = 0; 4425aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 4435aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* parse standard options */ 4445aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ 4455aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); 4465aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 4475aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 448d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX 449d34d581c6a320e356a6cda923c7aa399479e812crobbiew maybe_run_child(&do_child1, "nddddddddd", 1, &file_fd, 450d34d581c6a320e356a6cda923c7aa399479e812crobbiew &parent_pipe[0], &parent_pipe[1], 451d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe1[0], &child_pipe1[1], 452d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe2[0], &child_pipe2[1], 453d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe3[0], &child_pipe3[1]); 454d34d581c6a320e356a6cda923c7aa399479e812crobbiew maybe_run_child(&do_child2, "nddddddddd", 2, &file_fd, 455d34d581c6a320e356a6cda923c7aa399479e812crobbiew &parent_pipe[0], &parent_pipe[1], 456d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe1[0], &child_pipe1[1], 457d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe2[0], &child_pipe2[1], 458d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe3[0], &child_pipe3[1]); 459d34d581c6a320e356a6cda923c7aa399479e812crobbiew maybe_run_child(&do_child3, "nddddddddd", 3, &file_fd, 460d34d581c6a320e356a6cda923c7aa399479e812crobbiew &parent_pipe[0], &parent_pipe[1], 461d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe1[0], &child_pipe1[1], 462d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe2[0], &child_pipe2[1], 463d34d581c6a320e356a6cda923c7aa399479e812crobbiew &child_pipe3[0], &child_pipe3[1]); 464d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif 465d34d581c6a320e356a6cda923c7aa399479e812crobbiew 4665aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (setup()) { /* global testup */ 4675aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "setup failed"); 4685aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew cleanup(); 4695aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /*NOTREACHED*/ 4705aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 4715aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 4725aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* check for looping state if -i option is given */ 4735aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew for (lc = 0; TEST_LOOPING(lc); lc++) { 4745aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* reset Tst_count in case we are looping */ 4755aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew Tst_count = 0; 4765aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 4775aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "Enter preparation phase"); 478d34d581c6a320e356a6cda923c7aa399479e812crobbiew if ((child_pid1 = FORK_OR_VFORK()) == 0) { /* first child */ 479d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX 480d34d581c6a320e356a6cda923c7aa399479e812crobbiew if (self_exec(av[0], "nddddddddd", 1, file_fd, 481d34d581c6a320e356a6cda923c7aa399479e812crobbiew parent_pipe[0], parent_pipe[1], 482d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe1[0], child_pipe1[1], 483d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe2[0], child_pipe2[1], 484d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe3[0], child_pipe3[1]) < 0) { 485d34d581c6a320e356a6cda923c7aa399479e812crobbiew perror("self_exec failed, child 1"); 486d34d581c6a320e356a6cda923c7aa399479e812crobbiew cleanup(); 487d34d581c6a320e356a6cda923c7aa399479e812crobbiew } 488d34d581c6a320e356a6cda923c7aa399479e812crobbiew#else 4895aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew do_child1(); 490d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif 4915aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } else if (child_pid1 < 0) { 4925aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew perror("Fork failed: child 1"); 4935aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew cleanup(); 4945aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /*NOTREACHED*/ 4955aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 4965aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 4975aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* parent */ 4985aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 4995aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if ((child_pid2 = fork()) == 0) { /* second child */ 500d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX 501d34d581c6a320e356a6cda923c7aa399479e812crobbiew if (self_exec(av[0], "nddddddddd", 2, file_fd, 502d34d581c6a320e356a6cda923c7aa399479e812crobbiew parent_pipe[0], parent_pipe[1], 503d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe1[0], child_pipe1[1], 504d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe2[0], child_pipe2[1], 505d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe3[0], child_pipe3[1]) < 0) { 506d34d581c6a320e356a6cda923c7aa399479e812crobbiew perror("self_exec failed, child 2"); 507d34d581c6a320e356a6cda923c7aa399479e812crobbiew cleanup(); 508d34d581c6a320e356a6cda923c7aa399479e812crobbiew } 509d34d581c6a320e356a6cda923c7aa399479e812crobbiew#else 5105aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew do_child2(); 511d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif 5125aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } else if (child_pid2 < 0) { 5135aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew perror("Fork failed: child 2"); 5145aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if ((kill(child_pid1, SIGKILL)) < 0) { 5155aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TFAIL, "Attempt to signal child " 5165aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew "1 failed"); 5175aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 5185aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew cleanup(); 5195aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /*NOTREACHED*/ 5205aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 5215aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 5225aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* parent */ 5235aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 5245aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if ((child_pid3 = fork()) == 0) { /* third child */ 525d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX 526d34d581c6a320e356a6cda923c7aa399479e812crobbiew if (self_exec(av[0], "nddddddddd", 3, file_fd, 527d34d581c6a320e356a6cda923c7aa399479e812crobbiew parent_pipe[0], parent_pipe[1], 528d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe1[0], child_pipe1[1], 529d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe2[0], child_pipe2[1], 530d34d581c6a320e356a6cda923c7aa399479e812crobbiew child_pipe3[0], child_pipe3[1]) < 0) { 531d34d581c6a320e356a6cda923c7aa399479e812crobbiew perror("self_exec failed, child 3"); 532d34d581c6a320e356a6cda923c7aa399479e812crobbiew cleanup(); 533d34d581c6a320e356a6cda923c7aa399479e812crobbiew } 534d34d581c6a320e356a6cda923c7aa399479e812crobbiew#else 535d34d581c6a320e356a6cda923c7aa399479e812crobbiew do_child3(); 536d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif 5375aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew do_child3(); 5385aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } else if (child_pid3 < 0) { 5395aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew perror("Fork failed: child 3"); 5405aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if ((kill(child_pid1, SIGKILL)) < 0) { 5415aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TFAIL, "Attempt to signal child " 5425aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew "1 failed"); 5435aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 5445aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if ((kill(child_pid2, SIGKILL)) < 0) { 5455aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TFAIL, "Attempt to signal child 2 " 5465aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew "failed"); 5475aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 5485aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew cleanup(); 5495aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /*NOTREACHED*/ 5505aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 5515aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* parent */ 5525aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 5535aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew close(parent_pipe[1]); 5545aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew close(child_pipe1[0]); 5555aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew close(child_pipe2[0]); 5565aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew close(child_pipe3[0]); 5575aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "Exit preparation phase"); 5585aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 559db63921767012310af15f29035a334e50486292cmridge/* //block1: */ 5605aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "Enter block 1"); 5615aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 0; 5625aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 5635aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * child 1 puts first lock (bytes 2-7) 5645aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 5655aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew child_free(child_pipe1[1], 0); 5665aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (parent_wait()) { 5675aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TFAIL, "didn't set first child's lock, " 5685aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew "errno: %d", errno); 5695aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 5705aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (do_test(&lock1, child_pid1)) { 5715aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "do_test failed child 1"); 5725aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 1; 5735aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 5745aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 5755aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 5765aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * child 2 puts second lock (bytes 9-14) 5775aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 5785aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew child_free(child_pipe2[1], 0); 5795aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (parent_wait()) { 5805aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "didn't set second child's lock, " 5815aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew "errno: %d", errno); 5825aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 1; 5835aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 5845aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (do_test(&lock2, child_pid2)) { 5855aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "do_test failed child 2"); 5865aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 1; 5875aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 5885aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 5895aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 5905aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * child 3 puts third lock (bytes 17-22) 5915aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 5925aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew child_free(child_pipe3[1], 0); 5935aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (parent_wait()) { 5945aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TFAIL, "didn't set third child's lock, " 5955aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew "errno: %d", errno); 5965aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 1; 5975aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 5985aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (do_test(&lock3, child_pid3)) { 5995aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "do_test failed child 3"); 6005aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 1; 6015aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 6025aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 6035aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 6045aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * child 2 tries to lock same range as 6055aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * child 3's first lock. 6065aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 6075aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew child_free(child_pipe2[1], 0); 6085aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 6095aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 6105aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * child 3 tries to lock same range as 6115aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * child 1 and child 2's first locks. 6125aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 6135aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew child_free(child_pipe3[1], 0); 6145aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 6155aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 6165aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * Tell child 1 to release its lock. This should cause a 6175aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * delayed deadlock between child 2 and child 3. 6185aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 6195aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew child_free(child_pipe1[1], 0); 6205aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 6215aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 6225aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * Setup an alarm to go off in case the deadlock is not 6235aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * detected 6245aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 6255aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew alarm(TIME_OUT); 6265aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 6275aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 6285aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * should get a message from child 3 telling that its 6295aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * second lock EDEADLOCK 6305aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 6315aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if ((ans = parent_wait()) != EDEADLK) { 6325aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TFAIL, "child 2 didn't deadlock, " 6335aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew "returned: %d", ans); 6345aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 1; 6355aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 6365aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 6375aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew /* 6385aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * Double check that lock 2 and lock 3 are still right 6395aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */ 6405aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew do_test(&lock2, child_pid2); 6415aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew do_test(&lock3, child_pid3); 6425aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 6435aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew stop_children(); 6445aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (fail) { 6455aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "Block 1 FAILED"); 6465aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } else { 6475aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "Block 1 PASSED"); 6485aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 6495aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TINFO, "Exit block 1"); 6505aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 6515aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew waitpid(child_pid1, &child_stat, 0); 6525aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew waitpid(child_pid2, &child_stat, 0); 6535aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew waitpid(child_pid3, &child_stat, 0); 6545aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew cleanup(); 65543337a3cf6f8809647cf9fc6c0054241f44b1fb1subrata_modak return 0; 6565aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew} 6575aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 658