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