From: Filipe Manana Date: Tue, 4 Aug 2015 04:10:49 +0000 (+1000) Subject: generic: test for fsync after adding hard links X-Git-Tag: v2022.05.01~2837 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=5b415d2be5a178632a33cd6ef54eeec85b08e6d8;p=xfstests-dev.git generic: test for fsync after adding hard links Test that if we add hard links (in the same directory) to two files and then fsync only one of the files, after the fsync log/journal is replayed all the links exist and the filesystem metadata (directory and file inodes) is in a consistent state. This test is motivated by a bug found in btrfs that is fixed by linux kernel patch titled: "Btrfs: fix stale directory entries after fsync log replay" Verified against ext3/4, xfs, f2fs and reiserfs on a 4.1 linux kernel. Signed-off-by: Filipe Manana Reviewed-by: Eryu Guan Signed-off-by: Dave Chinner --- diff --git a/tests/generic/104 b/tests/generic/104 new file mode 100755 index 00000000..eeb7363f --- /dev/null +++ b/tests/generic/104 @@ -0,0 +1,99 @@ +#! /bin/bash +# FSQA Test No. 104 +# +# Test that if we add hard links (in the same directory) to two files and then +# fsync only one of the files, after the fsync log/journal is replayed all the +# links exist and the filesystem metadata (directory and file inodes) is in a +# consistent state. +# +#----------------------------------------------------------------------- +# +# Copyright (C) 2015 SUSE Linux Products GmbH. All Rights Reserved. +# Author: Filipe Manana +# +# 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() +{ + _cleanup_flakey + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/dmflakey + +# real QA test starts here +_need_to_be_root +_supported_fs generic +_supported_os Linux +_require_scratch +_require_dm_flakey +_require_metadata_journaling $SCRATCH_DEV + +rm -f $seqres.full + +_scratch_mkfs >>$seqres.full 2>&1 +_init_flakey +_mount_flakey + +# Create our test directory and files. +mkdir $SCRATCH_MNT/testdir +touch $SCRATCH_MNT/testdir/foo +touch $SCRATCH_MNT/testdir/bar + +# Make sure everything done so far is durably persisted. +sync + +# Create one hard link for file foo and another one for file bar. After that +# fsync only the file bar. +ln $SCRATCH_MNT/testdir/bar $SCRATCH_MNT/testdir/bar_link +ln $SCRATCH_MNT/testdir/foo $SCRATCH_MNT/testdir/foo_link +$XFS_IO_PROG -c "fsync" $SCRATCH_MNT/testdir/bar + +# Silently drop all writes on our scratch device to simulate a power failure. +_load_flakey_table $FLAKEY_DROP_WRITES +_unmount_flakey + +# Allow writes again and mount the fs to trigger log/journal replay. +_load_flakey_table $FLAKEY_ALLOW_WRITES +_mount_flakey + +# Now verify both our files have a link count of 2. +echo "Link count for file foo: $(stat --format=%h $SCRATCH_MNT/testdir/foo)" +echo "Link count for file bar: $(stat --format=%h $SCRATCH_MNT/testdir/bar)" + +# We should be able to remove all the links of our files in testdir, and after +# that the parent directory should become empty and therefore possible to +# remove it. +rm -f $SCRATCH_MNT/testdir/* +rmdir $SCRATCH_MNT/testdir + +_unmount_flakey + +# The fstests framework will call fsck against our filesystem which will verify +# that all metadata is in a consistent state. + +status=0 +exit diff --git a/tests/generic/104.out b/tests/generic/104.out new file mode 100644 index 00000000..55e485fe --- /dev/null +++ b/tests/generic/104.out @@ -0,0 +1,3 @@ +QA output created by 104 +Link count for file foo: 2 +Link count for file bar: 2 diff --git a/tests/generic/group b/tests/generic/group index 9da394e0..bb623d4f 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -106,6 +106,7 @@ 101 auto quick metadata 102 auto rw 103 auto enospc quick +104 auto quick metadata 105 acl auto quick 112 rw aio auto quick 113 rw aio auto quick