Module Name: src Committed By: pooka Date: Wed Jul 28 15:24:54 UTC 2010
Modified Files: src/tests/fs/nfs: Makefile Added Files: src/tests/fs/nfs: t_mountd.c Log Message: Add test for service interruption while mountd handles SIGHUP. This is an xfail test for the problem described in PR kern/5844 per highly surreptitious nudge from mrg To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/tests/fs/nfs/Makefile cvs rdiff -u -r0 -r1.1 src/tests/fs/nfs/t_mountd.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/nfs/Makefile diff -u src/tests/fs/nfs/Makefile:1.1 src/tests/fs/nfs/Makefile:1.2 --- src/tests/fs/nfs/Makefile:1.1 Mon Jul 26 15:53:00 2010 +++ src/tests/fs/nfs/Makefile Wed Jul 28 15:24:54 2010 @@ -1,6 +1,21 @@ -# $NetBSD: Makefile,v 1.1 2010/07/26 15:53:00 pooka Exp $ +# $NetBSD: Makefile,v 1.2 2010/07/28 15:24:54 pooka Exp $ # +.include <bsd.own.mk> + SUBDIR+= nfsservice -.include <bsd.subdir.mk> +TESTS_C= t_mountd + +LDADD+=-lrumpfs_ffs # ffs +LDADD+=-lrumpfs_nfs # NFS +LDADD+=-lrumpdev_disk -lrumpdev # disk device +LDADD+=-lrumpnet_shmif -lrumpnet_netinet -lrumpnet_net -lrumpnet +LDADD+=-lrumpvfs -lrump -lrumpuser -lpthread # base + +LDADD+=-lutil + +VFSTESTDIR != cd ${.CURDIR}/../common && ${PRINTOBJDIR} +LDADD+=-L${VFSTESTDIR} -lvfstest + +.include <bsd.test.mk> Added files: Index: src/tests/fs/nfs/t_mountd.c diff -u /dev/null src/tests/fs/nfs/t_mountd.c:1.1 --- /dev/null Wed Jul 28 15:24:54 2010 +++ src/tests/fs/nfs/t_mountd.c Wed Jul 28 15:24:54 2010 @@ -0,0 +1,120 @@ +/* $NetBSD: t_mountd.c,v 1.1 2010/07/28 15:24:54 pooka Exp $ */ + +/*- + * Copyright (c) 2010 The NetBSD Foundation, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <sys/types.h> +#include <sys/mount.h> + +#include <atf-c.h> +#include <errno.h> +#include <fcntl.h> +#include <pthread.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> + +#include <rump/rump.h> +#include <rump/rump_syscalls.h> + +#include "../../h_macros.h" +#include "../common/h_fsmacros.h" + +ATF_TC(mountdhup); +ATF_TC_HEAD(mountdhup, tc) +{ + + atf_tc_set_md_var(tc, "descr", "test for service interrupt while " + "mountd handles SIGHUP"); + atf_tc_set_md_var(tc, "use.fs", "true"); +} + +static volatile int quit; + +static void * +wrkwrkwrk(void *unused) +{ + int fd, fail; + + rump_sys_chdir(FSTEST_MNTNAME); + while (!quit) { + fd = rump_sys_open("file", O_RDWR | O_CREAT); + if (fd == -1) { + if (errno == EACCES) { + fail++; + break; + } + atf_tc_fail_errno("open file"); + } + rump_sys_close(fd); + if (rump_sys_unlink("file") == -1) { + if (errno == EACCES) { + fail++; + break; + } + atf_tc_fail_errno("unlink file"); + } + } + rump_sys_chdir("/"); + quit = 1; + + return fail ? &fail : NULL; +} + +ATF_TC_BODY(mountdhup, tc) +{ + pthread_t pt; + struct nfstestargs *nfsargs; + void *voidargs; + int attempts; + void *fail; + + FSTEST_CONSTRUCTOR(tc, nfs, voidargs); + nfsargs = voidargs; + + pthread_create(&pt, NULL, wrkwrkwrk, NULL); + for (attempts = 100; attempts && !quit; attempts--) { + usleep(100000); + kill(nfsargs->ta_childpid, SIGHUP); + } + quit = 1; + pthread_join(pt, &fail); + + FSTEST_DESTRUCTOR(tc, nfs, voidargs); + + atf_tc_expect_fail("PR kern/5844"); + if (fail) + atf_tc_fail("op failed with EACCES"); + atf_tc_expect_pass(); +} + +ATF_TP_ADD_TCS(tp) +{ + + ATF_TP_ADD_TC(tp, mountdhup); + + return atf_no_error(); +}