t_renamerace.c revision 1.1
1/* $NetBSD: t_renamerace.c,v 1.1 2009/04/07 20:51:46 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 <err.h> 13#include <errno.h> 14#include <fcntl.h> 15#include <pthread.h> 16#include <stdio.h> 17#include <unistd.h> 18#include <string.h> 19 20#include <rump/rump.h> 21#include <rump/rump_syscalls.h> 22#include <rump/ukfs.h> 23 24#include <fs/tmpfs/tmpfs_args.h> 25 26#define NROUND (1<<16) /* usually triggered with this amount of rounds */ 27 28ATF_TC(renamerace); 29ATF_TC_HEAD(renamerace, tc) 30{ 31 atf_tc_set_md_var(tc, "descr", "rename(2) race against files " 32 "unlinked mid-operation, kern/41128"); 33} 34 35void * 36w1(void *arg) 37{ 38 int fd, i; 39 40 for (i = 0; i < NROUND; i++) { 41 fd = rump_sys_open("/rename.test1", O_WRONLY|O_CREAT|O_TRUNC, 0666); 42 rump_sys_unlink("/rename.test1"); 43 rump_sys_close(fd); 44 } 45 return NULL; 46} 47 48ATF_TC_BODY(renamerace, tc) 49{ 50 struct tmpfs_args args; 51 struct ukfs *fs; 52 pthread_t pt; 53 int fail = 0, succ = 0, i; 54 55 memset(&args, 0, sizeof(args)); 56 args.ta_version = TMPFS_ARGS_VERSION; 57 args.ta_root_mode = 0777; 58 59 ukfs_init(); 60 fs = ukfs_mount(MOUNT_TMPFS, "tmpfs", UKFS_DEFAULTMP, 0, &args, sizeof(args)); 61 if (fs == NULL) 62 err(1, "ukfs_mount"); 63 64 pthread_create(&pt, NULL, w1, fs); 65 66 for (i = 0; i < NROUND; i++) { 67 int rv; 68 rv = rump_sys_rename("/rename.test1", "/rename.test2"); 69#if 0 70 if (rv == 0) { 71 if (succ++ % 10000 == 0) 72 printf("success\n"); 73 } else { 74 if (fail++ % 10000 == 0) 75 printf("fail\n"); 76 } 77#endif 78 } 79 80 pthread_join(pt, NULL); 81 ukfs_release(fs, 0); 82} 83 84ATF_TP_ADD_TCS(tp) 85{ 86 ATF_TP_ADD_TC(tp, renamerace); 87} 88