fcntl20.c revision 0a643cbbb767d477008ea1d30e422aa78195813e
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"
490a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper#include "safe_macros.h"
50865695bbc89088b9526ea9045410e5afb70a985cplars
51865695bbc89088b9526ea9045410e5afb70a985cplars#define STRINGSIZE	27
52865695bbc89088b9526ea9045410e5afb70a985cplars#define STRING		"abcdefghijklmnopqrstuvwxyz\n"
53865695bbc89088b9526ea9045410e5afb70a985cplars#define STOP		0xFFF0
54865695bbc89088b9526ea9045410e5afb70a985cplars
55865695bbc89088b9526ea9045410e5afb70a985cplarsint parent_pipe[2];
56865695bbc89088b9526ea9045410e5afb70a985cplarsint child_pipe[2];
57865695bbc89088b9526ea9045410e5afb70a985cplarsint fd;
58a1e518de6c83215cacf5faad0f4a36148f2f8f8aplarspid_t parent_pid, child_pid;
59865695bbc89088b9526ea9045410e5afb70a985cplars
60865695bbc89088b9526ea9045410e5afb70a985cplarsvoid parent_put();
61865695bbc89088b9526ea9045410e5afb70a985cplarsvoid parent_get();
62865695bbc89088b9526ea9045410e5afb70a985cplarsvoid child_put();
63865695bbc89088b9526ea9045410e5afb70a985cplarsvoid child_get();
64865695bbc89088b9526ea9045410e5afb70a985cplarsvoid stop_child();
65a1e518de6c83215cacf5faad0f4a36148f2f8f8aplarsvoid compare_lock(struct flock *, short, short, int, int, pid_t);
66865695bbc89088b9526ea9045410e5afb70a985cplarsvoid unlock_file();
67865695bbc89088b9526ea9045410e5afb70a985cplarsvoid do_test(struct flock *, short, short, int, int);
68865695bbc89088b9526ea9045410e5afb70a985cplarsvoid catch_child();
69865695bbc89088b9526ea9045410e5afb70a985cplarschar *str_type();
70865695bbc89088b9526ea9045410e5afb70a985cplarsint do_lock(int, short, short, int, int);
71865695bbc89088b9526ea9045410e5afb70a985cplars
72fa31d55d3486830313bd044f7333697ce6124d22nstrazchar *TCID = "fcntl20";
73865695bbc89088b9526ea9045410e5afb70a985cplarsint TST_TOTAL = 1;
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	tst_sig(FORK, DEF_HANDLER, cleanup);
915aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
925aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	umask(0);
935aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
945aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	TEST_PAUSE;
955aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
965aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	parent_pid = getpid();
9754f7a718c05ce3e0c51950e1a6d2243513366076robbiew
980a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper	SAFE_PIPE(NULL, parent_pipe);
990a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper	SAFE_PIPE(NULL, child_pipe);
1000a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper
10154f7a718c05ce3e0c51950e1a6d2243513366076robbiew	tst_tmpdir();
1020a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper
103dad2271b03625d8d549ede28a8792c6a7836cc54robbiew	snprintf(template, PATH_MAX, "fcntl20XXXXXX");
1045aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1050a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper	if ((fd = mkstemp(template)) == -1)
1060a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper		tst_resm(TFAIL|TERRNO, "mkstemp failed");
1075aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1080a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper	SAFE_WRITE(cleanup, 0, fd, buf, STRINGSIZE);
1095aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1101e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	memset(&act, 0, sizeof(act));
1111e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	act.sa_handler = catch_child;
1121e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	sigemptyset(&act.sa_mask);
1131e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	sigaddset(&act.sa_mask, SIGCLD);
1140a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper	if (sigaction(SIGCLD, &act, NULL) == -1)
1150a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper		tst_brkm(TFAIL|TERRNO, cleanup, "SIGCLD signal setup failed");
1165aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
1175aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
11856207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid cleanup()
1195aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
1205aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	TEST_CLEANUP;
1215aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1220a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper	SAFE_CLOSE(NULL, fd);
1230a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper
12454f7a718c05ce3e0c51950e1a6d2243513366076robbiew	tst_rmdir();
1252c28215423293e443469a07ae7011135d058b671Garrett Cooper
1265aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
1275aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1285aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewvoid do_child()
1295aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
1305aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	struct flock fl;
1315aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1325aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	close(parent_pipe[1]);
1335aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	close(child_pipe[0]);
13456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	while (1) {
1355aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		child_get(&fl);
1365aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		if (fcntl(fd, F_GETLK, &fl) < 0) {
1370a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper			tst_resm(TFAIL|TERRNO, "fcntl on file failed");
1385aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			fail = 1;
1395aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		}
1405aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		child_put(&fl);
1415aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
1425aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
1435aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1445aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewint do_lock(int cmd, short type, short whence, int start, int len)
1455aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
1465aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	struct flock fl;
1475aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1485aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl.l_type = type;
1495aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl.l_whence = whence;
1505aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl.l_start = start;
1515aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl.l_len = len;
15256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	return (fcntl(fd, cmd, &fl));
1535aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
1545aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
15556207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid do_test(struct flock *fl, short type, short whence, int start, int len)
1565aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
1575aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl->l_type = type;
1585aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl->l_whence = whence;
1595aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl->l_start = start;
1605aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl->l_len = len;
1615aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl->l_pid = (short)0;
1625aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1635aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	parent_put(fl);
1645aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	parent_get(fl);
1655aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
1665aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1675aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewvoid
1685aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewcompare_lock(struct flock *fl, short type, short whence, int start, int len,
1695aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	     pid_t pid)
1705aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
1715aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (fl->l_type != type) {
1725aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "lock type is wrong should be %s is %s",
1735aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			 str_type(type), str_type(fl->l_type));
1745aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
1755aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
1765aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1775aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (fl->l_whence != whence) {
1785aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "lock whence is wrong should be %d is %d",
1795aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			 whence, fl->l_whence);
1805aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
1815aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
1825aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1835aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (fl->l_start != start) {
1845aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "region starts in wrong place, should be"
185923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak			 "%d is %"PRId64, start, (int64_t)fl->l_start);
1865aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
1875aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
1885aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1895aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (fl->l_len != len) {
190923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak		tst_resm(TFAIL, "region length is wrong, should be %d is %"PRId64,
191923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak			 len, (int64_t)fl->l_len);
1925aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
1935aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
1945aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1955aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (fl->l_pid != pid) {
1965aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "locking pid is wrong, should be %d is %d",
1975aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			 pid, fl->l_pid);
1985aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
1995aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2005aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2015aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
20256207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid unlock_file()
2035aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2045aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	struct flock fl;
2055aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
2065aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 0, 0) < 0) {
20756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		tst_resm(TFAIL, "fcntl on file failed, errno =%d", errno);
2085aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
2095aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2105aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	do_test(&fl, F_WRLCK, 0, 0, 0);
21156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	compare_lock(&fl, (short)F_UNLCK, (short)0, 0, 0, (pid_t) 0);
2125aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2135aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
21456207cec7732e09c216c751c0b5f88a242bacae6subrata_modakchar *str_type(int type)
2155aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2165aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	static char buf[20];
2175aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
2185aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	switch (type) {
2195aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	case 1:
22056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		return ("F_RDLCK");
2215aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	case 2:
22256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		return ("F_WRLCK");
2235aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	case 3:
22456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		return ("F_UNLCK");
2255aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	default:
2265aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		sprintf(buf, "BAD VALUE: %d", type);
22756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		return (buf);
2285aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2295aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2305aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
23156207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid parent_put(struct flock *l)
2325aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2335aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (write(parent_pipe[1], l, sizeof(*l)) != sizeof(*l)) {
2345aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "couldn't send message to child");
2355aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
2365aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2375aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2385aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
23956207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid parent_get(struct flock *l)
2405aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2415aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (read(child_pipe[0], l, sizeof(*l)) != sizeof(*l)) {
2425aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "couldn't get message from child");
2435aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
2445aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2455aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2465aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
24756207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid child_put(struct flock *l)
2485aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2495aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (write(child_pipe[1], l, sizeof(*l)) != sizeof(*l)) {
2505aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "couldn't send message to parent");
2515aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
2525aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2535aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2545aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
25556207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid child_get(struct flock *l)
2565aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2575aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (read(parent_pipe[0], l, sizeof(*l)) != sizeof(*l)) {
2585aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "couldn't get message from parent");
2595aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		cleanup();
2605aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	} else if (l->l_type == (short)STOP) {
2615aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		exit(0);
2625aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2635aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2645aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
26556207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid stop_child()
2665aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2675aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	struct flock fl;
2685aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
26956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	(void)signal(SIGCLD, (void (*)())SIG_DFL);
2705aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl.l_type = STOP;
2715aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	parent_put(&fl);
2725aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	wait(0);
2735aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2745aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
27556207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid catch_child()
2765aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2775aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	tst_resm(TFAIL, "Unexpected death of child process");
2785aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	cleanup();
2795aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2805aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
2815aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewint main(int ac, char **av)
282865695bbc89088b9526ea9045410e5afb70a985cplars{
283865695bbc89088b9526ea9045410e5afb70a985cplars	struct flock tl;
284865695bbc89088b9526ea9045410e5afb70a985cplars
28556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	int lc;			/* loop counter */
28656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	char *msg;		/* message returned from parse_opts */
287865695bbc89088b9526ea9045410e5afb70a985cplars
288865695bbc89088b9526ea9045410e5afb70a985cplars	/* parse standard options */
28945e285d46ab47b0ff76c88acb5ba97b0bd5f753dGarrett Cooper	if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) {
29060fa8014af7534eaefa901200c8df4b74ce422e6Garrett Cooper		tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
291865695bbc89088b9526ea9045410e5afb70a985cplars	}
292d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
293d34d581c6a320e356a6cda923c7aa399479e812crobbiew	maybe_run_child(&do_child, "ddddd", &parent_pipe[0], &parent_pipe[1],
294d34d581c6a320e356a6cda923c7aa399479e812crobbiew			&child_pipe[0], &child_pipe[1], &fd);
295d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
296d34d581c6a320e356a6cda923c7aa399479e812crobbiew
29756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	setup();		/* global setup */
298865695bbc89088b9526ea9045410e5afb70a985cplars
299865695bbc89088b9526ea9045410e5afb70a985cplars	/* Check for looping state if -i option is given */
300865695bbc89088b9526ea9045410e5afb70a985cplars	for (lc = 0; TEST_LOOPING(lc); lc++) {
301865695bbc89088b9526ea9045410e5afb70a985cplars		/* reset Tst_count in case we are looping */
302865695bbc89088b9526ea9045410e5afb70a985cplars		Tst_count = 0;
303865695bbc89088b9526ea9045410e5afb70a985cplars
304d34d581c6a320e356a6cda923c7aa399479e812crobbiew		if ((child_pid = FORK_OR_VFORK()) == 0) {	/* child */
305d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
30656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			if (self_exec
30756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			    (av[0], "ddddd", parent_pipe[0], parent_pipe[1],
30856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			     child_pipe[0], child_pipe[1], fd) < 0) {
309d34d581c6a320e356a6cda923c7aa399479e812crobbiew				tst_resm(TFAIL, "self_exec failed");
310d34d581c6a320e356a6cda923c7aa399479e812crobbiew				cleanup();
311d34d581c6a320e356a6cda923c7aa399479e812crobbiew			}
312d34d581c6a320e356a6cda923c7aa399479e812crobbiew#else
313865695bbc89088b9526ea9045410e5afb70a985cplars			do_child();
314d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
315865695bbc89088b9526ea9045410e5afb70a985cplars		}
316865695bbc89088b9526ea9045410e5afb70a985cplars
317865695bbc89088b9526ea9045410e5afb70a985cplars		if (child_pid < 0) {
318865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TFAIL, "Fork failed");
319865695bbc89088b9526ea9045410e5afb70a985cplars			cleanup();
320865695bbc89088b9526ea9045410e5afb70a985cplars		}
321865695bbc89088b9526ea9045410e5afb70a985cplars
322865695bbc89088b9526ea9045410e5afb70a985cplars		(void)close(parent_pipe[0]);
323865695bbc89088b9526ea9045410e5afb70a985cplars		(void)close(child_pipe[1]);
324865695bbc89088b9526ea9045410e5afb70a985cplars
325db63921767012310af15f29035a334e50486292cmridge/* //block1: */
326865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter block 1");
327865695bbc89088b9526ea9045410e5afb70a985cplars		/*
328865695bbc89088b9526ea9045410e5afb70a985cplars		 * Add a read lock to the middle of the file and unlock a
329865695bbc89088b9526ea9045410e5afb70a985cplars		 * section just before the lock
330865695bbc89088b9526ea9045410e5afb70a985cplars		 */
331865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 5) < 0) {
332dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
333dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
334865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
335865695bbc89088b9526ea9045410e5afb70a985cplars		}
336865695bbc89088b9526ea9045410e5afb70a985cplars
337865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 5, 5) < 0) {
338dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
339dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
340865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
341865695bbc89088b9526ea9045410e5afb70a985cplars		}
342865695bbc89088b9526ea9045410e5afb70a985cplars
343865695bbc89088b9526ea9045410e5afb70a985cplars		/*
344865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test read lock
345865695bbc89088b9526ea9045410e5afb70a985cplars		 */
346865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 0, 0);
347865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 10, 5, parent_pid);
348865695bbc89088b9526ea9045410e5afb70a985cplars
349865695bbc89088b9526ea9045410e5afb70a985cplars		/*
350865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test that the rest of the file is unlocked
351865695bbc89088b9526ea9045410e5afb70a985cplars		 */
352865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 15, 0);
35356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		compare_lock(&tl, (short)F_UNLCK, (short)0, 15, 0, (pid_t) 0);
354865695bbc89088b9526ea9045410e5afb70a985cplars
355865695bbc89088b9526ea9045410e5afb70a985cplars		/*
356865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
357865695bbc89088b9526ea9045410e5afb70a985cplars		 */
358865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
359865695bbc89088b9526ea9045410e5afb70a985cplars
360865695bbc89088b9526ea9045410e5afb70a985cplars		if (fail) {
361865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 1: FAILED");
362865695bbc89088b9526ea9045410e5afb70a985cplars		} else {
363865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 1: PASSED");
364865695bbc89088b9526ea9045410e5afb70a985cplars		}
365865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 1");
366865695bbc89088b9526ea9045410e5afb70a985cplars
367db63921767012310af15f29035a334e50486292cmridge/* //block2: */
368865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter block 2");
369865695bbc89088b9526ea9045410e5afb70a985cplars		fail = 0;
370865695bbc89088b9526ea9045410e5afb70a985cplars		/*
371865695bbc89088b9526ea9045410e5afb70a985cplars		 * Set a read lock in the middle and do an unlock that
372865695bbc89088b9526ea9045410e5afb70a985cplars		 * ends at the first byte of the read lock.
373865695bbc89088b9526ea9045410e5afb70a985cplars		 */
374865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 5) < 0) {
375dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
376dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
377865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
378865695bbc89088b9526ea9045410e5afb70a985cplars		}
379865695bbc89088b9526ea9045410e5afb70a985cplars
380865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 5, 6) < 0) {
381dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
382dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
383865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
384865695bbc89088b9526ea9045410e5afb70a985cplars		}
385865695bbc89088b9526ea9045410e5afb70a985cplars
386865695bbc89088b9526ea9045410e5afb70a985cplars		/*
387865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test read lock
388865695bbc89088b9526ea9045410e5afb70a985cplars		 */
389865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 0, 0);
390865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 11, 4, parent_pid);
391865695bbc89088b9526ea9045410e5afb70a985cplars
392865695bbc89088b9526ea9045410e5afb70a985cplars		/*
393865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test to make sure the rest of the file is unlocked
394865695bbc89088b9526ea9045410e5afb70a985cplars		 */
395865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 15, 0);
39656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		compare_lock(&tl, (short)F_UNLCK, (short)0, 15, 0, (pid_t) 0);
397865695bbc89088b9526ea9045410e5afb70a985cplars
398865695bbc89088b9526ea9045410e5afb70a985cplars		/*
399865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
400865695bbc89088b9526ea9045410e5afb70a985cplars		 */
401865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
402865695bbc89088b9526ea9045410e5afb70a985cplars
4030a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper		if (fail)
404865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 2: FAILED");
4050a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper		else
406865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 2: PASSED");
407865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 2");
408865695bbc89088b9526ea9045410e5afb70a985cplars
409db63921767012310af15f29035a334e50486292cmridge/* //block3: */
410865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter block 3");
411865695bbc89088b9526ea9045410e5afb70a985cplars		fail = 0;
412865695bbc89088b9526ea9045410e5afb70a985cplars
413865695bbc89088b9526ea9045410e5afb70a985cplars		/*
414865695bbc89088b9526ea9045410e5afb70a985cplars		 * Set a read lock on the middle of the file and do an
415865695bbc89088b9526ea9045410e5afb70a985cplars		 * unlock that overlaps the front of the read
416865695bbc89088b9526ea9045410e5afb70a985cplars		 */
417865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 5) < 0) {
418dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
419dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
420865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
421865695bbc89088b9526ea9045410e5afb70a985cplars		}
422865695bbc89088b9526ea9045410e5afb70a985cplars
423865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 5, 8) < 0) {
424dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
425dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
426865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
427865695bbc89088b9526ea9045410e5afb70a985cplars		}
428865695bbc89088b9526ea9045410e5afb70a985cplars
429865695bbc89088b9526ea9045410e5afb70a985cplars		/*
430865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test the read lock
431865695bbc89088b9526ea9045410e5afb70a985cplars		 */
432865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 0, 0);
433865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 13, 2, parent_pid);
434865695bbc89088b9526ea9045410e5afb70a985cplars
435865695bbc89088b9526ea9045410e5afb70a985cplars		/*
436865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test to make sure the rest of the file is unlocked
437865695bbc89088b9526ea9045410e5afb70a985cplars		 */
438865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 15, 0);
43956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		compare_lock(&tl, (short)F_UNLCK, (short)0, 15, 0, (pid_t) 0);
440865695bbc89088b9526ea9045410e5afb70a985cplars
441865695bbc89088b9526ea9045410e5afb70a985cplars		/*
442865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
443865695bbc89088b9526ea9045410e5afb70a985cplars		 */
444865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
445865695bbc89088b9526ea9045410e5afb70a985cplars
4460a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper		if (fail)
447865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 3: FAILED");
4480a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper		else
449865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 3: PASSED");
450865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 3");
451865695bbc89088b9526ea9045410e5afb70a985cplars
452db63921767012310af15f29035a334e50486292cmridge/* //block4: */
453865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter blcok 4");
454865695bbc89088b9526ea9045410e5afb70a985cplars		fail = 0;
45556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
456865695bbc89088b9526ea9045410e5afb70a985cplars		/*
457865695bbc89088b9526ea9045410e5afb70a985cplars		 * Set a read lock in the middle of a file and unlock a
458865695bbc89088b9526ea9045410e5afb70a985cplars		 * section in the middle of it
459865695bbc89088b9526ea9045410e5afb70a985cplars		 */
460865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 10) < 0) {
461dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
462dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
463865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
464865695bbc89088b9526ea9045410e5afb70a985cplars		}
465865695bbc89088b9526ea9045410e5afb70a985cplars
466865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 13, 5) < 0) {
467dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
468dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
469865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
470865695bbc89088b9526ea9045410e5afb70a985cplars		}
471865695bbc89088b9526ea9045410e5afb70a985cplars
472865695bbc89088b9526ea9045410e5afb70a985cplars		/*
473865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test the first read lock
474865695bbc89088b9526ea9045410e5afb70a985cplars		 */
475865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 0, 0);
476865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 10, 3, parent_pid);
477865695bbc89088b9526ea9045410e5afb70a985cplars
478865695bbc89088b9526ea9045410e5afb70a985cplars		/*
479865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test the second read lock
480865695bbc89088b9526ea9045410e5afb70a985cplars		 */
481865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 13, 0);
482865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 18, 2, parent_pid);
483865695bbc89088b9526ea9045410e5afb70a985cplars
484865695bbc89088b9526ea9045410e5afb70a985cplars		/*
485865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test to make sure the rest of the file is unlocked
486865695bbc89088b9526ea9045410e5afb70a985cplars		 */
487865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 20, 0);
48856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		compare_lock(&tl, (short)F_UNLCK, (short)0, 20, 0, (pid_t) 0);
489865695bbc89088b9526ea9045410e5afb70a985cplars
490865695bbc89088b9526ea9045410e5afb70a985cplars		/*
491865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
492865695bbc89088b9526ea9045410e5afb70a985cplars		 */
493865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
494865695bbc89088b9526ea9045410e5afb70a985cplars
4950a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper		if (fail)
496865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 4: FAILED");
4970a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper		else
498865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 4: PASSED");
499865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 4");
500865695bbc89088b9526ea9045410e5afb70a985cplars
501db63921767012310af15f29035a334e50486292cmridge/* //block5: */
502865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter block 5");
503865695bbc89088b9526ea9045410e5afb70a985cplars		fail = 0;
504865695bbc89088b9526ea9045410e5afb70a985cplars
505865695bbc89088b9526ea9045410e5afb70a985cplars		/*
506865695bbc89088b9526ea9045410e5afb70a985cplars		 * Set a read lock in the middle of the file and do a
507865695bbc89088b9526ea9045410e5afb70a985cplars		 * unlock that overlaps the end
508865695bbc89088b9526ea9045410e5afb70a985cplars		 */
509865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 5) < 0) {
510dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
511dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
512865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
513865695bbc89088b9526ea9045410e5afb70a985cplars		}
514865695bbc89088b9526ea9045410e5afb70a985cplars
515865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 13, 5) < 0) {
516dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
517dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
518865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
519865695bbc89088b9526ea9045410e5afb70a985cplars		}
520865695bbc89088b9526ea9045410e5afb70a985cplars
521865695bbc89088b9526ea9045410e5afb70a985cplars		/*
522865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test the read lock
523865695bbc89088b9526ea9045410e5afb70a985cplars		 */
524865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 0, 0);
525865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 10, 3, parent_pid);
526865695bbc89088b9526ea9045410e5afb70a985cplars
527865695bbc89088b9526ea9045410e5afb70a985cplars		/*
528865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test to make sure the rest of the file is unlocked
529865695bbc89088b9526ea9045410e5afb70a985cplars		 */
530865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 13, 0);
53156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		compare_lock(&tl, (short)F_UNLCK, (short)0, 13, 0, (pid_t) 0);
532865695bbc89088b9526ea9045410e5afb70a985cplars
533865695bbc89088b9526ea9045410e5afb70a985cplars		/*
534865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
535865695bbc89088b9526ea9045410e5afb70a985cplars		 */
536865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
537865695bbc89088b9526ea9045410e5afb70a985cplars
5380a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper		if (fail)
539865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 5: FAILED");
5400a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper		else
541865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 5: PASSED");
542865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 5");
543865695bbc89088b9526ea9045410e5afb70a985cplars
544db63921767012310af15f29035a334e50486292cmridge/* //block6: */
545865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter block 6");
546865695bbc89088b9526ea9045410e5afb70a985cplars		fail = 0;
54756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
548865695bbc89088b9526ea9045410e5afb70a985cplars		/*
549865695bbc89088b9526ea9045410e5afb70a985cplars		 * Set read lock in the middle of the file and do an unlock
550865695bbc89088b9526ea9045410e5afb70a985cplars		 * starting at the last byte of the read lock
551865695bbc89088b9526ea9045410e5afb70a985cplars		 */
552865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 5) < 0) {
553dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
554dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
555865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
556865695bbc89088b9526ea9045410e5afb70a985cplars		}
557865695bbc89088b9526ea9045410e5afb70a985cplars
558865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 14, 5) < 0) {
559dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
560dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
561865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
562865695bbc89088b9526ea9045410e5afb70a985cplars		}
563865695bbc89088b9526ea9045410e5afb70a985cplars
564865695bbc89088b9526ea9045410e5afb70a985cplars		/*
565865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test read lock
566865695bbc89088b9526ea9045410e5afb70a985cplars		 */
567865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 10, 0);
568865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 10, 4, parent_pid);
569865695bbc89088b9526ea9045410e5afb70a985cplars
570865695bbc89088b9526ea9045410e5afb70a985cplars		/*
571865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test to make sure the end of the file is unlocked
572865695bbc89088b9526ea9045410e5afb70a985cplars		 */
573865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 14, 0);
57456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		compare_lock(&tl, (short)F_UNLCK, (short)0, 14, 0, (pid_t) 0);
575865695bbc89088b9526ea9045410e5afb70a985cplars
576865695bbc89088b9526ea9045410e5afb70a985cplars		/*
577865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
578865695bbc89088b9526ea9045410e5afb70a985cplars		 */
579865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
580865695bbc89088b9526ea9045410e5afb70a985cplars
5810a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper		if (fail)
582865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 6: FAILED");
5830a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper		else
584865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 6: PASSED");
585865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 6");
586865695bbc89088b9526ea9045410e5afb70a985cplars
587db63921767012310af15f29035a334e50486292cmridge/* //block7: */
588865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter block 7");
589865695bbc89088b9526ea9045410e5afb70a985cplars		fail = 0;
590865695bbc89088b9526ea9045410e5afb70a985cplars
591865695bbc89088b9526ea9045410e5afb70a985cplars		/*
592865695bbc89088b9526ea9045410e5afb70a985cplars		 * Set a read lock at the middle of the file and do an
593865695bbc89088b9526ea9045410e5afb70a985cplars		 * unlock that starts at the byte past the end of the read
594865695bbc89088b9526ea9045410e5afb70a985cplars		 * lock
595865695bbc89088b9526ea9045410e5afb70a985cplars		 */
596865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 5) < 0) {
597dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
598dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
599865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
600865695bbc89088b9526ea9045410e5afb70a985cplars		}
601865695bbc89088b9526ea9045410e5afb70a985cplars
602865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 16, 0) < 0) {
603dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
604dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
605865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
606865695bbc89088b9526ea9045410e5afb70a985cplars		}
607865695bbc89088b9526ea9045410e5afb70a985cplars
608865695bbc89088b9526ea9045410e5afb70a985cplars		/*
609865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test the read lock
610865695bbc89088b9526ea9045410e5afb70a985cplars		 */
611865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 0, 0);
612865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 10, 5, parent_pid);
613865695bbc89088b9526ea9045410e5afb70a985cplars
614865695bbc89088b9526ea9045410e5afb70a985cplars		/*
615865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test to make sure the rest of the file is unlocked
616865695bbc89088b9526ea9045410e5afb70a985cplars		 */
617865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 16, 0);
61856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		compare_lock(&tl, (short)F_UNLCK, (short)0, 16, 0, (pid_t) 0);
619865695bbc89088b9526ea9045410e5afb70a985cplars
620865695bbc89088b9526ea9045410e5afb70a985cplars		/*
621865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
622865695bbc89088b9526ea9045410e5afb70a985cplars		 */
623865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
624865695bbc89088b9526ea9045410e5afb70a985cplars
6250a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper		if (fail)
626865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 7: FAILED");
6270a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper		else
628865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 7: PASSED");
629865695bbc89088b9526ea9045410e5afb70a985cplars
630865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 7");
631865695bbc89088b9526ea9045410e5afb70a985cplars
632865695bbc89088b9526ea9045410e5afb70a985cplars		stop_child();
633865695bbc89088b9526ea9045410e5afb70a985cplars	}
634865695bbc89088b9526ea9045410e5afb70a985cplars	cleanup();
6352c28215423293e443469a07ae7011135d058b671Garrett Cooper	tst_exit();
6360a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper}
637