Home | History | Annotate | Line # | Download | only in vfs
t_renamerace.c revision 1.6
      1  1.6  pooka /*	$NetBSD: t_renamerace.c,v 1.6 2010/07/16 13:07:23 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.4  pooka w1_dirs(void *arg)
     53  1.4  pooka {
     54  1.4  pooka 
     55  1.4  pooka 	rump_pub_lwp_alloc_and_switch(0, 10);
     56  1.4  pooka 	rump_sys_chdir(arg);
     57  1.4  pooka 
     58  1.4  pooka 	while (!quittingtime) {
     59  1.4  pooka 		if (rump_sys_mkdir("rename.test1", 0777) == -1)
     60  1.4  pooka 			atf_tc_fail_errno("mkdir");
     61  1.4  pooka 		rump_sys_rmdir("rename.test1");
     62  1.4  pooka 	}
     63  1.4  pooka 
     64  1.4  pooka 	rump_sys_chdir("/");
     65  1.4  pooka 
     66  1.4  pooka 	return NULL;
     67  1.4  pooka }
     68  1.4  pooka 
     69  1.4  pooka static void *
     70  1.1  pooka w2(void *arg)
     71  1.1  pooka {
     72  1.1  pooka 
     73  1.1  pooka 	rump_pub_lwp_alloc_and_switch(0, 11);
     74  1.1  pooka 	rump_sys_chdir(arg);
     75  1.1  pooka 
     76  1.1  pooka 	while (!quittingtime) {
     77  1.1  pooka 		rump_sys_rename("rename.test1", "rename.test2");
     78  1.1  pooka 	}
     79  1.1  pooka 
     80  1.1  pooka 	rump_sys_chdir("/");
     81  1.1  pooka 
     82  1.1  pooka 	return NULL;
     83  1.1  pooka }
     84  1.1  pooka 
     85  1.1  pooka static void
     86  1.1  pooka renamerace(const atf_tc_t *tc, const char *mp)
     87  1.1  pooka {
     88  1.1  pooka 	pthread_t pt1, pt2;
     89  1.1  pooka 
     90  1.2  pooka 	if (FSTYPE_LFS(tc))
     91  1.2  pooka 		atf_tc_expect_signal(-1, "PR kern/43582");
     92  1.2  pooka 
     93  1.1  pooka 	pthread_create(&pt1, NULL, w1, __UNCONST(mp));
     94  1.1  pooka 	pthread_create(&pt2, NULL, w2, __UNCONST(mp));
     95  1.1  pooka 
     96  1.1  pooka 	sleep(5);
     97  1.1  pooka 	quittingtime = 1;
     98  1.1  pooka 
     99  1.1  pooka 	pthread_join(pt1, NULL);
    100  1.1  pooka 	pthread_join(pt2, NULL);
    101  1.3  pooka 
    102  1.3  pooka 	/*
    103  1.3  pooka 	 * XXX: does not always fail on LFS, especially for unicpu
    104  1.6  pooka 	 * configurations.  see other ramblings about racy tests.
    105  1.3  pooka 	 */
    106  1.3  pooka 	if (FSTYPE_LFS(tc))
    107  1.3  pooka 		abort();
    108  1.1  pooka }
    109  1.1  pooka 
    110  1.4  pooka static void
    111  1.4  pooka renamerace_dirs(const atf_tc_t *tc, const char *mp)
    112  1.4  pooka {
    113  1.4  pooka 	pthread_t pt1, pt2;
    114  1.4  pooka 
    115  1.4  pooka 	/* XXX: msdosfs also sometimes hangs */
    116  1.4  pooka 	if (FSTYPE_FFS(tc) || FSTYPE_EXT2FS(tc) || FSTYPE_LFS(tc) ||
    117  1.4  pooka 	    FSTYPE_MSDOS(tc))
    118  1.5  pooka 		atf_tc_expect_signal(-1, "PR kern/43626");
    119  1.4  pooka 
    120  1.4  pooka 	pthread_create(&pt1, NULL, w1_dirs, __UNCONST(mp));
    121  1.4  pooka 	pthread_create(&pt2, NULL, w2, __UNCONST(mp));
    122  1.4  pooka 
    123  1.4  pooka 	sleep(5);
    124  1.4  pooka 	quittingtime = 1;
    125  1.4  pooka 
    126  1.4  pooka 	pthread_join(pt1, NULL);
    127  1.4  pooka 	pthread_join(pt2, NULL);
    128  1.4  pooka 
    129  1.4  pooka 	/*
    130  1.4  pooka 	 * Doesn't always trigger when run on a slow backend
    131  1.4  pooka 	 * (i.e. not on tmpfs/mfs).  So do the usual kludge.
    132  1.4  pooka 	 */
    133  1.4  pooka 	if (FSTYPE_FFS(tc) || FSTYPE_EXT2FS(tc) || FSTYPE_LFS(tc) ||
    134  1.4  pooka 	    FSTYPE_MSDOS(tc))
    135  1.4  pooka 		abort();
    136  1.4  pooka }
    137  1.4  pooka 
    138  1.1  pooka ATF_TC_FSAPPLY(renamerace, "rename(2) race with file unlinked mid-operation");
    139  1.4  pooka ATF_TC_FSAPPLY(renamerace_dirs, "rename(2) race with directories");
    140  1.1  pooka 
    141  1.1  pooka ATF_TP_ADD_TCS(tp)
    142  1.1  pooka {
    143  1.1  pooka 
    144  1.1  pooka 	ATF_TP_FSAPPLY(renamerace); /* PR kern/41128 */
    145  1.4  pooka 	ATF_TP_FSAPPLY(renamerace_dirs);
    146  1.1  pooka 
    147  1.1  pooka 	return atf_no_error();
    148  1.1  pooka }
    149