Module Name: src Committed By: bad Date: Fri Aug 9 23:24:15 UTC 2024
Modified Files: src/distrib/sets/lists/debug: mi src/distrib/sets/lists/tests: mi src/tests/kernel: Makefile Added Files: src/tests/kernel: t_unmount.c Log Message: add tests/kernel/t_umount.c: test case for unmount(2) demonstrate that failing to umount and async mounted file system causes the kernel syncer to start flushing dirty buffers for it. PR kern/58564: async mounts revert to being synced after failed unmount To generate a diff of this commit: cvs rdiff -u -r1.440 -r1.441 src/distrib/sets/lists/debug/mi cvs rdiff -u -r1.1328 -r1.1329 src/distrib/sets/lists/tests/mi cvs rdiff -u -r1.78 -r1.79 src/tests/kernel/Makefile cvs rdiff -u -r0 -r1.1 src/tests/kernel/t_unmount.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/distrib/sets/lists/debug/mi diff -u src/distrib/sets/lists/debug/mi:1.440 src/distrib/sets/lists/debug/mi:1.441 --- src/distrib/sets/lists/debug/mi:1.440 Thu Jul 11 08:13:49 2024 +++ src/distrib/sets/lists/debug/mi Fri Aug 9 23:24:15 2024 @@ -1,4 +1,4 @@ -# $NetBSD: mi,v 1.440 2024/07/11 08:13:49 riastradh Exp $ +# $NetBSD: mi,v 1.441 2024/08/09 23:24:15 bad Exp $ # ./etc/mtree/set.debug comp-sys-root ./usr/lib comp-sys-usr compatdir @@ -1831,6 +1831,7 @@ ./usr/libdata/debug/usr/tests/kernel/t_time.debug tests-obsolete obsolete,compattestfile ./usr/libdata/debug/usr/tests/kernel/t_timeleft.debug tests-kernel-tests debug,atf,compattestfile ./usr/libdata/debug/usr/tests/kernel/t_ucontext.debug tests-obsolete obsolete,compattestfile +./usr/libdata/debug/usr/tests/kernel/t_unmount.debug tests-kernel-tests debug,atf,rump ./usr/libdata/debug/usr/tests/kernel/t_writev.debug tests-obsolete obsolete,compattestfile ./usr/libdata/debug/usr/tests/kernel/t_zombie.debug tests-kernel-tests debug,atf ./usr/libdata/debug/usr/tests/kernel/tty/t_pr.debug tests-kernel-tests debug,atf,rump Index: src/distrib/sets/lists/tests/mi diff -u src/distrib/sets/lists/tests/mi:1.1328 src/distrib/sets/lists/tests/mi:1.1329 --- src/distrib/sets/lists/tests/mi:1.1328 Wed Jul 10 20:33:37 2024 +++ src/distrib/sets/lists/tests/mi Fri Aug 9 23:24:15 2024 @@ -1,4 +1,4 @@ -# $NetBSD: mi,v 1.1328 2024/07/10 20:33:37 rillig Exp $ +# $NetBSD: mi,v 1.1329 2024/08/09 23:24:15 bad Exp $ # # Note: don't delete entries from here - mark them as "obsolete" instead. # @@ -2363,6 +2363,7 @@ ./usr/tests/kernel/t_ucontext tests-obsolete obsolete ./usr/tests/kernel/t_umount tests-kernel-tests compattestfile,atf ./usr/tests/kernel/t_umountstress tests-kernel-tests compattestfile,atf +./usr/tests/kernel/t_unmount tests-kernel-tests atf,rump ./usr/tests/kernel/t_writev tests-obsolete obsolete ./usr/tests/kernel/t_zombie tests-kernel-tests compattestfile,atf ./usr/tests/kernel/tty tests-kernel-tests compattestfile,atf Index: src/tests/kernel/Makefile diff -u src/tests/kernel/Makefile:1.78 src/tests/kernel/Makefile:1.79 --- src/tests/kernel/Makefile:1.78 Mon Apr 22 07:24:22 2024 +++ src/tests/kernel/Makefile Fri Aug 9 23:24:15 2024 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.78 2024/04/22 07:24:22 pho Exp $ +# $NetBSD: Makefile,v 1.79 2024/08/09 23:24:15 bad Exp $ NOMAN= # defined @@ -25,6 +25,9 @@ TESTS_C+= t_kauth_pr_47598 TESTS_C+= t_ksem TESTS_C+= t_sysctl TESTS_C+= t_timeleft +.if ${MKRUMP} != "no" +TESTS_C+= t_unmount +.endif TESTS_C+= t_zombie TESTS_C+= t_open_pr_57260 @@ -63,6 +66,9 @@ LDADD.t_fdrestart+= ${LIBRUMPBASE} LDADD.t_mqueue+= -lrt +LDADD.t_unmount+= -lrumpfs_tmpfs +LDADD.t_unmount+= ${LIBRUMPBASE} + .if (${MKRUMP} != "no") && !defined(BSD_MK_COMPAT_FILE) TESTS_SUBDIRS+= tty @@ -79,6 +85,7 @@ LDADD.t_rnd+= -lrumpdev_rnd -lrumpdev $ LDADD.t_timeleft+= -lpthread CPPFLAGS+= -D_KERNTYPES +CPPFLAGS.t_unmount.c+= -D_KMEMUSER -D__EXPOSE_MOUNT ARCH_INCS_DIR:= ${.PARSEDIR}/arch/${MACHINE_ARCH} .if exists(${ARCH_INCS_DIR}/stack_pointer.h) Added files: Index: src/tests/kernel/t_unmount.c diff -u /dev/null src/tests/kernel/t_unmount.c:1.1 --- /dev/null Fri Aug 9 23:24:15 2024 +++ src/tests/kernel/t_unmount.c Fri Aug 9 23:24:15 2024 @@ -0,0 +1,110 @@ +/* $NetBSD: t_unmount.c,v 1.1 2024/08/09 23:24:15 bad Exp $ */ + +/*- + * Copyright (c) 2010 The NetBSD Foundation, Inc. + * All rights reserved. + * + * 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 NETBSD FOUNDATION, INC. AND + * CONTRIBUTORS ``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 FOUNDATION 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/cdefs.h> +__COPYRIGHT("@(#) Copyright (c) 2024\ + The NetBSD Foundation, inc. All rights reserved."); +__RCSID("$NetBSD: t_unmount.c,v 1.1 2024/08/09 23:24:15 bad Exp $"); + +#include <sys/types.h> +#include <sys/mount.h> +#include <sys/vnode.h> + +#include <rump/rump.h> +#include <rump/rumpvnode_if.h> +#include <rump/rump_syscalls.h> + +#include <fs/tmpfs/tmpfs_args.h> + +#include <atf-c.h> +#include <errno.h> +#include <stdio.h> + +#include "h_macros.h" + +ATF_TC(async); +ATF_TC_HEAD(async, tc) +{ + atf_tc_set_md_var(tc, + "descr", "failed unmount of async fs should stay async"); +} + +#define MP "/mnt" + +ATF_TC_BODY(async, tc) +{ + struct tmpfs_args args; + struct vnode *vp; + extern struct vnode *rumpns_rootvnode; + int rv; + + RZ(rump_init()); + + memset(&args, 0, sizeof(args)); + args.ta_version = TMPFS_ARGS_VERSION; + args.ta_root_mode = 0777; + + /* create mount point and mount a tmpfs on it */ + RL(rump_sys_mkdir(MP, 0777)); + RL(rump_sys_mount(MOUNT_TMPFS, MP, MNT_ASYNC, &args, sizeof(args))); + + /* make sure the tmpfs is busy */ + RL(rump_sys_chdir(MP)); + + /* need a stable lwp for componentname */ + RZ(rump_pub_lwproc_rfork(RUMP_RFCFDG)); + + /* get vnode of MP, unlocked */ + rv = rump_pub_namei(RUMP_NAMEI_LOOKUP, 0, + MP, NULL, &vp, NULL); + ATF_REQUIRE_MSG((rv == 0), "rump_pub_namei failed: %s", strerror(rv)); + + /* make sure we didn't just get the root vnode */ + ATF_REQUIRE_MSG((rumpns_rootvnode != vp), "drat! got the root vnode"); + + printf("mnt_iflag & IMNT_ONWORKLIST == %d\n", + (vp->v_mount->mnt_iflag & IMNT_ONWORKLIST) != 0); + + /* can't unmount a busy file system */ + ATF_REQUIRE_ERRNO(EBUSY, rump_sys_unmount(MP, 0) == -1); + + printf("mnt_iflag & IMNT_ONWORKLIST == %d\n", + (vp->v_mount->mnt_iflag & IMNT_ONWORKLIST) != 0); + + + atf_tc_expect_fail("mount point on syncer work list. PR kern/58564"); + ATF_REQUIRE_MSG(((vp->v_mount->mnt_iflag & IMNT_ONWORKLIST) == 0), + "mount point on syncer work list"); +} + +ATF_TP_ADD_TCS(tp) +{ + ATF_TP_ADD_TC(tp, async); + + return atf_no_error(); +}