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