1*49cdfc7eSAndroid Build Coastguard Worker /*
2*49cdfc7eSAndroid Build Coastguard Worker *
3*49cdfc7eSAndroid Build Coastguard Worker * Copyright (c) International Business Machines Corp., 2002
4*49cdfc7eSAndroid Build Coastguard Worker * Copyright (c) Cyril Hrubis [email protected] 2009
5*49cdfc7eSAndroid Build Coastguard Worker *
6*49cdfc7eSAndroid Build Coastguard Worker * This program is free software; you can redistribute it and/or modify
7*49cdfc7eSAndroid Build Coastguard Worker * it under the terms of the GNU General Public License as published by
8*49cdfc7eSAndroid Build Coastguard Worker * the Free Software Foundation; either version 2 of the License, or
9*49cdfc7eSAndroid Build Coastguard Worker * (at your option) any later version.
10*49cdfc7eSAndroid Build Coastguard Worker *
11*49cdfc7eSAndroid Build Coastguard Worker * This program is distributed in the hope that it will be useful,
12*49cdfc7eSAndroid Build Coastguard Worker * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*49cdfc7eSAndroid Build Coastguard Worker * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
14*49cdfc7eSAndroid Build Coastguard Worker * the GNU General Public License for more details.
15*49cdfc7eSAndroid Build Coastguard Worker *
16*49cdfc7eSAndroid Build Coastguard Worker * You should have received a copy of the GNU General Public License
17*49cdfc7eSAndroid Build Coastguard Worker * along with this program; if not, write to the Free Software
18*49cdfc7eSAndroid Build Coastguard Worker * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19*49cdfc7eSAndroid Build Coastguard Worker */
20*49cdfc7eSAndroid Build Coastguard Worker
21*49cdfc7eSAndroid Build Coastguard Worker /*
22*49cdfc7eSAndroid Build Coastguard Worker * NAME
23*49cdfc7eSAndroid Build Coastguard Worker * ftest06.c -- test inode things (ported from SPIE section2/filesuite/ftest7.c, by Airong Zhang)
24*49cdfc7eSAndroid Build Coastguard Worker *
25*49cdfc7eSAndroid Build Coastguard Worker * this is the same as ftest2, except that it uses lseek64
26*49cdfc7eSAndroid Build Coastguard Worker *
27*49cdfc7eSAndroid Build Coastguard Worker * CALLS
28*49cdfc7eSAndroid Build Coastguard Worker * open, close, read, write, lseek64,
29*49cdfc7eSAndroid Build Coastguard Worker * unlink, chdir
30*49cdfc7eSAndroid Build Coastguard Worker *
31*49cdfc7eSAndroid Build Coastguard Worker *
32*49cdfc7eSAndroid Build Coastguard Worker * ALGORITHM
33*49cdfc7eSAndroid Build Coastguard Worker *
34*49cdfc7eSAndroid Build Coastguard Worker * This was tino.c by rbk. Moved to test suites by dale.
35*49cdfc7eSAndroid Build Coastguard Worker *
36*49cdfc7eSAndroid Build Coastguard Worker * ftest06 [-f tmpdirname] nchild iterations [partition]
37*49cdfc7eSAndroid Build Coastguard Worker *
38*49cdfc7eSAndroid Build Coastguard Worker * This forks some child processes, they do some random operations
39*49cdfc7eSAndroid Build Coastguard Worker * which use lots of directory operations.
40*49cdfc7eSAndroid Build Coastguard Worker *
41*49cdfc7eSAndroid Build Coastguard Worker * RESTRICTIONS
42*49cdfc7eSAndroid Build Coastguard Worker * Runs a long time with default args - can take others on input
43*49cdfc7eSAndroid Build Coastguard Worker * line. Use with "term mode".
44*49cdfc7eSAndroid Build Coastguard Worker * If run on vax the ftruncate will not be random - will always go to
45*49cdfc7eSAndroid Build Coastguard Worker * start of file. NOTE: produces a very high load average!!
46*49cdfc7eSAndroid Build Coastguard Worker *
47*49cdfc7eSAndroid Build Coastguard Worker */
48*49cdfc7eSAndroid Build Coastguard Worker
49*49cdfc7eSAndroid Build Coastguard Worker #define _LARGEFILE64_SOURCE 1
50*49cdfc7eSAndroid Build Coastguard Worker #include <stdio.h>
51*49cdfc7eSAndroid Build Coastguard Worker #include <sys/types.h>
52*49cdfc7eSAndroid Build Coastguard Worker #include <sys/param.h>
53*49cdfc7eSAndroid Build Coastguard Worker #include <fcntl.h>
54*49cdfc7eSAndroid Build Coastguard Worker #include <sys/stat.h>
55*49cdfc7eSAndroid Build Coastguard Worker #include <sys/mount.h>
56*49cdfc7eSAndroid Build Coastguard Worker #include <sys/wait.h>
57*49cdfc7eSAndroid Build Coastguard Worker #include <errno.h>
58*49cdfc7eSAndroid Build Coastguard Worker #include <signal.h>
59*49cdfc7eSAndroid Build Coastguard Worker #include <unistd.h>
60*49cdfc7eSAndroid Build Coastguard Worker #include "test.h"
61*49cdfc7eSAndroid Build Coastguard Worker #include "libftest.h"
62*49cdfc7eSAndroid Build Coastguard Worker
63*49cdfc7eSAndroid Build Coastguard Worker char *TCID = "ftest06";
64*49cdfc7eSAndroid Build Coastguard Worker int TST_TOTAL = 1;
65*49cdfc7eSAndroid Build Coastguard Worker
66*49cdfc7eSAndroid Build Coastguard Worker #define PASSED 1
67*49cdfc7eSAndroid Build Coastguard Worker #define FAILED 0
68*49cdfc7eSAndroid Build Coastguard Worker
69*49cdfc7eSAndroid Build Coastguard Worker static void crfile(int, int);
70*49cdfc7eSAndroid Build Coastguard Worker static void unlfile(int, int);
71*49cdfc7eSAndroid Build Coastguard Worker static void fussdir(int, int);
72*49cdfc7eSAndroid Build Coastguard Worker static void dotest(int, int);
73*49cdfc7eSAndroid Build Coastguard Worker static void dowarn(int, char *, char *);
74*49cdfc7eSAndroid Build Coastguard Worker static void term(int sig);
75*49cdfc7eSAndroid Build Coastguard Worker static void cleanup(void);
76*49cdfc7eSAndroid Build Coastguard Worker
77*49cdfc7eSAndroid Build Coastguard Worker #define MAXCHILD 25
78*49cdfc7eSAndroid Build Coastguard Worker #define K_1 1024
79*49cdfc7eSAndroid Build Coastguard Worker #define K_2 2048
80*49cdfc7eSAndroid Build Coastguard Worker #define K_4 4096
81*49cdfc7eSAndroid Build Coastguard Worker
82*49cdfc7eSAndroid Build Coastguard Worker static int local_flag;
83*49cdfc7eSAndroid Build Coastguard Worker
84*49cdfc7eSAndroid Build Coastguard Worker #define M (1024*1024)
85*49cdfc7eSAndroid Build Coastguard Worker
86*49cdfc7eSAndroid Build Coastguard Worker static int iterations;
87*49cdfc7eSAndroid Build Coastguard Worker static int nchild;
88*49cdfc7eSAndroid Build Coastguard Worker static int parent_pid;
89*49cdfc7eSAndroid Build Coastguard Worker static int pidlist[MAXCHILD];
90*49cdfc7eSAndroid Build Coastguard Worker
91*49cdfc7eSAndroid Build Coastguard Worker static char homedir[MAXPATHLEN];
92*49cdfc7eSAndroid Build Coastguard Worker static char dirname[MAXPATHLEN];
93*49cdfc7eSAndroid Build Coastguard Worker static int dirlen;
94*49cdfc7eSAndroid Build Coastguard Worker static int mnt = 0;
95*49cdfc7eSAndroid Build Coastguard Worker static char startdir[MAXPATHLEN], mntpoint[MAXPATHLEN];
96*49cdfc7eSAndroid Build Coastguard Worker static char *partition;
97*49cdfc7eSAndroid Build Coastguard Worker static char *cwd;
98*49cdfc7eSAndroid Build Coastguard Worker static char *fstyp;
99*49cdfc7eSAndroid Build Coastguard Worker
main(int ac,char * av[])100*49cdfc7eSAndroid Build Coastguard Worker int main(int ac, char *av[])
101*49cdfc7eSAndroid Build Coastguard Worker {
102*49cdfc7eSAndroid Build Coastguard Worker int pid, child, status, count, k, j;
103*49cdfc7eSAndroid Build Coastguard Worker char name[MAXPATHLEN];
104*49cdfc7eSAndroid Build Coastguard Worker
105*49cdfc7eSAndroid Build Coastguard Worker int lc;
106*49cdfc7eSAndroid Build Coastguard Worker
107*49cdfc7eSAndroid Build Coastguard Worker /*
108*49cdfc7eSAndroid Build Coastguard Worker * parse standard options
109*49cdfc7eSAndroid Build Coastguard Worker */
110*49cdfc7eSAndroid Build Coastguard Worker tst_parse_opts(ac, av, NULL, NULL);
111*49cdfc7eSAndroid Build Coastguard Worker
112*49cdfc7eSAndroid Build Coastguard Worker /*
113*49cdfc7eSAndroid Build Coastguard Worker * Default values for run conditions.
114*49cdfc7eSAndroid Build Coastguard Worker */
115*49cdfc7eSAndroid Build Coastguard Worker iterations = 50;
116*49cdfc7eSAndroid Build Coastguard Worker nchild = 5;
117*49cdfc7eSAndroid Build Coastguard Worker
118*49cdfc7eSAndroid Build Coastguard Worker if (signal(SIGTERM, term) == SIG_ERR) {
119*49cdfc7eSAndroid Build Coastguard Worker tst_resm(TBROK, "first signal failed");
120*49cdfc7eSAndroid Build Coastguard Worker
121*49cdfc7eSAndroid Build Coastguard Worker }
122*49cdfc7eSAndroid Build Coastguard Worker
123*49cdfc7eSAndroid Build Coastguard Worker /* use the default values for run conditions */
124*49cdfc7eSAndroid Build Coastguard Worker for (lc = 0; TEST_LOOPING(lc); lc++) {
125*49cdfc7eSAndroid Build Coastguard Worker
126*49cdfc7eSAndroid Build Coastguard Worker local_flag = PASSED;
127*49cdfc7eSAndroid Build Coastguard Worker /*
128*49cdfc7eSAndroid Build Coastguard Worker * Make a directory to do this in; ignore error if already exists.
129*49cdfc7eSAndroid Build Coastguard Worker */
130*49cdfc7eSAndroid Build Coastguard Worker parent_pid = getpid();
131*49cdfc7eSAndroid Build Coastguard Worker tst_tmpdir();
132*49cdfc7eSAndroid Build Coastguard Worker
133*49cdfc7eSAndroid Build Coastguard Worker if (!startdir[0]) {
134*49cdfc7eSAndroid Build Coastguard Worker if (getcwd(startdir, MAXPATHLEN) == NULL) {
135*49cdfc7eSAndroid Build Coastguard Worker tst_brkm(TFAIL | TERRNO, NULL, "getcwd failed");
136*49cdfc7eSAndroid Build Coastguard Worker }
137*49cdfc7eSAndroid Build Coastguard Worker }
138*49cdfc7eSAndroid Build Coastguard Worker cwd = startdir;
139*49cdfc7eSAndroid Build Coastguard Worker
140*49cdfc7eSAndroid Build Coastguard Worker snprintf(dirname, ARRAY_SIZE(dirname),
141*49cdfc7eSAndroid Build Coastguard Worker "%s/ftest06.%d", cwd, getpid());
142*49cdfc7eSAndroid Build Coastguard Worker snprintf(homedir, ARRAY_SIZE(homedir),
143*49cdfc7eSAndroid Build Coastguard Worker "%s/ftest06h.%d", cwd, getpid());
144*49cdfc7eSAndroid Build Coastguard Worker
145*49cdfc7eSAndroid Build Coastguard Worker mkdir(dirname, 0755);
146*49cdfc7eSAndroid Build Coastguard Worker mkdir(homedir, 0755);
147*49cdfc7eSAndroid Build Coastguard Worker
148*49cdfc7eSAndroid Build Coastguard Worker if (chdir(dirname) < 0)
149*49cdfc7eSAndroid Build Coastguard Worker tst_brkm(TFAIL | TERRNO, cleanup, "\tCan't chdir(%s)",
150*49cdfc7eSAndroid Build Coastguard Worker dirname);
151*49cdfc7eSAndroid Build Coastguard Worker
152*49cdfc7eSAndroid Build Coastguard Worker dirlen = strlen(dirname);
153*49cdfc7eSAndroid Build Coastguard Worker
154*49cdfc7eSAndroid Build Coastguard Worker if (chdir(homedir) < 0)
155*49cdfc7eSAndroid Build Coastguard Worker tst_brkm(TFAIL | TERRNO, cleanup, "\tCan't chdir(%s)",
156*49cdfc7eSAndroid Build Coastguard Worker homedir);
157*49cdfc7eSAndroid Build Coastguard Worker
158*49cdfc7eSAndroid Build Coastguard Worker /* enter block */
159*49cdfc7eSAndroid Build Coastguard Worker for (k = 0; k < nchild; k++) {
160*49cdfc7eSAndroid Build Coastguard Worker if ((child = fork()) == 0) {
161*49cdfc7eSAndroid Build Coastguard Worker dotest(k, iterations);
162*49cdfc7eSAndroid Build Coastguard Worker tst_exit();
163*49cdfc7eSAndroid Build Coastguard Worker }
164*49cdfc7eSAndroid Build Coastguard Worker if (child < 0) {
165*49cdfc7eSAndroid Build Coastguard Worker tst_brkm(TBROK | TERRNO, cleanup,
166*49cdfc7eSAndroid Build Coastguard Worker "fork failed");
167*49cdfc7eSAndroid Build Coastguard Worker }
168*49cdfc7eSAndroid Build Coastguard Worker pidlist[k] = child;
169*49cdfc7eSAndroid Build Coastguard Worker }
170*49cdfc7eSAndroid Build Coastguard Worker
171*49cdfc7eSAndroid Build Coastguard Worker /*
172*49cdfc7eSAndroid Build Coastguard Worker * Wait for children to finish.
173*49cdfc7eSAndroid Build Coastguard Worker */
174*49cdfc7eSAndroid Build Coastguard Worker count = 0;
175*49cdfc7eSAndroid Build Coastguard Worker while ((child = wait(&status)) > 0) {
176*49cdfc7eSAndroid Build Coastguard Worker //tst_resm(TINFO,"Test{%d} exited status = 0x%x", child, status);
177*49cdfc7eSAndroid Build Coastguard Worker //fprintf(stdout, "status is %d",status);
178*49cdfc7eSAndroid Build Coastguard Worker if (status) {
179*49cdfc7eSAndroid Build Coastguard Worker tst_resm(TFAIL,
180*49cdfc7eSAndroid Build Coastguard Worker "Test{%d} failed, expected 0 exit.",
181*49cdfc7eSAndroid Build Coastguard Worker child);
182*49cdfc7eSAndroid Build Coastguard Worker local_flag = FAILED;
183*49cdfc7eSAndroid Build Coastguard Worker }
184*49cdfc7eSAndroid Build Coastguard Worker ++count;
185*49cdfc7eSAndroid Build Coastguard Worker }
186*49cdfc7eSAndroid Build Coastguard Worker
187*49cdfc7eSAndroid Build Coastguard Worker /*
188*49cdfc7eSAndroid Build Coastguard Worker * Should have collected all children.
189*49cdfc7eSAndroid Build Coastguard Worker */
190*49cdfc7eSAndroid Build Coastguard Worker if (count != nchild) {
191*49cdfc7eSAndroid Build Coastguard Worker tst_resm(TFAIL,
192*49cdfc7eSAndroid Build Coastguard Worker "Wrong # children waited on, count = %d",
193*49cdfc7eSAndroid Build Coastguard Worker count);
194*49cdfc7eSAndroid Build Coastguard Worker local_flag = FAILED;
195*49cdfc7eSAndroid Build Coastguard Worker }
196*49cdfc7eSAndroid Build Coastguard Worker
197*49cdfc7eSAndroid Build Coastguard Worker if (local_flag == PASSED)
198*49cdfc7eSAndroid Build Coastguard Worker tst_resm(TPASS, "Test passed.");
199*49cdfc7eSAndroid Build Coastguard Worker else
200*49cdfc7eSAndroid Build Coastguard Worker tst_resm(TFAIL, "Test failed.");
201*49cdfc7eSAndroid Build Coastguard Worker
202*49cdfc7eSAndroid Build Coastguard Worker if (iterations > 26)
203*49cdfc7eSAndroid Build Coastguard Worker iterations = 26;
204*49cdfc7eSAndroid Build Coastguard Worker
205*49cdfc7eSAndroid Build Coastguard Worker for (k = 0; k < nchild; k++)
206*49cdfc7eSAndroid Build Coastguard Worker for (j = 0; j < iterations + 1; j++) {
207*49cdfc7eSAndroid Build Coastguard Worker ft_mkname(name, dirname, k, j);
208*49cdfc7eSAndroid Build Coastguard Worker rmdir(name);
209*49cdfc7eSAndroid Build Coastguard Worker unlink(name);
210*49cdfc7eSAndroid Build Coastguard Worker }
211*49cdfc7eSAndroid Build Coastguard Worker
212*49cdfc7eSAndroid Build Coastguard Worker if (chdir(startdir) < 0)
213*49cdfc7eSAndroid Build Coastguard Worker tst_brkm(TFAIL | TERRNO, cleanup, "Can't chdir(%s)",
214*49cdfc7eSAndroid Build Coastguard Worker startdir);
215*49cdfc7eSAndroid Build Coastguard Worker
216*49cdfc7eSAndroid Build Coastguard Worker pid = fork();
217*49cdfc7eSAndroid Build Coastguard Worker if (pid < 0) {
218*49cdfc7eSAndroid Build Coastguard Worker tst_brkm(TBROK | TERRNO, NULL, "fork failed");
219*49cdfc7eSAndroid Build Coastguard Worker }
220*49cdfc7eSAndroid Build Coastguard Worker
221*49cdfc7eSAndroid Build Coastguard Worker if (pid == 0) {
222*49cdfc7eSAndroid Build Coastguard Worker execl("/bin/rm", "rm", "-rf", homedir, NULL);
223*49cdfc7eSAndroid Build Coastguard Worker
224*49cdfc7eSAndroid Build Coastguard Worker } else
225*49cdfc7eSAndroid Build Coastguard Worker wait(&status);
226*49cdfc7eSAndroid Build Coastguard Worker
227*49cdfc7eSAndroid Build Coastguard Worker if (status)
228*49cdfc7eSAndroid Build Coastguard Worker tst_resm(TINFO,
229*49cdfc7eSAndroid Build Coastguard Worker "CAUTION - ftest06, '%s' may not have been removed.",
230*49cdfc7eSAndroid Build Coastguard Worker homedir);
231*49cdfc7eSAndroid Build Coastguard Worker
232*49cdfc7eSAndroid Build Coastguard Worker pid = fork();
233*49cdfc7eSAndroid Build Coastguard Worker if (pid < 0) {
234*49cdfc7eSAndroid Build Coastguard Worker tst_brkm(TBROK | TERRNO, NULL, "fork failed");
235*49cdfc7eSAndroid Build Coastguard Worker }
236*49cdfc7eSAndroid Build Coastguard Worker if (pid == 0) {
237*49cdfc7eSAndroid Build Coastguard Worker execl("/bin/rm", "rm", "-rf", dirname, NULL);
238*49cdfc7eSAndroid Build Coastguard Worker exit(1);
239*49cdfc7eSAndroid Build Coastguard Worker } else
240*49cdfc7eSAndroid Build Coastguard Worker wait(&status);
241*49cdfc7eSAndroid Build Coastguard Worker if (status) {
242*49cdfc7eSAndroid Build Coastguard Worker tst_resm(TWARN,
243*49cdfc7eSAndroid Build Coastguard Worker "CAUTION - ftest06, '%s' may not have been removed.",
244*49cdfc7eSAndroid Build Coastguard Worker dirname);
245*49cdfc7eSAndroid Build Coastguard Worker }
246*49cdfc7eSAndroid Build Coastguard Worker
247*49cdfc7eSAndroid Build Coastguard Worker sync();
248*49cdfc7eSAndroid Build Coastguard Worker
249*49cdfc7eSAndroid Build Coastguard Worker }
250*49cdfc7eSAndroid Build Coastguard Worker
251*49cdfc7eSAndroid Build Coastguard Worker if (local_flag == FAILED)
252*49cdfc7eSAndroid Build Coastguard Worker tst_resm(TFAIL, "Test failed.");
253*49cdfc7eSAndroid Build Coastguard Worker else
254*49cdfc7eSAndroid Build Coastguard Worker tst_resm(TPASS, "Test passed.");
255*49cdfc7eSAndroid Build Coastguard Worker
256*49cdfc7eSAndroid Build Coastguard Worker cleanup();
257*49cdfc7eSAndroid Build Coastguard Worker tst_exit();
258*49cdfc7eSAndroid Build Coastguard Worker }
259*49cdfc7eSAndroid Build Coastguard Worker
260*49cdfc7eSAndroid Build Coastguard Worker #define warn(val,m1,m2) if ((val) < 0) dowarn(me,m1,m2)
261*49cdfc7eSAndroid Build Coastguard Worker
262*49cdfc7eSAndroid Build Coastguard Worker /*
263*49cdfc7eSAndroid Build Coastguard Worker * crfile()
264*49cdfc7eSAndroid Build Coastguard Worker * Create a file and write something into it.
265*49cdfc7eSAndroid Build Coastguard Worker */
266*49cdfc7eSAndroid Build Coastguard Worker static char crmsg[] = "Gee, let's write something in the file!\n";
267*49cdfc7eSAndroid Build Coastguard Worker
crfile(int me,int count)268*49cdfc7eSAndroid Build Coastguard Worker static void crfile(int me, int count)
269*49cdfc7eSAndroid Build Coastguard Worker {
270*49cdfc7eSAndroid Build Coastguard Worker int fd;
271*49cdfc7eSAndroid Build Coastguard Worker off64_t seekval;
272*49cdfc7eSAndroid Build Coastguard Worker int val;
273*49cdfc7eSAndroid Build Coastguard Worker char fname[MAXPATHLEN];
274*49cdfc7eSAndroid Build Coastguard Worker char buf[MAXPATHLEN];
275*49cdfc7eSAndroid Build Coastguard Worker
276*49cdfc7eSAndroid Build Coastguard Worker ft_mkname(fname, dirname, me, count);
277*49cdfc7eSAndroid Build Coastguard Worker
278*49cdfc7eSAndroid Build Coastguard Worker fd = open(fname, O_RDWR | O_CREAT | O_TRUNC, 0666);
279*49cdfc7eSAndroid Build Coastguard Worker if (fd < 0 && errno == EISDIR) {
280*49cdfc7eSAndroid Build Coastguard Worker val = rmdir(fname);
281*49cdfc7eSAndroid Build Coastguard Worker warn(val, "rmdir", fname);
282*49cdfc7eSAndroid Build Coastguard Worker fd = open(fname, O_RDWR | O_CREAT | O_TRUNC, 0666);
283*49cdfc7eSAndroid Build Coastguard Worker }
284*49cdfc7eSAndroid Build Coastguard Worker warn(fd, "creating", fname);
285*49cdfc7eSAndroid Build Coastguard Worker
286*49cdfc7eSAndroid Build Coastguard Worker seekval = lseek64(fd, (off64_t) (rand() % M), 0);
287*49cdfc7eSAndroid Build Coastguard Worker warn(seekval, "lseek64", 0);
288*49cdfc7eSAndroid Build Coastguard Worker
289*49cdfc7eSAndroid Build Coastguard Worker val = write(fd, crmsg, sizeof(crmsg) - 1);
290*49cdfc7eSAndroid Build Coastguard Worker warn(val, "write", 0);
291*49cdfc7eSAndroid Build Coastguard Worker
292*49cdfc7eSAndroid Build Coastguard Worker seekval = lseek(fd, -((off64_t) sizeof(crmsg) - 1), 1);
293*49cdfc7eSAndroid Build Coastguard Worker warn(seekval, "lseek64", 0);
294*49cdfc7eSAndroid Build Coastguard Worker
295*49cdfc7eSAndroid Build Coastguard Worker val = read(fd, buf, sizeof(crmsg) - 1);
296*49cdfc7eSAndroid Build Coastguard Worker warn(val, "read", 0);
297*49cdfc7eSAndroid Build Coastguard Worker
298*49cdfc7eSAndroid Build Coastguard Worker if (strncmp(crmsg, buf, sizeof(crmsg) - 1))
299*49cdfc7eSAndroid Build Coastguard Worker dowarn(me, "compare", 0);
300*49cdfc7eSAndroid Build Coastguard Worker
301*49cdfc7eSAndroid Build Coastguard Worker val = close(fd);
302*49cdfc7eSAndroid Build Coastguard Worker warn(val, "close", 0);
303*49cdfc7eSAndroid Build Coastguard Worker }
304*49cdfc7eSAndroid Build Coastguard Worker
305*49cdfc7eSAndroid Build Coastguard Worker /*
306*49cdfc7eSAndroid Build Coastguard Worker * unlfile()
307*49cdfc7eSAndroid Build Coastguard Worker * Unlink some of the files.
308*49cdfc7eSAndroid Build Coastguard Worker */
unlfile(int me,int count)309*49cdfc7eSAndroid Build Coastguard Worker static void unlfile(int me, int count)
310*49cdfc7eSAndroid Build Coastguard Worker {
311*49cdfc7eSAndroid Build Coastguard Worker int val, i;
312*49cdfc7eSAndroid Build Coastguard Worker char fname[MAXPATHLEN];
313*49cdfc7eSAndroid Build Coastguard Worker
314*49cdfc7eSAndroid Build Coastguard Worker i = count - 10;
315*49cdfc7eSAndroid Build Coastguard Worker if (i < 0)
316*49cdfc7eSAndroid Build Coastguard Worker i = 0;
317*49cdfc7eSAndroid Build Coastguard Worker for (; i < count; i++) {
318*49cdfc7eSAndroid Build Coastguard Worker ft_mkname(fname, dirname, me, i);
319*49cdfc7eSAndroid Build Coastguard Worker val = rmdir(fname);
320*49cdfc7eSAndroid Build Coastguard Worker if (val < 0)
321*49cdfc7eSAndroid Build Coastguard Worker val = unlink(fname);
322*49cdfc7eSAndroid Build Coastguard Worker if (val == 0 || errno == ENOENT)
323*49cdfc7eSAndroid Build Coastguard Worker continue;
324*49cdfc7eSAndroid Build Coastguard Worker dowarn(me, "unlink", fname);
325*49cdfc7eSAndroid Build Coastguard Worker }
326*49cdfc7eSAndroid Build Coastguard Worker }
327*49cdfc7eSAndroid Build Coastguard Worker
328*49cdfc7eSAndroid Build Coastguard Worker /*
329*49cdfc7eSAndroid Build Coastguard Worker * fussdir()
330*49cdfc7eSAndroid Build Coastguard Worker * Make a directory, put stuff in it, remove it, and remove directory.
331*49cdfc7eSAndroid Build Coastguard Worker *
332*49cdfc7eSAndroid Build Coastguard Worker * Randomly leave the directory there.
333*49cdfc7eSAndroid Build Coastguard Worker */
fussdir(int me,int count)334*49cdfc7eSAndroid Build Coastguard Worker static void fussdir(int me, int count)
335*49cdfc7eSAndroid Build Coastguard Worker {
336*49cdfc7eSAndroid Build Coastguard Worker int val;
337*49cdfc7eSAndroid Build Coastguard Worker char dir[MAXPATHLEN], fname[MAXPATHLEN], savedir[MAXPATHLEN];
338*49cdfc7eSAndroid Build Coastguard Worker
339*49cdfc7eSAndroid Build Coastguard Worker ft_mkname(dir, dirname, me, count);
340*49cdfc7eSAndroid Build Coastguard Worker rmdir(dir);
341*49cdfc7eSAndroid Build Coastguard Worker unlink(dir);
342*49cdfc7eSAndroid Build Coastguard Worker
343*49cdfc7eSAndroid Build Coastguard Worker val = mkdir(dir, 0755);
344*49cdfc7eSAndroid Build Coastguard Worker warn(val, "mkdir", dir);
345*49cdfc7eSAndroid Build Coastguard Worker
346*49cdfc7eSAndroid Build Coastguard Worker /*
347*49cdfc7eSAndroid Build Coastguard Worker * Arrange to create files in the directory.
348*49cdfc7eSAndroid Build Coastguard Worker */
349*49cdfc7eSAndroid Build Coastguard Worker strcpy(savedir, dirname);
350*49cdfc7eSAndroid Build Coastguard Worker strcpy(dirname, "");
351*49cdfc7eSAndroid Build Coastguard Worker
352*49cdfc7eSAndroid Build Coastguard Worker val = chdir(dir);
353*49cdfc7eSAndroid Build Coastguard Worker warn(val, "chdir", dir);
354*49cdfc7eSAndroid Build Coastguard Worker
355*49cdfc7eSAndroid Build Coastguard Worker crfile(me, count);
356*49cdfc7eSAndroid Build Coastguard Worker crfile(me, count + 1);
357*49cdfc7eSAndroid Build Coastguard Worker
358*49cdfc7eSAndroid Build Coastguard Worker val = chdir("..");
359*49cdfc7eSAndroid Build Coastguard Worker warn(val, "chdir", "..");
360*49cdfc7eSAndroid Build Coastguard Worker
361*49cdfc7eSAndroid Build Coastguard Worker val = rmdir(dir);
362*49cdfc7eSAndroid Build Coastguard Worker
363*49cdfc7eSAndroid Build Coastguard Worker if (val >= 0) {
364*49cdfc7eSAndroid Build Coastguard Worker tst_brkm(TFAIL, NULL,
365*49cdfc7eSAndroid Build Coastguard Worker "Test[%d]: rmdir of non-empty %s succeeds!", me,
366*49cdfc7eSAndroid Build Coastguard Worker dir);
367*49cdfc7eSAndroid Build Coastguard Worker }
368*49cdfc7eSAndroid Build Coastguard Worker
369*49cdfc7eSAndroid Build Coastguard Worker val = chdir(dir);
370*49cdfc7eSAndroid Build Coastguard Worker warn(val, "chdir", dir);
371*49cdfc7eSAndroid Build Coastguard Worker
372*49cdfc7eSAndroid Build Coastguard Worker ft_mkname(fname, dirname, me, count);
373*49cdfc7eSAndroid Build Coastguard Worker val = unlink(fname);
374*49cdfc7eSAndroid Build Coastguard Worker warn(val, "unlink", fname);
375*49cdfc7eSAndroid Build Coastguard Worker
376*49cdfc7eSAndroid Build Coastguard Worker ft_mkname(fname, dirname, me, count + 1);
377*49cdfc7eSAndroid Build Coastguard Worker val = unlink(fname);
378*49cdfc7eSAndroid Build Coastguard Worker warn(val, "unlink", fname);
379*49cdfc7eSAndroid Build Coastguard Worker
380*49cdfc7eSAndroid Build Coastguard Worker val = chdir(homedir);
381*49cdfc7eSAndroid Build Coastguard Worker warn(val, "chdir", homedir);
382*49cdfc7eSAndroid Build Coastguard Worker
383*49cdfc7eSAndroid Build Coastguard Worker if (rand() & 0x01) {
384*49cdfc7eSAndroid Build Coastguard Worker val = rmdir(dir);
385*49cdfc7eSAndroid Build Coastguard Worker warn(val, "rmdir", dir);
386*49cdfc7eSAndroid Build Coastguard Worker }
387*49cdfc7eSAndroid Build Coastguard Worker
388*49cdfc7eSAndroid Build Coastguard Worker strcpy(dirname, savedir);
389*49cdfc7eSAndroid Build Coastguard Worker }
390*49cdfc7eSAndroid Build Coastguard Worker
391*49cdfc7eSAndroid Build Coastguard Worker /*
392*49cdfc7eSAndroid Build Coastguard Worker * dotest()
393*49cdfc7eSAndroid Build Coastguard Worker * Children execute this.
394*49cdfc7eSAndroid Build Coastguard Worker *
395*49cdfc7eSAndroid Build Coastguard Worker * Randomly do an inode thing; loop for # iterations.
396*49cdfc7eSAndroid Build Coastguard Worker */
397*49cdfc7eSAndroid Build Coastguard Worker #define THING(p) {p, "p"}
398*49cdfc7eSAndroid Build Coastguard Worker
399*49cdfc7eSAndroid Build Coastguard Worker struct ino_thing {
400*49cdfc7eSAndroid Build Coastguard Worker void (*it_proc) ();
401*49cdfc7eSAndroid Build Coastguard Worker char *it_name;
402*49cdfc7eSAndroid Build Coastguard Worker } ino_thing[] = {
403*49cdfc7eSAndroid Build Coastguard Worker THING(crfile), THING(unlfile), THING(fussdir), THING(sync),};
404*49cdfc7eSAndroid Build Coastguard Worker
405*49cdfc7eSAndroid Build Coastguard Worker #define NTHING ARRAY_SIZE(ino_thing)
406*49cdfc7eSAndroid Build Coastguard Worker
407*49cdfc7eSAndroid Build Coastguard Worker int thing_cnt[NTHING];
408*49cdfc7eSAndroid Build Coastguard Worker int thing_last[NTHING];
409*49cdfc7eSAndroid Build Coastguard Worker
dotest(int me,int count)410*49cdfc7eSAndroid Build Coastguard Worker static void dotest(int me, int count)
411*49cdfc7eSAndroid Build Coastguard Worker {
412*49cdfc7eSAndroid Build Coastguard Worker int thing, i;
413*49cdfc7eSAndroid Build Coastguard Worker
414*49cdfc7eSAndroid Build Coastguard Worker //tst_resm(TINFO,"Test %d pid %d starting.", me, getpid());
415*49cdfc7eSAndroid Build Coastguard Worker
416*49cdfc7eSAndroid Build Coastguard Worker srand(getpid());
417*49cdfc7eSAndroid Build Coastguard Worker
418*49cdfc7eSAndroid Build Coastguard Worker for (i = 0; i < count; i++) {
419*49cdfc7eSAndroid Build Coastguard Worker thing = (rand() >> 3) % NTHING;
420*49cdfc7eSAndroid Build Coastguard Worker (*ino_thing[thing].it_proc) (me, i, ino_thing[thing].it_name);
421*49cdfc7eSAndroid Build Coastguard Worker ++thing_cnt[thing];
422*49cdfc7eSAndroid Build Coastguard Worker }
423*49cdfc7eSAndroid Build Coastguard Worker
424*49cdfc7eSAndroid Build Coastguard Worker //tst_resm(TINFO,"Test %d pid %d exiting.", me, getpid());
425*49cdfc7eSAndroid Build Coastguard Worker }
426*49cdfc7eSAndroid Build Coastguard Worker
dowarn(int me,char * m1,char * m2)427*49cdfc7eSAndroid Build Coastguard Worker static void dowarn(int me, char *m1, char *m2)
428*49cdfc7eSAndroid Build Coastguard Worker {
429*49cdfc7eSAndroid Build Coastguard Worker int err = errno;
430*49cdfc7eSAndroid Build Coastguard Worker
431*49cdfc7eSAndroid Build Coastguard Worker tst_brkm(TFAIL, NULL, "Test[%d]: error %d on %s %s",
432*49cdfc7eSAndroid Build Coastguard Worker me, err, m1, (m2 ? m2 : ""));
433*49cdfc7eSAndroid Build Coastguard Worker }
434*49cdfc7eSAndroid Build Coastguard Worker
term(int sig LTP_ATTRIBUTE_UNUSED)435*49cdfc7eSAndroid Build Coastguard Worker static void term(int sig LTP_ATTRIBUTE_UNUSED)
436*49cdfc7eSAndroid Build Coastguard Worker {
437*49cdfc7eSAndroid Build Coastguard Worker int i;
438*49cdfc7eSAndroid Build Coastguard Worker
439*49cdfc7eSAndroid Build Coastguard Worker tst_resm(TINFO, "\tterm -[%d]- got sig term.", getpid());
440*49cdfc7eSAndroid Build Coastguard Worker
441*49cdfc7eSAndroid Build Coastguard Worker if (parent_pid == getpid()) {
442*49cdfc7eSAndroid Build Coastguard Worker for (i = 0; i < nchild; i++)
443*49cdfc7eSAndroid Build Coastguard Worker if (pidlist[i])
444*49cdfc7eSAndroid Build Coastguard Worker kill(pidlist[i], SIGTERM);
445*49cdfc7eSAndroid Build Coastguard Worker return;
446*49cdfc7eSAndroid Build Coastguard Worker }
447*49cdfc7eSAndroid Build Coastguard Worker
448*49cdfc7eSAndroid Build Coastguard Worker tst_brkm(TBROK, NULL, "Term: Child process exiting.");
449*49cdfc7eSAndroid Build Coastguard Worker }
450*49cdfc7eSAndroid Build Coastguard Worker
cleanup(void)451*49cdfc7eSAndroid Build Coastguard Worker static void cleanup(void)
452*49cdfc7eSAndroid Build Coastguard Worker {
453*49cdfc7eSAndroid Build Coastguard Worker char mount_buffer[1024];
454*49cdfc7eSAndroid Build Coastguard Worker
455*49cdfc7eSAndroid Build Coastguard Worker if (mnt == 1) {
456*49cdfc7eSAndroid Build Coastguard Worker if (chdir(startdir) < 0) {
457*49cdfc7eSAndroid Build Coastguard Worker tst_resm(TINFO, "Could not change to %s ", startdir);
458*49cdfc7eSAndroid Build Coastguard Worker }
459*49cdfc7eSAndroid Build Coastguard Worker if (!strcmp(fstyp, "cfs")) {
460*49cdfc7eSAndroid Build Coastguard Worker sprintf(mount_buffer, "/bin/umount %s", partition);
461*49cdfc7eSAndroid Build Coastguard Worker if (system(mount_buffer) != 0) {
462*49cdfc7eSAndroid Build Coastguard Worker tst_resm(TINFO, "Unable to unmount %s from %s ",
463*49cdfc7eSAndroid Build Coastguard Worker partition, mntpoint);
464*49cdfc7eSAndroid Build Coastguard Worker if (umount(partition)) {
465*49cdfc7eSAndroid Build Coastguard Worker tst_resm(TINFO,
466*49cdfc7eSAndroid Build Coastguard Worker "Unable to unmount %s from %s ",
467*49cdfc7eSAndroid Build Coastguard Worker partition, mntpoint);
468*49cdfc7eSAndroid Build Coastguard Worker } else {
469*49cdfc7eSAndroid Build Coastguard Worker tst_resm(TINFO,
470*49cdfc7eSAndroid Build Coastguard Worker "Forced umount for %s, /etc/mtab now dirty",
471*49cdfc7eSAndroid Build Coastguard Worker partition);
472*49cdfc7eSAndroid Build Coastguard Worker }
473*49cdfc7eSAndroid Build Coastguard Worker }
474*49cdfc7eSAndroid Build Coastguard Worker } else {
475*49cdfc7eSAndroid Build Coastguard Worker if (umount(partition)) {
476*49cdfc7eSAndroid Build Coastguard Worker tst_resm(TINFO, "Unable to unmount %s from %s ",
477*49cdfc7eSAndroid Build Coastguard Worker partition, mntpoint);
478*49cdfc7eSAndroid Build Coastguard Worker }
479*49cdfc7eSAndroid Build Coastguard Worker }
480*49cdfc7eSAndroid Build Coastguard Worker if (rmdir(mntpoint) != 0) {
481*49cdfc7eSAndroid Build Coastguard Worker tst_resm(TINFO, "Unable to rmdir %s ", mntpoint);
482*49cdfc7eSAndroid Build Coastguard Worker }
483*49cdfc7eSAndroid Build Coastguard Worker }
484*49cdfc7eSAndroid Build Coastguard Worker tst_rmdir();
485*49cdfc7eSAndroid Build Coastguard Worker
486*49cdfc7eSAndroid Build Coastguard Worker }
487