2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (c) 2018 The University of Texas at Austin. All Rights Reserved.
7 # Test case created by CrashMonkey
9 # Test if we create a hard link to a file and persist either of the files, all
13 seqres=$RESULT_DIR/$seq
14 echo "QA output created by $seq"
18 status=1 # failure is the default!
19 trap "_cleanup; exit \$status" 0 1 2 3 15
28 # get standard environment, filters and checks
34 fssize=$((2**20 * 256))
36 # remove previous $seqres.full before test
39 # real QA test starts here
42 _require_scratch_nocheck
43 _require_dm_target flakey
45 # initialize scratch device
46 _scratch_mkfs_sized $fssize >> $seqres.full 2>&1
47 _require_metadata_journaling $SCRATCH_DEV
50 stat_opt='-c "blocks: %b size: %s inode: %i links: %h"'
55 # Using _scratch_mkfs instead of cleaning up the working directory,
56 # adds about 10 seconds of delay in total for the 37 tests.
67 _flakey_drop_and_remount
70 after=`stat "$stat_opt" $1`
73 if [ "$before" != "$after" ] && [ $2 -ne 1 ]; then
74 echo "Before: $before"
79 _check_scratch_fs $FLAKEY_DEV
82 # create a hard link $2 to file $1, and fsync $3, followed by power-cut
86 local src=$SCRATCH_MNT/$1
87 local dest=$SCRATCH_MNT/$2
91 if [ "$3" == "./" ]; then
97 echo -ne "\n=== link $src $dest with fsync $fsync ===\n" | \
101 # Now execute the workload
102 # Create the directory in which the source and destination files
105 mkdir -p "${dest%/*}"
109 # If the file being persisted is a sibling, create it first
110 if [ ! -f $fsync ]; then
115 $XFS_IO_PROG -c "fsync" $fsync
117 if [ $sibling -ne 1 ]; then
118 before=`stat "$stat_opt" $src`
121 check_consistency $src $sibling
125 # create a hard link $2 to file $1, and sync, followed by power-cut
128 local src=$SCRATCH_MNT/$1
129 local dest=$SCRATCH_MNT/$2
132 echo -ne "\n=== link $src $dest with sync ===\n" | _filter_scratch
135 # now execute the workload
136 # Create the directory in which the source and destination files
139 mkdir -p "${dest%/*}"
143 before=`stat "$stat_opt" $src`
145 check_consistency $src 0
150 # Create different combinations to run the link test
151 # Group 0: Both files within root directory
152 file_names[0]="foo bar"
153 fsync_names[0]="./ foo bar"
155 # Group 1: Create hard link in a sub directory
156 file_names[1]="foo A/bar"
157 fsync_names[1]="./ foo bar A A/bar A/foo"
159 # Group 2: Create hard link in parent directory
160 file_names[2]="A/foo bar"
161 fsync_names[2]="./ foo bar A A/bar A/foo"
163 # Group 3: Both files within a directory other than root
164 file_names[3]="A/foo A/bar"
165 fsync_names[3]="./ A A/bar A/foo"
167 #Group 4: Exercise name reuse : Link file in sub-directory
168 file_names[4]="bar A/bar"
169 fsync_names[4]="./ foo bar A A/bar A/foo"
171 #Group 5: Exercise name reuse : Link file in parent directory
172 file_names[5]="A/bar bar"
173 fsync_names[5]="./ foo bar A A/bar A/foo"
175 for ((test_group = 0; test_group < 6; test_group++)); do
176 for file in ${fsync_names[$test_group]}; do
177 test_link_fsync ${file_names[$test_group]} $file
179 test_link_sync ${file_names[$test_group]}