svn commit: r328775 - user/pho/stress2/misc

Peter Holm pho at FreeBSD.org
Fri Feb 2 12:52:43 UTC 2018


Author: pho
Date: Fri Feb  2 12:52:42 2018
New Revision: 328775
URL: https://svnweb.freebsd.org/changeset/base/328775

Log:
  Added a regression test for pageout of a partially dirty page.
  
  Obtained from:	Tristan Verniquet <tris_vern at hotmail.com>
  Sponsored by:	Dell EMC Isilon

Added:
  user/pho/stress2/misc/mmap33.sh   (contents, props changed)

Added: user/pho/stress2/misc/mmap33.sh
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/pho/stress2/misc/mmap33.sh	Fri Feb  2 12:52:42 2018	(r328775)
@@ -0,0 +1,95 @@
+#!/bin/sh
+
+# ftruncate+mmap+fsync fails for small maps
+# https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=225586
+
+# Original test scenario by tris_vern at hotmail.com
+
+# Fixed in r328773:
+# On pageout, in vnode generic pager, for partially dirty page, only
+# clear dirty bits for completely invalid blocks.
+
+. ../default.cfg
+
+cat > /tmp/mmap33.c <<EOF
+#include <sys/mman.h>
+
+#include <err.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+int
+main (int argc, char *argv[])
+{
+	size_t i, size1, size2;
+	int fd;
+	char *data;
+	char *filename;
+	char pattern = 0x01;
+
+	if (argc != 4) {
+		fprintf(stderr, "Usage: %s filename size1 size2\n", argv[0]);
+		exit(1);
+	}
+
+	filename = argv[1];
+	size1 = atoi(argv[2]);
+	size2 = atoi(argv[3]);
+
+	fd = open(filename, O_RDWR | O_TRUNC | O_CREAT, 0644);
+	for (i = 0; i < size1; i++)
+		write(fd, &pattern, 1);
+	close(fd);
+
+	fd = open(filename, O_RDWR, 0644);
+	if (fd == -1)
+		err(1, "open(%s)", filename);
+	if (ftruncate(fd, size2) == -1)
+		err(1, "ftruncate()");
+	data = mmap(NULL, size2, PROT_READ|PROT_WRITE,MAP_SHARED, fd, 0);
+	if (data == MAP_FAILED)
+		err(1, "mmap()");
+	memset(data, 0xFF, size2);
+
+	if (munmap(data, size2) == -1)
+		err(1, "munmap");
+	close(fd);
+
+	return (0);
+}
+EOF
+cc -o /tmp/mmap33 -Wall -Wextra -O2 -g /tmp/mmap33.c || exit 1
+rm /tmp/mmap33.c
+
+set -e
+mount | grep "on $mntpoint " | grep -q /dev/md && umount -f $mntpoint
+[ -c /dev/md$mdstart ] &&  mdconfig -d -u $mdstart
+mdconfig -a -t swap -s 2g -u $mdstart
+bsdlabel -w md$mdstart auto
+newfs $newfs_flags -n md${mdstart}$part > /dev/null
+mount /dev/md${mdstart}$part $mntpoint
+set +e
+
+file=file
+odir=`pwd`
+cd $mntpoint
+/tmp/mmap33 $file 1024 511
+s=$?
+sum1=`md5 < $mntpoint/$file`
+[ -f template.core -a $s -eq 0 ] &&
+    { ls -l template.core; mv template.core /tmp; s=1; }
+cd $odir
+umount $mntpoint
+mount /dev/md${mdstart}$part $mntpoint
+# This fails for truncate size < 512
+sum2=`md5 < $mntpoint/$file`
+[ $sum1 = $sum2 ] ||
+    { s=2; echo "md5 fingerprint differs."; }
+umount $mntpoint
+
+mdconfig -d -u $mdstart
+rm /tmp/mmap33
+exit $s


More information about the svn-src-user mailing list