fcntl20.c revision 923b23ff1fd1b77bd895949f9a6b4508c6485f33
1865695bbc89088b9526ea9045410e5afb70a985cplars/*
2865695bbc89088b9526ea9045410e5afb70a985cplars *
3865695bbc89088b9526ea9045410e5afb70a985cplars *   Copyright (c) International Business Machines  Corp., 2001
4865695bbc89088b9526ea9045410e5afb70a985cplars *
5865695bbc89088b9526ea9045410e5afb70a985cplars *   This program is free software;  you can redistribute it and/or modify
6865695bbc89088b9526ea9045410e5afb70a985cplars *   it under the terms of the GNU General Public License as published by
7865695bbc89088b9526ea9045410e5afb70a985cplars *   the Free Software Foundation; either version 2 of the License, or
8865695bbc89088b9526ea9045410e5afb70a985cplars *   (at your option) any later version.
9865695bbc89088b9526ea9045410e5afb70a985cplars *
10865695bbc89088b9526ea9045410e5afb70a985cplars *   This program is distributed in the hope that it will be useful,
11865695bbc89088b9526ea9045410e5afb70a985cplars *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
12865695bbc89088b9526ea9045410e5afb70a985cplars *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13865695bbc89088b9526ea9045410e5afb70a985cplars *   the GNU General Public License for more details.
14865695bbc89088b9526ea9045410e5afb70a985cplars *
15865695bbc89088b9526ea9045410e5afb70a985cplars *   You should have received a copy of the GNU General Public License
16865695bbc89088b9526ea9045410e5afb70a985cplars *   along with this program;  if not, write to the Free Software
17865695bbc89088b9526ea9045410e5afb70a985cplars *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18865695bbc89088b9526ea9045410e5afb70a985cplars */
19865695bbc89088b9526ea9045410e5afb70a985cplars
20865695bbc89088b9526ea9045410e5afb70a985cplars/*
21865695bbc89088b9526ea9045410e5afb70a985cplars * NAME
2256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak *	fcntl20.c
234bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
24865695bbc89088b9526ea9045410e5afb70a985cplars * DESCRIPTION
2556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak *	Check locking of regions of a file
26865695bbc89088b9526ea9045410e5afb70a985cplars *
27865695bbc89088b9526ea9045410e5afb70a985cplars * ALGORITHM
2856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak *	Test unlocking sections around a read lock
29865695bbc89088b9526ea9045410e5afb70a985cplars *
30865695bbc89088b9526ea9045410e5afb70a985cplars * USAGE
3156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak *	fcntl20
32865695bbc89088b9526ea9045410e5afb70a985cplars *
33865695bbc89088b9526ea9045410e5afb70a985cplars * HISTORY
34865695bbc89088b9526ea9045410e5afb70a985cplars *	07/2001 Ported by Wayne Boyer
35865695bbc89088b9526ea9045410e5afb70a985cplars *
36865695bbc89088b9526ea9045410e5afb70a985cplars * RESTRICTIONS
3756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak *	None
38865695bbc89088b9526ea9045410e5afb70a985cplars */
39865695bbc89088b9526ea9045410e5afb70a985cplars
40865695bbc89088b9526ea9045410e5afb70a985cplars#include <fcntl.h>
41865695bbc89088b9526ea9045410e5afb70a985cplars#include <errno.h>
42865695bbc89088b9526ea9045410e5afb70a985cplars#include <signal.h>
435aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew#include <sys/stat.h>
445aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew#include <sys/types.h>
45db63921767012310af15f29035a334e50486292cmridge#include <sys/wait.h>
46923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak#include <inttypes.h>
475aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew#include "test.h"
485aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew#include "usctest.h"
49865695bbc89088b9526ea9045410e5afb70a985cplars
50865695bbc89088b9526ea9045410e5afb70a985cplars#define STRINGSIZE	27
51865695bbc89088b9526ea9045410e5afb70a985cplars#define STRING		"abcdefghijklmnopqrstuvwxyz\n"
52865695bbc89088b9526ea9045410e5afb70a985cplars#define STOP		0xFFF0
53865695bbc89088b9526ea9045410e5afb70a985cplars
54865695bbc89088b9526ea9045410e5afb70a985cplarsint parent_pipe[2];
55865695bbc89088b9526ea9045410e5afb70a985cplarsint child_pipe[2];
56865695bbc89088b9526ea9045410e5afb70a985cplarsint fd;
57a1e518de6c83215cacf5faad0f4a36148f2f8f8aplarspid_t parent_pid, child_pid;
58865695bbc89088b9526ea9045410e5afb70a985cplars
59865695bbc89088b9526ea9045410e5afb70a985cplarsvoid parent_put();
60865695bbc89088b9526ea9045410e5afb70a985cplarsvoid parent_get();
61865695bbc89088b9526ea9045410e5afb70a985cplarsvoid child_put();
62865695bbc89088b9526ea9045410e5afb70a985cplarsvoid child_get();
63865695bbc89088b9526ea9045410e5afb70a985cplarsvoid stop_child();
64a1e518de6c83215cacf5faad0f4a36148f2f8f8aplarsvoid compare_lock(struct flock *, short, short, int, int, pid_t);
65865695bbc89088b9526ea9045410e5afb70a985cplarsvoid unlock_file();
66865695bbc89088b9526ea9045410e5afb70a985cplarsvoid do_test(struct flock *, short, short, int, int);
67865695bbc89088b9526ea9045410e5afb70a985cplarsvoid catch_child();
68865695bbc89088b9526ea9045410e5afb70a985cplarschar *str_type();
69865695bbc89088b9526ea9045410e5afb70a985cplarsint do_lock(int, short, short, int, int);
70865695bbc89088b9526ea9045410e5afb70a985cplars
71fa31d55d3486830313bd044f7333697ce6124d22nstrazchar *TCID = "fcntl20";
72865695bbc89088b9526ea9045410e5afb70a985cplarsint TST_TOTAL = 1;
73865695bbc89088b9526ea9045410e5afb70a985cplarsextern int Tst_count;
74865695bbc89088b9526ea9045410e5afb70a985cplars
75865695bbc89088b9526ea9045410e5afb70a985cplarsvoid setup(void);
76865695bbc89088b9526ea9045410e5afb70a985cplarsvoid cleanup(void);
77865695bbc89088b9526ea9045410e5afb70a985cplars
78865695bbc89088b9526ea9045410e5afb70a985cplarsint fail = 0;
79865695bbc89088b9526ea9045410e5afb70a985cplars
805aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew/*
815aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * setup
8256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak *	performs all ONE TIME setup for this test
835aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */
8456207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid setup()
855aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
865aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	char *buf = STRING;
87dad2271b03625d8d549ede28a8792c6a7836cc54robbiew	char template[PATH_MAX];
881e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	struct sigaction act;
895aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
905aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	/* capture signals */
915aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	tst_sig(FORK, DEF_HANDLER, cleanup);
925aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
935aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	umask(0);
945aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
955aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	/* Pause if that option was specified */
965aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	TEST_PAUSE;
975aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
985aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	pipe(parent_pipe);
995aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	pipe(child_pipe);
1005aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	parent_pid = getpid();
10154f7a718c05ce3e0c51950e1a6d2243513366076robbiew
10254f7a718c05ce3e0c51950e1a6d2243513366076robbiew	tst_tmpdir();
103dad2271b03625d8d549ede28a8792c6a7836cc54robbiew	snprintf(template, PATH_MAX, "fcntl20XXXXXX");
1045aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
105dad2271b03625d8d549ede28a8792c6a7836cc54robbiew	if ((fd = mkstemp(template)) < 0) {
10656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		tst_resm(TFAIL, "Couldn't open temp file! errno = %d", errno);
10756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	}
1085aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
10956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	if (write(fd, buf, STRINGSIZE) < 0) {
11056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		tst_resm(TFAIL, "Couldn't write to temp file! errno = %d",
11156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			 errno);
11256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	}
1135aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1141e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	memset(&act, 0, sizeof(act));
1151e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	act.sa_handler = catch_child;
1161e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	sigemptyset(&act.sa_mask);
1171e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	sigaddset(&act.sa_mask, SIGCLD);
1181e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	if ((sigaction(SIGCLD, &act, NULL)) < 0) {
11956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		tst_resm(TFAIL, "SIGCLD signal setup failed, errno: %d", errno);
1205aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
1215aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
1225aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
1235aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1245aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew/*
1255aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * cleanup()
12656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak *	performs all ONE TIME cleanup for this test at completion or
12756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak *	premature exit
1285aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */
12956207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid cleanup()
1305aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
1315aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	/*
1325aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	 * print timing stats if that option was specified
1335aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	 * print errno log if that option was specified
1345aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	 */
1355aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	TEST_CLEANUP;
1365aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
13754f7a718c05ce3e0c51950e1a6d2243513366076robbiew	tst_rmdir();
1385aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	/* exit with return code appropriate for results */
1395aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	tst_exit();
1405aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
1415aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1425aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewvoid do_child()
1435aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
1445aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	struct flock fl;
1455aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1465aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	close(parent_pipe[1]);
1475aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	close(child_pipe[0]);
14856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	while (1) {
1495aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		child_get(&fl);
1505aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		if (fcntl(fd, F_GETLK, &fl) < 0) {
151dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
152dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
1535aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			fail = 1;
1545aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		}
1555aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		child_put(&fl);
1565aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
1575aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
1585aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1595aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewint do_lock(int cmd, short type, short whence, int start, int len)
1605aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
1615aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	struct flock fl;
1625aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1635aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl.l_type = type;
1645aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl.l_whence = whence;
1655aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl.l_start = start;
1665aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl.l_len = len;
16756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	return (fcntl(fd, cmd, &fl));
1685aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
1695aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
17056207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid do_test(struct flock *fl, short type, short whence, int start, int len)
1715aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
1725aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl->l_type = type;
1735aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl->l_whence = whence;
1745aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl->l_start = start;
1755aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl->l_len = len;
1765aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl->l_pid = (short)0;
1775aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1785aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	parent_put(fl);
1795aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	parent_get(fl);
1805aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
1815aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1825aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewvoid
1835aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewcompare_lock(struct flock *fl, short type, short whence, int start, int len,
1845aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	     pid_t pid)
1855aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
1865aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (fl->l_type != type) {
1875aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "lock type is wrong should be %s is %s",
1885aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			 str_type(type), str_type(fl->l_type));
1895aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
1905aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
1915aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1925aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (fl->l_whence != whence) {
1935aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "lock whence is wrong should be %d is %d",
1945aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			 whence, fl->l_whence);
1955aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
1965aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
1975aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1985aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (fl->l_start != start) {
1995aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "region starts in wrong place, should be"
200923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak			 "%d is %"PRId64, start, (int64_t)fl->l_start);
2015aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
2025aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2035aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
2045aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (fl->l_len != len) {
205923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak		tst_resm(TFAIL, "region length is wrong, should be %d is %"PRId64,
206923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak			 len, (int64_t)fl->l_len);
2075aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
2085aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2095aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
2105aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (fl->l_pid != pid) {
2115aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "locking pid is wrong, should be %d is %d",
2125aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			 pid, fl->l_pid);
2135aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
2145aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2155aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2165aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
21756207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid unlock_file()
2185aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2195aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	struct flock fl;
2205aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
2215aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 0, 0) < 0) {
22256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		tst_resm(TFAIL, "fcntl on file failed, errno =%d", errno);
2235aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
2245aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2255aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	do_test(&fl, F_WRLCK, 0, 0, 0);
22656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	compare_lock(&fl, (short)F_UNLCK, (short)0, 0, 0, (pid_t) 0);
2275aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2285aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
22956207cec7732e09c216c751c0b5f88a242bacae6subrata_modakchar *str_type(int type)
2305aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2315aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	static char buf[20];
2325aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
2335aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	switch (type) {
2345aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	case 1:
23556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		return ("F_RDLCK");
2365aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	case 2:
23756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		return ("F_WRLCK");
2385aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	case 3:
23956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		return ("F_UNLCK");
2405aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	default:
2415aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		sprintf(buf, "BAD VALUE: %d", type);
24256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		return (buf);
2435aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2445aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2455aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
24656207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid parent_put(struct flock *l)
2475aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2485aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (write(parent_pipe[1], l, sizeof(*l)) != sizeof(*l)) {
2495aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "couldn't send message to child");
2505aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
2515aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2525aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2535aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
25456207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid parent_get(struct flock *l)
2555aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2565aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (read(child_pipe[0], l, sizeof(*l)) != sizeof(*l)) {
2575aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "couldn't get message from child");
2585aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
2595aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2605aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2615aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
26256207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid child_put(struct flock *l)
2635aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2645aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (write(child_pipe[1], l, sizeof(*l)) != sizeof(*l)) {
2655aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "couldn't send message to parent");
2665aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
2675aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2685aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2695aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
27056207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid child_get(struct flock *l)
2715aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2725aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (read(parent_pipe[0], l, sizeof(*l)) != sizeof(*l)) {
2735aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "couldn't get message from parent");
2745aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		cleanup();
2755aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	} else if (l->l_type == (short)STOP) {
2765aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		exit(0);
2775aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2785aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2795aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
28056207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid stop_child()
2815aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2825aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	struct flock fl;
2835aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
28456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	(void)signal(SIGCLD, (void (*)())SIG_DFL);
2855aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl.l_type = STOP;
2865aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	parent_put(&fl);
2875aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	wait(0);
2885aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2895aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
29056207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid catch_child()
2915aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2925aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	tst_resm(TFAIL, "Unexpected death of child process");
2935aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	cleanup();
2945aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2955aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
2965aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewint main(int ac, char **av)
297865695bbc89088b9526ea9045410e5afb70a985cplars{
298865695bbc89088b9526ea9045410e5afb70a985cplars	struct flock tl;
299865695bbc89088b9526ea9045410e5afb70a985cplars
30056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	int lc;			/* loop counter */
30156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	char *msg;		/* message returned from parse_opts */
302865695bbc89088b9526ea9045410e5afb70a985cplars
303865695bbc89088b9526ea9045410e5afb70a985cplars	/* parse standard options */
30456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	if ((msg = parse_opts(ac, av, (option_t *) NULL, NULL)) != (char *)NULL) {
305865695bbc89088b9526ea9045410e5afb70a985cplars		tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg);
306865695bbc89088b9526ea9045410e5afb70a985cplars	}
307d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
308d34d581c6a320e356a6cda923c7aa399479e812crobbiew	maybe_run_child(&do_child, "ddddd", &parent_pipe[0], &parent_pipe[1],
309d34d581c6a320e356a6cda923c7aa399479e812crobbiew			&child_pipe[0], &child_pipe[1], &fd);
310d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
311d34d581c6a320e356a6cda923c7aa399479e812crobbiew
31256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	setup();		/* global setup */
313865695bbc89088b9526ea9045410e5afb70a985cplars
314865695bbc89088b9526ea9045410e5afb70a985cplars	/* Check for looping state if -i option is given */
315865695bbc89088b9526ea9045410e5afb70a985cplars	for (lc = 0; TEST_LOOPING(lc); lc++) {
316865695bbc89088b9526ea9045410e5afb70a985cplars		/* reset Tst_count in case we are looping */
317865695bbc89088b9526ea9045410e5afb70a985cplars		Tst_count = 0;
318865695bbc89088b9526ea9045410e5afb70a985cplars
319d34d581c6a320e356a6cda923c7aa399479e812crobbiew		if ((child_pid = FORK_OR_VFORK()) == 0) {	/* child */
320d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
32156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			if (self_exec
32256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			    (av[0], "ddddd", parent_pipe[0], parent_pipe[1],
32356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			     child_pipe[0], child_pipe[1], fd) < 0) {
324d34d581c6a320e356a6cda923c7aa399479e812crobbiew				tst_resm(TFAIL, "self_exec failed");
325d34d581c6a320e356a6cda923c7aa399479e812crobbiew				cleanup();
326d34d581c6a320e356a6cda923c7aa399479e812crobbiew			}
327d34d581c6a320e356a6cda923c7aa399479e812crobbiew#else
328865695bbc89088b9526ea9045410e5afb70a985cplars			do_child();
329d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
330865695bbc89088b9526ea9045410e5afb70a985cplars		}
331865695bbc89088b9526ea9045410e5afb70a985cplars
332865695bbc89088b9526ea9045410e5afb70a985cplars		if (child_pid < 0) {
333865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TFAIL, "Fork failed");
334865695bbc89088b9526ea9045410e5afb70a985cplars			cleanup();
335865695bbc89088b9526ea9045410e5afb70a985cplars		}
336865695bbc89088b9526ea9045410e5afb70a985cplars
337865695bbc89088b9526ea9045410e5afb70a985cplars		(void)close(parent_pipe[0]);
338865695bbc89088b9526ea9045410e5afb70a985cplars		(void)close(child_pipe[1]);
339865695bbc89088b9526ea9045410e5afb70a985cplars
340db63921767012310af15f29035a334e50486292cmridge/* //block1: */
341865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter block 1");
342865695bbc89088b9526ea9045410e5afb70a985cplars		/*
343865695bbc89088b9526ea9045410e5afb70a985cplars		 * Add a read lock to the middle of the file and unlock a
344865695bbc89088b9526ea9045410e5afb70a985cplars		 * section just before the lock
345865695bbc89088b9526ea9045410e5afb70a985cplars		 */
346865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 5) < 0) {
347dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
348dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
349865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
350865695bbc89088b9526ea9045410e5afb70a985cplars		}
351865695bbc89088b9526ea9045410e5afb70a985cplars
352865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 5, 5) < 0) {
353dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
354dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
355865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
356865695bbc89088b9526ea9045410e5afb70a985cplars		}
357865695bbc89088b9526ea9045410e5afb70a985cplars
358865695bbc89088b9526ea9045410e5afb70a985cplars		/*
359865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test read lock
360865695bbc89088b9526ea9045410e5afb70a985cplars		 */
361865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 0, 0);
362865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 10, 5, parent_pid);
363865695bbc89088b9526ea9045410e5afb70a985cplars
364865695bbc89088b9526ea9045410e5afb70a985cplars		/*
365865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test that the rest of the file is unlocked
366865695bbc89088b9526ea9045410e5afb70a985cplars		 */
367865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 15, 0);
36856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		compare_lock(&tl, (short)F_UNLCK, (short)0, 15, 0, (pid_t) 0);
369865695bbc89088b9526ea9045410e5afb70a985cplars
370865695bbc89088b9526ea9045410e5afb70a985cplars		/*
371865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
372865695bbc89088b9526ea9045410e5afb70a985cplars		 */
373865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
374865695bbc89088b9526ea9045410e5afb70a985cplars
375865695bbc89088b9526ea9045410e5afb70a985cplars		if (fail) {
376865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 1: FAILED");
377865695bbc89088b9526ea9045410e5afb70a985cplars		} else {
378865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 1: PASSED");
379865695bbc89088b9526ea9045410e5afb70a985cplars		}
380865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 1");
381865695bbc89088b9526ea9045410e5afb70a985cplars
382db63921767012310af15f29035a334e50486292cmridge/* //block2: */
383865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter block 2");
384865695bbc89088b9526ea9045410e5afb70a985cplars		fail = 0;
385865695bbc89088b9526ea9045410e5afb70a985cplars		/*
386865695bbc89088b9526ea9045410e5afb70a985cplars		 * Set a read lock in the middle and do an unlock that
387865695bbc89088b9526ea9045410e5afb70a985cplars		 * ends at the first byte of the read lock.
388865695bbc89088b9526ea9045410e5afb70a985cplars		 */
389865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 5) < 0) {
390dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
391dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
392865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
393865695bbc89088b9526ea9045410e5afb70a985cplars		}
394865695bbc89088b9526ea9045410e5afb70a985cplars
395865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 5, 6) < 0) {
396dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
397dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
398865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
399865695bbc89088b9526ea9045410e5afb70a985cplars		}
400865695bbc89088b9526ea9045410e5afb70a985cplars
401865695bbc89088b9526ea9045410e5afb70a985cplars		/*
402865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test read lock
403865695bbc89088b9526ea9045410e5afb70a985cplars		 */
404865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 0, 0);
405865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 11, 4, parent_pid);
406865695bbc89088b9526ea9045410e5afb70a985cplars
407865695bbc89088b9526ea9045410e5afb70a985cplars		/*
408865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test to make sure the rest of the file is unlocked
409865695bbc89088b9526ea9045410e5afb70a985cplars		 */
410865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 15, 0);
41156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		compare_lock(&tl, (short)F_UNLCK, (short)0, 15, 0, (pid_t) 0);
412865695bbc89088b9526ea9045410e5afb70a985cplars
413865695bbc89088b9526ea9045410e5afb70a985cplars		/*
414865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
415865695bbc89088b9526ea9045410e5afb70a985cplars		 */
416865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
417865695bbc89088b9526ea9045410e5afb70a985cplars
418865695bbc89088b9526ea9045410e5afb70a985cplars		if (fail) {
419865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 2: FAILED");
420865695bbc89088b9526ea9045410e5afb70a985cplars		} else {
421865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 2: PASSED");
422865695bbc89088b9526ea9045410e5afb70a985cplars		}
423865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 2");
424865695bbc89088b9526ea9045410e5afb70a985cplars
425db63921767012310af15f29035a334e50486292cmridge/* //block3: */
426865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter block 3");
427865695bbc89088b9526ea9045410e5afb70a985cplars		fail = 0;
428865695bbc89088b9526ea9045410e5afb70a985cplars
429865695bbc89088b9526ea9045410e5afb70a985cplars		/*
430865695bbc89088b9526ea9045410e5afb70a985cplars		 * Set a read lock on the middle of the file and do an
431865695bbc89088b9526ea9045410e5afb70a985cplars		 * unlock that overlaps the front of the read
432865695bbc89088b9526ea9045410e5afb70a985cplars		 */
433865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 5) < 0) {
434dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
435dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
436865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
437865695bbc89088b9526ea9045410e5afb70a985cplars		}
438865695bbc89088b9526ea9045410e5afb70a985cplars
439865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 5, 8) < 0) {
440dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
441dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
442865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
443865695bbc89088b9526ea9045410e5afb70a985cplars		}
444865695bbc89088b9526ea9045410e5afb70a985cplars
445865695bbc89088b9526ea9045410e5afb70a985cplars		/*
446865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test the read lock
447865695bbc89088b9526ea9045410e5afb70a985cplars		 */
448865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 0, 0);
449865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 13, 2, parent_pid);
450865695bbc89088b9526ea9045410e5afb70a985cplars
451865695bbc89088b9526ea9045410e5afb70a985cplars		/*
452865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test to make sure the rest of the file is unlocked
453865695bbc89088b9526ea9045410e5afb70a985cplars		 */
454865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 15, 0);
45556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		compare_lock(&tl, (short)F_UNLCK, (short)0, 15, 0, (pid_t) 0);
456865695bbc89088b9526ea9045410e5afb70a985cplars
457865695bbc89088b9526ea9045410e5afb70a985cplars		/*
458865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
459865695bbc89088b9526ea9045410e5afb70a985cplars		 */
460865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
461865695bbc89088b9526ea9045410e5afb70a985cplars
462865695bbc89088b9526ea9045410e5afb70a985cplars		if (fail) {
463865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 3: FAILED");
464865695bbc89088b9526ea9045410e5afb70a985cplars		} else {
465865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 3: PASSED");
466865695bbc89088b9526ea9045410e5afb70a985cplars		}
467865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 3");
468865695bbc89088b9526ea9045410e5afb70a985cplars
469db63921767012310af15f29035a334e50486292cmridge/* //block4: */
470865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter blcok 4");
471865695bbc89088b9526ea9045410e5afb70a985cplars		fail = 0;
47256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
473865695bbc89088b9526ea9045410e5afb70a985cplars		/*
474865695bbc89088b9526ea9045410e5afb70a985cplars		 * Set a read lock in the middle of a file and unlock a
475865695bbc89088b9526ea9045410e5afb70a985cplars		 * section in the middle of it
476865695bbc89088b9526ea9045410e5afb70a985cplars		 */
477865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 10) < 0) {
478dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
479dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
480865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
481865695bbc89088b9526ea9045410e5afb70a985cplars		}
482865695bbc89088b9526ea9045410e5afb70a985cplars
483865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 13, 5) < 0) {
484dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
485dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
486865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
487865695bbc89088b9526ea9045410e5afb70a985cplars		}
488865695bbc89088b9526ea9045410e5afb70a985cplars
489865695bbc89088b9526ea9045410e5afb70a985cplars		/*
490865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test the first read lock
491865695bbc89088b9526ea9045410e5afb70a985cplars		 */
492865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 0, 0);
493865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 10, 3, parent_pid);
494865695bbc89088b9526ea9045410e5afb70a985cplars
495865695bbc89088b9526ea9045410e5afb70a985cplars		/*
496865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test the second read lock
497865695bbc89088b9526ea9045410e5afb70a985cplars		 */
498865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 13, 0);
499865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 18, 2, parent_pid);
500865695bbc89088b9526ea9045410e5afb70a985cplars
501865695bbc89088b9526ea9045410e5afb70a985cplars		/*
502865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test to make sure the rest of the file is unlocked
503865695bbc89088b9526ea9045410e5afb70a985cplars		 */
504865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 20, 0);
50556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		compare_lock(&tl, (short)F_UNLCK, (short)0, 20, 0, (pid_t) 0);
506865695bbc89088b9526ea9045410e5afb70a985cplars
507865695bbc89088b9526ea9045410e5afb70a985cplars		/*
508865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
509865695bbc89088b9526ea9045410e5afb70a985cplars		 */
510865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
511865695bbc89088b9526ea9045410e5afb70a985cplars
512865695bbc89088b9526ea9045410e5afb70a985cplars		if (fail) {
513865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 4: FAILED");
514865695bbc89088b9526ea9045410e5afb70a985cplars		} else {
515865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 4: PASSED");
516865695bbc89088b9526ea9045410e5afb70a985cplars		}
517865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 4");
518865695bbc89088b9526ea9045410e5afb70a985cplars
519db63921767012310af15f29035a334e50486292cmridge/* //block5: */
520865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter block 5");
521865695bbc89088b9526ea9045410e5afb70a985cplars		fail = 0;
522865695bbc89088b9526ea9045410e5afb70a985cplars
523865695bbc89088b9526ea9045410e5afb70a985cplars		/*
524865695bbc89088b9526ea9045410e5afb70a985cplars		 * Set a read lock in the middle of the file and do a
525865695bbc89088b9526ea9045410e5afb70a985cplars		 * unlock that overlaps the end
526865695bbc89088b9526ea9045410e5afb70a985cplars		 */
527865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 5) < 0) {
528dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
529dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
530865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
531865695bbc89088b9526ea9045410e5afb70a985cplars		}
532865695bbc89088b9526ea9045410e5afb70a985cplars
533865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 13, 5) < 0) {
534dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
535dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
536865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
537865695bbc89088b9526ea9045410e5afb70a985cplars		}
538865695bbc89088b9526ea9045410e5afb70a985cplars
539865695bbc89088b9526ea9045410e5afb70a985cplars		/*
540865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test the read lock
541865695bbc89088b9526ea9045410e5afb70a985cplars		 */
542865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 0, 0);
543865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 10, 3, parent_pid);
544865695bbc89088b9526ea9045410e5afb70a985cplars
545865695bbc89088b9526ea9045410e5afb70a985cplars		/*
546865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test to make sure the rest of the file is unlocked
547865695bbc89088b9526ea9045410e5afb70a985cplars		 */
548865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 13, 0);
54956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		compare_lock(&tl, (short)F_UNLCK, (short)0, 13, 0, (pid_t) 0);
550865695bbc89088b9526ea9045410e5afb70a985cplars
551865695bbc89088b9526ea9045410e5afb70a985cplars		/*
552865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
553865695bbc89088b9526ea9045410e5afb70a985cplars		 */
554865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
555865695bbc89088b9526ea9045410e5afb70a985cplars
556865695bbc89088b9526ea9045410e5afb70a985cplars		if (fail) {
557865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 5: FAILED");
558865695bbc89088b9526ea9045410e5afb70a985cplars		} else {
559865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 5: PASSED");
560865695bbc89088b9526ea9045410e5afb70a985cplars		}
561865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 5");
562865695bbc89088b9526ea9045410e5afb70a985cplars
563db63921767012310af15f29035a334e50486292cmridge/* //block6: */
564865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter block 6");
565865695bbc89088b9526ea9045410e5afb70a985cplars		fail = 0;
56656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
567865695bbc89088b9526ea9045410e5afb70a985cplars		/*
568865695bbc89088b9526ea9045410e5afb70a985cplars		 * Set read lock in the middle of the file and do an unlock
569865695bbc89088b9526ea9045410e5afb70a985cplars		 * starting at the last byte of the read lock
570865695bbc89088b9526ea9045410e5afb70a985cplars		 */
571865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 5) < 0) {
572dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
573dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
574865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
575865695bbc89088b9526ea9045410e5afb70a985cplars		}
576865695bbc89088b9526ea9045410e5afb70a985cplars
577865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 14, 5) < 0) {
578dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
579dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
580865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
581865695bbc89088b9526ea9045410e5afb70a985cplars		}
582865695bbc89088b9526ea9045410e5afb70a985cplars
583865695bbc89088b9526ea9045410e5afb70a985cplars		/*
584865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test read lock
585865695bbc89088b9526ea9045410e5afb70a985cplars		 */
586865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 10, 0);
587865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 10, 4, parent_pid);
588865695bbc89088b9526ea9045410e5afb70a985cplars
589865695bbc89088b9526ea9045410e5afb70a985cplars		/*
590865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test to make sure the end of the file is unlocked
591865695bbc89088b9526ea9045410e5afb70a985cplars		 */
592865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 14, 0);
59356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		compare_lock(&tl, (short)F_UNLCK, (short)0, 14, 0, (pid_t) 0);
594865695bbc89088b9526ea9045410e5afb70a985cplars
595865695bbc89088b9526ea9045410e5afb70a985cplars		/*
596865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
597865695bbc89088b9526ea9045410e5afb70a985cplars		 */
598865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
599865695bbc89088b9526ea9045410e5afb70a985cplars
600865695bbc89088b9526ea9045410e5afb70a985cplars		if (fail) {
601865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 6: FAILED");
602865695bbc89088b9526ea9045410e5afb70a985cplars		} else {
603865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 6: PASSED");
604865695bbc89088b9526ea9045410e5afb70a985cplars		}
605865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 6");
606865695bbc89088b9526ea9045410e5afb70a985cplars
607db63921767012310af15f29035a334e50486292cmridge/* //block7: */
608865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter block 7");
609865695bbc89088b9526ea9045410e5afb70a985cplars		fail = 0;
610865695bbc89088b9526ea9045410e5afb70a985cplars
611865695bbc89088b9526ea9045410e5afb70a985cplars		/*
612865695bbc89088b9526ea9045410e5afb70a985cplars		 * Set a read lock at the middle of the file and do an
613865695bbc89088b9526ea9045410e5afb70a985cplars		 * unlock that starts at the byte past the end of the read
614865695bbc89088b9526ea9045410e5afb70a985cplars		 * lock
615865695bbc89088b9526ea9045410e5afb70a985cplars		 */
616865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 5) < 0) {
617dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
618dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
619865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
620865695bbc89088b9526ea9045410e5afb70a985cplars		}
621865695bbc89088b9526ea9045410e5afb70a985cplars
622865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 16, 0) < 0) {
623dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
624dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
625865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
626865695bbc89088b9526ea9045410e5afb70a985cplars		}
627865695bbc89088b9526ea9045410e5afb70a985cplars
628865695bbc89088b9526ea9045410e5afb70a985cplars		/*
629865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test the read lock
630865695bbc89088b9526ea9045410e5afb70a985cplars		 */
631865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 0, 0);
632865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 10, 5, parent_pid);
633865695bbc89088b9526ea9045410e5afb70a985cplars
634865695bbc89088b9526ea9045410e5afb70a985cplars		/*
635865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test to make sure the rest of the file is unlocked
636865695bbc89088b9526ea9045410e5afb70a985cplars		 */
637865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 16, 0);
63856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		compare_lock(&tl, (short)F_UNLCK, (short)0, 16, 0, (pid_t) 0);
639865695bbc89088b9526ea9045410e5afb70a985cplars
640865695bbc89088b9526ea9045410e5afb70a985cplars		/*
641865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
642865695bbc89088b9526ea9045410e5afb70a985cplars		 */
643865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
644865695bbc89088b9526ea9045410e5afb70a985cplars
645865695bbc89088b9526ea9045410e5afb70a985cplars		if (fail) {
646865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 7: FAILED");
647865695bbc89088b9526ea9045410e5afb70a985cplars		} else {
648865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 7: PASSED");
649865695bbc89088b9526ea9045410e5afb70a985cplars		}
650865695bbc89088b9526ea9045410e5afb70a985cplars
651865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 7");
652865695bbc89088b9526ea9045410e5afb70a985cplars
653865695bbc89088b9526ea9045410e5afb70a985cplars		stop_child();
654865695bbc89088b9526ea9045410e5afb70a985cplars		close(fd);
655865695bbc89088b9526ea9045410e5afb70a985cplars	}
656865695bbc89088b9526ea9045410e5afb70a985cplars	cleanup();
65743337a3cf6f8809647cf9fc6c0054241f44b1fb1subrata_modak	return 0;
658865695bbc89088b9526ea9045410e5afb70a985cplars}
659