fcntl17.c revision d6d11d08678aac1ed2c370ea8e42e5f45aea07be
1865695bbc89088b9526ea9045410e5afb70a985cplars/*
2865695bbc89088b9526ea9045410e5afb70a985cplars *
3865695bbc89088b9526ea9045410e5afb70a985cplars *   Copyright (c) International Business Machines  Corp., 2001
4865695bbc89088b9526ea9045410e5afb70a985cplars *
5865695bbc89088b9526ea9045410e5afb70a985cplars *   This program is free software;  you can redistribute it and/or modify
6865695bbc89088b9526ea9045410e5afb70a985cplars *   it under the terms of the GNU General Public License as published by
7865695bbc89088b9526ea9045410e5afb70a985cplars *   the Free Software Foundation; either version 2 of the License, or
8865695bbc89088b9526ea9045410e5afb70a985cplars *   (at your option) any later version.
9865695bbc89088b9526ea9045410e5afb70a985cplars *
10865695bbc89088b9526ea9045410e5afb70a985cplars *   This program is distributed in the hope that it will be useful,
11865695bbc89088b9526ea9045410e5afb70a985cplars *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
12865695bbc89088b9526ea9045410e5afb70a985cplars *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13865695bbc89088b9526ea9045410e5afb70a985cplars *   the GNU General Public License for more details.
14865695bbc89088b9526ea9045410e5afb70a985cplars *
15865695bbc89088b9526ea9045410e5afb70a985cplars *   You should have received a copy of the GNU General Public License
16865695bbc89088b9526ea9045410e5afb70a985cplars *   along with this program;  if not, write to the Free Software
174548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18865695bbc89088b9526ea9045410e5afb70a985cplars */
19865695bbc89088b9526ea9045410e5afb70a985cplars
20865695bbc89088b9526ea9045410e5afb70a985cplars/*
21865695bbc89088b9526ea9045410e5afb70a985cplars * NAME
2256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak *	fcntl17.c
23865695bbc89088b9526ea9045410e5afb70a985cplars *
24865695bbc89088b9526ea9045410e5afb70a985cplars * DESCRIPTION
2556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak *	Check deadlock detection for file locking
26865695bbc89088b9526ea9045410e5afb70a985cplars *
27865695bbc89088b9526ea9045410e5afb70a985cplars * ALGORITHM
2856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak *	The parent forks off 3 children. The parent controls the children
2956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak *	with messages via pipes to create a delayed deadlock between the
3056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak *	second and third child.
31865695bbc89088b9526ea9045410e5afb70a985cplars *
32865695bbc89088b9526ea9045410e5afb70a985cplars * USAGE
3356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak *	fcntl17
34865695bbc89088b9526ea9045410e5afb70a985cplars *
35865695bbc89088b9526ea9045410e5afb70a985cplars * HISTORY
36865695bbc89088b9526ea9045410e5afb70a985cplars *	07/2001 Ported by Wayne Boyer
374bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *      04/2002 Minor fixes by William Jay Huie (testcase name
3807635bca720b53e75ffe5b6cb3502e8954cad0bcplars		fcntl05 => fcntl17, check signal return for SIG_ERR)
39865695bbc89088b9526ea9045410e5afb70a985cplars *
40865695bbc89088b9526ea9045410e5afb70a985cplars * RESTRICTIONS
41865695bbc89088b9526ea9045410e5afb70a985cplars *	None
42865695bbc89088b9526ea9045410e5afb70a985cplars */
43865695bbc89088b9526ea9045410e5afb70a985cplars
445b31d1bb1f8c30e3cb6555d4f88ffff96ba04352vapier#ifndef _GNU_SOURCE
45354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao#define _GNU_SOURCE
465b31d1bb1f8c30e3cb6555d4f88ffff96ba04352vapier#endif
475b31d1bb1f8c30e3cb6555d4f88ffff96ba04352vapier
48865695bbc89088b9526ea9045410e5afb70a985cplars#include <fcntl.h>
49865695bbc89088b9526ea9045410e5afb70a985cplars#include <errno.h>
50865695bbc89088b9526ea9045410e5afb70a985cplars#include <signal.h>
515aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew#include <sys/stat.h>
525aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew#include <sys/types.h>
53db63921767012310af15f29035a334e50486292cmridge#include <sys/wait.h>
54923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak#include <inttypes.h>
55923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak
565aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew#include "test.h"
57865695bbc89088b9526ea9045410e5afb70a985cplars
5807635bca720b53e75ffe5b6cb3502e8954cad0bcplarschar *TCID = "fcntl17";
59865695bbc89088b9526ea9045410e5afb70a985cplarsint TST_TOTAL = 1;
60865695bbc89088b9526ea9045410e5afb70a985cplars
61865695bbc89088b9526ea9045410e5afb70a985cplars#define STRINGSIZE	27
62865695bbc89088b9526ea9045410e5afb70a985cplars#define STRING		"abcdefghijklmnopqrstuvwxyz\n"
63865695bbc89088b9526ea9045410e5afb70a985cplars#define STOP		0xFFF0
64865695bbc89088b9526ea9045410e5afb70a985cplars#define TIME_OUT	10
65865695bbc89088b9526ea9045410e5afb70a985cplars
66865695bbc89088b9526ea9045410e5afb70a985cplars/* global variables */
67865695bbc89088b9526ea9045410e5afb70a985cplarsint parent_pipe[2];
68865695bbc89088b9526ea9045410e5afb70a985cplarsint child_pipe1[2];
69865695bbc89088b9526ea9045410e5afb70a985cplarsint child_pipe2[2];
70865695bbc89088b9526ea9045410e5afb70a985cplarsint child_pipe3[2];
71865695bbc89088b9526ea9045410e5afb70a985cplarsint file_fd;
724673685b374a826ed5a8397366deba4722ab5bf8robbiewpid_t parent_pid, child_pid1, child_pid2, child_pid3;
73874b4225b16598f2afb24655de584b770f2b522bplarsint child_stat;
7456207cec7732e09c216c751c0b5f88a242bacae6subrata_modakstruct flock lock1 = { (short)F_WRLCK, (short)0, 2, 5, (short)0 };
7556207cec7732e09c216c751c0b5f88a242bacae6subrata_modakstruct flock lock2 = { (short)F_WRLCK, (short)0, 9, 5, (short)0 };
7656207cec7732e09c216c751c0b5f88a242bacae6subrata_modakstruct flock lock3 = { (short)F_WRLCK, (short)0, 17, 5, (short)0 };
7756207cec7732e09c216c751c0b5f88a242bacae6subrata_modakstruct flock lock4 = { (short)F_WRLCK, (short)0, 17, 5, (short)0 };
7856207cec7732e09c216c751c0b5f88a242bacae6subrata_modakstruct flock lock5 = { (short)F_WRLCK, (short)0, 2, 14, (short)0 };
7956207cec7732e09c216c751c0b5f88a242bacae6subrata_modakstruct flock unlock = { (short)F_UNLCK, (short)0, 0, 0, (short)0 };
80865695bbc89088b9526ea9045410e5afb70a985cplars
81865695bbc89088b9526ea9045410e5afb70a985cplars/* prototype declarations */
82865695bbc89088b9526ea9045410e5afb70a985cplarsint setup();
83865695bbc89088b9526ea9045410e5afb70a985cplarsvoid cleanup();
84865695bbc89088b9526ea9045410e5afb70a985cplarsint parent_wait();
85865695bbc89088b9526ea9045410e5afb70a985cplarsvoid parent_free();
86865695bbc89088b9526ea9045410e5afb70a985cplarsvoid child_wait();
87865695bbc89088b9526ea9045410e5afb70a985cplarsvoid child_free();
88865695bbc89088b9526ea9045410e5afb70a985cplarsvoid do_child1();
89865695bbc89088b9526ea9045410e5afb70a985cplarsvoid do_child2();
90865695bbc89088b9526ea9045410e5afb70a985cplarsvoid do_child3();
91f08488fd49050c1ac0c29014433db13714b7170asubrata_modakint do_test(struct flock *, pid_t);
92865695bbc89088b9526ea9045410e5afb70a985cplarsvoid stop_children();
93865695bbc89088b9526ea9045410e5afb70a985cplarsvoid catch_child();
94865695bbc89088b9526ea9045410e5afb70a985cplarsvoid catch_alarm();
95865695bbc89088b9526ea9045410e5afb70a985cplarschar *str_type();
96865695bbc89088b9526ea9045410e5afb70a985cplars
97c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingerint setup(void)
98865695bbc89088b9526ea9045410e5afb70a985cplars{
99865695bbc89088b9526ea9045410e5afb70a985cplars	char *buf = STRING;
10056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	char template[PATH_MAX];
1011e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	struct sigaction act;
102865695bbc89088b9526ea9045410e5afb70a985cplars
1032c28215423293e443469a07ae7011135d058b671Garrett Cooper	tst_sig(FORK, DEF_HANDLER, NULL);
104865695bbc89088b9526ea9045410e5afb70a985cplars	umask(0);
1052c28215423293e443469a07ae7011135d058b671Garrett Cooper	TEST_PAUSE;
10656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	tst_tmpdir();		/* make temp dir and cd to it */
107865695bbc89088b9526ea9045410e5afb70a985cplars
10856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	if (pipe(parent_pipe) < 0) {
1094bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak		tst_resm(TFAIL, "Couldn't create parent_pipe! errno = %d",
110caccaf23298a7d0f34d4b68cd6619435def51a7eplars			 errno);
111134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak		return 1;
112caccaf23298a7d0f34d4b68cd6619435def51a7eplars	}
11356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	if (pipe(child_pipe1) < 0) {
1144bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak		tst_resm(TFAIL, "Couldn't create child_pipe1! errno = %d",
115caccaf23298a7d0f34d4b68cd6619435def51a7eplars			 errno);
116134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak		return 1;
117caccaf23298a7d0f34d4b68cd6619435def51a7eplars	}
11856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	if (pipe(child_pipe2) < 0) {
1194bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak		tst_resm(TFAIL, "Couldn't create child_pipe2! errno = %d",
120caccaf23298a7d0f34d4b68cd6619435def51a7eplars			 errno);
121134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak		return 1;
122caccaf23298a7d0f34d4b68cd6619435def51a7eplars	}
12356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	if (pipe(child_pipe3) < 0) {
1244bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak		tst_resm(TFAIL, "Couldn't create child_pipe3! errno = %d",
125caccaf23298a7d0f34d4b68cd6619435def51a7eplars			 errno);
126134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak		return 1;
127caccaf23298a7d0f34d4b68cd6619435def51a7eplars	}
128865695bbc89088b9526ea9045410e5afb70a985cplars	parent_pid = getpid();
129dad2271b03625d8d549ede28a8792c6a7836cc54robbiew	snprintf(template, PATH_MAX, "fcntl17XXXXXX");
130865695bbc89088b9526ea9045410e5afb70a985cplars
13156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	if ((file_fd = mkstemp(template)) < 0) {
13256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		tst_resm(TFAIL, "Couldn't open temp file! errno = %d", errno);
13356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	}
134865695bbc89088b9526ea9045410e5afb70a985cplars
13556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	if (write(file_fd, buf, STRINGSIZE) < 0) {
13656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		tst_resm(TFAIL, "Couldn't write to temp file! errno = %d",
13756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			 errno);
13856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	}
139865695bbc89088b9526ea9045410e5afb70a985cplars
1401e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	memset(&act, 0, sizeof(act));
1411e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	act.sa_handler = catch_alarm;
1421e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	sigemptyset(&act.sa_mask);
1431e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	sigaddset(&act.sa_mask, SIGALRM);
1441e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	if (sigaction(SIGALRM, &act, NULL) < 0) {
145865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TFAIL, "SIGALRM signal setup failed, errno: %d",
146865695bbc89088b9526ea9045410e5afb70a985cplars			 errno);
147134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak		return 1;
148865695bbc89088b9526ea9045410e5afb70a985cplars	}
149865695bbc89088b9526ea9045410e5afb70a985cplars
1501e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	memset(&act, 0, sizeof(act));
1511e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	act.sa_handler = catch_child;
1521e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	sigemptyset(&act.sa_mask);
1531e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	sigaddset(&act.sa_mask, SIGCLD);
1541e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	if (sigaction(SIGCLD, &act, NULL) < 0) {
15556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		tst_resm(TFAIL, "SIGCLD signal setup failed, errno: %d", errno);
156134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak		return 1;
157865695bbc89088b9526ea9045410e5afb70a985cplars	}
15843337a3cf6f8809647cf9fc6c0054241f44b1fb1subrata_modak	return 0;
159865695bbc89088b9526ea9045410e5afb70a985cplars}
160865695bbc89088b9526ea9045410e5afb70a985cplars
161c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid cleanup(void)
162865695bbc89088b9526ea9045410e5afb70a985cplars{
16356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	close(file_fd);
164865695bbc89088b9526ea9045410e5afb70a985cplars	tst_rmdir();
1652c28215423293e443469a07ae7011135d058b671Garrett Cooper
166865695bbc89088b9526ea9045410e5afb70a985cplars}
167865695bbc89088b9526ea9045410e5afb70a985cplars
168c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid do_child1(void)
169865695bbc89088b9526ea9045410e5afb70a985cplars{
17056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	int err;
171db63921767012310af15f29035a334e50486292cmridge
172865695bbc89088b9526ea9045410e5afb70a985cplars	close(parent_pipe[0]);
173865695bbc89088b9526ea9045410e5afb70a985cplars	close(child_pipe1[1]);
174865695bbc89088b9526ea9045410e5afb70a985cplars	close(child_pipe2[0]);
175865695bbc89088b9526ea9045410e5afb70a985cplars	close(child_pipe2[1]);
176865695bbc89088b9526ea9045410e5afb70a985cplars	close(child_pipe3[0]);
177865695bbc89088b9526ea9045410e5afb70a985cplars	close(child_pipe3[1]);
178865695bbc89088b9526ea9045410e5afb70a985cplars
179865695bbc89088b9526ea9045410e5afb70a985cplars	child_wait(child_pipe1[0]);
18056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	tst_resm(TINFO, "child 1 starting");
181865695bbc89088b9526ea9045410e5afb70a985cplars	if (fcntl(file_fd, F_SETLK, &lock1) < 0) {
18256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		err = errno;
18356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		tst_resm(TINFO, "child 1 lock err %d", err);
184db63921767012310af15f29035a334e50486292cmridge		parent_free(err);
185865695bbc89088b9526ea9045410e5afb70a985cplars	} else {
18656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		tst_resm(TINFO, "child 1 pid %d locked", getpid());
187865695bbc89088b9526ea9045410e5afb70a985cplars		parent_free(0);
188865695bbc89088b9526ea9045410e5afb70a985cplars	}
189865695bbc89088b9526ea9045410e5afb70a985cplars
190865695bbc89088b9526ea9045410e5afb70a985cplars	child_wait(child_pipe1[0]);
19156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	tst_resm(TINFO, "child 1 resuming");
192865695bbc89088b9526ea9045410e5afb70a985cplars	fcntl(file_fd, F_SETLK, &unlock);
19356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	tst_resm(TINFO, "child 1 unlocked");
194865695bbc89088b9526ea9045410e5afb70a985cplars
195865695bbc89088b9526ea9045410e5afb70a985cplars	child_wait(child_pipe1[0]);
19656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	tst_resm(TINFO, "child 1 exiting");
197865695bbc89088b9526ea9045410e5afb70a985cplars	exit(1);
198865695bbc89088b9526ea9045410e5afb70a985cplars}
199865695bbc89088b9526ea9045410e5afb70a985cplars
200c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid do_child2(void)
201865695bbc89088b9526ea9045410e5afb70a985cplars{
20256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	int err;
203db63921767012310af15f29035a334e50486292cmridge
204865695bbc89088b9526ea9045410e5afb70a985cplars	close(parent_pipe[0]);
205865695bbc89088b9526ea9045410e5afb70a985cplars	close(child_pipe1[0]);
206865695bbc89088b9526ea9045410e5afb70a985cplars	close(child_pipe1[1]);
207865695bbc89088b9526ea9045410e5afb70a985cplars	close(child_pipe2[1]);
208865695bbc89088b9526ea9045410e5afb70a985cplars	close(child_pipe3[0]);
209865695bbc89088b9526ea9045410e5afb70a985cplars	close(child_pipe3[1]);
210865695bbc89088b9526ea9045410e5afb70a985cplars
211865695bbc89088b9526ea9045410e5afb70a985cplars	child_wait(child_pipe2[0]);
21256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	tst_resm(TINFO, "child 2 starting");
213865695bbc89088b9526ea9045410e5afb70a985cplars	if (fcntl(file_fd, F_SETLK, &lock2) < 0) {
21456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		err = errno;
21556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		tst_resm(TINFO, "child 2 lock err %d", err);
216db63921767012310af15f29035a334e50486292cmridge		parent_free(err);
217865695bbc89088b9526ea9045410e5afb70a985cplars	} else {
21856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		tst_resm(TINFO, "child 2 pid %d locked", getpid());
219865695bbc89088b9526ea9045410e5afb70a985cplars		parent_free(0);
220865695bbc89088b9526ea9045410e5afb70a985cplars	}
221865695bbc89088b9526ea9045410e5afb70a985cplars
222865695bbc89088b9526ea9045410e5afb70a985cplars	child_wait(child_pipe2[0]);
22356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	tst_resm(TINFO, "child 2 resuming");
224865695bbc89088b9526ea9045410e5afb70a985cplars	if (fcntl(file_fd, F_SETLKW, &lock4) < 0) {
22556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		err = errno;
22656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		tst_resm(TINFO, "child 2 lockw err %d", err);
227db63921767012310af15f29035a334e50486292cmridge		parent_free(err);
228865695bbc89088b9526ea9045410e5afb70a985cplars	} else {
22956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		tst_resm(TINFO, "child 2 lockw locked");
230865695bbc89088b9526ea9045410e5afb70a985cplars		parent_free(0);
231865695bbc89088b9526ea9045410e5afb70a985cplars	}
232865695bbc89088b9526ea9045410e5afb70a985cplars
233865695bbc89088b9526ea9045410e5afb70a985cplars	child_wait(child_pipe2[0]);
23456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	tst_resm(TINFO, "child 2 exiting");
235865695bbc89088b9526ea9045410e5afb70a985cplars	exit(1);
236865695bbc89088b9526ea9045410e5afb70a985cplars}
237865695bbc89088b9526ea9045410e5afb70a985cplars
238c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid do_child3(void)
239865695bbc89088b9526ea9045410e5afb70a985cplars{
24056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	int err;
241db63921767012310af15f29035a334e50486292cmridge
242865695bbc89088b9526ea9045410e5afb70a985cplars	close(parent_pipe[0]);
243865695bbc89088b9526ea9045410e5afb70a985cplars	close(child_pipe1[0]);
244865695bbc89088b9526ea9045410e5afb70a985cplars	close(child_pipe1[1]);
245865695bbc89088b9526ea9045410e5afb70a985cplars	close(child_pipe2[0]);
246865695bbc89088b9526ea9045410e5afb70a985cplars	close(child_pipe2[1]);
247865695bbc89088b9526ea9045410e5afb70a985cplars	close(child_pipe3[1]);
248865695bbc89088b9526ea9045410e5afb70a985cplars
249865695bbc89088b9526ea9045410e5afb70a985cplars	child_wait(child_pipe3[0]);
25056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	tst_resm(TINFO, "child 3 starting");
251865695bbc89088b9526ea9045410e5afb70a985cplars	if (fcntl(file_fd, F_SETLK, &lock3) < 0) {
25256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		err = errno;
25356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		tst_resm(TINFO, "child 3 lock err %d", err);
254db63921767012310af15f29035a334e50486292cmridge		parent_free(err);
255865695bbc89088b9526ea9045410e5afb70a985cplars	} else {
25656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		tst_resm(TINFO, "child 3 pid %d locked", getpid());
257865695bbc89088b9526ea9045410e5afb70a985cplars		parent_free(0);
258865695bbc89088b9526ea9045410e5afb70a985cplars	}
259865695bbc89088b9526ea9045410e5afb70a985cplars
260865695bbc89088b9526ea9045410e5afb70a985cplars	child_wait(child_pipe3[0]);
26156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	tst_resm(TINFO, "child 3 resuming");
262865695bbc89088b9526ea9045410e5afb70a985cplars	if (fcntl(file_fd, F_SETLKW, &lock5) < 0) {
26356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		err = errno;
26456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		tst_resm(TINFO, "child 3 lockw err %d", err);
265db63921767012310af15f29035a334e50486292cmridge		parent_free(err);
266865695bbc89088b9526ea9045410e5afb70a985cplars	} else {
26756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		tst_resm(TINFO, "child 3 lockw locked");
268865695bbc89088b9526ea9045410e5afb70a985cplars		parent_free(0);
269865695bbc89088b9526ea9045410e5afb70a985cplars	}
270865695bbc89088b9526ea9045410e5afb70a985cplars
271865695bbc89088b9526ea9045410e5afb70a985cplars	child_wait(child_pipe3[0]);
27256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	tst_resm(TINFO, "child 3 exiting");
273865695bbc89088b9526ea9045410e5afb70a985cplars	exit(1);
274865695bbc89088b9526ea9045410e5afb70a985cplars}
275865695bbc89088b9526ea9045410e5afb70a985cplars
27656207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint do_test(struct flock *lock, pid_t pid)
277865695bbc89088b9526ea9045410e5afb70a985cplars{
278865695bbc89088b9526ea9045410e5afb70a985cplars	struct flock fl;
279865695bbc89088b9526ea9045410e5afb70a985cplars
280db63921767012310af15f29035a334e50486292cmridge	fl.l_type = /* lock->l_type */ F_RDLCK;
281865695bbc89088b9526ea9045410e5afb70a985cplars	fl.l_whence = lock->l_whence;
282865695bbc89088b9526ea9045410e5afb70a985cplars	fl.l_start = lock->l_start;
283865695bbc89088b9526ea9045410e5afb70a985cplars	fl.l_len = lock->l_len;
28456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	fl.l_pid = (short)0;
285865695bbc89088b9526ea9045410e5afb70a985cplars	if (fcntl(file_fd, F_GETLK, &fl) < 0) {
28656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		tst_resm(TFAIL, "fcntl on file failed, errno =%d", errno);
287134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak		return 1;
288865695bbc89088b9526ea9045410e5afb70a985cplars	}
289865695bbc89088b9526ea9045410e5afb70a985cplars
290865695bbc89088b9526ea9045410e5afb70a985cplars	if (fl.l_type != lock->l_type) {
291865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TFAIL, "lock type is wrong should be %s is %s",
292865695bbc89088b9526ea9045410e5afb70a985cplars			 str_type(lock->l_type), str_type(fl.l_type));
293134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak		return 1;
294865695bbc89088b9526ea9045410e5afb70a985cplars	}
295865695bbc89088b9526ea9045410e5afb70a985cplars
296865695bbc89088b9526ea9045410e5afb70a985cplars	if (fl.l_whence != lock->l_whence) {
297865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TFAIL, "lock whence is wrong should be %d is %d",
298865695bbc89088b9526ea9045410e5afb70a985cplars			 lock->l_whence, fl.l_whence);
299134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak		return 1;
300865695bbc89088b9526ea9045410e5afb70a985cplars	}
301865695bbc89088b9526ea9045410e5afb70a985cplars
302865695bbc89088b9526ea9045410e5afb70a985cplars	if (fl.l_start != lock->l_start) {
303865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TFAIL, "region starts in wrong place, "
304354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 "should be %" PRId64 " is %" PRId64,
305354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 (int64_t) lock->l_start, (int64_t) fl.l_start);
306134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak		return 1;
307865695bbc89088b9526ea9045410e5afb70a985cplars	}
308865695bbc89088b9526ea9045410e5afb70a985cplars
309865695bbc89088b9526ea9045410e5afb70a985cplars	if (fl.l_len != lock->l_len) {
310354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_resm(TFAIL,
311354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 "region length is wrong, should be %" PRId64 " is %"
312354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 PRId64, (int64_t) lock->l_len, (int64_t) fl.l_len);
313134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak		return 1;
314865695bbc89088b9526ea9045410e5afb70a985cplars	}
315865695bbc89088b9526ea9045410e5afb70a985cplars
316865695bbc89088b9526ea9045410e5afb70a985cplars	if (fl.l_pid != pid) {
317865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TFAIL, "locking pid is wrong, should be %d is %d",
318865695bbc89088b9526ea9045410e5afb70a985cplars			 pid, fl.l_pid);
319134e896cc5a60e96b32807f5be09e99099596f5dsubrata_modak		return 1;
320865695bbc89088b9526ea9045410e5afb70a985cplars	}
32143337a3cf6f8809647cf9fc6c0054241f44b1fb1subrata_modak	return 0;
322865695bbc89088b9526ea9045410e5afb70a985cplars}
323865695bbc89088b9526ea9045410e5afb70a985cplars
32456207cec7732e09c216c751c0b5f88a242bacae6subrata_modakchar *str_type(int type)
325865695bbc89088b9526ea9045410e5afb70a985cplars{
326865695bbc89088b9526ea9045410e5afb70a985cplars	static char buf[20];
327865695bbc89088b9526ea9045410e5afb70a985cplars
328865695bbc89088b9526ea9045410e5afb70a985cplars	switch (type) {
329db63921767012310af15f29035a334e50486292cmridge	case F_RDLCK:
33056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		return ("F_RDLCK");
331db63921767012310af15f29035a334e50486292cmridge	case F_WRLCK:
33256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		return ("F_WRLCK");
333db63921767012310af15f29035a334e50486292cmridge	case F_UNLCK:
33456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		return ("F_UNLCK");
335865695bbc89088b9526ea9045410e5afb70a985cplars	default:
336865695bbc89088b9526ea9045410e5afb70a985cplars		sprintf(buf, "BAD VALUE: %d", type);
33756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		return (buf);
338865695bbc89088b9526ea9045410e5afb70a985cplars	}
339865695bbc89088b9526ea9045410e5afb70a985cplars}
340865695bbc89088b9526ea9045410e5afb70a985cplars
34156207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid parent_free(int arg)
342865695bbc89088b9526ea9045410e5afb70a985cplars{
343865695bbc89088b9526ea9045410e5afb70a985cplars	if (write(parent_pipe[1], &arg, sizeof(arg)) != sizeof(arg)) {
344865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TFAIL, "couldn't send message to parent");
345865695bbc89088b9526ea9045410e5afb70a985cplars		exit(1);
346865695bbc89088b9526ea9045410e5afb70a985cplars	}
347865695bbc89088b9526ea9045410e5afb70a985cplars}
348865695bbc89088b9526ea9045410e5afb70a985cplars
349c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingerint parent_wait(void)
350865695bbc89088b9526ea9045410e5afb70a985cplars{
351865695bbc89088b9526ea9045410e5afb70a985cplars	int arg;
352865695bbc89088b9526ea9045410e5afb70a985cplars
353865695bbc89088b9526ea9045410e5afb70a985cplars	if (read(parent_pipe[0], &arg, sizeof(arg)) != sizeof(arg)) {
354865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TFAIL, "parent_wait() failed");
35556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		return (errno);
356865695bbc89088b9526ea9045410e5afb70a985cplars	}
35756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	return (arg);
358865695bbc89088b9526ea9045410e5afb70a985cplars}
359865695bbc89088b9526ea9045410e5afb70a985cplars
36056207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid child_free(int fd, int arg)
361865695bbc89088b9526ea9045410e5afb70a985cplars{
362865695bbc89088b9526ea9045410e5afb70a985cplars	if (write(fd, &arg, sizeof(arg)) != sizeof(arg)) {
363865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TFAIL, "couldn't send message to child");
364865695bbc89088b9526ea9045410e5afb70a985cplars		exit(1);
365865695bbc89088b9526ea9045410e5afb70a985cplars	}
366865695bbc89088b9526ea9045410e5afb70a985cplars}
367865695bbc89088b9526ea9045410e5afb70a985cplars
36856207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid child_wait(int fd)
369865695bbc89088b9526ea9045410e5afb70a985cplars{
370865695bbc89088b9526ea9045410e5afb70a985cplars	int arg;
371865695bbc89088b9526ea9045410e5afb70a985cplars
372865695bbc89088b9526ea9045410e5afb70a985cplars	if (read(fd, &arg, sizeof(arg)) != sizeof(arg)) {
373865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TFAIL, "couldn't get message from parent");
374865695bbc89088b9526ea9045410e5afb70a985cplars		exit(1);
375865695bbc89088b9526ea9045410e5afb70a985cplars	} else if (arg == (short)STOP) {
376865695bbc89088b9526ea9045410e5afb70a985cplars		exit(0);
377865695bbc89088b9526ea9045410e5afb70a985cplars	}
378865695bbc89088b9526ea9045410e5afb70a985cplars}
379865695bbc89088b9526ea9045410e5afb70a985cplars
380c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid stop_children(void)
381865695bbc89088b9526ea9045410e5afb70a985cplars{
382865695bbc89088b9526ea9045410e5afb70a985cplars	int arg;
383865695bbc89088b9526ea9045410e5afb70a985cplars
384e61ddbaf9b02e1f4f94f4708551ecc825c1ac1d7Mike Frysinger	signal(SIGCLD, SIG_DFL);
385865695bbc89088b9526ea9045410e5afb70a985cplars	arg = STOP;
386865695bbc89088b9526ea9045410e5afb70a985cplars	child_free(child_pipe1[1], arg);
387865695bbc89088b9526ea9045410e5afb70a985cplars	child_free(child_pipe2[1], arg);
388865695bbc89088b9526ea9045410e5afb70a985cplars	child_free(child_pipe3[1], arg);
389865695bbc89088b9526ea9045410e5afb70a985cplars	wait(0);
390865695bbc89088b9526ea9045410e5afb70a985cplars}
391865695bbc89088b9526ea9045410e5afb70a985cplars
392c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid catch_child(void)
393865695bbc89088b9526ea9045410e5afb70a985cplars{
394865695bbc89088b9526ea9045410e5afb70a985cplars	tst_resm(TFAIL, "Unexpected death of child process");
395865695bbc89088b9526ea9045410e5afb70a985cplars	cleanup();
396354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao}
397865695bbc89088b9526ea9045410e5afb70a985cplars
398c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid catch_alarm(void)
399865695bbc89088b9526ea9045410e5afb70a985cplars{
40056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	sighold(SIGCHLD);
401865695bbc89088b9526ea9045410e5afb70a985cplars	/*
402865695bbc89088b9526ea9045410e5afb70a985cplars	 * Timer has runout and the children have not detected the deadlock.
403865695bbc89088b9526ea9045410e5afb70a985cplars	 * Need to kill the kids and exit
404865695bbc89088b9526ea9045410e5afb70a985cplars	 */
40556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	if (child_pid1 != 0 && (kill(child_pid1, SIGKILL)) < 0) {
406865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TFAIL, "Attempt to signal child 1 failed.");
407865695bbc89088b9526ea9045410e5afb70a985cplars	}
408865695bbc89088b9526ea9045410e5afb70a985cplars
40956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	if (child_pid2 != 0 && (kill(child_pid2, SIGKILL)) < 0) {
410db63921767012310af15f29035a334e50486292cmridge		tst_resm(TFAIL, "Attempt to signal child 2 failed.");
411db63921767012310af15f29035a334e50486292cmridge	}
41256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	if (child_pid3 != 0 && (kill(child_pid3, SIGKILL)) < 0) {
413865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TFAIL, "Attempt to signal child 2 failed.");
414865695bbc89088b9526ea9045410e5afb70a985cplars	}
41556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	tst_resm(TFAIL, "Alarm expired, deadlock not detected");
41656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	tst_resm(TWARN, "You may need to kill child processes by hand");
417865695bbc89088b9526ea9045410e5afb70a985cplars	cleanup();
418354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao}
4195aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
4205aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewint main(int ac, char **av)
4215aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
4225aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	int ans;
42389af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis	int lc;
4245aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	int fail = 0;
4255aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
426d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis	tst_parse_opts(ac, av, NULL, NULL);
427d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
428d34d581c6a320e356a6cda923c7aa399479e812crobbiew	maybe_run_child(&do_child1, "nddddddddd", 1, &file_fd,
429d34d581c6a320e356a6cda923c7aa399479e812crobbiew			&parent_pipe[0], &parent_pipe[1],
430d34d581c6a320e356a6cda923c7aa399479e812crobbiew			&child_pipe1[0], &child_pipe1[1],
431d34d581c6a320e356a6cda923c7aa399479e812crobbiew			&child_pipe2[0], &child_pipe2[1],
432d34d581c6a320e356a6cda923c7aa399479e812crobbiew			&child_pipe3[0], &child_pipe3[1]);
433d34d581c6a320e356a6cda923c7aa399479e812crobbiew	maybe_run_child(&do_child2, "nddddddddd", 2, &file_fd,
434d34d581c6a320e356a6cda923c7aa399479e812crobbiew			&parent_pipe[0], &parent_pipe[1],
435d34d581c6a320e356a6cda923c7aa399479e812crobbiew			&child_pipe1[0], &child_pipe1[1],
436d34d581c6a320e356a6cda923c7aa399479e812crobbiew			&child_pipe2[0], &child_pipe2[1],
437d34d581c6a320e356a6cda923c7aa399479e812crobbiew			&child_pipe3[0], &child_pipe3[1]);
438d34d581c6a320e356a6cda923c7aa399479e812crobbiew	maybe_run_child(&do_child3, "nddddddddd", 3, &file_fd,
439d34d581c6a320e356a6cda923c7aa399479e812crobbiew			&parent_pipe[0], &parent_pipe[1],
440d34d581c6a320e356a6cda923c7aa399479e812crobbiew			&child_pipe1[0], &child_pipe1[1],
441d34d581c6a320e356a6cda923c7aa399479e812crobbiew			&child_pipe2[0], &child_pipe2[1],
442d34d581c6a320e356a6cda923c7aa399479e812crobbiew			&child_pipe3[0], &child_pipe3[1]);
443d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
444d34d581c6a320e356a6cda923c7aa399479e812crobbiew
44556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	if (setup()) {		/* global testup */
4465aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TINFO, "setup failed");
4475aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		cleanup();
448354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
4495aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
4505aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	/* check for looping state if -i option is given */
4515aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	for (lc = 0; TEST_LOOPING(lc); lc++) {
452d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang		/* reset tst_count in case we are looping */
453d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang		tst_count = 0;
4545aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
4555aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TINFO, "Enter preparation phase");
456d34d581c6a320e356a6cda923c7aa399479e812crobbiew		if ((child_pid1 = FORK_OR_VFORK()) == 0) {	/* first child */
457d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
458d34d581c6a320e356a6cda923c7aa399479e812crobbiew			if (self_exec(av[0], "nddddddddd", 1, file_fd,
459d34d581c6a320e356a6cda923c7aa399479e812crobbiew				      parent_pipe[0], parent_pipe[1],
460d34d581c6a320e356a6cda923c7aa399479e812crobbiew				      child_pipe1[0], child_pipe1[1],
461d34d581c6a320e356a6cda923c7aa399479e812crobbiew				      child_pipe2[0], child_pipe2[1],
462d34d581c6a320e356a6cda923c7aa399479e812crobbiew				      child_pipe3[0], child_pipe3[1]) < 0) {
463d34d581c6a320e356a6cda923c7aa399479e812crobbiew				perror("self_exec failed, child 1");
464d34d581c6a320e356a6cda923c7aa399479e812crobbiew				cleanup();
465d34d581c6a320e356a6cda923c7aa399479e812crobbiew			}
466d34d581c6a320e356a6cda923c7aa399479e812crobbiew#else
4675aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			do_child1();
468d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
4695aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		} else if (child_pid1 < 0) {
4705aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			perror("Fork failed: child 1");
4715aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			cleanup();
472354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
4735aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
4745aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		/* parent */
4755aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
4765aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		if ((child_pid2 = fork()) == 0) {	/* second child */
477d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
478d34d581c6a320e356a6cda923c7aa399479e812crobbiew			if (self_exec(av[0], "nddddddddd", 2, file_fd,
479d34d581c6a320e356a6cda923c7aa399479e812crobbiew				      parent_pipe[0], parent_pipe[1],
480d34d581c6a320e356a6cda923c7aa399479e812crobbiew				      child_pipe1[0], child_pipe1[1],
481d34d581c6a320e356a6cda923c7aa399479e812crobbiew				      child_pipe2[0], child_pipe2[1],
482d34d581c6a320e356a6cda923c7aa399479e812crobbiew				      child_pipe3[0], child_pipe3[1]) < 0) {
483d34d581c6a320e356a6cda923c7aa399479e812crobbiew				perror("self_exec failed, child 2");
484d34d581c6a320e356a6cda923c7aa399479e812crobbiew				cleanup();
485d34d581c6a320e356a6cda923c7aa399479e812crobbiew			}
486d34d581c6a320e356a6cda923c7aa399479e812crobbiew#else
4875aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			do_child2();
488d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
4895aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		} else if (child_pid2 < 0) {
4905aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			perror("Fork failed: child 2");
4915aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			if ((kill(child_pid1, SIGKILL)) < 0) {
4925aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew				tst_resm(TFAIL, "Attempt to signal child "
4935aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew					 "1 failed");
4945aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			}
4955aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			cleanup();
496354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
4975aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
4985aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		/* parent */
4995aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
5005aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		if ((child_pid3 = fork()) == 0) {	/* third child */
501d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
502d34d581c6a320e356a6cda923c7aa399479e812crobbiew			if (self_exec(av[0], "nddddddddd", 3, file_fd,
503d34d581c6a320e356a6cda923c7aa399479e812crobbiew				      parent_pipe[0], parent_pipe[1],
504d34d581c6a320e356a6cda923c7aa399479e812crobbiew				      child_pipe1[0], child_pipe1[1],
505d34d581c6a320e356a6cda923c7aa399479e812crobbiew				      child_pipe2[0], child_pipe2[1],
506d34d581c6a320e356a6cda923c7aa399479e812crobbiew				      child_pipe3[0], child_pipe3[1]) < 0) {
507d34d581c6a320e356a6cda923c7aa399479e812crobbiew				perror("self_exec failed, child 3");
508d34d581c6a320e356a6cda923c7aa399479e812crobbiew				cleanup();
509d34d581c6a320e356a6cda923c7aa399479e812crobbiew			}
510d34d581c6a320e356a6cda923c7aa399479e812crobbiew#else
511d34d581c6a320e356a6cda923c7aa399479e812crobbiew			do_child3();
512d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
5135aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			do_child3();
5145aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		} else if (child_pid3 < 0) {
5155aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			perror("Fork failed: child 3");
5165aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			if ((kill(child_pid1, SIGKILL)) < 0) {
5175aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew				tst_resm(TFAIL, "Attempt to signal child "
5185aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew					 "1 failed");
5195aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			}
5205aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			if ((kill(child_pid2, SIGKILL)) < 0) {
5215aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew				tst_resm(TFAIL, "Attempt to signal child 2 "
5225aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew					 "failed");
5235aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			}
5245aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			cleanup();
525354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
5265aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		/* parent */
5275aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
5285aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		close(parent_pipe[1]);
5295aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		close(child_pipe1[0]);
5305aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		close(child_pipe2[0]);
5315aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		close(child_pipe3[0]);
5325aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TINFO, "Exit preparation phase");
5335aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
534db63921767012310af15f29035a334e50486292cmridge/* //block1: */
5355aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TINFO, "Enter block 1");
5365aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 0;
5375aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		/*
5385aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		 * child 1 puts first lock (bytes 2-7)
5395aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		 */
5405aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		child_free(child_pipe1[1], 0);
5415aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		if (parent_wait()) {
5425aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			tst_resm(TFAIL, "didn't set first child's lock, "
5435aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew				 "errno: %d", errno);
5445aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		}
5455aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		if (do_test(&lock1, child_pid1)) {
5465aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			tst_resm(TINFO, "do_test failed child 1");
5475aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			fail = 1;
5485aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		}
5495aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
5505aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		/*
5515aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		 * child 2 puts second lock (bytes 9-14)
5525aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		 */
5535aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		child_free(child_pipe2[1], 0);
5545aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		if (parent_wait()) {
5555aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			tst_resm(TINFO, "didn't set second child's lock, "
5565aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew				 "errno: %d", errno);
5575aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			fail = 1;
5585aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		}
5595aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		if (do_test(&lock2, child_pid2)) {
5605aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			tst_resm(TINFO, "do_test failed child 2");
5615aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			fail = 1;
5625aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		}
5635aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
5645aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		/*
5655aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		 * child 3 puts third lock (bytes 17-22)
5665aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		 */
5675aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		child_free(child_pipe3[1], 0);
5685aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		if (parent_wait()) {
5695aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			tst_resm(TFAIL, "didn't set third child's lock, "
5705aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew				 "errno: %d", errno);
5715aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			fail = 1;
5725aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		}
5735aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		if (do_test(&lock3, child_pid3)) {
5745aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			tst_resm(TINFO, "do_test failed child 3");
5755aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			fail = 1;
5765aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		}
5775aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
5785aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		/*
5795aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		 * child 2 tries to lock same range as
5805aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		 * child 3's first lock.
5815aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		 */
5825aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		child_free(child_pipe2[1], 0);
5835aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
5845aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		/*
5855aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		 * child 3 tries to lock same range as
5865aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		 * child 1 and child 2's first locks.
5875aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		 */
5885aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		child_free(child_pipe3[1], 0);
5895aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
5905aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		/*
5915aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		 * Tell child 1 to release its lock. This should cause a
5925aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		 * delayed deadlock between child 2 and child 3.
5935aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		 */
5945aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		child_free(child_pipe1[1], 0);
5955aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
5965aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		/*
5975aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		 * Setup an alarm to go off in case the deadlock is not
5985aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		 * detected
5995aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		 */
6005aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		alarm(TIME_OUT);
6015aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
6025aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		/*
6035aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		 * should get a message from child 3 telling that its
6045aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		 * second lock EDEADLOCK
6055aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		 */
6065aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		if ((ans = parent_wait()) != EDEADLK) {
6075aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			tst_resm(TFAIL, "child 2 didn't deadlock, "
6085aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew				 "returned: %d", ans);
6095aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			fail = 1;
6105aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		}
6115aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
6125aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		/*
6135aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		 * Double check that lock 2 and lock 3 are still right
6145aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		 */
6155aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		do_test(&lock2, child_pid2);
6165aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		do_test(&lock3, child_pid3);
6175aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
6185aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		stop_children();
6195aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		if (fail) {
6205aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			tst_resm(TINFO, "Block 1 FAILED");
6215aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		} else {
6225aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			tst_resm(TINFO, "Block 1 PASSED");
6235aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		}
6245aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TINFO, "Exit block 1");
6255aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
6265aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	waitpid(child_pid1, &child_stat, 0);
6275aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	waitpid(child_pid2, &child_stat, 0);
6285aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	waitpid(child_pid3, &child_stat, 0);
6295aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	cleanup();
6302c28215423293e443469a07ae7011135d058b671Garrett Cooper	tst_exit();
631ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
632