1865695bbc89088b9526ea9045410e5afb70a985cplars/*
2865695bbc89088b9526ea9045410e5afb70a985cplars *
3865695bbc89088b9526ea9045410e5afb70a985cplars *   Copyright (c) International Business Machines  Corp., 2001
4865695bbc89088b9526ea9045410e5afb70a985cplars *
5865695bbc89088b9526ea9045410e5afb70a985cplars *   This program is free software;  you can redistribute it and/or modify
6865695bbc89088b9526ea9045410e5afb70a985cplars *   it under the terms of the GNU General Public License as published by
7865695bbc89088b9526ea9045410e5afb70a985cplars *   the Free Software Foundation; either version 2 of the License, or
8865695bbc89088b9526ea9045410e5afb70a985cplars *   (at your option) any later version.
9865695bbc89088b9526ea9045410e5afb70a985cplars *
10865695bbc89088b9526ea9045410e5afb70a985cplars *   This program is distributed in the hope that it will be useful,
11865695bbc89088b9526ea9045410e5afb70a985cplars *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
12865695bbc89088b9526ea9045410e5afb70a985cplars *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13865695bbc89088b9526ea9045410e5afb70a985cplars *   the GNU General Public License for more details.
14865695bbc89088b9526ea9045410e5afb70a985cplars *
15865695bbc89088b9526ea9045410e5afb70a985cplars *   You should have received a copy of the GNU General Public License
16865695bbc89088b9526ea9045410e5afb70a985cplars *   along with this program;  if not, write to the Free Software
174548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18865695bbc89088b9526ea9045410e5afb70a985cplars */
19865695bbc89088b9526ea9045410e5afb70a985cplars
20865695bbc89088b9526ea9045410e5afb70a985cplars/*
21865695bbc89088b9526ea9045410e5afb70a985cplars * NAME
2256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak *	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"
480a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper#include "safe_macros.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;
73865695bbc89088b9526ea9045410e5afb70a985cplars
74865695bbc89088b9526ea9045410e5afb70a985cplarsvoid setup(void);
75865695bbc89088b9526ea9045410e5afb70a985cplarsvoid cleanup(void);
76865695bbc89088b9526ea9045410e5afb70a985cplars
77865695bbc89088b9526ea9045410e5afb70a985cplarsint fail = 0;
78865695bbc89088b9526ea9045410e5afb70a985cplars
795aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew/*
805aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew * setup
8156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak *	performs all ONE TIME setup for this test
825aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew */
83c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid setup(void)
845aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
855aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	char *buf = STRING;
86dad2271b03625d8d549ede28a8792c6a7836cc54robbiew	char template[PATH_MAX];
871e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	struct sigaction act;
885aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
895aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	tst_sig(FORK, DEF_HANDLER, cleanup);
905aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
915aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	umask(0);
925aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
935aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	TEST_PAUSE;
945aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
955aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	parent_pid = getpid();
9654f7a718c05ce3e0c51950e1a6d2243513366076robbiew
970a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper	SAFE_PIPE(NULL, parent_pipe);
980a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper	SAFE_PIPE(NULL, child_pipe);
990a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper
10054f7a718c05ce3e0c51950e1a6d2243513366076robbiew	tst_tmpdir();
1010a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper
102dad2271b03625d8d549ede28a8792c6a7836cc54robbiew	snprintf(template, PATH_MAX, "fcntl20XXXXXX");
1035aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1040a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper	if ((fd = mkstemp(template)) == -1)
105354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_resm(TFAIL | TERRNO, "mkstemp failed");
1065aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1070a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper	SAFE_WRITE(cleanup, 0, fd, buf, STRINGSIZE);
1085aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1091e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	memset(&act, 0, sizeof(act));
1101e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	act.sa_handler = catch_child;
1111e4cf0c6ea46b11ed5d6fac9bc9646f1784645b7robbiew	sigemptyset(&act.sa_mask);
112ad33a3dbf669a1f60f890bfa8f22d5ca1b7a4794Khem Raj	sigaddset(&act.sa_mask, SIGCHLD);
113ad33a3dbf669a1f60f890bfa8f22d5ca1b7a4794Khem Raj	if (sigaction(SIGCHLD, &act, NULL) == -1)
114ad33a3dbf669a1f60f890bfa8f22d5ca1b7a4794Khem Raj		tst_brkm(TFAIL | TERRNO, cleanup, "SIGCHLD signal setup failed");
1155aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
1165aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
117c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid cleanup(void)
1185aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
1190a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper	SAFE_CLOSE(NULL, fd);
1200a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper
12154f7a718c05ce3e0c51950e1a6d2243513366076robbiew	tst_rmdir();
1222c28215423293e443469a07ae7011135d058b671Garrett Cooper
1235aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
1245aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
125c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid do_child(void)
1265aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
1275aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	struct flock fl;
1285aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1295aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	close(parent_pipe[1]);
1305aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	close(child_pipe[0]);
13156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	while (1) {
1325aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		child_get(&fl);
1335aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		if (fcntl(fd, F_GETLK, &fl) < 0) {
134354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			tst_resm(TFAIL | TERRNO, "fcntl on file failed");
1355aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			fail = 1;
1365aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		}
1375aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		child_put(&fl);
1385aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
1395aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
1405aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1415aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewint do_lock(int cmd, short type, short whence, int start, int len)
1425aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
1435aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	struct flock fl;
1445aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1455aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl.l_type = type;
1465aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl.l_whence = whence;
1475aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl.l_start = start;
1485aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl.l_len = len;
14956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	return (fcntl(fd, cmd, &fl));
1505aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
1515aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
15256207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid do_test(struct flock *fl, short type, short whence, int start, int len)
1535aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
1545aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl->l_type = type;
1555aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl->l_whence = whence;
1565aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl->l_start = start;
1575aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl->l_len = len;
1585aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl->l_pid = (short)0;
1595aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1605aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	parent_put(fl);
1615aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	parent_get(fl);
1625aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
1635aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1645aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewvoid
1655aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewcompare_lock(struct flock *fl, short type, short whence, int start, int len,
1665aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	     pid_t pid)
1675aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
1685aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (fl->l_type != type) {
1695aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "lock type is wrong should be %s is %s",
1705aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			 str_type(type), str_type(fl->l_type));
1715aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
1725aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
1735aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1745aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (fl->l_whence != whence) {
1755aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "lock whence is wrong should be %d is %d",
1765aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			 whence, fl->l_whence);
1775aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
1785aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
1795aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1805aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (fl->l_start != start) {
1815aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "region starts in wrong place, should be"
182354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 "%d is %" PRId64, start, (int64_t) fl->l_start);
1835aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
1845aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
1855aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1865aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (fl->l_len != len) {
187354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		tst_resm(TFAIL,
188354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 "region length is wrong, should be %d is %" PRId64,
189354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 len, (int64_t) fl->l_len);
1905aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
1915aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
1925aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
1935aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (fl->l_pid != pid) {
1945aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "locking pid is wrong, should be %d is %d",
1955aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew			 pid, fl->l_pid);
1965aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
1975aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
1985aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
1995aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
200c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid unlock_file(void)
2015aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2025aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	struct flock fl;
2035aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
2045aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 0, 0) < 0) {
20556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		tst_resm(TFAIL, "fcntl on file failed, errno =%d", errno);
2065aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
2075aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2085aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	do_test(&fl, F_WRLCK, 0, 0, 0);
20956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	compare_lock(&fl, (short)F_UNLCK, (short)0, 0, 0, (pid_t) 0);
2105aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2115aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
21256207cec7732e09c216c751c0b5f88a242bacae6subrata_modakchar *str_type(int type)
2135aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2145aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	static char buf[20];
2155aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
2165aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	switch (type) {
2175aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	case 1:
21856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		return ("F_RDLCK");
2195aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	case 2:
22056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		return ("F_WRLCK");
2215aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	case 3:
22256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		return ("F_UNLCK");
2235aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	default:
2245aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		sprintf(buf, "BAD VALUE: %d", type);
22556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		return (buf);
2265aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2275aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2285aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
22956207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid parent_put(struct flock *l)
2305aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2315aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (write(parent_pipe[1], l, sizeof(*l)) != sizeof(*l)) {
2325aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "couldn't send message to child");
2335aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
2345aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2355aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2365aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
23756207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid parent_get(struct flock *l)
2385aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2395aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (read(child_pipe[0], l, sizeof(*l)) != sizeof(*l)) {
2405aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "couldn't get message from child");
2415aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
2425aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2435aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2445aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
24556207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid child_put(struct flock *l)
2465aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2475aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (write(child_pipe[1], l, sizeof(*l)) != sizeof(*l)) {
2485aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "couldn't send message to parent");
2495aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		fail = 1;
2505aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2515aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2525aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
25356207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid child_get(struct flock *l)
2545aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2555aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	if (read(parent_pipe[0], l, sizeof(*l)) != sizeof(*l)) {
2565aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		tst_resm(TFAIL, "couldn't get message from parent");
2575aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		cleanup();
2585aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	} else if (l->l_type == (short)STOP) {
2595aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew		exit(0);
2605aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	}
2615aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2625aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
263c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid stop_child(void)
2645aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2655aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	struct flock fl;
2665aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
267ad33a3dbf669a1f60f890bfa8f22d5ca1b7a4794Khem Raj	signal(SIGCHLD, SIG_DFL);
2685aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	fl.l_type = STOP;
2695aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	parent_put(&fl);
2705aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	wait(0);
2715aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2725aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
273c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid catch_child(void)
2745aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{
2755aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	tst_resm(TFAIL, "Unexpected death of child process");
2765aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew	cleanup();
2775aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew}
2785aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew
2795aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewint main(int ac, char **av)
280865695bbc89088b9526ea9045410e5afb70a985cplars{
281865695bbc89088b9526ea9045410e5afb70a985cplars	struct flock tl;
282865695bbc89088b9526ea9045410e5afb70a985cplars
28389af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis	int lc;
284865695bbc89088b9526ea9045410e5afb70a985cplars
285d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis	tst_parse_opts(ac, av, NULL, NULL);
286d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
287d34d581c6a320e356a6cda923c7aa399479e812crobbiew	maybe_run_child(&do_child, "ddddd", &parent_pipe[0], &parent_pipe[1],
288d34d581c6a320e356a6cda923c7aa399479e812crobbiew			&child_pipe[0], &child_pipe[1], &fd);
289d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
290d34d581c6a320e356a6cda923c7aa399479e812crobbiew
29156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	setup();		/* global setup */
292865695bbc89088b9526ea9045410e5afb70a985cplars
293865695bbc89088b9526ea9045410e5afb70a985cplars	/* Check for looping state if -i option is given */
294865695bbc89088b9526ea9045410e5afb70a985cplars	for (lc = 0; TEST_LOOPING(lc); lc++) {
295d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang		/* reset tst_count in case we are looping */
296d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang		tst_count = 0;
297865695bbc89088b9526ea9045410e5afb70a985cplars
298d34d581c6a320e356a6cda923c7aa399479e812crobbiew		if ((child_pid = FORK_OR_VFORK()) == 0) {	/* child */
299d34d581c6a320e356a6cda923c7aa399479e812crobbiew#ifdef UCLINUX
30056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			if (self_exec
30156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			    (av[0], "ddddd", parent_pipe[0], parent_pipe[1],
30256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			     child_pipe[0], child_pipe[1], fd) < 0) {
303d34d581c6a320e356a6cda923c7aa399479e812crobbiew				tst_resm(TFAIL, "self_exec failed");
304d34d581c6a320e356a6cda923c7aa399479e812crobbiew				cleanup();
305d34d581c6a320e356a6cda923c7aa399479e812crobbiew			}
306d34d581c6a320e356a6cda923c7aa399479e812crobbiew#else
307865695bbc89088b9526ea9045410e5afb70a985cplars			do_child();
308d34d581c6a320e356a6cda923c7aa399479e812crobbiew#endif
309865695bbc89088b9526ea9045410e5afb70a985cplars		}
310865695bbc89088b9526ea9045410e5afb70a985cplars
311865695bbc89088b9526ea9045410e5afb70a985cplars		if (child_pid < 0) {
312865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TFAIL, "Fork failed");
313865695bbc89088b9526ea9045410e5afb70a985cplars			cleanup();
314865695bbc89088b9526ea9045410e5afb70a985cplars		}
315865695bbc89088b9526ea9045410e5afb70a985cplars
316865695bbc89088b9526ea9045410e5afb70a985cplars		(void)close(parent_pipe[0]);
317865695bbc89088b9526ea9045410e5afb70a985cplars		(void)close(child_pipe[1]);
318865695bbc89088b9526ea9045410e5afb70a985cplars
319db63921767012310af15f29035a334e50486292cmridge/* //block1: */
320865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter block 1");
321865695bbc89088b9526ea9045410e5afb70a985cplars		/*
322865695bbc89088b9526ea9045410e5afb70a985cplars		 * Add a read lock to the middle of the file and unlock a
323865695bbc89088b9526ea9045410e5afb70a985cplars		 * section just before the lock
324865695bbc89088b9526ea9045410e5afb70a985cplars		 */
325865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 5) < 0) {
326dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
327dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
328865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
329865695bbc89088b9526ea9045410e5afb70a985cplars		}
330865695bbc89088b9526ea9045410e5afb70a985cplars
331865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 5, 5) < 0) {
332dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
333dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
334865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
335865695bbc89088b9526ea9045410e5afb70a985cplars		}
336865695bbc89088b9526ea9045410e5afb70a985cplars
337865695bbc89088b9526ea9045410e5afb70a985cplars		/*
338865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test read lock
339865695bbc89088b9526ea9045410e5afb70a985cplars		 */
340865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 0, 0);
341865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 10, 5, parent_pid);
342865695bbc89088b9526ea9045410e5afb70a985cplars
343865695bbc89088b9526ea9045410e5afb70a985cplars		/*
344865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test that the rest of the file is unlocked
345865695bbc89088b9526ea9045410e5afb70a985cplars		 */
346865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 15, 0);
34756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		compare_lock(&tl, (short)F_UNLCK, (short)0, 15, 0, (pid_t) 0);
348865695bbc89088b9526ea9045410e5afb70a985cplars
349865695bbc89088b9526ea9045410e5afb70a985cplars		/*
350865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
351865695bbc89088b9526ea9045410e5afb70a985cplars		 */
352865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
353865695bbc89088b9526ea9045410e5afb70a985cplars
354865695bbc89088b9526ea9045410e5afb70a985cplars		if (fail) {
355865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 1: FAILED");
356865695bbc89088b9526ea9045410e5afb70a985cplars		} else {
357865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 1: PASSED");
358865695bbc89088b9526ea9045410e5afb70a985cplars		}
359865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 1");
360865695bbc89088b9526ea9045410e5afb70a985cplars
361db63921767012310af15f29035a334e50486292cmridge/* //block2: */
362865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter block 2");
363865695bbc89088b9526ea9045410e5afb70a985cplars		fail = 0;
364865695bbc89088b9526ea9045410e5afb70a985cplars		/*
365865695bbc89088b9526ea9045410e5afb70a985cplars		 * Set a read lock in the middle and do an unlock that
366865695bbc89088b9526ea9045410e5afb70a985cplars		 * ends at the first byte of the read lock.
367865695bbc89088b9526ea9045410e5afb70a985cplars		 */
368865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 5) < 0) {
369dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
370dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
371865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
372865695bbc89088b9526ea9045410e5afb70a985cplars		}
373865695bbc89088b9526ea9045410e5afb70a985cplars
374865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 5, 6) < 0) {
375dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
376dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
377865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
378865695bbc89088b9526ea9045410e5afb70a985cplars		}
379865695bbc89088b9526ea9045410e5afb70a985cplars
380865695bbc89088b9526ea9045410e5afb70a985cplars		/*
381865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test read lock
382865695bbc89088b9526ea9045410e5afb70a985cplars		 */
383865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 0, 0);
384865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 11, 4, parent_pid);
385865695bbc89088b9526ea9045410e5afb70a985cplars
386865695bbc89088b9526ea9045410e5afb70a985cplars		/*
387865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test to make sure the rest of the file is unlocked
388865695bbc89088b9526ea9045410e5afb70a985cplars		 */
389865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 15, 0);
39056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		compare_lock(&tl, (short)F_UNLCK, (short)0, 15, 0, (pid_t) 0);
391865695bbc89088b9526ea9045410e5afb70a985cplars
392865695bbc89088b9526ea9045410e5afb70a985cplars		/*
393865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
394865695bbc89088b9526ea9045410e5afb70a985cplars		 */
395865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
396865695bbc89088b9526ea9045410e5afb70a985cplars
3970a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper		if (fail)
398865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 2: FAILED");
3990a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper		else
400865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 2: PASSED");
401865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 2");
402865695bbc89088b9526ea9045410e5afb70a985cplars
403db63921767012310af15f29035a334e50486292cmridge/* //block3: */
404865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter block 3");
405865695bbc89088b9526ea9045410e5afb70a985cplars		fail = 0;
406865695bbc89088b9526ea9045410e5afb70a985cplars
407865695bbc89088b9526ea9045410e5afb70a985cplars		/*
408865695bbc89088b9526ea9045410e5afb70a985cplars		 * Set a read lock on the middle of the file and do an
409865695bbc89088b9526ea9045410e5afb70a985cplars		 * unlock that overlaps the front of the read
410865695bbc89088b9526ea9045410e5afb70a985cplars		 */
411865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 5) < 0) {
412dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
413dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
414865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
415865695bbc89088b9526ea9045410e5afb70a985cplars		}
416865695bbc89088b9526ea9045410e5afb70a985cplars
417865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 5, 8) < 0) {
418dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
419dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
420865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
421865695bbc89088b9526ea9045410e5afb70a985cplars		}
422865695bbc89088b9526ea9045410e5afb70a985cplars
423865695bbc89088b9526ea9045410e5afb70a985cplars		/*
424865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test the read lock
425865695bbc89088b9526ea9045410e5afb70a985cplars		 */
426865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 0, 0);
427865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 13, 2, parent_pid);
428865695bbc89088b9526ea9045410e5afb70a985cplars
429865695bbc89088b9526ea9045410e5afb70a985cplars		/*
430865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test to make sure the rest of the file is unlocked
431865695bbc89088b9526ea9045410e5afb70a985cplars		 */
432865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 15, 0);
43356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		compare_lock(&tl, (short)F_UNLCK, (short)0, 15, 0, (pid_t) 0);
434865695bbc89088b9526ea9045410e5afb70a985cplars
435865695bbc89088b9526ea9045410e5afb70a985cplars		/*
436865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
437865695bbc89088b9526ea9045410e5afb70a985cplars		 */
438865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
439865695bbc89088b9526ea9045410e5afb70a985cplars
4400a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper		if (fail)
441865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 3: FAILED");
4420a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper		else
443865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 3: PASSED");
444865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 3");
445865695bbc89088b9526ea9045410e5afb70a985cplars
446db63921767012310af15f29035a334e50486292cmridge/* //block4: */
447865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter blcok 4");
448865695bbc89088b9526ea9045410e5afb70a985cplars		fail = 0;
44956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
450865695bbc89088b9526ea9045410e5afb70a985cplars		/*
451865695bbc89088b9526ea9045410e5afb70a985cplars		 * Set a read lock in the middle of a file and unlock a
452865695bbc89088b9526ea9045410e5afb70a985cplars		 * section in the middle of it
453865695bbc89088b9526ea9045410e5afb70a985cplars		 */
454865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 10) < 0) {
455dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
456dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
457865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
458865695bbc89088b9526ea9045410e5afb70a985cplars		}
459865695bbc89088b9526ea9045410e5afb70a985cplars
460865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 13, 5) < 0) {
461dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
462dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
463865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
464865695bbc89088b9526ea9045410e5afb70a985cplars		}
465865695bbc89088b9526ea9045410e5afb70a985cplars
466865695bbc89088b9526ea9045410e5afb70a985cplars		/*
467865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test the first read lock
468865695bbc89088b9526ea9045410e5afb70a985cplars		 */
469865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 0, 0);
470865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 10, 3, parent_pid);
471865695bbc89088b9526ea9045410e5afb70a985cplars
472865695bbc89088b9526ea9045410e5afb70a985cplars		/*
473865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test the second read lock
474865695bbc89088b9526ea9045410e5afb70a985cplars		 */
475865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 13, 0);
476865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 18, 2, parent_pid);
477865695bbc89088b9526ea9045410e5afb70a985cplars
478865695bbc89088b9526ea9045410e5afb70a985cplars		/*
479865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test to make sure the rest of the file is unlocked
480865695bbc89088b9526ea9045410e5afb70a985cplars		 */
481865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 20, 0);
48256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		compare_lock(&tl, (short)F_UNLCK, (short)0, 20, 0, (pid_t) 0);
483865695bbc89088b9526ea9045410e5afb70a985cplars
484865695bbc89088b9526ea9045410e5afb70a985cplars		/*
485865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
486865695bbc89088b9526ea9045410e5afb70a985cplars		 */
487865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
488865695bbc89088b9526ea9045410e5afb70a985cplars
4890a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper		if (fail)
490865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 4: FAILED");
4910a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper		else
492865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 4: PASSED");
493865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 4");
494865695bbc89088b9526ea9045410e5afb70a985cplars
495db63921767012310af15f29035a334e50486292cmridge/* //block5: */
496865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter block 5");
497865695bbc89088b9526ea9045410e5afb70a985cplars		fail = 0;
498865695bbc89088b9526ea9045410e5afb70a985cplars
499865695bbc89088b9526ea9045410e5afb70a985cplars		/*
500865695bbc89088b9526ea9045410e5afb70a985cplars		 * Set a read lock in the middle of the file and do a
501865695bbc89088b9526ea9045410e5afb70a985cplars		 * unlock that overlaps the end
502865695bbc89088b9526ea9045410e5afb70a985cplars		 */
503865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 5) < 0) {
504dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
505dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
506865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
507865695bbc89088b9526ea9045410e5afb70a985cplars		}
508865695bbc89088b9526ea9045410e5afb70a985cplars
509865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 13, 5) < 0) {
510dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
511dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
512865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
513865695bbc89088b9526ea9045410e5afb70a985cplars		}
514865695bbc89088b9526ea9045410e5afb70a985cplars
515865695bbc89088b9526ea9045410e5afb70a985cplars		/*
516865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test the read lock
517865695bbc89088b9526ea9045410e5afb70a985cplars		 */
518865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 0, 0);
519865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 10, 3, parent_pid);
520865695bbc89088b9526ea9045410e5afb70a985cplars
521865695bbc89088b9526ea9045410e5afb70a985cplars		/*
522865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test to make sure the rest of the file is unlocked
523865695bbc89088b9526ea9045410e5afb70a985cplars		 */
524865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 13, 0);
52556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		compare_lock(&tl, (short)F_UNLCK, (short)0, 13, 0, (pid_t) 0);
526865695bbc89088b9526ea9045410e5afb70a985cplars
527865695bbc89088b9526ea9045410e5afb70a985cplars		/*
528865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
529865695bbc89088b9526ea9045410e5afb70a985cplars		 */
530865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
531865695bbc89088b9526ea9045410e5afb70a985cplars
5320a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper		if (fail)
533865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 5: FAILED");
5340a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper		else
535865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 5: PASSED");
536865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 5");
537865695bbc89088b9526ea9045410e5afb70a985cplars
538db63921767012310af15f29035a334e50486292cmridge/* //block6: */
539865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter block 6");
540865695bbc89088b9526ea9045410e5afb70a985cplars		fail = 0;
54156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
542865695bbc89088b9526ea9045410e5afb70a985cplars		/*
543865695bbc89088b9526ea9045410e5afb70a985cplars		 * Set read lock in the middle of the file and do an unlock
544865695bbc89088b9526ea9045410e5afb70a985cplars		 * starting at the last byte of the read lock
545865695bbc89088b9526ea9045410e5afb70a985cplars		 */
546865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 5) < 0) {
547dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
548dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
549865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
550865695bbc89088b9526ea9045410e5afb70a985cplars		}
551865695bbc89088b9526ea9045410e5afb70a985cplars
552865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 14, 5) < 0) {
553dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
554dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
555865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
556865695bbc89088b9526ea9045410e5afb70a985cplars		}
557865695bbc89088b9526ea9045410e5afb70a985cplars
558865695bbc89088b9526ea9045410e5afb70a985cplars		/*
559865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test read lock
560865695bbc89088b9526ea9045410e5afb70a985cplars		 */
561865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 10, 0);
562865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 10, 4, parent_pid);
563865695bbc89088b9526ea9045410e5afb70a985cplars
564865695bbc89088b9526ea9045410e5afb70a985cplars		/*
565865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test to make sure the end of the file is unlocked
566865695bbc89088b9526ea9045410e5afb70a985cplars		 */
567865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 14, 0);
56856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		compare_lock(&tl, (short)F_UNLCK, (short)0, 14, 0, (pid_t) 0);
569865695bbc89088b9526ea9045410e5afb70a985cplars
570865695bbc89088b9526ea9045410e5afb70a985cplars		/*
571865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
572865695bbc89088b9526ea9045410e5afb70a985cplars		 */
573865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
574865695bbc89088b9526ea9045410e5afb70a985cplars
5750a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper		if (fail)
576865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 6: FAILED");
5770a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper		else
578865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 6: PASSED");
579865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 6");
580865695bbc89088b9526ea9045410e5afb70a985cplars
581db63921767012310af15f29035a334e50486292cmridge/* //block7: */
582865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Enter block 7");
583865695bbc89088b9526ea9045410e5afb70a985cplars		fail = 0;
584865695bbc89088b9526ea9045410e5afb70a985cplars
585865695bbc89088b9526ea9045410e5afb70a985cplars		/*
586865695bbc89088b9526ea9045410e5afb70a985cplars		 * Set a read lock at the middle of the file and do an
587865695bbc89088b9526ea9045410e5afb70a985cplars		 * unlock that starts at the byte past the end of the read
588865695bbc89088b9526ea9045410e5afb70a985cplars		 * lock
589865695bbc89088b9526ea9045410e5afb70a985cplars		 */
590865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_RDLCK, (short)0, 10, 5) < 0) {
591dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
592dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
593865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
594865695bbc89088b9526ea9045410e5afb70a985cplars		}
595865695bbc89088b9526ea9045410e5afb70a985cplars
596865695bbc89088b9526ea9045410e5afb70a985cplars		if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 16, 0) < 0) {
597dad2271b03625d8d549ede28a8792c6a7836cc54robbiew			tst_resm(TFAIL, "fcntl on file failed, errno =%d",
598dad2271b03625d8d549ede28a8792c6a7836cc54robbiew				 errno);
599865695bbc89088b9526ea9045410e5afb70a985cplars			fail = 1;
600865695bbc89088b9526ea9045410e5afb70a985cplars		}
601865695bbc89088b9526ea9045410e5afb70a985cplars
602865695bbc89088b9526ea9045410e5afb70a985cplars		/*
603865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test the read lock
604865695bbc89088b9526ea9045410e5afb70a985cplars		 */
605865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 0, 0);
606865695bbc89088b9526ea9045410e5afb70a985cplars		compare_lock(&tl, (short)F_RDLCK, (short)0, 10, 5, parent_pid);
607865695bbc89088b9526ea9045410e5afb70a985cplars
608865695bbc89088b9526ea9045410e5afb70a985cplars		/*
609865695bbc89088b9526ea9045410e5afb70a985cplars		 * Test to make sure the rest of the file is unlocked
610865695bbc89088b9526ea9045410e5afb70a985cplars		 */
611865695bbc89088b9526ea9045410e5afb70a985cplars		do_test(&tl, (short)F_WRLCK, (short)0, 16, 0);
61256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		compare_lock(&tl, (short)F_UNLCK, (short)0, 16, 0, (pid_t) 0);
613865695bbc89088b9526ea9045410e5afb70a985cplars
614865695bbc89088b9526ea9045410e5afb70a985cplars		/*
615865695bbc89088b9526ea9045410e5afb70a985cplars		 * remove all the locks set above
616865695bbc89088b9526ea9045410e5afb70a985cplars		 */
617865695bbc89088b9526ea9045410e5afb70a985cplars		unlock_file();
618865695bbc89088b9526ea9045410e5afb70a985cplars
6190a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper		if (fail)
620865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 7: FAILED");
6210a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper		else
622865695bbc89088b9526ea9045410e5afb70a985cplars			tst_resm(TINFO, "Test block 7: PASSED");
623865695bbc89088b9526ea9045410e5afb70a985cplars
624865695bbc89088b9526ea9045410e5afb70a985cplars		tst_resm(TINFO, "Exit block 7");
625865695bbc89088b9526ea9045410e5afb70a985cplars
626865695bbc89088b9526ea9045410e5afb70a985cplars		stop_child();
627865695bbc89088b9526ea9045410e5afb70a985cplars	}
628865695bbc89088b9526ea9045410e5afb70a985cplars	cleanup();
6292c28215423293e443469a07ae7011135d058b671Garrett Cooper	tst_exit();
6300a643cbbb767d477008ea1d30e422aa78195813eGarrett Cooper}
631