fcntl20.c revision d59a659cd639ca2780b00049d102acd2a783d585
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" 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) 106354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao 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) 115354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao 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) { 137354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao 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" 185354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "%d is %" PRId64, start, (int64_t) fl->l_start); 1865aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 1; 1875aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 1885aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 1895aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (fl->l_len != len) { 190354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TFAIL, 191354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "region length is wrong, should be %d is %" PRId64, 192354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao len, (int64_t) fl->l_len); 1935aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 1; 1945aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 1955aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 1965aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (fl->l_pid != pid) { 1975aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TFAIL, "locking pid is wrong, should be %d is %d", 1985aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew pid, fl->l_pid); 1995aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 1; 2005aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 2015aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew} 2025aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 20356207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid unlock_file() 2045aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{ 2055aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew struct flock fl; 2065aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 2075aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (do_lock(F_SETLK, (short)F_UNLCK, (short)0, 0, 0) < 0) { 20856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TFAIL, "fcntl on file failed, errno =%d", errno); 2095aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 1; 2105aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 2115aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew do_test(&fl, F_WRLCK, 0, 0, 0); 21256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak compare_lock(&fl, (short)F_UNLCK, (short)0, 0, 0, (pid_t) 0); 2135aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew} 2145aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 21556207cec7732e09c216c751c0b5f88a242bacae6subrata_modakchar *str_type(int type) 2165aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{ 2175aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew static char buf[20]; 2185aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 2195aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew switch (type) { 2205aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew case 1: 22156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak return ("F_RDLCK"); 2225aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew case 2: 22356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak return ("F_WRLCK"); 2245aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew case 3: 22556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak return ("F_UNLCK"); 2265aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew default: 2275aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew sprintf(buf, "BAD VALUE: %d", type); 22856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak return (buf); 2295aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 2305aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew} 2315aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 23256207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid parent_put(struct flock *l) 2335aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{ 2345aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (write(parent_pipe[1], l, sizeof(*l)) != sizeof(*l)) { 2355aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TFAIL, "couldn't send message to child"); 2365aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 1; 2375aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 2385aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew} 2395aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 24056207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid parent_get(struct flock *l) 2415aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{ 2425aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (read(child_pipe[0], l, sizeof(*l)) != sizeof(*l)) { 2435aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TFAIL, "couldn't get message from child"); 2445aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 1; 2455aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 2465aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew} 2475aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 24856207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid child_put(struct flock *l) 2495aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{ 2505aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (write(child_pipe[1], l, sizeof(*l)) != sizeof(*l)) { 2515aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TFAIL, "couldn't send message to parent"); 2525aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fail = 1; 2535aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 2545aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew} 2555aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 25656207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid child_get(struct flock *l) 2575aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{ 2585aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew if (read(parent_pipe[0], l, sizeof(*l)) != sizeof(*l)) { 2595aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TFAIL, "couldn't get message from parent"); 2605aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew cleanup(); 2615aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } else if (l->l_type == (short)STOP) { 2625aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew exit(0); 2635aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew } 2645aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew} 2655aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 26656207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid stop_child() 2675aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{ 2685aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew struct flock fl; 2695aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 27056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak (void)signal(SIGCLD, (void (*)())SIG_DFL); 2715aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew fl.l_type = STOP; 2725aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew parent_put(&fl); 2735aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew wait(0); 2745aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew} 2755aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 27656207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid catch_child() 2775aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew{ 2785aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew tst_resm(TFAIL, "Unexpected death of child process"); 2795aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew cleanup(); 2805aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew} 2815aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiew 2825aab8a773ae811e815dcbe0ea5c4fee3f0a04f1erobbiewint main(int ac, char **av) 283865695bbc89088b9526ea9045410e5afb70a985cplars{ 284865695bbc89088b9526ea9045410e5afb70a985cplars struct flock tl; 285865695bbc89088b9526ea9045410e5afb70a985cplars 28689af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis int lc; 28789af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis char *msg; 288865695bbc89088b9526ea9045410e5afb70a985cplars 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++) { 301d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang /* reset tst_count in case we are looping */ 302d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang 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