generic/527: add additional test including a file with a hardlink
authorFilipe Manana <fdmanana@suse.com>
Mon, 3 Feb 2020 16:19:28 +0000 (16:19 +0000)
committerEryu Guan <guaneryu@gmail.com>
Sun, 9 Feb 2020 14:05:10 +0000 (22:05 +0800)
Add a similar test to the existing one but with a file that has a
hardlink as well. This is motivated by a bug found in btrfs where
a fsync on a file that has the old name of another file results
in the logging code to hit an infinite loop. The patch that fixes
the bug in btrfs has the following subject:

  "Btrfs: fix infinite loop during fsync after rename operations"

Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
tests/generic/527
tests/generic/527.out

index aacccd91b6ccbd5aecd2b9f4826c2e7dfd3f1eae..61dd4f0b1442922a220398a0ea7c5126448580bd 100755 (executable)
@@ -45,6 +45,12 @@ mkdir $SCRATCH_MNT/testdir
 echo -n "foo" > $SCRATCH_MNT/testdir/fname1
 echo -n "hello" > $SCRATCH_MNT/testdir/fname2
 
+# For a different variant of the same test but when files have hardlinks too.
+mkdir $SCRATCH_MNT/testdir2
+echo -n "foo" > $SCRATCH_MNT/testdir2/zz
+ln $SCRATCH_MNT/testdir2/zz $SCRATCH_MNT/testdir2/zz_link
+echo -n "hello" > $SCRATCH_MNT/testdir2/a
+
 # Make sure everything done so far is durably persisted.
 sync
 
@@ -57,6 +63,21 @@ ln $SCRATCH_MNT/testdir/fname3 $SCRATCH_MNT/testdir/fname2
 echo -n "bar" > $SCRATCH_MNT/testdir/fname1
 $XFS_IO_PROG -c "fsync" $SCRATCH_MNT/testdir/fname1
 
+# A second variant, more complex, that involves files with hardlinks too.
+
+# The following 3 renames are equivalent to a rename exchange (zz_link to a), but
+# without the atomicity which isn't required here.
+mv $SCRATCH_MNT/testdir2/a $SCRATCH_MNT/testdir2/tmp
+mv $SCRATCH_MNT/testdir2/zz_link $SCRATCH_MNT/testdir2/a
+mv $SCRATCH_MNT/testdir2/tmp $SCRATCH_MNT/testdir2/zz_link
+
+# The following rename and file creation are equivalent to a rename whiteout.
+mv $SCRATCH_MNT/testdir2/zz $SCRATCH_MNT/testdir2/a2
+echo -n "bar" > $SCRATCH_MNT/testdir2/zz
+
+# Fsync of zz should work and produce correct results after a power failure.
+$XFS_IO_PROG -c "fsync" $SCRATCH_MNT/testdir2/zz
+
 # Simulate a power failure and mount the filesystem to check that all file names
 # exist and correspond to the correct inodes.
 _flakey_drop_and_remount
@@ -65,6 +86,11 @@ echo "File fname1 data after power failure: $(cat $SCRATCH_MNT/testdir/fname1)"
 echo "File fname2 data after power failure: $(cat $SCRATCH_MNT/testdir/fname2)"
 echo "File fname3 data after power failure: $(cat $SCRATCH_MNT/testdir/fname3)"
 
+echo "File a data after power failure: $(cat $SCRATCH_MNT/testdir2/a)"
+echo "File a2 data after power failure: $(cat $SCRATCH_MNT/testdir2/a2)"
+echo "File zz data after power failure: $(cat $SCRATCH_MNT/testdir2/zz)"
+echo "File zz_link data after power failure: $(cat $SCRATCH_MNT/testdir2/zz_link)"
+
 _unmount_flakey
 
 status=0
index 3c34e1ff2b36bcdeb7fb265f3171fe8e7ba7131c..7397fe883b91b46c249ce09d7a38041b68b984cc 100644 (file)
@@ -2,3 +2,7 @@ QA output created by 527
 File fname1 data after power failure: bar
 File fname2 data after power failure: foo
 File fname3 data after power failure: foo
+File a data after power failure: foo
+File a2 data after power failure: foo
+File zz data after power failure: bar
+File zz_link data after power failure: hello