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