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