From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from sfi-mx-1.v28.ch3.sourceforge.com ([172.29.28.121] helo=mx.sourceforge.net) by 335xhf1.ch3.sourceforge.com with esmtp (Exim 4.69) (envelope-from ) id 1MlRhz-0004UP-Ky for ltp-list@lists.sourceforge.net; Wed, 09 Sep 2009 18:15:55 +0000 Received: from relay2.suse.de (mail2.suse.de [195.135.221.8]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 651079337C for ; Wed, 9 Sep 2009 20:15:42 +0200 (CEST) Date: Wed, 9 Sep 2009 20:15:41 +0200 From: Cyril Hrubis Message-ID: <20090909181541.GA31549@schrodinger.suse.cz> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="W/nzBZO5zC0uMSeA" Content-Disposition: inline Subject: [LTP] [PATCH] ftest cleanup II List-Id: Linux Test Project General Discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ltp-list-bounces@lists.sourceforge.net To: ltp-list@lists.sourceforge.net --W/nzBZO5zC0uMSeA Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi, this is ftest cleanup part II. Most of the functions that were copy & pasted again and again in every file are now in libftest library. Also ftest04, ftest05, ftest06, ftest07 and ftest08 are cleaned. Signed-off-by: Cyril Hrubis chrubis@suse.cz -- Cyril Hrubis chrubis@suse.cz --W/nzBZO5zC0uMSeA Content-Type: text/x-patch; charset=us-ascii Content-Disposition: attachment; filename="ftest_cleanup_II.patch" Index: ltp/testcases/kernel/fs/ftest/ftest01.c =================================================================== --- ltp.orig/testcases/kernel/fs/ftest/ftest01.c +++ ltp/testcases/kernel/fs/ftest/ftest01.c @@ -1,6 +1,7 @@ /* * * Copyright (c) International Business Machines Corp., 2002 + * Copyright (c) Cyril Hrubis chrubis@suse.cz 2009 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -58,6 +59,7 @@ #include #include "test.h" #include "usctest.h" +#include "libftest.h" char *TCID = "ftest01"; int TST_TOTAL = 1; @@ -66,12 +68,8 @@ static void setup(void); static void runtest(void); static void dotest(int, int, int); static void domisc(int, int, char*); -static void bfill(char*, char, int); -static void dumpbuf(char*); -static void dumpbits(char*, int); -static void orbits(char*, char*, int); static void cleanup(void); -static void term(int); +static void term(int sig); #define PASSED 1 #define FAILED 0 @@ -81,26 +79,23 @@ static void term(int); #define K_2 2048 #define K_4 4096 -char progname[]= "ftest1()"; /* replace ++ with test name */ +static int csize; /* chunk size */ +static int iterations; /* # total iterations */ +static int max_size; /* max file size */ +static int misc_intvl; /* for doing misc things; 0 ==> no */ +static int nchild; /* how many children */ +static int nwait; +static int fd; /* file descriptor used by child */ +static int parent_pid; +static int pidlist[MAXCHILD]; +static char test_name[2]; -int csize; /* chunk size */ -int iterations; /* # total iterations */ -int max_size; /* max file size */ -int misc_intvl; /* for doing misc things; 0 ==> no */ -int nchild; /* how many children */ -int nwait; -int fd; /* file descriptor used by child */ -int parent_pid; -int pidlist[MAXCHILD]; -char test_name[2]; -char *prog; +static char fuss[40]; /* directory to do this in */ +static char homedir[200]; /* where we started */ -char fuss[40] = ""; /* directory to do this in */ -char homedir[200]= ""; /* where we started */ +static int local_flag; -int local_flag; - -int main (int ac, char *av[]) +int main(int ac, char *av[]) { int lc; char *msg; @@ -108,7 +103,7 @@ int main (int ac, char *av[]) /* * parse standard options */ - if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != NULL) + if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); setup(); @@ -326,7 +321,6 @@ static void dotest(int testers, int me, * repeat until count = nchunks. * ++val. */ - srand(getpid()); if (misc_intvl) @@ -337,10 +331,10 @@ static void dotest(int testers, int me, misc_cnt[i] = 0; ftruncate(fd, 0); file_max = 0; - bfill(bits, 0, (nchunks+7)/8); - bfill(hold_bits, 0, (nchunks+7)/8); - bfill(val_buf, val, csize); - bfill(zero_buf, 0, csize); + memset(bits, 0, (nchunks+7)/8); + memset(hold_bits, 0, (nchunks+7)/8); + memset(val_buf, val, csize); + memset(zero_buf, 0, csize); count = 0; collide = 0; while (count < nchunks) { @@ -381,11 +375,11 @@ static void dotest(int testers, int me, tst_resm(TFAIL, "Test[%d]: last_trunc = 0x%x.", me, last_trunc); sync(); - dumpbuf(buf); - dumpbits(bits, (nchunks+7)/8); - orbits(hold_bits, bits, (nchunks+7)/8); + ft_dumpbuf(buf, csize); + ft_dumpbits(bits, (nchunks+7)/8); + ft_orbits(hold_bits, bits, (nchunks+7)/8); tst_resm(TINFO, "Hold "); - dumpbits(hold_bits, (nchunks+7)/8); + ft_dumpbits(hold_bits, (nchunks+7)/8); tst_exit(); } bits[chunk/8] |= (1<<(chunk%8)); @@ -404,11 +398,11 @@ static void dotest(int testers, int me, tst_resm(TFAIL, "Test[%d]: last_trunc = 0x%x.", me, last_trunc); sync(); - dumpbuf(buf); - dumpbits(bits, (nchunks+7)/8); - orbits(hold_bits, bits, (nchunks+7)/8); + ft_dumpbuf(buf, csize); + ft_dumpbits(bits, (nchunks+7)/8); + ft_orbits(hold_bits, bits, (nchunks+7)/8); tst_resm(TINFO, "Hold "); - dumpbits(hold_bits, (nchunks+7)/8); + ft_dumpbits(hold_bits, (nchunks+7)/8); tst_exit(); } } @@ -436,7 +430,7 @@ static void dotest(int testers, int me, * If hit "misc" interval, do it. */ if (misc_intvl && --whenmisc <= 0) { - orbits(hold_bits, bits, (nchunks+7)/8); + ft_orbits(hold_bits, bits, (nchunks+7)/8); domisc(me, fd, bits); whenmisc = NEXTMISC; } @@ -519,78 +513,10 @@ static void domisc(int me, int fd, char ++type; } -static void bfill(char *buf, char val, int size) -{ - int i; - - for (i = 0; i < size; i++) - buf[i] = val; -} - -/* - * dumpbuf - * Dump the buffer. - */ -static void dumpbuf(char *buf) -{ - char val; - int idx, nout, i; - - tst_resm(TINFO, "\tBuf:"); - nout = 0; - idx = 0; - val = buf[0]; - - for (i = 0; i < csize; i++) { - if (buf[i] != val) { - if (i == idx+1) - tst_resm(TINFO, "\t%x, ", buf[idx] & 0xff); - else - tst_resm(TINFO, "\t%d*%x, ", i-idx, buf[idx] & 0xff); - idx = i; - ++nout; - } - if (nout > 10) { - tst_resm(TINFO, "\t ... more"); - return; - } - } - - if (i == idx+1) - tst_resm(TINFO, "\t%x", buf[idx] & 0xff); - else - tst_resm(TINFO, "\t%d*%x", i-idx, buf[idx]); -} - -/* - * dumpbits - * Dump the bit-map. - */ -static void dumpbits(char *bits, int size) -{ - char *buf; - - tst_resm(TINFO, "\tBits array:"); - - for (buf = bits; size > 0; --size, ++buf) { - if ((buf-bits) % 16 == 0) - tst_resm(TINFO, "\t%04x:\t", 8*(buf-bits)); - tst_resm(TINFO, "\t%02x ", *buf & 0xff); - } - - tst_resm(TINFO, "\t"); -} - -static void orbits(char *hold, char *bits, int count) -{ - while (count-- > 0) - *hold++ |= *bits++; -} - /* * SIGTERM signal handler. */ -static void term(int sig) +static void term(int sig LTP_ATTRIBUTE_UNUSED) { int i; Index: ltp/testcases/kernel/fs/ftest/ftest02.c =================================================================== --- ltp.orig/testcases/kernel/fs/ftest/ftest02.c +++ ltp/testcases/kernel/fs/ftest/ftest02.c @@ -1,6 +1,7 @@ /* * * Copyright (c) International Business Machines Corp., 2002 + * Copyright (c) Cyril Hrubis chrubis@suse.cz 2009 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -44,8 +45,6 @@ #include -#include "test.h" -#include "usctest.h" #include #include #include @@ -55,6 +54,9 @@ #include #include #include +#include "test.h" +#include "usctest.h" +#include "libftest.h" #define MAXCHILD 25 #define K_1 1024 @@ -64,7 +66,6 @@ char *TCID = "ftest02"; int TST_TOTAL = 1; -extern int Tst_count; #define PASSED 1 #define FAILED 0 @@ -74,30 +75,28 @@ static void unlfile(int, int); static void fussdir(int, int); static void dotest(int, int); static void dowarn(int, char*, char*); -static void mkname(char*, int, int); static void term(int sig); static void cleanup(void); #define M (1024*1024) -int iterations; -int nchild; -int parent_pid; -int pidlist[MAXCHILD]; - -char homedir[MAXPATHLEN]; -char dirname[MAXPATHLEN]; -char tmpname[MAXPATHLEN]; -char *prog; -int dirlen; -int mnt = 0; -char startdir[MAXPATHLEN], mntpoint[MAXPATHLEN], newfsstring[90]; -char *partition; -char *cwd; -char *fstyp; -int local_flag; +static int iterations; +static int nchild; +static int parent_pid; +static int pidlist[MAXCHILD]; + +static char homedir[MAXPATHLEN]; +static char dirname[MAXPATHLEN]; +static char tmpname[MAXPATHLEN]; +static int dirlen; +static int mnt = 0; +static char startdir[MAXPATHLEN], mntpoint[MAXPATHLEN]; +static char *partition; +static char *cwd; +static char *fstyp; +static int local_flag; -int main(int ac, char *av[]) +int main(void) { int k, j, pid, child, status, count; char name[128]; @@ -149,7 +148,7 @@ int main(int ac, char *av[]) } - for(k = 0; k < nchild; k++) { + for (k = 0; k < nchild; k++) { if ((child = fork()) == 0) { dotest(k, iterations); exit(0); @@ -167,7 +166,7 @@ int main(int ac, char *av[]) * Wait for children to finish. */ count = 0; - while((child = wait(&status)) > 0) { + while ((child = wait(&status)) > 0) { //tst_resm(TINFO,"Test{%d} exited status = 0x%x", child, status); //tst_resm(TINFO,"status is %d",status); if (status) { @@ -195,7 +194,7 @@ int main(int ac, char *av[]) for (k = 0; k < nchild; k++) for (j = 0; j < iterations + 1; j++) { - mkname(name, k, j); + ft_mkname(name, dirname, k, j); rmdir(name); unlink(name); } @@ -258,12 +257,10 @@ char crmsg[] = "Gee, let's write somethi static void crfile(int me, int count) { - int fd; - int val; - char fname[128]; - char buf[128]; + int fd, val; + char fname[128], buf[128]; - mkname(fname, me, count); + ft_mkname(fname, dirname, me, count); fd = open(fname, O_RDWR|O_CREAT|O_TRUNC, 0666); if (fd < 0 && errno == EISDIR) { @@ -307,8 +304,8 @@ static void unlfile(int me, int count) if (i < 0) i = 0; - for(; i < count; i++) { - mkname(fname, me, i); + for (; i < count; i++) { + ft_mkname(fname, dirname, me, i); val = rmdir(fname); if (val < 0 ) val = unlink(fname); @@ -326,13 +323,12 @@ static void unlfile(int me, int count) */ static void fussdir(int me, int count) { - int val; - char dir[128]; - char fname[128]; - char savedir[128]; + int val; + char dir[128], fname[128], savedir[128]; - mkname(dir, me, count); - rmdir(dir); unlink(dir); /* insure not there */ + ft_mkname(dir, dirname, me, count); + rmdir(dir); + unlink(dir); val = mkdir(dir, 0755); warn(val, "mkdir", dir); @@ -340,7 +336,6 @@ static void fussdir(int me, int count) /* * Arrange to create files in the directory. */ - strcpy(savedir, dirname); strcpy(dirname, ""); @@ -354,6 +349,7 @@ static void fussdir(int me, int count) warn(val, "chdir", ".."); val = rmdir(dir); + if (val >= 0) { tst_resm(TFAIL,"Test[%d]: rmdir of non-empty %s succeeds!", me, dir); tst_exit(); @@ -362,11 +358,11 @@ static void fussdir(int me, int count) val = chdir(dir); warn(val, "chdir", dir); - mkname(fname, me, count); + ft_mkname(fname, dirname, me, count); val = unlink(fname); warn(val, "unlink", fname); - mkname(fname, me, count+1); + ft_mkname(fname, dirname, me, count+1); val = unlink(fname); warn(val, "unlink", fname); @@ -412,7 +408,8 @@ static void dotest(int me, int count) //tst_resm(TINFO,"Test %d pid %d starting.", me, getpid()); srand(getpid()); - for(i = 0; i < count; i++) { + + for (i = 0; i < count; i++) { thing = (rand() >> 3) % NTHING; (*ino_thing[thing].it_proc)(me, i, ino_thing[thing].it_name); ++thing_cnt[thing]; @@ -431,27 +428,10 @@ static void dowarn(int me, char *m1, cha tst_exit(); } -static void mkname(char *name, int me, int idx) -{ - int len; - - strcpy(name, dirname); - - if (name[0]) { - len = dirlen+1; - name[len-1] = '/'; - } else - len = 0; - - name[len+0] = 'A' + (me % 26); - name[len+1] = 'a' + (idx % 26); - name[len+2] = '\0'; -} - /* * SIGTERM signal handler. */ -static void term(int sig) +static void term(int sig LTP_ATTRIBUTE_UNUSED) { int i; Index: ltp/testcases/kernel/fs/ftest/ftest03.c =================================================================== --- ltp.orig/testcases/kernel/fs/ftest/ftest03.c +++ ltp/testcases/kernel/fs/ftest/ftest03.c @@ -1,6 +1,7 @@ /* * * Copyright (c) International Business Machines Corp., 2002 + * Copyright (c) Cyril Hrubis chrubis@suse.cz 2009 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -64,10 +65,10 @@ #include #include "test.h" #include "usctest.h" +#include "libftest.h" char *TCID = "ftest03"; int TST_TOTAL = 1; -extern int Tst_count; #define PASSED 1 #define FAILED 0 @@ -76,34 +77,29 @@ static void setup(void); static void runtest(void); static void dotest(int, int, int); static void domisc(int, int, char*); -static void bfill(char*, char, int); -static void dumpiov(struct iovec*); -static void dumpbits(char*, int); -static void orbits(char*, char*, int); static void term(int sig); -#define MAXCHILD 25 /* max number of children to allow */ +#define MAXCHILD 25 #define K_1 1024 #define K_2 2048 #define K_4 4096 #define MAXIOVCNT 16 -int csize; /* chunk size */ -int iterations; /* # total iterations */ -int max_size; /* max file size */ -int misc_intvl; /* for doing misc things; 0 ==> no */ -int nchild; /* how many children */ -int nwait; -int fd; /* file descriptor used by child */ -int parent_pid; -int pidlist[MAXCHILD]; -char test_name[2]; /* childs test directory name */ -char *prog, *getcwd() ; +static int csize; /* chunk size */ +static int iterations; /* # total iterations */ +static int max_size; /* max file size */ +static int misc_intvl; /* for doing misc things; 0 ==> no */ +static int nchild; /* how many children */ +static int nwait; +static int fd; /* file descriptor used by child */ +static int parent_pid; +static int pidlist[MAXCHILD]; +static char test_name[2]; /* childs test directory name */ -char fuss[40] = ""; /* directory to do this in */ -char homedir[200]= ""; /* where we started */ +static char fuss[40]; /* directory to do this in */ +static char homedir[200]; /* where we started */ -int local_flag; +static int local_flag; int main (int ac, char *av[]) { @@ -399,14 +395,14 @@ static void dotest(int testers, int me, ftruncate(fd,0); file_max = 0; - bfill(bits, 0, (nchunks+7) / 8); - bfill(hold_bits, 0, (nchunks+7) / 8); + memset(bits, 0, (nchunks+7) / 8); + memset(hold_bits, 0, (nchunks+7) / 8); /* Have to fill the val and zero iov buffers in a different manner */ for (i = 0; i < MAXIOVCNT; i++) { - bfill(val_iovec[i].iov_base,val,val_iovec[i].iov_len); - bfill(zero_iovec[i].iov_base,0,zero_iovec[i].iov_len); + memset(val_iovec[i].iov_base,val,val_iovec[i].iov_len); + memset(zero_iovec[i].iov_base,0,zero_iovec[i].iov_len); } @@ -450,11 +446,11 @@ static void dotest(int testers, int me, tst_resm(TINFO, "\tTest[%d]: last_trunc = 0x%x.", me, last_trunc); sync(); - dumpiov(&r_iovec[i]); - dumpbits(bits, (nchunks+7)/8); - orbits(hold_bits, bits, (nchunks+7)/8); + ft_dumpiov(&r_iovec[i]); + ft_dumpbits(bits, (nchunks+7)/8); + ft_orbits(hold_bits, bits, (nchunks+7)/8); tst_resm(TINFO, "\tHold "); - dumpbits(hold_bits, (nchunks+7)/8); + ft_dumpbits(hold_bits, (nchunks+7)/8); tst_exit(); } } @@ -474,11 +470,11 @@ static void dotest(int testers, int me, tst_resm(TINFO, "\tTest[%d]: last_trunc = 0x%x.", me, last_trunc); sync(); - dumpiov(&r_iovec[i]); - dumpbits(bits, (nchunks+7)/8); - orbits(hold_bits, bits, (nchunks+7)/8); + ft_dumpiov(&r_iovec[i]); + ft_dumpbits(bits, (nchunks+7)/8); + ft_orbits(hold_bits, bits, (nchunks+7)/8); tst_resm(TINFO, "\tHold "); - dumpbits(hold_bits, (nchunks+7)/8); + ft_dumpbits(hold_bits, (nchunks+7)/8); tst_exit(); } } @@ -507,7 +503,7 @@ static void dotest(int testers, int me, * If hit "misc" interval, do it. */ if (misc_intvl && --whenmisc <= 0) { - orbits(hold_bits, bits, (nchunks+7)/8); + ft_orbits(hold_bits, bits, (nchunks+7)/8); domisc(me, fd, bits); whenmisc = NEXTMISC; } @@ -586,77 +582,10 @@ static void domisc(int me, int fd, char ++type; } -static void bfill(char *buf, char val, int size) -{ - int i; - - for (i = 0; i < size; i++) - buf[i] = val; -} - -/* - * dumpiov - * Dump the contents of the r_iovec buffer. - */ -static void dumpiov(struct iovec *iovptr) -{ - int i; - char val, *buf; - int idx, nout; - - nout = 0; - idx = 0; - - buf = (char*)iovptr->iov_base; - val = buf[0]; - - for (i = 0; i < iovptr->iov_len; i++) { - - if (buf[i] != val) { - if (i == idx+1) - tst_resm(TINFO, "\t%x, ", buf[idx] & 0xff); - else - tst_resm(TINFO, "\t%d*%x, ", i-idx, buf[idx] & 0xff); - idx = i; - ++nout; - } - - if (nout > 10) { - tst_resm(TINFO, "\t ... more"); - return; - } - } - - if (i == idx+1) - tst_resm(TINFO, "\t%x", buf[idx] & 0xff); - else - tst_resm(TINFO, "\t%d*%x", i-idx, buf[idx]); -} - -/* - * Dump the bit-map. - */ -static void dumpbits(char *bits, int size) -{ - char *buf; - - for (buf = bits; size > 0; --size, ++buf) { - if ((buf-bits) % 16 == 0) - tst_resm(TINFO, "\t%04x:\t", 8*(buf-bits)); - tst_resm(TINFO, "\t%02x ", *buf & 0xff); - } -} - -static void orbits(char *hold, char *bits, int count) -{ - while (count-- > 0) - *hold++ |= *bits++; -} - /* * SIGTERM signal handler. */ -static void term(int sig) +static void term(int sig LTP_ATTRIBUTE_UNUSED) { int i; @@ -685,5 +614,3 @@ static void term(int sig) tst_exit(); } - - Index: ltp/testcases/kernel/fs/ftest/libftest.c =================================================================== --- /dev/null +++ ltp/testcases/kernel/fs/ftest/libftest.c @@ -0,0 +1,139 @@ +/* + * Copyright (c) Cyril Hrubis chrubis@suse.cz 2009 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + * the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include "test.h" +#include "libftest.h" + +/* + * Dump content of iov structure. + */ +void ft_dumpiov(struct iovec *iov) +{ + char val, *buf; + int idx, nout, i; + + tst_resm(TINFO, "\tBuf:"); + + nout = 0; + idx = 0; + buf = (char*)iov->iov_base; + val = buf[0]; + + for (i = 0; (unsigned int)i < iov->iov_len; i++) { + + if (buf[i] != val) { + if (i == idx+1) + tst_resm(TINFO, "\t%x, ", buf[idx] & 0xff); + else + tst_resm(TINFO, "\t%d*%x, ", i-idx, buf[idx] & 0xff); + idx = i; + ++nout; + } + + if (nout > 10) { + tst_resm(TINFO, "\t ... more"); + return; + } + } + + if (i == idx+1) + tst_resm(TINFO, "\t%x", buf[idx] & 0xff); + else + tst_resm(TINFO, "\t%d*%x", i-idx, buf[idx]); +} + +/* + * Dump bits string. + */ +void ft_dumpbits(char *bits, int size) +{ + char *buf; + + tst_resm(TINFO, "\tBits array:"); + + for (buf = bits; size > 0; --size, ++buf) { + if ((buf-bits) % 16 == 0) + tst_resm(TINFO, "\t%04x:\t", 8*(buf-bits)); + tst_resm(TINFO, "\t%02x ", *buf & 0xff); + } + + tst_resm(TINFO, "\t"); +} + +/* + * Do logical or of hold and bits (of size) + * fields and store result into hold field. + */ +void ft_orbits(char *hold, char *bits, int size) +{ + while (size-- > 0) + *hold++ |= *bits++; +} + +/* + * Dumps buffer in hexadecimal format. + */ +void ft_dumpbuf(char *buf, int csize) +{ + char val; + int idx, nout, i; + + tst_resm(TINFO, "\tBuf:"); + nout = 0; + idx = 0; + val = buf[0]; + + for (i = 0; i < csize; i++) { + if (buf[i] != val) { + if (i == idx+1) + tst_resm(TINFO, "\t%x, ", buf[idx] & 0xff); + else + tst_resm(TINFO, "\t%d*%x, ", i-idx, buf[idx] & 0xff); + idx = i; + ++nout; + } + if (nout > 10) { + tst_resm(TINFO, "\t ... more"); + return; + } + } + + if (i == idx+1) + tst_resm(TINFO, "\t%x", buf[idx] & 0xff); + else + tst_resm(TINFO, "\t%d*%x", i-idx, buf[idx]); +} + +/* + * Creates filename from path and numbers. + * + * TODO: name is big enough? + */ +void ft_mkname(char *name, char *dirname, int me, int idx) +{ + char a, b; + + a = 'A' + (me % 26); + b = 'a' + (idx % 26); + + if (dirname[0] != '\0') + sprintf(name, "%s/%c%c", dirname, a, b); + else + sprintf(name, "%c%c", a, b); +} Index: ltp/testcases/kernel/fs/ftest/libftest.h =================================================================== --- /dev/null +++ ltp/testcases/kernel/fs/ftest/libftest.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) Cyril Hrubis chrubis@suse.cz 2009 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + * the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + * This small library was created in order to put all code that's duplicated in + * ftestXX.c files here. + */ + +#ifndef __LIBFTEST_H__ +#define __LIBFTEST_H__ + +struct iovec; + +/* + * Dump content of iov structure. + */ +void ft_dumpiov(struct iovec *iov); + +/* + * Dump bits string. + */ +void ft_dumpbits(char *bits, int size); + +/* + * Do logical or of hold and bits (of size) + * fields and store result into hold field. + */ +void ft_orbits(char *hold, char *bits, int size); + +/* + * Dumps buffer in hexadecimal format. + */ +void ft_dumpbuf(char *buf, int csize); + +/* + * Creates filename from path and numbers. + */ +void ft_mkname(char *name, char *dirname, int me, int idx); + +#endif /* __LIBFTEST_H__ */ Index: ltp/testcases/kernel/fs/ftest/ftest05.c =================================================================== --- ltp.orig/testcases/kernel/fs/ftest/ftest05.c +++ ltp/testcases/kernel/fs/ftest/ftest05.c @@ -1,6 +1,7 @@ /* * * Copyright (c) International Business Machines Corp., 2002 + * Copyright (c) Cyril Hrubis chrubis@suse.cz 2009 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -50,104 +51,91 @@ */ #define _XOPEN_SOURCE 500 -#define _LARGEFILE64_SOURCE 1 -#include /* needed by testhead.h */ +#define _LARGEFILE64_SOURCE 1 +#include #include #include #include #include #include -#include /* DEM - added SIGTERM support */ +#include #include +#include #include "test.h" #include "usctest.h" +#include "libftest.h" char *TCID = "ftest05"; int TST_TOTAL = 1; -extern int Tst_count; -void setup(void); -int runtest(); -int dotest(int, int, int); -int domisc(int, int, char*); -int bfill(char*, char, int); -int dumpbuf(char*); -int dumpbits(char*, int); -int orbits(char*, char*, int); -int term(); -void cleanup(void); +static void setup(void); +static void runtest(); +static void dotest(int, int, int); +static void domisc(int, int, char*); +static void term(int sig); +static void cleanup(void); #define PASSED 1 #define FAILED 0 -#define MAXCHILD 25 /* max number of children to allow */ +#define MAXCHILD 25 #define K_1 1024 #define K_2 2048 #define K_4 4096 +static int csize; /* chunk size */ +static int iterations; /* # total iterations */ +static off64_t max_size; /* max file size */ +static int misc_intvl; /* for doing misc things; 0 ==> no */ +static int nchild; /* how many children */ +static int nwait; +static int fd; /* file descriptor used by child */ +static int parent_pid; +static int pidlist[MAXCHILD]; +static char test_name[2]; /* childs test directory name */ + +static char fuss[40]; /* directory to do this in */ +static char homedir[200]; /* where we started */ -int csize; /* chunk size */ -int iterations; /* # total iterations */ -off64_t max_size; /* max file size */ -int misc_intvl; /* for doing misc things; 0 ==> no */ -int nchild; /* how many children */ -int nwait; -int fd; /* file descriptor used by child */ -int parent_pid; -int pidlist[MAXCHILD]; -char test_name[2]; /* childs test directory name */ -char *prog; - -char fuss[40] = ""; /* directory to do this in */ -char homedir[200]= ""; /* where we started */ - -int local_flag; - -/*--------------------------------------------------------------*/ -int main (ac, av) - int ac; - char *av[]; +static int local_flag; + +int main(int ac, char *av[]) { - int lc; /* loop counter */ - char *msg; /* message returned from parse_opts */ + int lc; + char *msg; /* - * parse standard options - */ - if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ - tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); - /*NOTREACHED*/ - } + * parse standard options + */ + if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) + tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); - setup(); + setup(); local_flag = PASSED; - for (lc = 0; TEST_LOOPING(lc); lc++) { + for (lc = 0; TEST_LOOPING(lc); lc++) { + + runtest(); - runtest(); + if (local_flag == PASSED) + tst_resm(TPASS, "Test passed."); + else + tst_resm(TFAIL, "Test failed."); + } - if (local_flag == PASSED) { - tst_resm(TPASS, "Test passed."); - } else { - tst_resm(TFAIL, "Test failed."); - } - } /* end of for */ cleanup(); - return 0; + tst_exit(); } -/*--------------------------------------------------------------*/ -void -setup() +static void setup(void) { - /* * Make a directory to do this in; ignore error if already exists. * Save starting directory. */ tst_tmpdir(); - getcwd(homedir, sizeof( homedir)); + getcwd(homedir, sizeof (homedir)); parent_pid = getpid(); if (!fuss[0]) @@ -160,49 +148,44 @@ setup() tst_exit(); } - /* * Default values for run conditions. */ - iterations = 10; nchild = 5; csize = K_2; /* should run with 1, 2, and 4 K sizes */ max_size = K_1 * K_1; misc_intvl = 10; - if ((sigset(SIGTERM, (void (*)())term)) == SIG_ERR) { + if (sigset(SIGTERM, term) == SIG_ERR) { perror("sigset failed"); exit(3); } local_flag = PASSED; - - return; } -int runtest() +static void runtest(void) { - register int i; - int pid; - int child; - int status; - int count; + int i, pid, child, status, count; - - for(i = 0; i < nchild; i++) { + for (i = 0; i < nchild; i++) { test_name[0] = 'a' + i; test_name[1] = '\0'; fd = open(test_name, O_RDWR|O_CREAT|O_TRUNC, 0666); + if (fd < 0) { tst_resm(TBROK, "\tError %d creating %s/%s.", errno, fuss, test_name); tst_exit(); } - if ((child = fork()) == 0) { /* child */ - dotest(nchild, i, fd); /* do it! */ - tst_exit(); /* when done, exit */ + + if ((child = fork()) == 0) { + dotest(nchild, i, fd); + tst_exit(); } + close(fd); + if (child < 0) { tst_resm(TINFO, "System resource may be too low, fork() malloc()" " etc are likely to fail."); @@ -217,37 +200,30 @@ int runtest() /* * Wait for children to finish. */ - count = 0; - while(1) - { - if ((child = wait(&status)) >= 0) { - //tst_resm(TINFO, "\tTest{%d} exited status = 0x%x", child, status); - if (status != 0) { - tst_resm(TFAIL, "\tTest{%d} failed, expected 0 exit.", child); - local_flag = FAILED; - } - ++count; - } - else - { - if (errno != EINTR) - break; - } + while (1) { + if ((child = wait(&status)) >= 0) { + if (status != 0) { + tst_resm(TFAIL, "\tTest{%d} failed, expected 0 exit.", child); + local_flag = FAILED; + } + ++count; + } else + if (errno != EINTR) + break; } /* * Should have collected all children. */ - if (count != nwait) { tst_resm(TFAIL, "\tWrong # children waited on, count = %d", count); local_flag = FAILED; } - chdir(homedir); pid = fork(); + if (pid < 0) { tst_resm(TINFO, "System resource may be too low, fork() malloc()" " etc are likely to fail."); @@ -255,18 +231,19 @@ int runtest() sync(); tst_exit(); } + if (pid == 0) { execl("/bin/rm", "rm", "-rf", fuss, NULL); tst_exit(); } wait(&status); + if (status) { tst_resm(TINFO,"CAUTION - ftest05, '%s' may not be removed", fuss); } - sync(); /* safeness */ - return 0; + sync(); } /* @@ -279,12 +256,10 @@ int runtest() #define NMISC 4 enum m_type { m_fsync, m_trunc, m_sync, m_fstat }; -char *m_str[] = { - "fsync", "trunc", "sync", "fstat" -}; +char *m_str[] = {"fsync", "trunc", "sync", "fstat"}; int misc_cnt[NMISC]; /* counts # of each kind of misc */ -int file_max; /* file-max size */ +int file_max; /* file-max size */ int nchunks; int last_trunc = -1; int tr_flag; @@ -293,42 +268,35 @@ enum m_type type = m_fsync; #define CHUNK(i) (((off64_t)i) * csize) #define NEXTMISC ((rand() % misc_intvl) + 5) -int dotest(testers, me, fd) - int testers; - int me; - int fd; +static void dotest(int testers, int me, int fd) { - register int i; - char *bits; - char *hold_bits; - char *buf; - char *val_buf; - char *zero_buf; - int count; - int collide; - char val; - int chunk; - int whenmisc; - int xfr; + int i, count, collide, chunk, whenmisc, xfr; + char *bits, *hold_bits, *buf, *val_buf, *zero_buf; + char val; nchunks = max_size / csize; - if( (bits = (char*)calloc((nchunks+7)/8, 1)) == 0) { + + if ((bits = calloc((nchunks+7)/8, 1)) == NULL) { tst_resm(TFAIL, "\tmalloc failed(bits)"); tst_exit(); } - if( (hold_bits = (char*)calloc((nchunks+7)/8, 1)) == 0) { + + if ((hold_bits = calloc((nchunks+7)/8, 1)) == NULL) { tst_resm(TFAIL, "\tmalloc failed(bold_bits)"); tst_exit(); } - if( (buf = (char*)(calloc(csize, 1))) == 0) { + + if ((buf = (calloc(csize, 1))) == NULL) { tst_resm(TFAIL, "\tmalloc failed(buf)"); tst_exit(); } - if( (val_buf = (char*)(calloc(csize, 1))) == 0) { + + if ((val_buf = (calloc(csize, 1))) == NULL) { tst_resm(TFAIL, "\tmalloc failed(val_buf)"); tst_exit(); } - if( (zero_buf = (char*)(calloc(csize, 1))) == 0) { + + if ((zero_buf = (calloc(csize, 1))) == NULL) { tst_resm(TFAIL, "\tmalloc failed(zero_buf)"); tst_exit(); } @@ -336,7 +304,6 @@ int dotest(testers, me, fd) /* * No init sectors; allow file to be sparse. */ - val = (64/testers) * me + 1; /* @@ -361,10 +328,10 @@ int dotest(testers, me, fd) misc_cnt[i] = 0; ftruncate(fd, 0); file_max = 0; - bfill(bits, 0, (nchunks+7)/8); - bfill(hold_bits, 0, (nchunks+7)/8); - bfill(val_buf, val, csize); - bfill(zero_buf, 0, csize); + memset(bits, 0, (nchunks+7)/8); + memset(hold_bits, 0, (nchunks+7)/8); + memset(val_buf, val, csize); + memset(zero_buf, 0, csize); count = 0; collide = 0; while(count < nchunks) { @@ -399,15 +366,16 @@ int dotest(testers, me, fd) } if (memcmp(buf, zero_buf, csize)) { tst_resm(TFAIL, - "\tTest[%d] bad verify @ 0x%Lx for val %d count %d xfr %d file_max 0x%Lx, should be %d.", + "\tTest[%d] bad verify @ 0x%Lx for val %d count %d xfr %d file_max 0x%x, should be %d.", me, CHUNK(chunk), val, count, xfr, file_max, zero_buf[0]); tst_resm(TINFO, "\tTest[%d]: last_trunc = 0x%x.", me, last_trunc); sync(); - dumpbuf(buf); - dumpbits(bits, (nchunks+7)/8); - orbits(hold_bits, bits, (nchunks+7)/8); - tst_resm(TINFO, "\tHold "); dumpbits(hold_bits, (nchunks+7)/8); + ft_dumpbuf(buf, csize); + ft_dumpbits(bits, (nchunks+7)/8); + ft_orbits(hold_bits, bits, (nchunks+7)/8); + tst_resm(TINFO, "\tHold "); + ft_dumpbits(hold_bits, (nchunks+7)/8); tst_exit(); } bits[chunk/8] |= (1<<(chunk%8)); @@ -420,15 +388,16 @@ int dotest(testers, me, fd) } ++collide; if (memcmp(buf, val_buf, csize)) { - tst_resm(TFAIL, "\tTest[%d] bad verify @ 0x%Lx for val %d count %d xfr %d file_max 0x%Lx.", + tst_resm(TFAIL, "\tTest[%d] bad verify @ 0x%Lx for val %d count %d xfr %d file_max 0x%x.", me, CHUNK(chunk), val, count, xfr, file_max); tst_resm(TINFO, "\tTest[%d]: last_trunc = 0x%x.", me, last_trunc); sync(); - dumpbuf(buf); - dumpbits(bits, (nchunks+7)/8); - orbits(hold_bits, bits, (nchunks+7)/8); - tst_resm(TINFO, "\tHold "); dumpbits(hold_bits, (nchunks+7)/8); + ft_dumpbuf(buf, csize); + ft_dumpbits(bits, (nchunks+7)/8); + ft_orbits(hold_bits, bits, (nchunks+7)/8); + tst_resm(TINFO, "\tHold "); + ft_dumpbits(hold_bits, (nchunks+7)/8); tst_exit(); } } @@ -456,7 +425,7 @@ int dotest(testers, me, fd) * If hit "misc" interval, do it. */ if (misc_intvl && --whenmisc <= 0) { - orbits(hold_bits, bits, (nchunks+7)/8); + ft_orbits(hold_bits, bits, (nchunks+7)/8); domisc(me, fd, bits); whenmisc = NEXTMISC; } @@ -469,32 +438,28 @@ int dotest(testers, me, fd) */ fsync(fd); - ++misc_cnt[(int)m_fsync]; + ++misc_cnt[m_fsync]; //tst_resm(TINFO, "\tTest{%d} val %d done, count = %d, collide = {%d}", // me, val, count, collide); //for(i = 0; i < NMISC; i++) // tst_resm(TINFO, "\t\tTest{%d}: {%d} %s's.", me, misc_cnt[i], m_str[i]); ++val; } - return 0; } /* * domisc() * Inject misc syscalls into the thing. */ - -int domisc(me, fd, bits) - int me; - int fd; - char *bits; +static void domisc(int me, int fd, char *bits) { - register int chunk; - struct stat sb; + int chunk; + struct stat sb; - if ((int) type > (int) m_fstat) + if (type > m_fstat) type = m_fsync; - switch(type) { + + switch (type) { case m_fsync: if (fsync(fd) < 0) { tst_resm(TFAIL, "\tTest[%d]: fsync error %d.", me, errno); @@ -507,13 +472,13 @@ int domisc(me, fd, bits) last_trunc = file_max; if (tr_flag) { if (ftruncate(fd, file_max) < 0) { - tst_resm(TFAIL, "\tTest[%d]: ftruncate error %d @ 0x%Lx.", me, errno, file_max); + tst_resm(TFAIL, "\tTest[%d]: ftruncate error %d @ 0x%x.", me, errno, file_max); tst_exit(); } tr_flag = 0; } else { if (truncate(test_name, file_max) < 0) { - tst_resm(TFAIL, "\tTest[%d]: truncate error %d @ 0x%Lx.", me, errno, file_max); + tst_resm(TFAIL, "\tTest[%d]: truncate error %d @ 0x%x.", me, errno, file_max); tst_exit(); } tr_flag = 1; @@ -532,105 +497,23 @@ int domisc(me, fd, bits) tst_exit(); } if (sb.st_size != file_max) { - tst_resm(TFAIL, "\tTest[%d]: fstat() mismatch; st_size=%x,file_max=%Lx.", - me, sb.st_size, file_max); + tst_resm(TFAIL, "\tTest[%d]: fstat() mismatch; st_size=%"PRIx64",file_max=%x.", + me, (int64_t)sb.st_size, file_max); tst_exit(); } break; } - ++misc_cnt[(int)type]; - type = (enum m_type) ((int) type + 1); - return 0; -} - -int bfill(buf, val, size) - register char *buf; - char val; - register int size; -{ - register int i; - - for(i = 0; i < size; i++) - buf[i] = val; - return 0; -} - -/* - * dumpbuf - * Dump the buffer. - */ - -int dumpbuf(buf) - register char *buf; -{ - register int i; - char val; - int idx; - int nout; - - tst_resm(TINFO, "\tBuf:"); - nout = 0; - idx = 0; - val = buf[0]; - for(i = 0; i < csize; i++) { - if (buf[i] != val) { - if (i == idx+1) - tst_resm(TINFO, "\t%x, ", buf[idx] & 0xff); - else - tst_resm(TINFO, "\t%d*%x, ", i-idx, buf[idx] & 0xff); - idx = i; - ++nout; - } - if (nout > 10) { - tst_resm(TINFO, "\t ... more"); - return 0; - } - } - if (i == idx+1) - tst_resm(TINFO, "\t%x", buf[idx] & 0xff); - else - tst_resm(TINFO, "\t%d*%x", i-idx, buf[idx]); - return 0; -} - -/* - * dumpbits - * Dump the bit-map. - */ - -int dumpbits(bits, size) - char *bits; - register int size; -{ - register char *buf; - - tst_resm(TINFO, "\tBits array:"); - for(buf = bits; size > 0; --size, ++buf) { - if ((buf-bits) % 16 == 0) - tst_resm(TINFO, "\t%04x:\t", 8*(buf-bits)); - tst_resm(TINFO, "\t%02x ", (int)*buf & 0xff); - } - return 0; -} - -int orbits(hold, bits, count) - register char *hold; - register char *bits; - register int count; -{ - while(count-- > 0) - *hold++ |= *bits++; - return 0; + ++misc_cnt[type]; + ++type; } /* term() * * This is called when a SIGTERM signal arrives. */ - -int term() +static void term(int sig LTP_ATTRIBUTE_UNUSED) { - register int i; + int i; tst_resm(TINFO, "\tterm -[%d]- got sig term.", getpid()); @@ -638,28 +521,27 @@ int term() * If run by hand we like to have the parent send the signal to * the child processes. This makes life easy. */ - if (parent_pid == getpid()) { for (i=0; i < nchild; i++) if (pidlist[i]) /* avoid embarassment */ kill(pidlist[i], SIGTERM); - return 0; + return; } tst_resm(TINFO, "\tunlinking '%s'", test_name); close(fd); + if (unlink(test_name)) tst_resm(TBROK, "Unlink of '%s' failed, errno = %d.", test_name, errno); else tst_resm(TINFO, "Unlink of '%s' successful.", test_name); + tst_exit(); - return 0; } -void -cleanup() +static void cleanup(void) { /* * print timing stats if that option was specified. Index: ltp/testcases/kernel/fs/ftest/ftest06.c =================================================================== --- ltp.orig/testcases/kernel/fs/ftest/ftest06.c +++ ltp/testcases/kernel/fs/ftest/ftest06.c @@ -1,6 +1,7 @@ /* * * Copyright (c) International Business Machines Corp., 2002 + * Copyright (c) Cyril Hrubis chrubis@suse.cz 2009 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -45,8 +46,8 @@ * */ -#define _LARGEFILE64_SOURCE 1 -#include /* needed by testhead.h */ +#define _LARGEFILE64_SOURCE 1 +#include #include #include #include @@ -54,101 +55,84 @@ #include #include #include -#include /* DEM - added SIGTERM support */ +#include #include #include "test.h" #include "usctest.h" +#include "libftest.h" char *TCID = "ftest06"; int TST_TOTAL = 1; -extern int Tst_count; - #define PASSED 1 #define FAILED 0 -void crfile(int, int); -void unlfile(int, int); -void fussdir(int, int); -int dotest(int, int); -void Warn(int, char*, char*); -int mkname(char*, int, int); -int term(); -void cleanup(); +static void crfile(int, int); +static void unlfile(int, int); +static void fussdir(int, int); +static void dotest(int, int); +static void dowarn(int, char*, char*); +static void term(int sig); +static void cleanup(void); -#define MAXCHILD 25 /* max number of children to allow */ +#define MAXCHILD 25 #define K_1 1024 #define K_2 2048 #define K_4 4096 +static int local_flag; -int local_flag; - -/*--------------------------------------------------------------*/ #define M (1024*1024) -int iterations; /* # total iterations */ -int nchild; -int parent_pid; -int pidlist[MAXCHILD]; - -char homedir[MAXPATHLEN]; -char dirname[MAXPATHLEN]; -char tmpname[MAXPATHLEN]; -int dirlen; -int mnt = 0; -char startdir[MAXPATHLEN], mntpoint[MAXPATHLEN], newfsstring[50]; -char *partition; -char *cwd; -char *fstyp; - - -/*--------------------------------------------------------------*/ -int main (ac, av) - int ac; - char *av[]; +static int iterations; +static int nchild; +static int parent_pid; +static int pidlist[MAXCHILD]; + +static char homedir[MAXPATHLEN]; +static char dirname[MAXPATHLEN]; +static char tmpname[MAXPATHLEN]; +static int dirlen; +static int mnt = 0; +static char startdir[MAXPATHLEN], mntpoint[MAXPATHLEN]; +static char *partition; +static char *cwd; +static char *fstyp; + +int main(int ac, char *av[]) { - register int k, j; - int pid; - int child; - int status; - int count; - char name[3]; + int pid, child, status, count, k, j; + char name[3]; - int lc; /* loop counter */ - char *msg; /* message returned from parse_opts */ + int lc; + char *msg; /* * parse standard options */ - if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ + if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL){ tst_resm(TBROK, "OPTION PARSING ERROR - %s", msg); tst_exit(); - /*NOTREACHED*/ } - /* * Default values for run conditions. */ - iterations = 50; nchild = 5; - if (signal(SIGTERM, (void (*)())term) == SIG_ERR) { + if (signal(SIGTERM, term) == SIG_ERR) { tst_resm(TBROK,"first signal failed"); tst_exit(); } /* use the default values for run conditions */ - for (lc = 0; TEST_LOOPING(lc); lc++) { local_flag = PASSED; /* * Make a directory to do this in; ignore error if already exists. */ - parent_pid = getpid(); tst_tmpdir(); @@ -157,7 +141,7 @@ int main (ac, av) tst_resm(TFAIL,"getcwd failed"); tst_exit(); } - } + } cwd = startdir; strcat(dirname, cwd); sprintf(tmpname, "/ftest06.%d", getpid()); @@ -181,11 +165,10 @@ int main (ac, av) } /* enter block */ - - for(k = 0; k < nchild; k++) { - if ((child = fork()) == 0) { /* child */ - dotest(k, iterations); /* do it! */ - tst_exit(); /* when done, exit */ + for (k = 0; k < nchild; k++) { + if ((child = fork()) == 0) { + dotest(k, iterations); + tst_exit(); } if (child < 0) { tst_resm(TINFO, "System resource may be too low, fork() malloc()" @@ -200,9 +183,8 @@ int main (ac, av) /* * Wait for children to finish. */ - count = 0; - while((child = wait(&status)) > 0) { + while ((child = wait(&status)) > 0) { //tst_resm(TINFO,"Test{%d} exited status = 0x%x", child, status); //fprintf(stdout, "status is %d",status); if (status) { @@ -215,24 +197,22 @@ int main (ac, av) /* * Should have collected all children. */ - if (count != nchild) { tst_resm(TFAIL,"Wrong # children waited on, count = %d", count); local_flag = FAILED; } - if (local_flag == PASSED) { - tst_resm(TPASS, "Test passed."); - } else { - tst_resm(TFAIL, "Test failed."); - } - + if (local_flag == PASSED) + tst_resm(TPASS, "Test passed."); + else + tst_resm(TFAIL, "Test failed."); if (iterations > 26) iterations = 26; - for (k=0; k < nchild; k++) - for (j=0; j < iterations + 1; j++) { - mkname(name, k, j); + + for (k = 0; k < nchild; k++) + for (j = 0; j < iterations + 1; j++) { + ft_mkname(name, dirname, k, j); rmdir(name); unlink(name); } @@ -246,11 +226,13 @@ int main (ac, av) tst_resm(TBROK, "Test broken due to inability of fork."); tst_exit(); } + if (pid == 0) { execl("/bin/rm", "rm", "-rf", homedir, NULL); tst_exit(); } else wait(&status); + if (status) tst_resm(TINFO,"CAUTION - ftest06, '%s' may not have been removed.", homedir); @@ -272,36 +254,29 @@ int main (ac, av) dirname); } - sync(); /* safeness */ - + sync(); cleanup(); - } /* end for */ - if (local_flag == FAILED) { + } + + if (local_flag == FAILED) tst_resm(TFAIL, "Test failed."); - } else { + else tst_resm(TPASS, "Test passed."); - } cleanup(); - return 0; + tst_exit(); } - -/*--------------------------------------------------------------*/ - - - -#define warn(val,m1,m2) if ((val) < 0) Warn(me,m1,m2) +#define warn(val,m1,m2) if ((val) < 0) dowarn(me,m1,m2) /* * crfile() * Create a file and write something into it. */ +static char crmsg[] = "Gee, let's write something in the file!\n"; -char crmsg[] = "Gee, let's write something in the file!\n"; - -void crfile(me, count) +static void crfile(int me, int count) { int fd; off64_t seekval; @@ -309,7 +284,7 @@ void crfile(me, count) char fname[128]; char buf[128]; - mkname(fname, me, count); + ft_mkname(fname, dirname, me, count); fd = open(fname, O_RDWR|O_CREAT|O_TRUNC, 0666); if (fd < 0 && errno == EISDIR) { @@ -331,7 +306,8 @@ void crfile(me, count) val = read(fd, buf, sizeof(crmsg)-1); warn(val, "read", 0); - if (strncmp(crmsg, buf, sizeof(crmsg)-1)) Warn(me, "compare", 0); + if (strncmp(crmsg, buf, sizeof(crmsg)-1)) + dowarn(me, "compare", 0); val = close(fd); warn(val, "close", 0); @@ -341,24 +317,22 @@ void crfile(me, count) * unlfile() * Unlink some of the files. */ - -void unlfile(me, count) +static void unlfile(int me, int count) { - int i; - int val; - char fname[128]; + int val, i; + char fname[128]; i = count - 10; if (i < 0) i = 0; - for(; i < count; i++) { - mkname(fname, me, i); + for (; i < count; i++) { + ft_mkname(fname, dirname, me, i); val = rmdir(fname); if (val < 0 ) val = unlink(fname); if (val == 0 || errno == ENOENT) continue; - Warn(me, "unlink", fname); + dowarn(me, "unlink", fname); } } @@ -368,16 +342,14 @@ void unlfile(me, count) * * Randomly leave the directory there. */ - -void fussdir(me, count) +static void fussdir(int me, int count) { - int val; - char dir[128]; - char fname[128]; - char savedir[128]; + int val; + char dir[128], fname[128], savedir[128]; - mkname(dir, me, count); - rmdir(dir); unlink(dir); /* insure not there */ + ft_mkname(dir, dirname, me, count); + rmdir(dir); + unlink(dir); val = mkdir(dir, 0755); warn(val, "mkdir", dir); @@ -385,7 +357,6 @@ void fussdir(me, count) /* * Arrange to create files in the directory. */ - strcpy(savedir, dirname); strcpy(dirname, ""); @@ -399,6 +370,7 @@ void fussdir(me, count) warn(val, "chdir", ".."); val = rmdir(dir); + if (val >= 0) { tst_resm(TFAIL,"Test[%d]: rmdir of non-empty %s succeeds!", me, dir); tst_exit(); @@ -407,11 +379,11 @@ void fussdir(me, count) val = chdir(dir); warn(val, "chdir", dir); - mkname(fname, me, count); + ft_mkname(fname, dirname, me, count); val = unlink(fname); warn(val, "unlink", fname); - mkname(fname, me, count+1); + ft_mkname(fname, dirname, me, count+1); val = unlink(fname); warn(val, "unlink", fname); @@ -433,8 +405,6 @@ void fussdir(me, count) * * Randomly do an inode thing; loop for # iterations. */ - - #define THING(p) {p, "p"} struct ino_thing { @@ -452,16 +422,14 @@ struct ino_thing { int thing_cnt[NTHING]; int thing_last[NTHING]; -int dotest(me, count) - int me; - int count; +static void dotest(int me, int count) { - int i; - int thing; + int thing, i; //tst_resm(TINFO,"Test %d pid %d starting.", me, getpid()); srand(getpid()); + for(i = 0; i < count; i++) { thing = (rand() >> 3) % NTHING; (*ino_thing[thing].it_proc)(me, i, ino_thing[thing].it_name); @@ -469,61 +437,36 @@ int dotest(me, count) } //tst_resm(TINFO,"Test %d pid %d exiting.", me, getpid()); - return 0; } -void Warn(me, m1, m2) - int me; - char *m1; - char *m2; +static void dowarn(int me, char *m1, char *m2) { - int err = errno; + int err = errno; tst_resm(TFAIL,"Test[%d]: error %d on %s %s", me, err, m1, (m2 ? m2 : "")); tst_exit(); } -int mkname(name, me, idx) - register char *name; -{ - register int len; - - (void) strcpy(name, dirname); - if (name[0]) { - len = dirlen+1; - name[len-1] = '/'; - } else - len = 0; - name[len+0] = 'A' + (me % 26); - name[len+1] = 'a' + (idx % 26); - name[len+2] = '\0'; - return 0; -} - -/*--------------------------------------------------------------*/ - - -int term() +static void term(int sig LTP_ATTRIBUTE_UNUSED) { - register int i; + int i; tst_resm(TINFO, "\tterm -[%d]- got sig term.", getpid()); if (parent_pid == getpid()) { - for (i=0; i < nchild; i++) - if (pidlist[i]) /* avoid embarassment */ + for (i = 0; i < nchild; i++) + if (pidlist[i]) kill(pidlist[i], SIGTERM); - return 0; + return; } tst_resm(TBROK, "Term: Child process exiting."); tst_exit(); - return 0; } -void cleanup() +static void cleanup(void) { char mount_buffer[1024]; @@ -532,14 +475,14 @@ void cleanup() tst_resm(TINFO,"Could not change to %s ", startdir); } if (!strcmp(fstyp, "cfs")) { - sprintf(mount_buffer, "/etc/umount %s", partition); + sprintf(mount_buffer, "/bin/umount %s", partition); if (system(mount_buffer) != 0) { tst_resm(TINFO,"Unable to unmount %s from %s ", partition, mntpoint); if (umount(partition)) { tst_resm(TINFO,"Unable to unmount %s from %s ", partition, mntpoint); } else { - tst_resm(TINFO, "Forced umount for %s, /etc/mnttab now dirty", partition ); + tst_resm(TINFO, "Forced umount for %s, /etc/mtab now dirty", partition ); } } } Index: ltp/include/compiler.h =================================================================== --- ltp.orig/include/compiler.h +++ ltp/include/compiler.h @@ -8,6 +8,7 @@ #define __LTP_COMPILER_H__ #define LTP_ATTRIBUTE_NORETURN __attribute__((noreturn)) +#define LTP_ATTRIBUTE_UNUSED __attribute__((unused)) #ifndef ARRAY_SIZE #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0])) Index: ltp/testcases/kernel/fs/ftest/ftest07.c =================================================================== --- ltp.orig/testcases/kernel/fs/ftest/ftest07.c +++ ltp/testcases/kernel/fs/ftest/ftest07.c @@ -1,6 +1,7 @@ /* * * Copyright (c) International Business Machines Corp., 2002 + * Copyright (c) Cyril Hrubis chrubis@suse.cz 2009 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -56,7 +57,7 @@ */ #define _XOPEN_SOURCE 500 -#define _LARGEFILE64_SOURCE 1 +#define _LARGEFILE64_SOURCE 1 #include #include #include @@ -64,104 +65,93 @@ #include #include #include -#include /* DEM - added SIGTERM support */ -#include /* needed by testhead.h */ +#include +#include #include +#include #include "test.h" #include "usctest.h" +#include "libftest.h" char *TCID = "ftest07"; int TST_TOTAL = 1; -extern int Tst_count; #define PASSED 1 #define FAILED 0 -#define MAXCHILD 25 /* max number of children to allow */ +#define MAXCHILD 25 #define K_1 1024 #define K_2 2048 #define K_4 4096 #define MAXIOVCNT 16 -void setup(); -int runtest(); -int dotest(int, int, int); -int domisc(int, int, char*); -int bfill(char*, char, int); -int dumpiov(struct iovec*); -int dumpbits(char*, int); -int orbits(char*, char*, int); -int term(); - -int csize; /* chunk size */ -int iterations; /* # total iterations */ -off64_t max_size; /* max file size */ -int misc_intvl; /* for doing misc things; 0 ==> no */ -int nchild; /* how many children */ -int nwait; -int fd; /* file descriptor used by child */ -int parent_pid; -int pidlist[MAXCHILD]; -char test_name[2]; /* childs test directory name */ -char *prog, *getcwd() ; - -char fuss[40] = ""; /* directory to do this in */ -char homedir[200]= ""; /* where we started */ - -int local_flag; - -/*--------------------------------------------------------------*/ -int main (ac, av) - int ac; - char *av[]; +static void setup(void); +static void runtest(void); +static void dotest(int, int, int); +static void domisc(int, int, char*); +static void term(int sig); + +static int csize; /* chunk size */ +static int iterations; /* # total iterations */ +static off64_t max_size; /* max file size */ +static int misc_intvl; /* for doing misc things; 0 ==> no */ +static int nchild; /* how many children */ +static int nwait; +static int fd; /* file descriptor used by child */ +static int parent_pid; +static int pidlist[MAXCHILD]; +static char test_name[2]; /* childs test directory name */ + +static char fuss[40]; /* directory to do this in */ +static char homedir[200]; /* where we started */ + +static int local_flag; + +int main(int ac, char *av[]) { - int lc; /* loop counter */ - char *msg; /* message returned from parse_opts */ + int lc; + char *msg; - /* - * parse standard options - */ - if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ - tst_resm(TBROK, "OPTION PARSING ERROR - %s", msg); - tst_exit(); - /*NOTREACHED*/ - } + /* + * parse standard options + */ + if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) { + tst_resm(TBROK, "OPTION PARSING ERROR - %s", msg); + tst_exit(); + } - setup(); + setup(); for (lc = 0; TEST_LOOPING(lc); lc++) { local_flag = PASSED; - runtest(); + runtest(); - if (local_flag == PASSED) { - tst_resm(TPASS, "Test passed."); - } else { - tst_resm(TFAIL, "Test failed."); - } + if (local_flag == PASSED) + tst_resm(TPASS, "Test passed."); + else + tst_resm(TFAIL, "Test failed."); tst_rmdir(); tst_exit(); - } /* end for */ + } + return 0; } - /*--------------------------------------------------------------*/ -void setup() +static void setup(void) { - char wdbuf[MAXPATHLEN], *cwd ; - int term(); + char wdbuf[MAXPATHLEN], *cwd; /* * Make a directory to do this in; ignore error if already exists. * Save starting directory. */ - - if ( (cwd = getcwd(homedir, sizeof( homedir))) == NULL ) { - tst_resm(TBROK,"Failed to get corrent directory") ; - tst_exit() ; + if ((cwd = getcwd(homedir, sizeof (homedir))) == NULL ) { + tst_resm(TBROK,"Failed to get corrent directory") ; + tst_exit(); } parent_pid = getpid(); @@ -186,23 +176,18 @@ void setup() max_size = K_1 * K_1; misc_intvl = 10; - if (sigset(SIGTERM, (void (*)())term) == SIG_ERR) { + if (sigset(SIGTERM, term) == SIG_ERR) { tst_resm(TBROK, " sigset failed: signo = 15") ; tst_exit() ; } } -int runtest() +static void runtest(void) { - register int i; - int pid; - int child; - int status; - int count; + int pid, child, status, count, i; - - for(i = 0; i < nchild; i++) { + for (i = 0; i < nchild; i++) { test_name[0] = 'a' + i; test_name[1] = '\0'; fd = open(test_name, O_RDWR|O_CREAT|O_TRUNC, 0666); @@ -210,9 +195,10 @@ int runtest() tst_resm(TBROK, "\tError %d creating %s/%s.", errno, fuss, test_name); tst_exit(); } - if ((child = fork()) == 0) { /* child */ - dotest(nchild, i, fd); /* do it! */ - tst_exit(); /* when done, exit */ + + if ((child = fork()) == 0) { + dotest(nchild, i, fd); + tst_exit(); } close(fd); @@ -231,23 +217,19 @@ int runtest() /* * Wait for children to finish. */ - count = 0; - while(1) - { - if ((child = wait(&status)) >= 0) { - //tst_resm(TINFO, "\tTest{%d} exited status = 0x%x", child, status); + while(1) { + if ((child = wait(&status)) >= 0) { + //tst_resm(TINFO, "\tTest{%d} exited status = 0x%x", child, status); if (status) { tst_resm(TFAIL, "\tTest{%d} failed, expected 0 exit.", child); local_flag = FAILED; } - ++count; - } - else - { - if (errno != EINTR) - break; - } + ++count; + } else { + if (errno != EINTR) + break; + } } /* @@ -278,8 +260,7 @@ int runtest() tst_resm(TINFO, "CAUTION - ftest07, '%s' may not be removed", fuss); } - sync(); /* safeness */ - return 0; + sync(); } /* @@ -292,9 +273,7 @@ int runtest() #define NMISC 4 enum m_type { m_fsync, m_trunc, m_sync, m_fstat }; -char *m_str[] = { - "fsync", "trunc", "sync", "fstat" -}; +char *m_str[] = {"fsync", "trunc", "sync", "fstat"}; int misc_cnt[NMISC]; /* counts # of each kind of misc */ int file_max; /* file-max size */ @@ -306,20 +285,11 @@ enum m_type type = m_fsync; #define CHUNK(i) (((off64_t)i) * csize) #define NEXTMISC ((rand() % misc_intvl) + 5) -int dotest(testers, me, fd) - int testers; - int me; - int fd; +static void dotest(int testers, int me, int fd) { - register int i; - char *bits; - char *hold_bits; - int count; - int collide; - char val; - int chunk; - int whenmisc; - int xfr; + char *bits, *hold_bits; + char val; + int count, collide, chunk, whenmisc, xfr, i; /* Stuff for the readv call */ struct iovec r_iovec[MAXIOVCNT]; @@ -332,11 +302,11 @@ int dotest(testers, me, fd) int w_ioveclen; nchunks = max_size / csize; - if( (bits = (char*)malloc((nchunks+7) / 8)) == 0) { + if ((bits = malloc((nchunks+7) / 8)) == NULL) { tst_resm(TBROK, "\tmalloc failed(bits)"); tst_exit(); } - if( (hold_bits = (char*)malloc((nchunks+7) / 8)) == 0) { + if ((hold_bits = malloc((nchunks+7) / 8)) == NULL) { tst_resm(TBROK, "\tmalloc failed(hlod_bits)"); tst_exit(); } @@ -350,7 +320,7 @@ int dotest(testers, me, fd) */ for (i = 0; i < MAXIOVCNT; i++) { - if( (r_iovec[i].iov_base = (char*)calloc(r_ioveclen, 1)) == 0) { + if ((r_iovec[i].iov_base = calloc(r_ioveclen, 1)) == NULL) { tst_resm(TFAIL, "\tmalloc failed(r_iovec[i].iov_base)"); tst_exit(); } @@ -360,27 +330,27 @@ int dotest(testers, me, fd) * make things more diffult for the OS. */ - if(malloc((i+1)*8) == 0) { + if (malloc((i+1)*8) == NULL) { tst_resm(TBROK, "\tmalloc failed((i+1)*8)"); tst_exit(); } - if( (val_iovec[i].iov_base = (char*)calloc(w_ioveclen, 1)) == 0) { + if ((val_iovec[i].iov_base = calloc(w_ioveclen, 1)) == NULL) { tst_resm(TBROK, "\tmalloc failed(val_iovec[i]"); exit(1); } val_iovec[i].iov_len = w_ioveclen; - if(malloc((i+1)*8) == 0) { + if (malloc((i+1)*8) == NULL) { tst_resm(TBROK, "\tmalloc failed((i+1)*8)"); tst_exit(); } - if( (zero_iovec[i].iov_base = (char*)calloc(w_ioveclen, 1)) == 0) { + if ((zero_iovec[i].iov_base = calloc(w_ioveclen, 1)) == NULL) { tst_resm(TBROK, "\tmalloc failed(zero_iover)"); tst_exit(); } zero_iovec[i].iov_len = w_ioveclen; - if(malloc((i+1)*8) == 0) { + if (malloc((i+1)*8) == NULL) { tst_resm(TBROK, "\tmalloc failed((i+1)*8)"); tst_exit(); } @@ -406,30 +376,32 @@ int dotest(testers, me, fd) */ srand(getpid()); - if (misc_intvl) whenmisc = NEXTMISC; - while(iterations-- > 0) { - for(i = 0; i < NMISC; i++) + if (misc_intvl) + whenmisc = NEXTMISC; + + while (iterations-- > 0) { + for (i = 0; i < NMISC; i++) misc_cnt[i] = 0; ftruncate(fd,0); file_max = 0; - bfill(bits, 0, (nchunks+7) / 8); - bfill(hold_bits, 0, (nchunks+7) / 8); + memset(bits, 0, (nchunks+7) / 8); + memset(hold_bits, 0, (nchunks+7) / 8); /* Have to fill the val and zero iov buffers in a different manner */ - for(i = 0; i < MAXIOVCNT; i++) { - bfill(val_iovec[i].iov_base,val,val_iovec[i].iov_len); - bfill(zero_iovec[i].iov_base,0,zero_iovec[i].iov_len); + for (i = 0; i < MAXIOVCNT; i++) { + memset(val_iovec[i].iov_base,val,val_iovec[i].iov_len); + memset(zero_iovec[i].iov_base,0,zero_iovec[i].iov_len); } count = 0; collide = 0; - while(count < nchunks) { + while (count < nchunks) { chunk = rand() % nchunks; /* * Read it. */ - if (lseek64(fd, CHUNK(chunk), 0) < (off64_t)0) { + if (lseek64(fd, CHUNK(chunk), 0) < 0) { tst_resm(TFAIL, "\tTest[%d]: lseek64(0) fail at %Lx, errno = %d.", me, CHUNK(chunk), errno); tst_exit(); @@ -453,7 +425,7 @@ int dotest(testers, me, fd) me, xfr, csize); tst_exit(); } - for(i=0;i (int) m_fstat) + if (type > m_fstat) type = m_fsync; switch(type) { case m_fsync: @@ -592,106 +560,24 @@ int domisc(me, fd, bits) tst_exit(); } if (sb.st_size != file_max) { - tst_resm(TFAIL, "\tTest[%d]: fstat() mismatch; st_size=%x,file_max=%x.", - me, sb.st_size, file_max); + tst_resm(TFAIL, "\tTest[%d]: fstat() mismatch; st_size=%"PRIx64",file_max=%x.", + me, (int64_t)sb.st_size, file_max); tst_exit(); } break; } - ++misc_cnt[(int)type]; - type = (enum m_type) ((int) type + 1); - return 0; -} - -int bfill(buf, val, size) - register char *buf; - char val; - register int size; -{ - register int i; - for(i = 0; i < size; i++) - buf[i] = val; - return 0; -} - -/* - * dumpiov - * Dump the contents of the r_iovec buffer. - */ - -int dumpiov(iovptr) - register struct iovec *iovptr; -{ - register int i; - char val; - int idx; - int nout; - - tst_resm(TINFO, "\tBuf:"); - nout = 0; - idx = 0; - val = ((char *)iovptr->iov_base)[0]; - for(i = 0; i < iovptr->iov_len; i++) { - if (((char *)iovptr->iov_base)[i] != val) { - if (i == idx+1) - tst_resm(TINFO, "\t%x, ", ((char *)iovptr->iov_base)[idx] & 0xff); - else - tst_resm(TINFO, "\t%d*%x, ", i-idx, ((char *)iovptr->iov_base)[idx] & 0xff); - idx = i; - ++nout; - } - if (nout > 10) { - tst_resm(TINFO, "\t ... more"); - return 0; - } - } - if (i == idx+1) - tst_resm(TINFO, "\t%x", ((char *)iovptr->iov_base)[idx] & 0xff); - else - tst_resm(TINFO, "\t%d*%x", i-idx, ((char *)iovptr->iov_base)[idx]); - return 0; -} - -/* - * dumpbits - * Dump the bit-map. - */ - -int dumpbits(bits, size) - char *bits; - register int size; -{ - register char *buf; - - tst_resm(TINFO, "\tBits array:"); - for(buf = bits; size > 0; --size, ++buf) { - if ((buf-bits) % 16 == 0) - tst_resm(TINFO, "\t%04x:\t", 8*(buf-bits)); - tst_resm(TINFO, "\t%02x ", (int)*buf & 0xff); - } - return 0; + ++misc_cnt[type]; + ++type; } -int orbits(hold, bits, count) - register char *hold; - register char *bits; - register int count; -{ - while(count-- > 0) - *hold++ |= *bits++; - return 0; -} - - /* term() * * This is called when a SIGTERM signal arrives. */ - -int term() +static void term(int sig LTP_ATTRIBUTE_UNUSED) { - register int i; + int i; tst_resm(TINFO, "\tterm -[%d]- got sig term.", getpid()); @@ -699,12 +585,11 @@ int term() * If run by hand we like to have the parent send the signal to * the child processes. This makes life easy. */ - if (parent_pid == getpid()) { for (i=0; i < nchild; i++) - if (pidlist[i]) /* avoid embarassment */ + if (pidlist[i]) kill(pidlist[i], SIGTERM); - return 0; + return; } tst_resm(TINFO, "\tunlinking '%s'", test_name); @@ -715,7 +600,6 @@ int term() test_name, errno); else tst_resm(TINFO, "Unlink of '%s' successful.", test_name); + tst_exit(); - return 0; } - Index: ltp/testcases/kernel/fs/ftest/ftest08.c =================================================================== --- ltp.orig/testcases/kernel/fs/ftest/ftest08.c +++ ltp/testcases/kernel/fs/ftest/ftest08.c @@ -1,6 +1,7 @@ /* * * Copyright (c) International Business Machines Corp., 2002 + * Copyright (c) Cyril Hrubis chrubis@suse.cz 2009 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -40,8 +41,8 @@ */ #define _XOPEN_SOURCE 500 -#define _LARGEFILE64_SOURCE 1 -#include /* needed by testhead.h */ +#define _LARGEFILE64_SOURCE 1 +#include #include #include #include @@ -50,146 +51,128 @@ #include #include #include -#include /* DEM - added SIGTERM support */ +#include #include #include "test.h" #include "usctest.h" +#include "libftest.h" char *TCID = "ftest08"; int TST_TOTAL = 1; -extern int Tst_count; #define PASSED 1 #define FAILED 0 -#define MAXCHILD 25 /* max number of children to allow */ +#define MAXCHILD 25 #define K_1 1024 #define K_2 2048 #define K_4 4096 #define MAXIOVCNT 16 -void init(); -int runtest(); -int dotest(int, int, int); -int domisc(int, int, char*); -int bfill(char*, char, int); -int dumpiov(struct iovec*); -int dumpbits(char*, int); -int term(); -void cleanup(void); - -int csize; /* chunk size */ -int iterations; /* # total iterations */ -off64_t max_size; /* max file size */ -int misc_intvl; /* for doing misc things; 0 ==> no */ -int nchild; /* number of child processes */ -int nwait; -int parent_pid; -int pidlist[MAXCHILD]; - -char filename[128]; -char *prog; - -int local_flag; - -/*--------------------------------------------------------------*/ -int main (ac, av) - int ac; - char *av[]; +static void init(void); +static void runtest(void); +static void dotest(int, int, int); +static void domisc(int, int); +static void term(int sig); +static void cleanup(void); + +static int csize; /* chunk size */ +static int iterations; /* # total iterations */ +static off64_t max_size; /* max file size */ +static int misc_intvl; /* for doing misc things; 0 ==> no */ +static int nchild; /* number of child processes */ +static int nwait; +static int parent_pid; +static int pidlist[MAXCHILD]; + +static char filename[128]; +static int local_flag; + +int main(int ac, char *av[]) { - int lc; /* loop counter */ - char *msg; /* message returned from parse_opts */ + int lc; + char *msg; /* * parse standard options */ - if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ + if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != NULL){ tst_resm(TBROK, "OPTION PARSING ERROR - %s", msg); tst_exit(); - /*NOTREACHED*/ } for (lc = 0; TEST_LOOPING(lc); lc++) { - local_flag = PASSED; - init(); - runtest(); - if (local_flag == PASSED) { - tst_resm(TPASS, "Test passed."); - } else { - tst_resm(TFAIL, "Test failed."); - } + if (local_flag == PASSED) + tst_resm(TPASS, "Test passed."); + else + tst_resm(TFAIL, "Test failed."); + } - } /* end for */ cleanup(); - return 0; + tst_exit(); } -void init() +static void init(void) { int fd; char wdbuf[MAXPATHLEN]; parent_pid = getpid(); tst_tmpdir(); + /* * Make a filename for the test. */ - if (!filename[0]) sprintf(filename, "%s/ftest08.%d", getcwd(wdbuf, MAXPATHLEN), getpid()); fd = open(filename, O_RDWR|O_CREAT|O_TRUNC, 0666); + if (fd < 0) { tst_resm(TBROK, "Error %d creating file %s", errno, filename); tst_exit(); } + close(fd); /* * Default values for run conditions. */ - iterations = 10; nchild = 5; csize = K_2; /* should run with 1, 2, and 4 K sizes */ max_size = K_1 * K_1; misc_intvl = 10; - if (sigset(SIGTERM, (void (*)())term) == SIG_ERR) { + if (sigset(SIGTERM, term) == SIG_ERR) { tst_resm(TBROK,"first sigset failed"); tst_exit(); } } -/*--------------------------------------------------------------*/ - - -int runtest() +static void runtest(void) { - register int i; - int child; - int status; - int count; - int fd; + int i, child, status, count, fd; + for (i = 0; i < nchild; i++) { - for(i = 0; i < nchild; i++) { - if ((child = fork()) == 0) { /* child */ + if ((child = fork()) == 0) { fd = open(filename, O_RDWR); if (fd < 0) { - tst_resm(TFAIL, "\tTest[%d]: error %d openning %s.", errno, filename); + tst_resm(TFAIL, "\tTest[%d]: error %d openning %s.", i, errno, filename); tst_exit(); } - dotest(nchild, i, fd); /* do it! */ + dotest(nchild, i, fd); close(fd); - tst_exit(); /* when done, exit */ + tst_exit(); } + if (child < 0) { tst_resm(TINFO, "System resource may be too low, fork() malloc()" " etc are likely to fail."); @@ -205,11 +188,9 @@ int runtest() /* * Wait for children to finish. */ - count = 0; - while((child = wait(&status)) != -1 || errno == EINTR) { - if (child > 0) - { + while ((child = wait(&status)) != -1 || errno == EINTR) { + if (child > 0) { //tst_resm(TINFO, "\tTest{%d} exited status = 0x%x", child, status); if (status) { tst_resm(TFAIL, "\tExpected 0 exit status - failed."); @@ -222,16 +203,13 @@ int runtest() /* * Should have collected all children. */ - if (count != nwait) { tst_resm(TFAIL, "\tWrong # children waited on, count = %d", count); local_flag = FAILED; } unlink(filename); - - sync(); /* safeness */ - return 0; + sync(); } /* @@ -241,12 +219,9 @@ int runtest() * Randomly read/mod/write chunks with known pattern and check. * When fill sectors, iterate. */ - #define NMISC 2 enum m_type { m_fsync, m_sync }; -char *m_str[] = { - "fsync", "sync" -}; +char *m_str[] = {"fsync", "sync"}; int misc_cnt[NMISC]; /* counts # of each kind of misc */ int misc_flag; @@ -255,52 +230,41 @@ int nchunks; #define CHUNK(i) ((((off64_t)i) * testers + me) * csize) #define NEXTMISC ((rand() % misc_intvl) + 5) -int dotest(testers, me, fd) - int testers; - int me; - int fd; +static void dotest(int testers, int me, int fd) { - register int i; - char *bits; - char *buf; - int count; - int collide; - char val; - char val0; - int chunk; - int whenmisc; - int xfr; + char *bits, *buf; + char val, val0; + int count, collide, chunk, whenmisc, xfr, i; /* Stuff for the readv call */ struct iovec r_iovec[MAXIOVCNT]; int r_ioveclen; /* Stuff for the writev call */ - struct iovec val0_iovec[MAXIOVCNT]; struct iovec val_iovec[MAXIOVCNT]; int w_ioveclen; nchunks = max_size / (testers * csize); - if( (bits = (char*)malloc((nchunks+7)/8)) == 0) { + + if ((bits = malloc((nchunks+7)/8)) == NULL) { tst_resm(TBROK, "\tmalloc failed(bits)"); tst_exit(); } - if( (buf = (char*)(malloc(csize))) == 0) { + + if ((buf = (malloc(csize))) == NULL) { tst_resm(TBROK, "\tmalloc failed(buf)"); tst_exit(); } - /*Allocate memory for the iovec buffers and init the iovec arrays - */ + /* Allocate memory for the iovec buffers and init the iovec arrays */ r_ioveclen = w_ioveclen = csize / MAXIOVCNT; - /* Please note that the above statement implies that csize - * be evenly divisible by MAXIOVCNT. - */ - + /* Please note that the above statement implies that csize + * be evenly divisible by MAXIOVCNT. + */ for (i = 0; i < MAXIOVCNT; i++) { - if( (r_iovec[i].iov_base = (char*)malloc(r_ioveclen)) == 0) { + if ((r_iovec[i].iov_base = malloc(r_ioveclen)) == NULL) { tst_resm(TBROK, "\tmalloc failed(iov_base)"); tst_exit(); } @@ -309,28 +273,30 @@ int dotest(testers, me, fd) /* Allocate unused memory areas between all the buffers to * make things more diffult for the OS. */ - - if(malloc((i+1)*8) == 0) { + if (malloc((i+1)*8) == NULL) { tst_resm(TBROK, "\tmalloc failed((i+1)*8)"); tst_exit(); } - if( (val0_iovec[i].iov_base = (char*)malloc(w_ioveclen)) == 0){ + + if ((val0_iovec[i].iov_base = malloc(w_ioveclen)) == NULL){ tst_resm(TBROK, "\tmalloc failed(val0_iovec)"); tst_exit(); } + val0_iovec[i].iov_len = w_ioveclen; - if(malloc((i+1)*8) == 0) { + if (malloc((i+1)*8) == NULL) { tst_resm(TBROK, "\tmalloc failed((i+1)*8)"); tst_exit(); } - if( (val_iovec[i].iov_base = (char*)malloc(w_ioveclen)) == 0){ + + if ((val_iovec[i].iov_base = malloc(w_ioveclen)) == NULL){ tst_resm(TBROK, "\tmalloc failed(iov_base)"); tst_exit(); } val_iovec[i].iov_len = w_ioveclen; - if(malloc((i+1)*8) == 0) { + if (malloc((i+1)*8) == NULL) { tst_resm(TBROK, "\tmalloc failed(((i+1)*8)"); tst_exit(); } @@ -339,7 +305,6 @@ int dotest(testers, me, fd) /* * No init sectors; file-sys makes 0 to start. */ - val = (64/testers) * me + 1; val0 = 0; @@ -357,28 +322,32 @@ int dotest(testers, me, fd) * repeat until count = nchunks. * ++val. */ - srand(getpid()); - if (misc_intvl) whenmisc = NEXTMISC; - while(iterations-- > 0) { - for(i = 0; i < NMISC; i++) + + if (misc_intvl) + whenmisc = NEXTMISC; + + while (iterations-- > 0) { + for (i = 0; i < NMISC; i++) misc_cnt[i] = 0; - bfill(bits, 0, (nchunks+7)/8); + memset(bits, 0, (nchunks+7)/8); /* Have to fill the val0 and val iov buffers in a different manner */ - for(i = 0; i < MAXIOVCNT; i++) { - bfill(val0_iovec[i].iov_base,val0,val0_iovec[i].iov_len); - bfill(val_iovec[i].iov_base,val,val_iovec[i].iov_len); + for (i = 0; i < MAXIOVCNT; i++) { + memset(val0_iovec[i].iov_base,val0,val0_iovec[i].iov_len); + memset(val_iovec[i].iov_base,val,val_iovec[i].iov_len); } + count = 0; collide = 0; - while(count < nchunks) { + + while (count < nchunks) { chunk = rand() % nchunks; /* * Read it. */ - if (lseek64(fd, CHUNK(chunk), 0) < (off64_t)0) { + if (lseek64(fd, CHUNK(chunk), 0) < 0) { tst_resm(TFAIL, "\tTest[%d]: lseek64(0) fail at %Lx, errno = %d.", me, CHUNK(chunk), errno); tst_exit(); @@ -401,12 +370,12 @@ int dotest(testers, me, fd) me, xfr, csize); tst_exit(); } - for(i = 0; i < MAXIOVCNT; i++) { + for (i = 0; i < MAXIOVCNT; i++) { if (memcmp(r_iovec[i].iov_base, val0_iovec[i].iov_base, r_iovec[i].iov_len)) { tst_resm(TFAIL, "\tTest[%d] bad verify @ 0x%Lx for val %d count %d xfr %d.", me, CHUNK(chunk), val0, count, xfr); - dumpiov(&r_iovec[i]); - dumpbits(bits, (nchunks+7)/8); + ft_dumpiov(&r_iovec[i]); + ft_dumpbits(bits, (nchunks+7)/8); tst_exit(); } } @@ -419,12 +388,12 @@ int dotest(testers, me, fd) tst_exit(); } ++collide; - for(i = 0; i < MAXIOVCNT; i++) { + for (i = 0; i < MAXIOVCNT; i++) { if (memcmp(r_iovec[i].iov_base, val_iovec[i].iov_base, r_iovec[i].iov_len)) { tst_resm(TFAIL, "\tTest[%d] bad verify @ 0x%Lx for val %d count %d xfr %d.", me, CHUNK(chunk), val, count, xfr); - dumpiov(&r_iovec[i]); - dumpbits(bits, (nchunks+7)/8); + ft_dumpiov(&r_iovec[i]); + ft_dumpbits(bits, (nchunks+7)/8); tst_exit(); } } @@ -432,7 +401,7 @@ int dotest(testers, me, fd) /* * Write it. */ - if (lseek64(fd, -((off64_t)xfr), 1) < (off64_t)0) { + if (lseek64(fd, -xfr, 1) < 0) { tst_resm(TFAIL, "\tTest[%d]: lseek64(1) fail at %Lx, errno = %d.", me, CHUNK(chunk), errno); tst_exit(); @@ -451,7 +420,7 @@ int dotest(testers, me, fd) * If hit "misc" interval, do it. */ if (misc_intvl && --whenmisc <= 0) { - domisc(me, fd, bits); + domisc(me, fd); whenmisc = NEXTMISC; } if (count + collide > 2 * nchunks) @@ -482,27 +451,22 @@ int dotest(testers, me, fd) } fsync(fd); - ++misc_cnt[(int)m_fsync]; + ++misc_cnt[m_fsync]; //tst_resm(TINFO, "\tTest[%d] val %d done, count = %d, collide = %d.", // me, val, count, collide); //for(i = 0; i < NMISC; i++) // tst_resm(TINFO, "\t\tTest[%d]: %d %s's.", me, misc_cnt[i], m_str[i]); val0 = val++; } - return 0; } /* * domisc() * Inject misc syscalls into the thing. */ - -int domisc(me, fd, bits) - int me; - int fd; - char *bits; +static void domisc(int me, int fd) { - enum m_type type; + enum m_type type; if (misc_flag) { type = m_fsync; @@ -511,115 +475,39 @@ int domisc(me, fd, bits) type = m_sync;; misc_flag = 1; } + switch(type) { - case m_fsync: - if (fsync(fd) < 0) { - tst_resm(TFAIL, "\tTest[%d]: fsync error %d.", me, errno); - tst_exit(); - } + case m_fsync: + if (fsync(fd) < 0) { + tst_resm(TFAIL, "\tTest[%d]: fsync error %d.", me, errno); + tst_exit(); + } break; - case m_sync: - sync(); + case m_sync: + sync(); break; } - ++misc_cnt[(int)type]; - return 0; -} -int bfill(buf, val, size) - register char *buf; - char val; - register int size; -{ - register int i; - - for(i = 0; i < size; i++) - buf[i] = val; - return 0; + ++misc_cnt[type]; } -/* - * dumpiov - * Dump the contents of the r_iovec buffer. - */ - -int dumpiov(iovptr) - register struct iovec *iovptr; -{ - register int i; - char val; - int idx; - int nout; - - tst_resm(TINFO, "\tBuf:"); - nout = 0; - idx = 0; - val = ((char *)iovptr->iov_base)[0]; - for(i = 0; i < iovptr->iov_len; i++) { - if (((char *)iovptr->iov_base)[i] != val) { - if (i == idx+1) - tst_resm(TINFO, "\t%x, ", ((char *)iovptr->iov_base)[idx] & 0xff); - else - tst_resm(TINFO, "\t%d*%x, ", i-idx, ((char *)iovptr->iov_base)[idx] & 0xff); - idx = i; - ++nout; - } - if (nout > 10) { - tst_resm(TINFO, "\t ... more"); - return 0; - } - } - if (i == idx+1) - tst_resm(TINFO, "\t%x", ((char *)iovptr->iov_base)[idx] & 0xff); - else - tst_resm(TINFO, "\t%d*%x", i-idx, ((char *)iovptr->iov_base)[idx]); - return 0; -} - - -/* - * dumpbits - * Dump the bit-map. - */ - -int dumpbits(bits, size) - char *bits; - register int size; -{ - register char *buf; - - tst_resm(TINFO, "\tBits array:"); - for(buf = bits; size > 0; --size, ++buf) { - if ((buf-bits) % 16 == 0) - tst_resm(TINFO, "\t%04x:\t", 8*(buf-bits)); - tst_resm(TINFO, "%02x ", (int)*buf & 0xff); - } - printf("\n"); - return 0; -} - -/*--------------------------------------------------------------*/ - - -int term() +static void term(int sig LTP_ATTRIBUTE_UNUSED) { - register int i; + int i; tst_resm(TINFO, "\tterm -[%d]- got sig term.", getpid()); if (parent_pid == getpid()) { for (i=0; i < nchild; i++) - if (pidlist[i]) /* avoid embarassment */ + if (pidlist[i]) kill(pidlist[i], SIGTERM); - return 0; + return; } tst_exit(); - return 0; } -void -cleanup() +void cleanup(void) { /* * print timing stats if that option was specified. @@ -628,6 +516,5 @@ cleanup() TEST_CLEANUP; tst_rmdir(); - tst_exit(); } --W/nzBZO5zC0uMSeA Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ------------------------------------------------------------------------------ Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day trial. Simplify your report design, integration and deployment - and focus on what you do best, core application coding. Discover what's new with Crystal Reports now. http://p.sf.net/sfu/bobj-july --W/nzBZO5zC0uMSeA Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Ltp-list mailing list Ltp-list@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/ltp-list --W/nzBZO5zC0uMSeA--