1 /* $NetBSD: t_renamerace.c,v 1.5 2009/04/14 10:19:39 pooka Exp $ */ 2 3 /* 4 * Modified for rump and atf from a program supplied 5 * by Nicolas Joly in kern/40948 6 */ 7 8 #include <sys/types.h> 9 #include <sys/mount.h> 10 11 #include <atf-c.h> 12 #include <errno.h> 13 #include <fcntl.h> 14 #include <pthread.h> 15 #include <stdio.h> 16 #include <unistd.h> 17 #include <string.h> 18 19 #include <rump/rump.h> 20 #include <rump/rump_syscalls.h> 21 #include <rump/ukfs.h> 22 23 #include <fs/tmpfs/tmpfs_args.h> 24 25 #include "../../h_macros.h" 26 27 ATF_TC(renamerace); 28 ATF_TC_HEAD(renamerace, tc) 29 { 30 atf_tc_set_md_var(tc, "descr", "rename(2) race against files " 31 "unlinked mid-operation, kern/41128"); 32 } 33 34 static void * 35 w1(void *arg) 36 { 37 int fd; 38 39 for (;;) { 40 fd = rump_sys_open("/rename.test1", 41 O_WRONLY|O_CREAT|O_TRUNC, 0666); 42 rump_sys_unlink("/rename.test1"); 43 rump_sys_close(fd); 44 } 45 return NULL; 46 } 47 48 static void * 49 w2(void *arg) 50 { 51 52 for (;;) { 53 rump_sys_rename("/rename.test1", "/rename.test2"); 54 } 55 return NULL; 56 } 57 58 ATF_TC_BODY(renamerace, tc) 59 { 60 struct tmpfs_args args; 61 struct ukfs *fs; 62 pthread_t pt1, pt2; 63 64 memset(&args, 0, sizeof(args)); 65 args.ta_version = TMPFS_ARGS_VERSION; 66 args.ta_root_mode = 0777; 67 68 ukfs_init(); 69 fs = ukfs_mount(MOUNT_TMPFS, "tmpfs", UKFS_DEFAULTMP, 0, 70 &args, sizeof(args)); 71 if (fs == NULL) 72 atf_tc_fail_errno("could not mount tmpfs"); 73 74 pthread_create(&pt1, NULL, w1, fs); 75 pthread_create(&pt2, NULL, w2, fs); 76 77 sleep(10); 78 } 79 80 ATF_TP_ADD_TCS(tp) 81 { 82 ATF_TP_ADD_TC(tp, renamerace); 83 return 0; /*XXX?*/ 84 } 85