Module Name:    src
Committed By:   pooka
Date:           Tue Apr  7 20:51:46 UTC 2009

Modified Files:
        src/tests/fs/tmpfs: Atffile Makefile
Added Files:
        src/tests/fs/tmpfs: t_renamerace.c

Log Message:
add regression test for kern/41128


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/tests/fs/tmpfs/Atffile
cvs rdiff -u -r1.2 -r1.3 src/tests/fs/tmpfs/Makefile
cvs rdiff -u -r0 -r1.1 src/tests/fs/tmpfs/t_renamerace.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/fs/tmpfs/Atffile
diff -u src/tests/fs/tmpfs/Atffile:1.4 src/tests/fs/tmpfs/Atffile:1.5
--- src/tests/fs/tmpfs/Atffile:1.4	Sun Dec 30 09:13:32 2007
+++ src/tests/fs/tmpfs/Atffile	Tue Apr  7 20:51:46 2009
@@ -1,5 +1,5 @@
 Content-Type: application/X-atf-atffile; version="1"
-X-NetBSD-Id: "$NetBSD: Atffile,v 1.4 2007/12/30 09:13:32 jmmv Exp $"
+X-NetBSD-Id: "$NetBSD: Atffile,v 1.5 2009/04/07 20:51:46 pooka Exp $"
 
 prop: test-suite = "NetBSD"
 
@@ -28,3 +28,4 @@
 tp: t_sockets
 tp: t_readdir
 tp: t_vnd
+tp: t_renamerace

Index: src/tests/fs/tmpfs/Makefile
diff -u src/tests/fs/tmpfs/Makefile:1.2 src/tests/fs/tmpfs/Makefile:1.3
--- src/tests/fs/tmpfs/Makefile:1.2	Wed Nov 21 15:39:34 2007
+++ src/tests/fs/tmpfs/Makefile	Tue Apr  7 20:51:46 2009
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.2 2007/11/21 15:39:34 jmmv Exp $
+# $NetBSD: Makefile,v 1.3 2009/04/07 20:51:46 pooka Exp $
 
 TESTSDIR=	${TESTSBASE}/fs/tmpfs
 
@@ -28,6 +28,10 @@
 TESTS_SH+=	t_vnd
 TESTS_SH+=	t_vnode_leak
 
+TESTS_C+=	t_renamerace
+
+LDADD.t_renamerace+= -lukfs -lrumpfs_tmpfs -lrumpvfs -lrump -lrumpuser -lpthread
+
 FILES=		h_funcs.subr
 FILESDIR=	${TESTSDIR}
 

Added files:

Index: src/tests/fs/tmpfs/t_renamerace.c
diff -u /dev/null src/tests/fs/tmpfs/t_renamerace.c:1.1
--- /dev/null	Tue Apr  7 20:51:46 2009
+++ src/tests/fs/tmpfs/t_renamerace.c	Tue Apr  7 20:51:46 2009
@@ -0,0 +1,87 @@
+/*	$NetBSD: t_renamerace.c,v 1.1 2009/04/07 20:51:46 pooka Exp $	*/
+
+/*
+ * Modified for rump and atf from a program supplied
+ * by Nicolas Joly in kern/40948
+ */
+
+#include <sys/types.h>
+#include <sys/mount.h>
+
+#include <atf-c.h>
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <rump/rump.h>
+#include <rump/rump_syscalls.h>
+#include <rump/ukfs.h>
+
+#include <fs/tmpfs/tmpfs_args.h>
+
+#define NROUND (1<<16) /* usually triggered with this amount of rounds */
+
+ATF_TC(renamerace);
+ATF_TC_HEAD(renamerace, tc)
+{
+	atf_tc_set_md_var(tc, "descr", "rename(2) race against files "
+	    "unlinked mid-operation, kern/41128");
+}
+
+void *
+w1(void *arg)
+{
+  int fd, i;
+
+  for (i = 0; i < NROUND; i++) {
+    fd = rump_sys_open("/rename.test1", O_WRONLY|O_CREAT|O_TRUNC, 0666);
+    rump_sys_unlink("/rename.test1");
+    rump_sys_close(fd);
+  }
+  return NULL;
+}
+
+ATF_TC_BODY(renamerace, tc)
+{
+  struct tmpfs_args args;
+  struct ukfs *fs;
+  pthread_t pt;
+  int fail = 0, succ = 0, i;
+
+  memset(&args, 0, sizeof(args));
+  args.ta_version = TMPFS_ARGS_VERSION;
+  args.ta_root_mode = 0777;
+
+  ukfs_init();
+  fs = ukfs_mount(MOUNT_TMPFS, "tmpfs", UKFS_DEFAULTMP, 0, &args, sizeof(args));
+  if (fs == NULL)
+    err(1, "ukfs_mount");
+
+  pthread_create(&pt, NULL, w1, fs);
+
+  for (i = 0; i < NROUND; i++) {
+    int rv;
+    rv = rump_sys_rename("/rename.test1", "/rename.test2");
+#if 0
+    if (rv == 0) {
+      if (succ++ % 10000 == 0)
+        printf("success\n");
+    } else {
+      if (fail++ % 10000 == 0)
+        printf("fail\n");
+    }
+#endif
+  }
+
+  pthread_join(pt, NULL);
+  ukfs_release(fs, 0);
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+	ATF_TP_ADD_TC(tp, renamerace);
+}

Reply via email to