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

Reply via email to