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);
+}