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