Home | History | Annotate | Line # | Download | only in vfs
t_renamerace.c revision 1.2
      1  1.2  pooka /*	$NetBSD: t_renamerace.c,v 1.2 2010/07/14 21:44:40 pooka Exp $	*/
      2  1.1  pooka 
      3  1.1  pooka /*
      4  1.1  pooka  * Modified for rump and atf from a program supplied
      5  1.1  pooka  * by Nicolas Joly in kern/40948
      6  1.1  pooka  */
      7  1.1  pooka 
      8  1.1  pooka #include <sys/types.h>
      9  1.1  pooka #include <sys/mount.h>
     10  1.1  pooka #include <sys/utsname.h>
     11  1.1  pooka 
     12  1.1  pooka #include <atf-c.h>
     13  1.1  pooka #include <errno.h>
     14  1.1  pooka #include <fcntl.h>
     15  1.1  pooka #include <pthread.h>
     16  1.1  pooka #include <stdio.h>
     17  1.1  pooka #include <stdlib.h>
     18  1.1  pooka #include <string.h>
     19  1.1  pooka #include <unistd.h>
     20  1.1  pooka 
     21  1.1  pooka #include <rump/rump.h>
     22  1.1  pooka #include <rump/rump_syscalls.h>
     23  1.1  pooka 
     24  1.1  pooka #include "../common/h_fsmacros.h"
     25  1.1  pooka #include "../../h_macros.h"
     26  1.1  pooka 
     27  1.1  pooka static volatile int quittingtime;
     28  1.1  pooka 
     29  1.1  pooka static void *
     30  1.1  pooka w1(void *arg)
     31  1.1  pooka {
     32  1.1  pooka 	int fd;
     33  1.1  pooka 
     34  1.1  pooka 	rump_pub_lwp_alloc_and_switch(0, 10);
     35  1.1  pooka 	rump_sys_chdir(arg);
     36  1.1  pooka 
     37  1.1  pooka 	while (!quittingtime) {
     38  1.1  pooka 		fd = rump_sys_open("rename.test1",
     39  1.1  pooka 		    O_WRONLY|O_CREAT|O_TRUNC, 0666);
     40  1.1  pooka 		if (fd == -1)
     41  1.1  pooka 			atf_tc_fail_errno("create");
     42  1.1  pooka 		rump_sys_unlink("rename.test1");
     43  1.1  pooka 		rump_sys_close(fd);
     44  1.1  pooka 	}
     45  1.1  pooka 
     46  1.1  pooka 	rump_sys_chdir("/");
     47  1.1  pooka 
     48  1.1  pooka 	return NULL;
     49  1.1  pooka }
     50  1.1  pooka 
     51  1.1  pooka static void *
     52  1.1  pooka w2(void *arg)
     53  1.1  pooka {
     54  1.1  pooka 
     55  1.1  pooka 	rump_pub_lwp_alloc_and_switch(0, 11);
     56  1.1  pooka 	rump_sys_chdir(arg);
     57  1.1  pooka 
     58  1.1  pooka 	while (!quittingtime) {
     59  1.1  pooka 		rump_sys_rename("rename.test1", "rename.test2");
     60  1.1  pooka 	}
     61  1.1  pooka 
     62  1.1  pooka 	rump_sys_chdir("/");
     63  1.1  pooka 
     64  1.1  pooka 	return NULL;
     65  1.1  pooka }
     66  1.1  pooka 
     67  1.1  pooka static void
     68  1.1  pooka renamerace(const atf_tc_t *tc, const char *mp)
     69  1.1  pooka {
     70  1.1  pooka 	pthread_t pt1, pt2;
     71  1.1  pooka 
     72  1.2  pooka 	if (FSTYPE_LFS(tc))
     73  1.2  pooka 		atf_tc_expect_signal(-1, "PR kern/43582");
     74  1.2  pooka 
     75  1.1  pooka 	pthread_create(&pt1, NULL, w1, __UNCONST(mp));
     76  1.1  pooka 	pthread_create(&pt2, NULL, w2, __UNCONST(mp));
     77  1.1  pooka 
     78  1.1  pooka 	sleep(5);
     79  1.1  pooka 	quittingtime = 1;
     80  1.1  pooka 
     81  1.1  pooka 	pthread_join(pt1, NULL);
     82  1.1  pooka 	pthread_join(pt2, NULL);
     83  1.1  pooka }
     84  1.1  pooka 
     85  1.1  pooka ATF_TC_FSAPPLY(renamerace, "rename(2) race with file unlinked mid-operation");
     86  1.1  pooka 
     87  1.1  pooka ATF_TP_ADD_TCS(tp)
     88  1.1  pooka {
     89  1.1  pooka 
     90  1.1  pooka 	ATF_TP_FSAPPLY(renamerace); /* PR kern/41128 */
     91  1.1  pooka 
     92  1.1  pooka 	return atf_no_error();
     93  1.1  pooka }
     94