Module Name:    src
Committed By:   perseant
Date:           Tue Aug 18 03:02:51 UTC 2020

Modified Files:
        src/distrib/sets/lists/debug: mi
        src/distrib/sets/lists/tests: mi
        src/tests/fs/lfs: Makefile
Added Files:
        src/tests/fs/lfs: t_rfw.c

Log Message:
Add skipped test for in-kernel roll-forward agent


To generate a diff of this commit:
cvs rdiff -u -r1.327 -r1.328 src/distrib/sets/lists/debug/mi
cvs rdiff -u -r1.892 -r1.893 src/distrib/sets/lists/tests/mi
cvs rdiff -u -r1.2 -r1.3 src/tests/fs/lfs/Makefile
cvs rdiff -u -r0 -r1.1 src/tests/fs/lfs/t_rfw.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.327 src/distrib/sets/lists/debug/mi:1.328
--- src/distrib/sets/lists/debug/mi:1.327	Fri Aug 14 00:53:16 2020
+++ src/distrib/sets/lists/debug/mi	Tue Aug 18 03:02:50 2020
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.327 2020/08/14 00:53:16 riastradh Exp $
+# $NetBSD: mi,v 1.328 2020/08/18 03:02:50 perseant Exp $
 ./etc/mtree/set.debug                           comp-sys-root
 ./usr/lib					comp-sys-usr		compatdir
 ./usr/lib/i18n/libBIG5_g.a			comp-c-debuglib		debuglib,compatfile
@@ -1666,6 +1666,7 @@
 ./usr/libdata/debug/usr/tests/fs/hfs/t_pathconvert.debug		tests-fs-debug		debug,atf,rump
 ./usr/libdata/debug/usr/tests/fs/kernfs/t_basic.debug			tests-fs-debug		debug,atf,rump
 ./usr/libdata/debug/usr/tests/fs/lfs/t_pr.debug				tests-fs-debug		debug,atf,rump
+./usr/libdata/debug/usr/tests/fs/lfs/t_rfw.debug			tests-fs-debug		debug,atf,rump
 ./usr/libdata/debug/usr/tests/fs/msdosfs/t_snapshot.debug		tests-fs-debug		debug,atf,rump
 ./usr/libdata/debug/usr/tests/fs/nfs/nfsservice/rumpnfsd.debug			tests-fs-debug		debug,atf,rump
 ./usr/libdata/debug/usr/tests/fs/nfs/t_mountd.debug			tests-fs-debug		debug,atf,rump

Index: src/distrib/sets/lists/tests/mi
diff -u src/distrib/sets/lists/tests/mi:1.892 src/distrib/sets/lists/tests/mi:1.893
--- src/distrib/sets/lists/tests/mi:1.892	Sun Aug 16 20:43:01 2020
+++ src/distrib/sets/lists/tests/mi	Tue Aug 18 03:02:50 2020
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.892 2020/08/16 20:43:01 rillig Exp $
+# $NetBSD: mi,v 1.893 2020/08/18 03:02:50 perseant Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 #
@@ -1501,6 +1501,7 @@
 ./usr/tests/fs/lfs/Atffile				tests-fs-tests		atf,rump
 ./usr/tests/fs/lfs/Kyuafile				tests-fs-tests		atf,rump,kyua
 ./usr/tests/fs/lfs/t_pr					tests-fs-tests		atf,rump
+./usr/tests/fs/lfs/t_rfw				tests-fs-tests		atf,rump
 ./usr/tests/fs/msdosfs					tests-fs-tests		compattestfile,atf
 ./usr/tests/fs/msdosfs/Atffile				tests-fs-tests		atf,rump
 ./usr/tests/fs/msdosfs/Kyuafile				tests-fs-tests		atf,rump,kyua

Index: src/tests/fs/lfs/Makefile
diff -u src/tests/fs/lfs/Makefile:1.2 src/tests/fs/lfs/Makefile:1.3
--- src/tests/fs/lfs/Makefile:1.2	Sun Mar  1 18:08:13 2020
+++ src/tests/fs/lfs/Makefile	Tue Aug 18 03:02:50 2020
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.2 2020/03/01 18:08:13 christos Exp $
+#	$NetBSD: Makefile,v 1.3 2020/08/18 03:02:50 perseant Exp $
 #
 
 .include <bsd.own.mk>
@@ -6,7 +6,7 @@
 TESTSDIR=	${TESTSBASE}/fs/lfs
 WARNS=		4
 
-TESTS_C=	t_pr
+TESTS_C=	t_pr t_rfw
 
 LDADD+=-lrumpfs_lfs -lrumpfs_ffs				# fs drivers
 LDADD+=-lrumpdev_disk -lrumpdev					# disk device

Added files:

