long page_size;
long page_offs[THREADS];
int use_wr[THREADS];
+int prefault = 0;
void *pt_page_marker(void *args)
{
exit(20);
}
+ if (prefault) {
+ for (i = 0; i < npages; i++) {
+ if (vastart[i * page_size] != 0) {
+ fprintf(stderr, "Prefaulting found non-zero "
+ "value in page %d: %d\n", i,
+ vastart[i * page_size]);
+ }
+ }
+ }
+
/* prepare the thread args */
for (i = 0; i < THREADS; i++) {
targs[i][0] = (void *)(long)fd;
for (i = 1; i < THREADS; i++)
page_offs[i] = page_offs[i-1] + step;
- while ((opt = getopt(argc, argv, "fw")) > 0) {
+ while ((opt = getopt(argc, argv, "fwr")) > 0) {
switch (opt) {
case 'f':
/* ignore errors */
/* use writes instead of mmap for one thread */
use_wr[0] = 1;
break;
+ case 'r':
+ /* prefault mmapped area by reading it */
+ prefault = 1;
+ break;
default:
fprintf(stderr, "ERROR: Unknown option character.\n");
exit(1);
}
if (optind != argc - 2) {
- fprintf(stderr, "ERROR: usage: holetest [-fw] "
+ fprintf(stderr, "ERROR: usage: holetest [-fwr] "
"FILENAME FILESIZEinMB\n");
exit(1);
}
--- /dev/null
+#! /bin/bash
+# FSQA Test No. 344
+#
+# Test races between mmap from racing threads when pages are prefaulted,
+# Test races between mmap and buffered writes when pages are prefaulted.
+#
+#-----------------------------------------------------------------------
+#
+# Copyright (C) 2016 SUSE Linux Products GmbH. All Rights Reserved.
+# Author: Jan Kara <jack@suse.cz>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it would be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#-----------------------------------------------------------------------
+#
+
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+tmp=/tmp/$$
+status=1 # failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+ cd /
+ rm -f $tmp.*
+}
+
+# get standard environment and checks
+. ./common/rc
+
+# real QA test starts here
+_supported_fs generic
+_supported_os Linux
+_require_scratch
+_require_test_program "holetest"
+
+rm -f $seqres.full
+
+_scratch_mkfs >>$seqres.full 2>&1
+_scratch_mount
+
+src/holetest -f -r $SCRATCH_MNT/testfile 16
+src/holetest -f -r $SCRATCH_MNT/testfile 256
+src/holetest -f -r -w $SCRATCH_MNT/testfile 16
+src/holetest -f -r -w $SCRATCH_MNT/testfile 256
+
+status=0
+exit
--- /dev/null
+QA output created by 344
+
+INFO: zero-filled test...
+INFO: sz = 16777216
+INFO: thread 0 created
+INFO: thread 1 created
+INFO: 0 error(s) detected
+
+INFO: posix_fallocate test...
+INFO: sz = 16777216
+INFO: thread 0 created
+INFO: thread 1 created
+INFO: 0 error(s) detected
+
+INFO: ftruncate test...
+INFO: sz = 16777216
+INFO: thread 0 created
+INFO: thread 1 created
+INFO: 0 error(s) detected
+
+INFO: zero-filled test...
+INFO: sz = 268435456
+INFO: thread 0 created
+INFO: thread 1 created
+INFO: 0 error(s) detected
+
+INFO: posix_fallocate test...
+INFO: sz = 268435456
+INFO: thread 0 created
+INFO: thread 1 created
+INFO: 0 error(s) detected
+
+INFO: ftruncate test...
+INFO: sz = 268435456
+INFO: thread 0 created
+INFO: thread 1 created
+INFO: 0 error(s) detected
+
+INFO: zero-filled test...
+INFO: sz = 16777216
+INFO: thread 0 created
+INFO: thread 1 created
+INFO: 0 error(s) detected
+
+INFO: posix_fallocate test...
+INFO: sz = 16777216
+INFO: thread 0 created
+INFO: thread 1 created
+INFO: 0 error(s) detected
+
+INFO: ftruncate test...
+INFO: sz = 16777216
+INFO: thread 0 created
+INFO: thread 1 created
+INFO: 0 error(s) detected
+
+INFO: zero-filled test...
+INFO: sz = 268435456
+INFO: thread 0 created
+INFO: thread 1 created
+INFO: 0 error(s) detected
+
+INFO: posix_fallocate test...
+INFO: sz = 268435456
+INFO: thread 0 created
+INFO: thread 1 created
+INFO: 0 error(s) detected
+
+INFO: ftruncate test...
+INFO: sz = 268435456
+INFO: thread 0 created
+INFO: thread 1 created
+INFO: 0 error(s) detected
341 auto quick metadata
342 auto quick metadata
343 auto quick metadata
+344 auto
346 auto
705 blockdev quick rw
706 blockdev quick rw