From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx1.redhat.com ([209.132.183.28]:29723 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752624AbdJ0Mzs (ORCPT ); Fri, 27 Oct 2017 08:55:48 -0400 From: Eryu Guan Subject: [PATCH 2/2] generic: ensure that mmap read doesn't see non-zero past EOF Date: Fri, 27 Oct 2017 20:53:57 +0800 Message-Id: <20171027125357.25222-2-eguan@redhat.com> In-Reply-To: <20171027125357.25222-1-eguan@redhat.com> References: <20171027125357.25222-1-eguan@redhat.com> Sender: linux-xfs-owner@vger.kernel.org List-ID: List-Id: xfs To: fstests@vger.kernel.org Cc: linux-xfs@vger.kernel.org, Eryu Guan >>From mmap(2) manpage, "a file is mapped in multiples of the page size. For a file that is not a multiple of the page size, the remaining memory is zeroed when mapped", this test is to test this behavior. This is inspired by an XFS bug that truncate down fails to zero partial block beyond new EOF because it sees unwritten extent and skipped zeroing wrongly. But the fact is the unwritten extent has been overwritten by a buffer write, just hasn't been converted to real allocation yet. Signed-off-by: Eryu Guan --- tests/generic/466 | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/466.out | 9 ++++ tests/generic/group | 1 + 3 files changed, 131 insertions(+) create mode 100755 tests/generic/466 create mode 100644 tests/generic/466.out diff --git a/tests/generic/466 b/tests/generic/466 new file mode 100755 index 000000000000..0c67bbd27484 --- /dev/null +++ b/tests/generic/466 @@ -0,0 +1,121 @@ +#! /bin/bash +# FS QA Test 466 +# +# Test that mmap read doesn't see non-zero data past EOF. +# +# This is inspired by an XFS bug that truncate down fails to zero partial block +# beyond new EOF because it sees unwritten extent and skipped zeroing wrongly. +# But the fact is the unwritten extent has been overwritten by a buffer write, +# just hasn't been converted to real allocation yet. +# +#----------------------------------------------------------------------- +# Copyright (c) 2017 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 +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +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, filters and checks +. ./common/rc +. ./common/filter + +# remove previous $seqres.full before test +rm -f $seqres.full + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_require_test + +# run fsx with and without fsync(2) after write to get more coverage +do_fsx() +{ + echo "fsx --replay-ops ${1#*.}" + run_fsx --replay-ops $1 >>$seqres.full + echo "fsx -y --replay-ops ${1#*.}" + run_fsx -y --replay-ops $1 >>$seqres.full +} + +# simplified fsx operations that work on small and not blocksize-aligned +# offsets, so filesystems with small block size could reproduce too +cat >$tmp.fsxops.0 <$tmp.fsxops.1 <$tmp.fsxops.2 <$tmp.fsxops.3 <