From 388144a0499cb9d07f1600093a356bb4bba773ed Mon Sep 17 00:00:00 2001 From: Lachlan McIlroy Date: Fri, 19 Nov 2010 10:17:34 -0600 Subject: [PATCH] xfstests 247: Test for race between direct I/O and mmap A customer reported a problem: If a process is using mmap to write to a file on an ext4 filesystem while another process is using direct I/O to write to the same file the first thread may receive a SIGBUS during a page fault. A SIGBUS occurs if the page fault tries to access a page that is entirely beyond the end of the file but in this test case that should not be happening. Signed-off-by: Lachlan McIlroy Signed-off-by: Eric Sandeen Reviewed-by: Dave Chinner --- 247 | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 247.out | 2 ++ group | 1 + 3 files changed, 83 insertions(+) create mode 100644 247 create mode 100644 247.out diff --git a/247 b/247 new file mode 100644 index 00000000..91410b61 --- /dev/null +++ b/247 @@ -0,0 +1,80 @@ +#! /bin/bash +# FS QA Test No. 247 +# +# Test for race between direct I/O and mmap +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 Red Hat, Inc. All Rights Reserved. +# +# 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 +#----------------------------------------------------------------------- +# +# creator +owner=lmcilroy@redhat.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 7 15 + +_cleanup() +{ + cd / + rm -f $tmp.* $testfile + wait +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here + +# Modify as appropriate. +_supported_fs generic +_supported_os Linux + +testfile=$TEST_DIR/$seq.$$ + +loops=500 +iosize=1048576 + +# Initialise file +dd if=/dev/zero of=$testfile bs=$iosize count=$loops &> /dev/null +[ $? -ne 0 ] && exit +sync + +# Direct I/O overwriter +dd if=/dev/zero of=$testfile oflag=direct bs=$iosize count=$loops conv=notrunc &> /dev/null & +[ $? -ne 0 ] && exit + +# Mmap writer +start=`expr $loops - 1` +for i in `seq $start -1 0` +do + offset=`expr $i \* $iosize` + $XFS_IO_PROG -F -f -c "mmap -w $offset $iosize" -c "mwrite $offset $iosize" $testfile + [ $? -ne 0 ] && exit +done + +wait + +echo "Silence is golden." + +# success, all done +status=0 +exit diff --git a/247.out b/247.out new file mode 100644 index 00000000..356bfbd5 --- /dev/null +++ b/247.out @@ -0,0 +1,2 @@ +QA output created by 247 +Silence is golden. diff --git a/group b/group index 25f5ad63..0f94dd9b 100644 --- a/group +++ b/group @@ -360,3 +360,4 @@ deprecated 244 auto quota quick 245 auto quick dir 246 auto quick rw +247 auto quick rw -- 2.47.3