xref: /aosp_15_r20/external/ltp/testcases/kernel/syscalls/fcntl/fcntl17.c (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
1*49cdfc7eSAndroid Build Coastguard Worker /*
2*49cdfc7eSAndroid Build Coastguard Worker  *
3*49cdfc7eSAndroid Build Coastguard Worker  *   Copyright (c) International Business Machines  Corp., 2001
4*49cdfc7eSAndroid Build Coastguard Worker  *
5*49cdfc7eSAndroid Build Coastguard Worker  *   This program is free software;  you can redistribute it and/or modify
6*49cdfc7eSAndroid Build Coastguard Worker  *   it under the terms of the GNU General Public License as published by
7*49cdfc7eSAndroid Build Coastguard Worker  *   the Free Software Foundation; either version 2 of the License, or
8*49cdfc7eSAndroid Build Coastguard Worker  *   (at your option) any later version.
9*49cdfc7eSAndroid Build Coastguard Worker  *
10*49cdfc7eSAndroid Build Coastguard Worker  *   This program is distributed in the hope that it will be useful,
11*49cdfc7eSAndroid Build Coastguard Worker  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
12*49cdfc7eSAndroid Build Coastguard Worker  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13*49cdfc7eSAndroid Build Coastguard Worker  *   the GNU General Public License for more details.
14*49cdfc7eSAndroid Build Coastguard Worker  *
15*49cdfc7eSAndroid Build Coastguard Worker  *   You should have received a copy of the GNU General Public License
16*49cdfc7eSAndroid Build Coastguard Worker  *   along with this program;  if not, write to the Free Software
17*49cdfc7eSAndroid Build Coastguard Worker  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18*49cdfc7eSAndroid Build Coastguard Worker  */
19*49cdfc7eSAndroid Build Coastguard Worker 
20*49cdfc7eSAndroid Build Coastguard Worker /*
21*49cdfc7eSAndroid Build Coastguard Worker  * NAME
22*49cdfc7eSAndroid Build Coastguard Worker  *	fcntl17.c
23*49cdfc7eSAndroid Build Coastguard Worker  *
24*49cdfc7eSAndroid Build Coastguard Worker  * DESCRIPTION
25*49cdfc7eSAndroid Build Coastguard Worker  *	Check deadlock detection for file locking
26*49cdfc7eSAndroid Build Coastguard Worker  *
27*49cdfc7eSAndroid Build Coastguard Worker  * ALGORITHM
28*49cdfc7eSAndroid Build Coastguard Worker  *	The parent forks off 3 children. The parent controls the children
29*49cdfc7eSAndroid Build Coastguard Worker  *	with messages via pipes to create a delayed deadlock between the
30*49cdfc7eSAndroid Build Coastguard Worker  *	second and third child.
31*49cdfc7eSAndroid Build Coastguard Worker  *
32*49cdfc7eSAndroid Build Coastguard Worker  * USAGE
33*49cdfc7eSAndroid Build Coastguard Worker  *	fcntl17
34*49cdfc7eSAndroid Build Coastguard Worker  *
35*49cdfc7eSAndroid Build Coastguard Worker  * HISTORY
36*49cdfc7eSAndroid Build Coastguard Worker  *	07/2001 Ported by Wayne Boyer
37*49cdfc7eSAndroid Build Coastguard Worker  *      04/2002 Minor fixes by William Jay Huie (testcase name
38*49cdfc7eSAndroid Build Coastguard Worker 		fcntl05 => fcntl17, check signal return for SIG_ERR)
39*49cdfc7eSAndroid Build Coastguard Worker  *
40*49cdfc7eSAndroid Build Coastguard Worker  * RESTRICTIONS
41*49cdfc7eSAndroid Build Coastguard Worker  *	None
42*49cdfc7eSAndroid Build Coastguard Worker  */
43*49cdfc7eSAndroid Build Coastguard Worker 
44*49cdfc7eSAndroid Build Coastguard Worker #ifndef _GNU_SOURCE
45*49cdfc7eSAndroid Build Coastguard Worker #define _GNU_SOURCE
46*49cdfc7eSAndroid Build Coastguard Worker #endif
47*49cdfc7eSAndroid Build Coastguard Worker 
48*49cdfc7eSAndroid Build Coastguard Worker #include <fcntl.h>
49*49cdfc7eSAndroid Build Coastguard Worker #include <errno.h>
50*49cdfc7eSAndroid Build Coastguard Worker #include <signal.h>
51*49cdfc7eSAndroid Build Coastguard Worker #include <sys/stat.h>
52*49cdfc7eSAndroid Build Coastguard Worker #include <sys/types.h>
53*49cdfc7eSAndroid Build Coastguard Worker #include <sys/wait.h>
54*49cdfc7eSAndroid Build Coastguard Worker #include <inttypes.h>
55*49cdfc7eSAndroid Build Coastguard Worker 
56*49cdfc7eSAndroid Build Coastguard Worker #include "test.h"
57*49cdfc7eSAndroid Build Coastguard Worker 
58*49cdfc7eSAndroid Build Coastguard Worker char *TCID = "fcntl17";
59*49cdfc7eSAndroid Build Coastguard Worker int TST_TOTAL = 1;
60*49cdfc7eSAndroid Build Coastguard Worker 
61*49cdfc7eSAndroid Build Coastguard Worker #define STRINGSIZE	27
62*49cdfc7eSAndroid Build Coastguard Worker #define STRING		"abcdefghijklmnopqrstuvwxyz\n"
63*49cdfc7eSAndroid Build Coastguard Worker #define STOP		0xFFF0
64*49cdfc7eSAndroid Build Coastguard Worker #define TIME_OUT	10
65*49cdfc7eSAndroid Build Coastguard Worker 
66*49cdfc7eSAndroid Build Coastguard Worker /* global variables */
67*49cdfc7eSAndroid Build Coastguard Worker int parent_pipe[2];
68*49cdfc7eSAndroid Build Coastguard Worker int child_pipe1[2];
69*49cdfc7eSAndroid Build Coastguard Worker int child_pipe2[2];
70*49cdfc7eSAndroid Build Coastguard Worker int child_pipe3[2];
71*49cdfc7eSAndroid Build Coastguard Worker int file_fd;
72*49cdfc7eSAndroid Build Coastguard Worker pid_t parent_pid, child_pid1, child_pid2, child_pid3;
73*49cdfc7eSAndroid Build Coastguard Worker int child_stat;
74*49cdfc7eSAndroid Build Coastguard Worker struct flock lock1 = { (short)F_WRLCK, (short)0, 2, 5, (short)0 };
75*49cdfc7eSAndroid Build Coastguard Worker struct flock lock2 = { (short)F_WRLCK, (short)0, 9, 5, (short)0 };
76*49cdfc7eSAndroid Build Coastguard Worker struct flock lock3 = { (short)F_WRLCK, (short)0, 17, 5, (short)0 };
77*49cdfc7eSAndroid Build Coastguard Worker struct flock lock4 = { (short)F_WRLCK, (short)0, 17, 5, (short)0 };
78*49cdfc7eSAndroid Build Coastguard Worker struct flock lock5 = { (short)F_WRLCK, (short)0, 2, 14, (short)0 };
79*49cdfc7eSAndroid Build Coastguard Worker struct flock unlock = { (short)F_UNLCK, (short)0, 0, 0, (short)0 };
80*49cdfc7eSAndroid Build Coastguard Worker 
81*49cdfc7eSAndroid Build Coastguard Worker /* prototype declarations */
82*49cdfc7eSAndroid Build Coastguard Worker int setup();
83*49cdfc7eSAndroid Build Coastguard Worker void cleanup();
84*49cdfc7eSAndroid Build Coastguard Worker int parent_wait();
85*49cdfc7eSAndroid Build Coastguard Worker void parent_free();
86*49cdfc7eSAndroid Build Coastguard Worker void child_wait();
87*49cdfc7eSAndroid Build Coastguard Worker void child_free();
88*49cdfc7eSAndroid Build Coastguard Worker void do_child1();
89*49cdfc7eSAndroid Build Coastguard Worker void do_child2();
90*49cdfc7eSAndroid Build Coastguard Worker void do_child3();
91*49cdfc7eSAndroid Build Coastguard Worker int do_test(struct flock *, pid_t);
92*49cdfc7eSAndroid Build Coastguard Worker void stop_children();
93*49cdfc7eSAndroid Build Coastguard Worker void catch_child();
94*49cdfc7eSAndroid Build Coastguard Worker void catch_alarm();
95*49cdfc7eSAndroid Build Coastguard Worker char *str_type();
96*49cdfc7eSAndroid Build Coastguard Worker 
setup(void)97*49cdfc7eSAndroid Build Coastguard Worker int setup(void)
98*49cdfc7eSAndroid Build Coastguard Worker {
99*49cdfc7eSAndroid Build Coastguard Worker 	char *buf = STRING;
100*49cdfc7eSAndroid Build Coastguard Worker 	char template[PATH_MAX];
101*49cdfc7eSAndroid Build Coastguard Worker 	struct sigaction act;
102*49cdfc7eSAndroid Build Coastguard Worker 
103*49cdfc7eSAndroid Build Coastguard Worker 	tst_sig(FORK, DEF_HANDLER, NULL);
104*49cdfc7eSAndroid Build Coastguard Worker 	umask(0);
105*49cdfc7eSAndroid Build Coastguard Worker 	TEST_PAUSE;
106*49cdfc7eSAndroid Build Coastguard Worker 	tst_tmpdir();		/* make temp dir and cd to it */
107*49cdfc7eSAndroid Build Coastguard Worker 
108*49cdfc7eSAndroid Build Coastguard Worker 	if (pipe(parent_pipe) < 0) {
109*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "Couldn't create parent_pipe! errno = %d",
110*49cdfc7eSAndroid Build Coastguard Worker 			 errno);
111*49cdfc7eSAndroid Build Coastguard Worker 		return 1;
112*49cdfc7eSAndroid Build Coastguard Worker 	}
113*49cdfc7eSAndroid Build Coastguard Worker 	if (pipe(child_pipe1) < 0) {
114*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "Couldn't create child_pipe1! errno = %d",
115*49cdfc7eSAndroid Build Coastguard Worker 			 errno);
116*49cdfc7eSAndroid Build Coastguard Worker 		return 1;
117*49cdfc7eSAndroid Build Coastguard Worker 	}
118*49cdfc7eSAndroid Build Coastguard Worker 	if (pipe(child_pipe2) < 0) {
119*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "Couldn't create child_pipe2! errno = %d",
120*49cdfc7eSAndroid Build Coastguard Worker 			 errno);
121*49cdfc7eSAndroid Build Coastguard Worker 		return 1;
122*49cdfc7eSAndroid Build Coastguard Worker 	}
123*49cdfc7eSAndroid Build Coastguard Worker 	if (pipe(child_pipe3) < 0) {
124*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "Couldn't create child_pipe3! errno = %d",
125*49cdfc7eSAndroid Build Coastguard Worker 			 errno);
126*49cdfc7eSAndroid Build Coastguard Worker 		return 1;
127*49cdfc7eSAndroid Build Coastguard Worker 	}
128*49cdfc7eSAndroid Build Coastguard Worker 	parent_pid = getpid();
129*49cdfc7eSAndroid Build Coastguard Worker 	snprintf(template, PATH_MAX, "fcntl17XXXXXX");
130*49cdfc7eSAndroid Build Coastguard Worker 
131*49cdfc7eSAndroid Build Coastguard Worker 	if ((file_fd = mkstemp(template)) < 0) {
132*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "Couldn't open temp file! errno = %d", errno);
133*49cdfc7eSAndroid Build Coastguard Worker 	}
134*49cdfc7eSAndroid Build Coastguard Worker 
135*49cdfc7eSAndroid Build Coastguard Worker 	if (write(file_fd, buf, STRINGSIZE) < 0) {
136*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "Couldn't write to temp file! errno = %d",
137*49cdfc7eSAndroid Build Coastguard Worker 			 errno);
138*49cdfc7eSAndroid Build Coastguard Worker 	}
139*49cdfc7eSAndroid Build Coastguard Worker 
140*49cdfc7eSAndroid Build Coastguard Worker 	memset(&act, 0, sizeof(act));
141*49cdfc7eSAndroid Build Coastguard Worker 	act.sa_handler = catch_alarm;
142*49cdfc7eSAndroid Build Coastguard Worker 	sigemptyset(&act.sa_mask);
143*49cdfc7eSAndroid Build Coastguard Worker 	sigaddset(&act.sa_mask, SIGALRM);
144*49cdfc7eSAndroid Build Coastguard Worker 	if (sigaction(SIGALRM, &act, NULL) < 0) {
145*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "SIGALRM signal setup failed, errno: %d",
146*49cdfc7eSAndroid Build Coastguard Worker 			 errno);
147*49cdfc7eSAndroid Build Coastguard Worker 		return 1;
148*49cdfc7eSAndroid Build Coastguard Worker 	}
149*49cdfc7eSAndroid Build Coastguard Worker 
150*49cdfc7eSAndroid Build Coastguard Worker 	memset(&act, 0, sizeof(act));
151*49cdfc7eSAndroid Build Coastguard Worker 	act.sa_handler = catch_child;
152*49cdfc7eSAndroid Build Coastguard Worker 	sigemptyset(&act.sa_mask);
153*49cdfc7eSAndroid Build Coastguard Worker 	sigaddset(&act.sa_mask, SIGCHLD);
154*49cdfc7eSAndroid Build Coastguard Worker 	if (sigaction(SIGCHLD, &act, NULL) < 0) {
155*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "SIGCHLD signal setup failed, errno: %d", errno);
156*49cdfc7eSAndroid Build Coastguard Worker 		return 1;
157*49cdfc7eSAndroid Build Coastguard Worker 	}
158*49cdfc7eSAndroid Build Coastguard Worker 	return 0;
159*49cdfc7eSAndroid Build Coastguard Worker }
160*49cdfc7eSAndroid Build Coastguard Worker 
cleanup(void)161*49cdfc7eSAndroid Build Coastguard Worker void cleanup(void)
162*49cdfc7eSAndroid Build Coastguard Worker {
163*49cdfc7eSAndroid Build Coastguard Worker 	if (child_pid1 > 0)
164*49cdfc7eSAndroid Build Coastguard Worker 		kill(child_pid1, 9);
165*49cdfc7eSAndroid Build Coastguard Worker 
166*49cdfc7eSAndroid Build Coastguard Worker 	if (child_pid2 > 0)
167*49cdfc7eSAndroid Build Coastguard Worker 		kill(child_pid2, 9);
168*49cdfc7eSAndroid Build Coastguard Worker 
169*49cdfc7eSAndroid Build Coastguard Worker 	if (child_pid3 > 0)
170*49cdfc7eSAndroid Build Coastguard Worker 		kill(child_pid3, 9);
171*49cdfc7eSAndroid Build Coastguard Worker 
172*49cdfc7eSAndroid Build Coastguard Worker 	close(file_fd);
173*49cdfc7eSAndroid Build Coastguard Worker 	tst_rmdir();
174*49cdfc7eSAndroid Build Coastguard Worker 
175*49cdfc7eSAndroid Build Coastguard Worker }
176*49cdfc7eSAndroid Build Coastguard Worker 
do_child1(void)177*49cdfc7eSAndroid Build Coastguard Worker void do_child1(void)
178*49cdfc7eSAndroid Build Coastguard Worker {
179*49cdfc7eSAndroid Build Coastguard Worker 	int err;
180*49cdfc7eSAndroid Build Coastguard Worker 
181*49cdfc7eSAndroid Build Coastguard Worker 	close(parent_pipe[0]);
182*49cdfc7eSAndroid Build Coastguard Worker 	close(child_pipe1[1]);
183*49cdfc7eSAndroid Build Coastguard Worker 	close(child_pipe2[0]);
184*49cdfc7eSAndroid Build Coastguard Worker 	close(child_pipe2[1]);
185*49cdfc7eSAndroid Build Coastguard Worker 	close(child_pipe3[0]);
186*49cdfc7eSAndroid Build Coastguard Worker 	close(child_pipe3[1]);
187*49cdfc7eSAndroid Build Coastguard Worker 
188*49cdfc7eSAndroid Build Coastguard Worker 	child_wait(child_pipe1[0]);
189*49cdfc7eSAndroid Build Coastguard Worker 	tst_resm(TINFO, "child 1 starting");
190*49cdfc7eSAndroid Build Coastguard Worker 	if (fcntl(file_fd, F_SETLK, &lock1) < 0) {
191*49cdfc7eSAndroid Build Coastguard Worker 		err = errno;
192*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TINFO, "child 1 lock err %d", err);
193*49cdfc7eSAndroid Build Coastguard Worker 		parent_free(err);
194*49cdfc7eSAndroid Build Coastguard Worker 	} else {
195*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TINFO, "child 1 pid %d locked", getpid());
196*49cdfc7eSAndroid Build Coastguard Worker 		parent_free(0);
197*49cdfc7eSAndroid Build Coastguard Worker 	}
198*49cdfc7eSAndroid Build Coastguard Worker 
199*49cdfc7eSAndroid Build Coastguard Worker 	child_wait(child_pipe1[0]);
200*49cdfc7eSAndroid Build Coastguard Worker 	tst_resm(TINFO, "child 1 resuming");
201*49cdfc7eSAndroid Build Coastguard Worker 	fcntl(file_fd, F_SETLK, &unlock);
202*49cdfc7eSAndroid Build Coastguard Worker 	tst_resm(TINFO, "child 1 unlocked");
203*49cdfc7eSAndroid Build Coastguard Worker 
204*49cdfc7eSAndroid Build Coastguard Worker 	child_wait(child_pipe1[0]);
205*49cdfc7eSAndroid Build Coastguard Worker 	tst_resm(TINFO, "child 1 exiting");
206*49cdfc7eSAndroid Build Coastguard Worker 	exit(1);
207*49cdfc7eSAndroid Build Coastguard Worker }
208*49cdfc7eSAndroid Build Coastguard Worker 
do_child2(void)209*49cdfc7eSAndroid Build Coastguard Worker void do_child2(void)
210*49cdfc7eSAndroid Build Coastguard Worker {
211*49cdfc7eSAndroid Build Coastguard Worker 	int err;
212*49cdfc7eSAndroid Build Coastguard Worker 
213*49cdfc7eSAndroid Build Coastguard Worker 	close(parent_pipe[0]);
214*49cdfc7eSAndroid Build Coastguard Worker 	close(child_pipe1[0]);
215*49cdfc7eSAndroid Build Coastguard Worker 	close(child_pipe1[1]);
216*49cdfc7eSAndroid Build Coastguard Worker 	close(child_pipe2[1]);
217*49cdfc7eSAndroid Build Coastguard Worker 	close(child_pipe3[0]);
218*49cdfc7eSAndroid Build Coastguard Worker 	close(child_pipe3[1]);
219*49cdfc7eSAndroid Build Coastguard Worker 
220*49cdfc7eSAndroid Build Coastguard Worker 	child_wait(child_pipe2[0]);
221*49cdfc7eSAndroid Build Coastguard Worker 	tst_resm(TINFO, "child 2 starting");
222*49cdfc7eSAndroid Build Coastguard Worker 	if (fcntl(file_fd, F_SETLK, &lock2) < 0) {
223*49cdfc7eSAndroid Build Coastguard Worker 		err = errno;
224*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TINFO, "child 2 lock err %d", err);
225*49cdfc7eSAndroid Build Coastguard Worker 		parent_free(err);
226*49cdfc7eSAndroid Build Coastguard Worker 	} else {
227*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TINFO, "child 2 pid %d locked", getpid());
228*49cdfc7eSAndroid Build Coastguard Worker 		parent_free(0);
229*49cdfc7eSAndroid Build Coastguard Worker 	}
230*49cdfc7eSAndroid Build Coastguard Worker 
231*49cdfc7eSAndroid Build Coastguard Worker 	child_wait(child_pipe2[0]);
232*49cdfc7eSAndroid Build Coastguard Worker 	tst_resm(TINFO, "child 2 resuming");
233*49cdfc7eSAndroid Build Coastguard Worker 	if (fcntl(file_fd, F_SETLKW, &lock4) < 0) {
234*49cdfc7eSAndroid Build Coastguard Worker 		err = errno;
235*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TINFO, "child 2 lockw err %d", err);
236*49cdfc7eSAndroid Build Coastguard Worker 		parent_free(err);
237*49cdfc7eSAndroid Build Coastguard Worker 	} else {
238*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TINFO, "child 2 lockw locked");
239*49cdfc7eSAndroid Build Coastguard Worker 		parent_free(0);
240*49cdfc7eSAndroid Build Coastguard Worker 	}
241*49cdfc7eSAndroid Build Coastguard Worker 
242*49cdfc7eSAndroid Build Coastguard Worker 	child_wait(child_pipe2[0]);
243*49cdfc7eSAndroid Build Coastguard Worker 	tst_resm(TINFO, "child 2 exiting");
244*49cdfc7eSAndroid Build Coastguard Worker 	exit(1);
245*49cdfc7eSAndroid Build Coastguard Worker }
246*49cdfc7eSAndroid Build Coastguard Worker 
do_child3(void)247*49cdfc7eSAndroid Build Coastguard Worker void do_child3(void)
248*49cdfc7eSAndroid Build Coastguard Worker {
249*49cdfc7eSAndroid Build Coastguard Worker 	int err;
250*49cdfc7eSAndroid Build Coastguard Worker 
251*49cdfc7eSAndroid Build Coastguard Worker 	close(parent_pipe[0]);
252*49cdfc7eSAndroid Build Coastguard Worker 	close(child_pipe1[0]);
253*49cdfc7eSAndroid Build Coastguard Worker 	close(child_pipe1[1]);
254*49cdfc7eSAndroid Build Coastguard Worker 	close(child_pipe2[0]);
255*49cdfc7eSAndroid Build Coastguard Worker 	close(child_pipe2[1]);
256*49cdfc7eSAndroid Build Coastguard Worker 	close(child_pipe3[1]);
257*49cdfc7eSAndroid Build Coastguard Worker 
258*49cdfc7eSAndroid Build Coastguard Worker 	child_wait(child_pipe3[0]);
259*49cdfc7eSAndroid Build Coastguard Worker 	tst_resm(TINFO, "child 3 starting");
260*49cdfc7eSAndroid Build Coastguard Worker 	if (fcntl(file_fd, F_SETLK, &lock3) < 0) {
261*49cdfc7eSAndroid Build Coastguard Worker 		err = errno;
262*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TINFO, "child 3 lock err %d", err);
263*49cdfc7eSAndroid Build Coastguard Worker 		parent_free(err);
264*49cdfc7eSAndroid Build Coastguard Worker 	} else {
265*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TINFO, "child 3 pid %d locked", getpid());
266*49cdfc7eSAndroid Build Coastguard Worker 		parent_free(0);
267*49cdfc7eSAndroid Build Coastguard Worker 	}
268*49cdfc7eSAndroid Build Coastguard Worker 
269*49cdfc7eSAndroid Build Coastguard Worker 	child_wait(child_pipe3[0]);
270*49cdfc7eSAndroid Build Coastguard Worker 	tst_resm(TINFO, "child 3 resuming");
271*49cdfc7eSAndroid Build Coastguard Worker 	if (fcntl(file_fd, F_SETLKW, &lock5) < 0) {
272*49cdfc7eSAndroid Build Coastguard Worker 		err = errno;
273*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TINFO, "child 3 lockw err %d", err);
274*49cdfc7eSAndroid Build Coastguard Worker 		parent_free(err);
275*49cdfc7eSAndroid Build Coastguard Worker 	} else {
276*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TINFO, "child 3 lockw locked");
277*49cdfc7eSAndroid Build Coastguard Worker 		parent_free(0);
278*49cdfc7eSAndroid Build Coastguard Worker 	}
279*49cdfc7eSAndroid Build Coastguard Worker 
280*49cdfc7eSAndroid Build Coastguard Worker 	child_wait(child_pipe3[0]);
281*49cdfc7eSAndroid Build Coastguard Worker 	tst_resm(TINFO, "child 3 exiting");
282*49cdfc7eSAndroid Build Coastguard Worker 	exit(1);
283*49cdfc7eSAndroid Build Coastguard Worker }
284*49cdfc7eSAndroid Build Coastguard Worker 
do_test(struct flock * lock,pid_t pid)285*49cdfc7eSAndroid Build Coastguard Worker int do_test(struct flock *lock, pid_t pid)
286*49cdfc7eSAndroid Build Coastguard Worker {
287*49cdfc7eSAndroid Build Coastguard Worker 	struct flock fl;
288*49cdfc7eSAndroid Build Coastguard Worker 
289*49cdfc7eSAndroid Build Coastguard Worker 	fl.l_type = /* lock->l_type */ F_RDLCK;
290*49cdfc7eSAndroid Build Coastguard Worker 	fl.l_whence = lock->l_whence;
291*49cdfc7eSAndroid Build Coastguard Worker 	fl.l_start = lock->l_start;
292*49cdfc7eSAndroid Build Coastguard Worker 	fl.l_len = lock->l_len;
293*49cdfc7eSAndroid Build Coastguard Worker 	fl.l_pid = (short)0;
294*49cdfc7eSAndroid Build Coastguard Worker 	if (fcntl(file_fd, F_GETLK, &fl) < 0) {
295*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "fcntl on file failed, errno =%d", errno);
296*49cdfc7eSAndroid Build Coastguard Worker 		return 1;
297*49cdfc7eSAndroid Build Coastguard Worker 	}
298*49cdfc7eSAndroid Build Coastguard Worker 
299*49cdfc7eSAndroid Build Coastguard Worker 	if (fl.l_type != lock->l_type) {
300*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "lock type is wrong should be %s is %s",
301*49cdfc7eSAndroid Build Coastguard Worker 			 str_type(lock->l_type), str_type(fl.l_type));
302*49cdfc7eSAndroid Build Coastguard Worker 		return 1;
303*49cdfc7eSAndroid Build Coastguard Worker 	}
304*49cdfc7eSAndroid Build Coastguard Worker 
305*49cdfc7eSAndroid Build Coastguard Worker 	if (fl.l_whence != lock->l_whence) {
306*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "lock whence is wrong should be %d is %d",
307*49cdfc7eSAndroid Build Coastguard Worker 			 lock->l_whence, fl.l_whence);
308*49cdfc7eSAndroid Build Coastguard Worker 		return 1;
309*49cdfc7eSAndroid Build Coastguard Worker 	}
310*49cdfc7eSAndroid Build Coastguard Worker 
311*49cdfc7eSAndroid Build Coastguard Worker 	if (fl.l_start != lock->l_start) {
312*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "region starts in wrong place, "
313*49cdfc7eSAndroid Build Coastguard Worker 			 "should be %" PRId64 " is %" PRId64,
314*49cdfc7eSAndroid Build Coastguard Worker 			 (int64_t) lock->l_start, (int64_t) fl.l_start);
315*49cdfc7eSAndroid Build Coastguard Worker 		return 1;
316*49cdfc7eSAndroid Build Coastguard Worker 	}
317*49cdfc7eSAndroid Build Coastguard Worker 
318*49cdfc7eSAndroid Build Coastguard Worker 	if (fl.l_len != lock->l_len) {
319*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL,
320*49cdfc7eSAndroid Build Coastguard Worker 			 "region length is wrong, should be %" PRId64 " is %"
321*49cdfc7eSAndroid Build Coastguard Worker 			 PRId64, (int64_t) lock->l_len, (int64_t) fl.l_len);
322*49cdfc7eSAndroid Build Coastguard Worker 		return 1;
323*49cdfc7eSAndroid Build Coastguard Worker 	}
324*49cdfc7eSAndroid Build Coastguard Worker 
325*49cdfc7eSAndroid Build Coastguard Worker 	if (fl.l_pid != pid) {
326*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "locking pid is wrong, should be %d is %d",
327*49cdfc7eSAndroid Build Coastguard Worker 			 pid, fl.l_pid);
328*49cdfc7eSAndroid Build Coastguard Worker 		return 1;
329*49cdfc7eSAndroid Build Coastguard Worker 	}
330*49cdfc7eSAndroid Build Coastguard Worker 	return 0;
331*49cdfc7eSAndroid Build Coastguard Worker }
332*49cdfc7eSAndroid Build Coastguard Worker 
str_type(int type)333*49cdfc7eSAndroid Build Coastguard Worker char *str_type(int type)
334*49cdfc7eSAndroid Build Coastguard Worker {
335*49cdfc7eSAndroid Build Coastguard Worker 	static char buf[20];
336*49cdfc7eSAndroid Build Coastguard Worker 
337*49cdfc7eSAndroid Build Coastguard Worker 	switch (type) {
338*49cdfc7eSAndroid Build Coastguard Worker 	case F_RDLCK:
339*49cdfc7eSAndroid Build Coastguard Worker 		return ("F_RDLCK");
340*49cdfc7eSAndroid Build Coastguard Worker 	case F_WRLCK:
341*49cdfc7eSAndroid Build Coastguard Worker 		return ("F_WRLCK");
342*49cdfc7eSAndroid Build Coastguard Worker 	case F_UNLCK:
343*49cdfc7eSAndroid Build Coastguard Worker 		return ("F_UNLCK");
344*49cdfc7eSAndroid Build Coastguard Worker 	default:
345*49cdfc7eSAndroid Build Coastguard Worker 		sprintf(buf, "BAD VALUE: %d", type);
346*49cdfc7eSAndroid Build Coastguard Worker 		return (buf);
347*49cdfc7eSAndroid Build Coastguard Worker 	}
348*49cdfc7eSAndroid Build Coastguard Worker }
349*49cdfc7eSAndroid Build Coastguard Worker 
parent_free(int arg)350*49cdfc7eSAndroid Build Coastguard Worker void parent_free(int arg)
351*49cdfc7eSAndroid Build Coastguard Worker {
352*49cdfc7eSAndroid Build Coastguard Worker 	if (write(parent_pipe[1], &arg, sizeof(arg)) != sizeof(arg)) {
353*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "couldn't send message to parent");
354*49cdfc7eSAndroid Build Coastguard Worker 		exit(1);
355*49cdfc7eSAndroid Build Coastguard Worker 	}
356*49cdfc7eSAndroid Build Coastguard Worker }
357*49cdfc7eSAndroid Build Coastguard Worker 
parent_wait(void)358*49cdfc7eSAndroid Build Coastguard Worker int parent_wait(void)
359*49cdfc7eSAndroid Build Coastguard Worker {
360*49cdfc7eSAndroid Build Coastguard Worker 	int arg;
361*49cdfc7eSAndroid Build Coastguard Worker 
362*49cdfc7eSAndroid Build Coastguard Worker 	if (read(parent_pipe[0], &arg, sizeof(arg)) != sizeof(arg)) {
363*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "parent_wait() failed");
364*49cdfc7eSAndroid Build Coastguard Worker 		return (errno);
365*49cdfc7eSAndroid Build Coastguard Worker 	}
366*49cdfc7eSAndroid Build Coastguard Worker 	return (arg);
367*49cdfc7eSAndroid Build Coastguard Worker }
368*49cdfc7eSAndroid Build Coastguard Worker 
child_free(int fd,int arg)369*49cdfc7eSAndroid Build Coastguard Worker void child_free(int fd, int arg)
370*49cdfc7eSAndroid Build Coastguard Worker {
371*49cdfc7eSAndroid Build Coastguard Worker 	if (write(fd, &arg, sizeof(arg)) != sizeof(arg)) {
372*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "couldn't send message to child");
373*49cdfc7eSAndroid Build Coastguard Worker 		exit(1);
374*49cdfc7eSAndroid Build Coastguard Worker 	}
375*49cdfc7eSAndroid Build Coastguard Worker }
376*49cdfc7eSAndroid Build Coastguard Worker 
child_wait(int fd)377*49cdfc7eSAndroid Build Coastguard Worker void child_wait(int fd)
378*49cdfc7eSAndroid Build Coastguard Worker {
379*49cdfc7eSAndroid Build Coastguard Worker 	int arg;
380*49cdfc7eSAndroid Build Coastguard Worker 
381*49cdfc7eSAndroid Build Coastguard Worker 	if (read(fd, &arg, sizeof(arg)) != sizeof(arg)) {
382*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "couldn't get message from parent");
383*49cdfc7eSAndroid Build Coastguard Worker 		exit(1);
384*49cdfc7eSAndroid Build Coastguard Worker 	} else if (arg == (short)STOP) {
385*49cdfc7eSAndroid Build Coastguard Worker 		exit(0);
386*49cdfc7eSAndroid Build Coastguard Worker 	}
387*49cdfc7eSAndroid Build Coastguard Worker }
388*49cdfc7eSAndroid Build Coastguard Worker 
stop_children(void)389*49cdfc7eSAndroid Build Coastguard Worker void stop_children(void)
390*49cdfc7eSAndroid Build Coastguard Worker {
391*49cdfc7eSAndroid Build Coastguard Worker 	int arg;
392*49cdfc7eSAndroid Build Coastguard Worker 
393*49cdfc7eSAndroid Build Coastguard Worker 	signal(SIGCHLD, SIG_DFL);
394*49cdfc7eSAndroid Build Coastguard Worker 	arg = STOP;
395*49cdfc7eSAndroid Build Coastguard Worker 	child_free(child_pipe1[1], arg);
396*49cdfc7eSAndroid Build Coastguard Worker 	child_free(child_pipe2[1], arg);
397*49cdfc7eSAndroid Build Coastguard Worker 	child_free(child_pipe3[1], arg);
398*49cdfc7eSAndroid Build Coastguard Worker 	waitpid(child_pid1, &child_stat, 0);
399*49cdfc7eSAndroid Build Coastguard Worker 	child_pid1 = 0;
400*49cdfc7eSAndroid Build Coastguard Worker 	waitpid(child_pid2, &child_stat, 0);
401*49cdfc7eSAndroid Build Coastguard Worker 	child_pid2 = 0;
402*49cdfc7eSAndroid Build Coastguard Worker 	waitpid(child_pid3, &child_stat, 0);
403*49cdfc7eSAndroid Build Coastguard Worker 	child_pid3 = 0;
404*49cdfc7eSAndroid Build Coastguard Worker }
405*49cdfc7eSAndroid Build Coastguard Worker 
catch_child(void)406*49cdfc7eSAndroid Build Coastguard Worker void catch_child(void)
407*49cdfc7eSAndroid Build Coastguard Worker {
408*49cdfc7eSAndroid Build Coastguard Worker 	tst_resm(TFAIL, "Unexpected death of child process");
409*49cdfc7eSAndroid Build Coastguard Worker 	cleanup();
410*49cdfc7eSAndroid Build Coastguard Worker }
411*49cdfc7eSAndroid Build Coastguard Worker 
catch_alarm(void)412*49cdfc7eSAndroid Build Coastguard Worker void catch_alarm(void)
413*49cdfc7eSAndroid Build Coastguard Worker {
414*49cdfc7eSAndroid Build Coastguard Worker 	sighold(SIGCHLD);
415*49cdfc7eSAndroid Build Coastguard Worker 	/*
416*49cdfc7eSAndroid Build Coastguard Worker 	 * Timer has runout and the children have not detected the deadlock.
417*49cdfc7eSAndroid Build Coastguard Worker 	 * Need to kill the kids and exit
418*49cdfc7eSAndroid Build Coastguard Worker 	 */
419*49cdfc7eSAndroid Build Coastguard Worker 	if (child_pid1 != 0 && (kill(child_pid1, SIGKILL)) < 0) {
420*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "Attempt to signal child 1 failed.");
421*49cdfc7eSAndroid Build Coastguard Worker 	}
422*49cdfc7eSAndroid Build Coastguard Worker 
423*49cdfc7eSAndroid Build Coastguard Worker 	if (child_pid2 != 0 && (kill(child_pid2, SIGKILL)) < 0) {
424*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "Attempt to signal child 2 failed.");
425*49cdfc7eSAndroid Build Coastguard Worker 	}
426*49cdfc7eSAndroid Build Coastguard Worker 	if (child_pid3 != 0 && (kill(child_pid3, SIGKILL)) < 0) {
427*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TFAIL, "Attempt to signal child 2 failed.");
428*49cdfc7eSAndroid Build Coastguard Worker 	}
429*49cdfc7eSAndroid Build Coastguard Worker 	tst_resm(TFAIL, "Alarm expired, deadlock not detected");
430*49cdfc7eSAndroid Build Coastguard Worker 	tst_resm(TWARN, "You may need to kill child processes by hand");
431*49cdfc7eSAndroid Build Coastguard Worker 	cleanup();
432*49cdfc7eSAndroid Build Coastguard Worker }
433*49cdfc7eSAndroid Build Coastguard Worker 
main(int ac,char ** av)434*49cdfc7eSAndroid Build Coastguard Worker int main(int ac, char **av)
435*49cdfc7eSAndroid Build Coastguard Worker {
436*49cdfc7eSAndroid Build Coastguard Worker 	int ans;
437*49cdfc7eSAndroid Build Coastguard Worker 	int lc;
438*49cdfc7eSAndroid Build Coastguard Worker 	int fail = 0;
439*49cdfc7eSAndroid Build Coastguard Worker 
440*49cdfc7eSAndroid Build Coastguard Worker 	tst_parse_opts(ac, av, NULL, NULL);
441*49cdfc7eSAndroid Build Coastguard Worker 
442*49cdfc7eSAndroid Build Coastguard Worker 	if (setup()) {		/* global testup */
443*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TINFO, "setup failed");
444*49cdfc7eSAndroid Build Coastguard Worker 		cleanup();
445*49cdfc7eSAndroid Build Coastguard Worker 	}
446*49cdfc7eSAndroid Build Coastguard Worker 
447*49cdfc7eSAndroid Build Coastguard Worker 	/* check for looping state if -i option is given */
448*49cdfc7eSAndroid Build Coastguard Worker 	for (lc = 0; TEST_LOOPING(lc); lc++) {
449*49cdfc7eSAndroid Build Coastguard Worker 		/* reset tst_count in case we are looping */
450*49cdfc7eSAndroid Build Coastguard Worker 		tst_count = 0;
451*49cdfc7eSAndroid Build Coastguard Worker 
452*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TINFO, "Enter preparation phase");
453*49cdfc7eSAndroid Build Coastguard Worker 		if ((child_pid1 = tst_fork()) == 0)	/* first child */
454*49cdfc7eSAndroid Build Coastguard Worker 			do_child1();
455*49cdfc7eSAndroid Build Coastguard Worker 		else if (child_pid1 < 0)
456*49cdfc7eSAndroid Build Coastguard Worker 			tst_brkm(TBROK|TERRNO, cleanup, "Fork failed: child 1");
457*49cdfc7eSAndroid Build Coastguard Worker 
458*49cdfc7eSAndroid Build Coastguard Worker 		/* parent */
459*49cdfc7eSAndroid Build Coastguard Worker 
460*49cdfc7eSAndroid Build Coastguard Worker 		if ((child_pid2 = fork()) == 0)	/* second child */
461*49cdfc7eSAndroid Build Coastguard Worker 			do_child2();
462*49cdfc7eSAndroid Build Coastguard Worker 		else if (child_pid2 < 0)
463*49cdfc7eSAndroid Build Coastguard Worker 			tst_brkm(TBROK|TERRNO, cleanup, "Fork failed: child 2");
464*49cdfc7eSAndroid Build Coastguard Worker 
465*49cdfc7eSAndroid Build Coastguard Worker 		/* parent */
466*49cdfc7eSAndroid Build Coastguard Worker 
467*49cdfc7eSAndroid Build Coastguard Worker 		if ((child_pid3 = fork()) == 0) {	/* third child */
468*49cdfc7eSAndroid Build Coastguard Worker 			do_child3();
469*49cdfc7eSAndroid Build Coastguard Worker 			do_child3();
470*49cdfc7eSAndroid Build Coastguard Worker 		} else if (child_pid3 < 0) {
471*49cdfc7eSAndroid Build Coastguard Worker 			tst_brkm(TBROK|TERRNO, cleanup, "Fork failed: child 3");
472*49cdfc7eSAndroid Build Coastguard Worker 		}
473*49cdfc7eSAndroid Build Coastguard Worker 		/* parent */
474*49cdfc7eSAndroid Build Coastguard Worker 
475*49cdfc7eSAndroid Build Coastguard Worker 		close(parent_pipe[1]);
476*49cdfc7eSAndroid Build Coastguard Worker 		close(child_pipe1[0]);
477*49cdfc7eSAndroid Build Coastguard Worker 		close(child_pipe2[0]);
478*49cdfc7eSAndroid Build Coastguard Worker 		close(child_pipe3[0]);
479*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TINFO, "Exit preparation phase");
480*49cdfc7eSAndroid Build Coastguard Worker 
481*49cdfc7eSAndroid Build Coastguard Worker /* //block1: */
482*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TINFO, "Enter block 1");
483*49cdfc7eSAndroid Build Coastguard Worker 		fail = 0;
484*49cdfc7eSAndroid Build Coastguard Worker 		/*
485*49cdfc7eSAndroid Build Coastguard Worker 		 * child 1 puts first lock (bytes 2-7)
486*49cdfc7eSAndroid Build Coastguard Worker 		 */
487*49cdfc7eSAndroid Build Coastguard Worker 		child_free(child_pipe1[1], 0);
488*49cdfc7eSAndroid Build Coastguard Worker 		if (parent_wait()) {
489*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "didn't set first child's lock, "
490*49cdfc7eSAndroid Build Coastguard Worker 				 "errno: %d", errno);
491*49cdfc7eSAndroid Build Coastguard Worker 		}
492*49cdfc7eSAndroid Build Coastguard Worker 		if (do_test(&lock1, child_pid1)) {
493*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TINFO, "do_test failed child 1");
494*49cdfc7eSAndroid Build Coastguard Worker 			fail = 1;
495*49cdfc7eSAndroid Build Coastguard Worker 		}
496*49cdfc7eSAndroid Build Coastguard Worker 
497*49cdfc7eSAndroid Build Coastguard Worker 		/*
498*49cdfc7eSAndroid Build Coastguard Worker 		 * child 2 puts second lock (bytes 9-14)
499*49cdfc7eSAndroid Build Coastguard Worker 		 */
500*49cdfc7eSAndroid Build Coastguard Worker 		child_free(child_pipe2[1], 0);
501*49cdfc7eSAndroid Build Coastguard Worker 		if (parent_wait()) {
502*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TINFO, "didn't set second child's lock, "
503*49cdfc7eSAndroid Build Coastguard Worker 				 "errno: %d", errno);
504*49cdfc7eSAndroid Build Coastguard Worker 			fail = 1;
505*49cdfc7eSAndroid Build Coastguard Worker 		}
506*49cdfc7eSAndroid Build Coastguard Worker 		if (do_test(&lock2, child_pid2)) {
507*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TINFO, "do_test failed child 2");
508*49cdfc7eSAndroid Build Coastguard Worker 			fail = 1;
509*49cdfc7eSAndroid Build Coastguard Worker 		}
510*49cdfc7eSAndroid Build Coastguard Worker 
511*49cdfc7eSAndroid Build Coastguard Worker 		/*
512*49cdfc7eSAndroid Build Coastguard Worker 		 * child 3 puts third lock (bytes 17-22)
513*49cdfc7eSAndroid Build Coastguard Worker 		 */
514*49cdfc7eSAndroid Build Coastguard Worker 		child_free(child_pipe3[1], 0);
515*49cdfc7eSAndroid Build Coastguard Worker 		if (parent_wait()) {
516*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "didn't set third child's lock, "
517*49cdfc7eSAndroid Build Coastguard Worker 				 "errno: %d", errno);
518*49cdfc7eSAndroid Build Coastguard Worker 			fail = 1;
519*49cdfc7eSAndroid Build Coastguard Worker 		}
520*49cdfc7eSAndroid Build Coastguard Worker 		if (do_test(&lock3, child_pid3)) {
521*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TINFO, "do_test failed child 3");
522*49cdfc7eSAndroid Build Coastguard Worker 			fail = 1;
523*49cdfc7eSAndroid Build Coastguard Worker 		}
524*49cdfc7eSAndroid Build Coastguard Worker 
525*49cdfc7eSAndroid Build Coastguard Worker 		/*
526*49cdfc7eSAndroid Build Coastguard Worker 		 * child 2 tries to lock same range as
527*49cdfc7eSAndroid Build Coastguard Worker 		 * child 3's first lock.
528*49cdfc7eSAndroid Build Coastguard Worker 		 */
529*49cdfc7eSAndroid Build Coastguard Worker 		child_free(child_pipe2[1], 0);
530*49cdfc7eSAndroid Build Coastguard Worker 
531*49cdfc7eSAndroid Build Coastguard Worker 		/*
532*49cdfc7eSAndroid Build Coastguard Worker 		 * child 3 tries to lock same range as
533*49cdfc7eSAndroid Build Coastguard Worker 		 * child 1 and child 2's first locks.
534*49cdfc7eSAndroid Build Coastguard Worker 		 */
535*49cdfc7eSAndroid Build Coastguard Worker 		child_free(child_pipe3[1], 0);
536*49cdfc7eSAndroid Build Coastguard Worker 
537*49cdfc7eSAndroid Build Coastguard Worker 		/*
538*49cdfc7eSAndroid Build Coastguard Worker 		 * Tell child 1 to release its lock. This should cause a
539*49cdfc7eSAndroid Build Coastguard Worker 		 * delayed deadlock between child 2 and child 3.
540*49cdfc7eSAndroid Build Coastguard Worker 		 */
541*49cdfc7eSAndroid Build Coastguard Worker 		child_free(child_pipe1[1], 0);
542*49cdfc7eSAndroid Build Coastguard Worker 
543*49cdfc7eSAndroid Build Coastguard Worker 		/*
544*49cdfc7eSAndroid Build Coastguard Worker 		 * Setup an alarm to go off in case the deadlock is not
545*49cdfc7eSAndroid Build Coastguard Worker 		 * detected
546*49cdfc7eSAndroid Build Coastguard Worker 		 */
547*49cdfc7eSAndroid Build Coastguard Worker 		alarm(TIME_OUT);
548*49cdfc7eSAndroid Build Coastguard Worker 
549*49cdfc7eSAndroid Build Coastguard Worker 		/*
550*49cdfc7eSAndroid Build Coastguard Worker 		 * should get a message from child 3 telling that its
551*49cdfc7eSAndroid Build Coastguard Worker 		 * second lock EDEADLOCK
552*49cdfc7eSAndroid Build Coastguard Worker 		 */
553*49cdfc7eSAndroid Build Coastguard Worker 		if ((ans = parent_wait()) != EDEADLK) {
554*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "child 2 didn't deadlock, "
555*49cdfc7eSAndroid Build Coastguard Worker 				 "returned: %d", ans);
556*49cdfc7eSAndroid Build Coastguard Worker 			fail = 1;
557*49cdfc7eSAndroid Build Coastguard Worker 		}
558*49cdfc7eSAndroid Build Coastguard Worker 
559*49cdfc7eSAndroid Build Coastguard Worker 		/*
560*49cdfc7eSAndroid Build Coastguard Worker 		 * Double check that lock 2 and lock 3 are still right
561*49cdfc7eSAndroid Build Coastguard Worker 		 */
562*49cdfc7eSAndroid Build Coastguard Worker 		do_test(&lock2, child_pid2);
563*49cdfc7eSAndroid Build Coastguard Worker 		do_test(&lock3, child_pid3);
564*49cdfc7eSAndroid Build Coastguard Worker 
565*49cdfc7eSAndroid Build Coastguard Worker 		stop_children();
566*49cdfc7eSAndroid Build Coastguard Worker 
567*49cdfc7eSAndroid Build Coastguard Worker 		if (fail) {
568*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TFAIL, "Block 1 FAILED");
569*49cdfc7eSAndroid Build Coastguard Worker 		} else {
570*49cdfc7eSAndroid Build Coastguard Worker 			tst_resm(TPASS, "Block 1 PASSED");
571*49cdfc7eSAndroid Build Coastguard Worker 		}
572*49cdfc7eSAndroid Build Coastguard Worker 		tst_resm(TINFO, "Exit block 1");
573*49cdfc7eSAndroid Build Coastguard Worker 	}
574*49cdfc7eSAndroid Build Coastguard Worker 	cleanup();
575*49cdfc7eSAndroid Build Coastguard Worker 	tst_exit();
576*49cdfc7eSAndroid Build Coastguard Worker }
577