xref: /aosp_15_r20/external/ltp/testcases/kernel/fs/ftest/ftest06.c (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
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