Index: src/tests/fs/lfs/t_rfw.c
diff -u /dev/null src/tests/fs/lfs/t_rfw.c:1.1
--- /dev/null	Tue Aug 18 03:02:51 2020
+++ src/tests/fs/lfs/t_rfw.c	Tue Aug 18 03:02:50 2020
@@ -0,0 +1,272 @@
+/*	$NetBSD: t_rfw.c,v 1.1 2020/08/18 03:02:50 perseant Exp $	*/
+
+#include <sys/types.h>
+#include <sys/mount.h>
+#include <sys/sysctl.h>
+#include <sys/wait.h>
+
+#include <atf-c.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <rump/rump.h>
+#include <rump/rump_syscalls.h>
+
+#include <ufs/ufs/ufsmount.h>
+#include <ufs/lfs/lfs.h>
+#include <ufs/lfs/lfs_extern.h>
+
+#include "h_macros.h"
+
+/* Debugging conditions */
+/* #define FORCE_SUCCESS */ /* Don't actually revert, everything worked */
+/* #define FORCE_SYSCTL */ /* Don't check - necessary for FORCE_SUCCESS */
+
+/* Write a well-known byte pattern into a file, appending if it exists */
+int write_file(const char *, int);
+
+/* Check the byte pattern and size of the file */
+int check_file(const char *, int);
+
+ATF_TC(rfw);
+ATF_TC_HEAD(rfw, tc)
+{
+	atf_tc_set_md_var(tc, "descr",
+		"LFS roll-forward creates an inconsistent filesystem");
+	atf_tc_set_md_var(tc, "timeout", "20");
+}
+
+#define IMGNAME "disk.img"
+#define FAKEBLK "/dev/blk"
+#define LOGFILE "newfs.log"
+#define SBLOCK0_COPY "sb0.dd"
+#define SBLOCK1_COPY "sb1.dd"
+#define MAXLINE 132
+#define CHUNKSIZE 300
+ATF_TC_BODY(rfw, tc)
+{
+	struct ufs_args args;
+	FILE *pipe;
+#if (!defined FORCE_SUCCESS && !defined FORCE_SYSCTL)
+	int o_sysctl_rfw;
+	int n_sysctl_rfw;
+	int mib[3];
+	size_t len;
+#endif
+	char buf[MAXLINE];
+	long long sb0addr = -1, sb1addr = -1;
+
+	/*
+	 * Initialize.
+	 */
+#if (!defined FORCE_SUCCESS && !defined FORCE_SYSCTL)
+	/* Set sysctl to allow roll-forward */
+	fprintf(stderr, "* Set sysctl\n");
+	mib[0] = CTL_VFS;
+	mib[1] = 5; /* LFS */
+	mib[2] = LFS_DO_RFW;
+	len = sizeof(o_sysctl_rfw);
+	if (sysctl(mib, 3, &o_sysctl_rfw, &len,
+		&n_sysctl_rfw, sizeof(n_sysctl_rfw)) < 0)
+		atf_tc_skip("roll-forward not enabled in kernel");
+#endif /* !FORCE_SUCCESS && !FORCE_SYSCTL */
+
+	/* Create filesystem */
+	fprintf(stderr, "* Create file system\n");
+	if (system("newfs_lfs -D -F -s 10000 ./" IMGNAME " > " LOGFILE) == -1)
+		atf_tc_fail_errno("newfs failed");
+	pipe = fopen(LOGFILE, "r");
+	if (pipe == NULL)
+		atf_tc_fail_errno("newfs failed to execute");
+	while (fgets(buf, MAXLINE, pipe) != NULL) {
+		if (sscanf(buf, "%lld,%lld", &sb0addr, &sb1addr) == 2)
+			break;
+	}
+	while (fgets(buf, MAXLINE, pipe) != NULL)
+		;
+	fclose(pipe);
+	if (sb0addr < 0 || sb1addr < 0)
+		atf_tc_fail("superblock not found");
+	fprintf(stderr, "* Superblocks at %lld and %lld\n",
+		sb0addr, sb1addr);
+
+	/* Set up rump */
+	rump_init();
+	if (rump_sys_mkdir("/mp", 0777) == -1)
+		atf_tc_fail_errno("cannot create mountpoint");
+	rump_pub_etfs_register(FAKEBLK, IMGNAME, RUMP_ETFS_BLK);
+
+	/*
+	 * Create initial filesystem state, from which
+	 * we will attempt to roll forward.
+	 */
+
+	/* Mount filesystem */
+	fprintf(stderr, "* Mount fs [1]\n");
+	memset(&args, 0, sizeof(args));
+	args.fspec = __UNCONST(FAKEBLK);
+	if (rump_sys_mount(MOUNT_LFS, "/mp", 0, &args, sizeof(args)) == -1)
+		atf_tc_fail_errno("rump_sys_mount failed");
+
+	/* Payload */
+	fprintf(stderr, "* Initial payload\n");
+	write_file("/mp/to_be_deleted", CHUNKSIZE);
+	write_file("/mp/to_be_appended", CHUNKSIZE);
+
+	/* Unmount */
+	rump_sys_unmount("/mp", 0);
+
+	/* Make copies of superblocks */
+	sprintf(buf, "dd if=%s of=%s bs=512 iseek=%lld count=16 conv=sync",
+		IMGNAME, SBLOCK0_COPY, sb0addr);
+	system(buf);
+	sprintf(buf, "dd if=%s of=%s bs=512 iseek=%lld count=16 conv=sync",
+		IMGNAME, SBLOCK1_COPY, sb1addr);
+	system(buf);
+
+	/*
+	 * Make changes which we will attempt to roll forward.
+	 */
+
+	/* Reconfigure and mount filesystem again */
+	fprintf(stderr, "* Mount fs [2]\n");
+	if (rump_sys_mount(MOUNT_LFS, "/mp", 0, &args, sizeof(args)) == -1)
+		atf_tc_fail_errno("rump_sys_mount failed [2]");
+
+	/* Add new file */
+	write_file("/mp/newly_created", CHUNKSIZE);
+
+	/* Append to existing file */
+	write_file("/mp/to_be_appended", CHUNKSIZE);
+
+	/* Delete file */
+	rump_sys_unlink("/mp/to_be_deleted");
+
+	/* Done with payload, unmount fs */
+	rump_sys_unmount("/mp", 0);
+
+#ifndef FORCE_SUCCESS
+	/*
+	 * Copy back old superblocks, reverting FS to old state
+	 */
+	sprintf(buf, "dd of=%s if=%s bs=512 oseek=%lld count=16 conv=sync,notrunc",
+		IMGNAME, SBLOCK0_COPY, sb0addr);
+	system(buf);
+	sprintf(buf, "dd of=%s if=%s bs=512 oseek=%lld count=16 conv=sync,notrunc",
+		IMGNAME, SBLOCK1_COPY, sb1addr);
+	system(buf);
+
+	if (system("fsck_lfs -n -f " IMGNAME))
+		atf_tc_fail_errno("fsck found errors with old superblocks");
+#endif
+
+	/*
+	 * Roll forward.
+	 */
+
+	/* Mount filesystem; this will roll forward. */
+	fprintf(stderr, "* Mount fs [3]\n");
+	if (rump_sys_mount(MOUNT_LFS, "/mp", 0, &args, sizeof(args)) == -1)
+		atf_tc_fail_errno("rump_sys_mount failed [3]");
+
+	/* Unmount filesystem */
+	rump_sys_unmount("/mp", 0);
+
+	/*
+	 * Use fsck_lfs to look for consistency errors
+	 */
+
+	if (system("fsck_lfs -n -f " IMGNAME))
+		atf_tc_fail_errno("fsck found errors");
+
+	/*
+	 * Check file system contents
+	 */
+
+	/* Mount filesystem one last time */
+	fprintf(stderr, "* Mount fs [4]\n");
+	if (rump_sys_mount(MOUNT_LFS, "/mp", 0, &args, sizeof(args)) == -1)
+		atf_tc_fail_errno("rump_sys_mount failed [4]");
+
+	if (check_file("/mp/newly_created", CHUNKSIZE) != 0)
+		atf_tc_fail("Newly added file differs");
+
+	if (check_file("/mp/to_be_appended", 2 * CHUNKSIZE) != 0)
+		atf_tc_fail("Appended file differs");
+
+	if (rump_sys_access("/mp/to_be_deleted", F_OK) == 0)
+		atf_tc_fail("Removed file still present");
+
+	/* Umount filesystem, test completed */
+	rump_sys_unmount("/mp", 0);
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+
+	ATF_TP_ADD_TC(tp, rfw);
+	return atf_no_error();
+}
+
+/* Write some data into a file */
+int write_file(const char *filename, int add)
+{
+	int fd, size, i;
+	struct stat statbuf;
+	unsigned char b;
+	int flags = O_CREAT|O_WRONLY;
+
+	if (rump_sys_stat(filename, &statbuf) < 0)
+		size = 0;
+	else {
+		size = statbuf.st_size;
+		flags |= O_APPEND;
+	}
+
+	fd = rump_sys_open(filename, flags);
+
+	for (i = 0; i < add; i++) {
+		b = (size + i) & 0xff;
+		rump_sys_write(fd, &b, 1);
+	}
+	rump_sys_close(fd);
+
+	return 0;
+}
+
+/* Check file's existence, size and contents */
+int check_file(const char *filename, int size)
+{
+	int fd, i;
+	struct stat statbuf;
+	unsigned char b;
+
+	if (rump_sys_stat(filename, &statbuf) < 0) {
+		fprintf(stderr, "%s: stat failed\n", filename);
+		return 1;
+	}
+	if (size != statbuf.st_size) {
+		fprintf(stderr, "%s: expected %d bytes, found %d\n",
+			filename, size, (int)statbuf.st_size);
+		return 2;
+	}
+
+	fd = rump_sys_open(filename, O_RDONLY);
+
+	for (i = 0; i < size; i++) {
+		rump_sys_read(fd, &b, 1);
+		if (b != (i & 0xff)) {
+			fprintf(stderr, "%s: byte %d: expected %x found %x\n",
+				filename, i, (unsigned)(i & 0xff), b);
+			return 3;
+		}
+	}
+	rump_sys_close(fd);
+
+	return 0;
+}

Reply via email to