blob: f2523fca27f265d58ab5838041a6e01d6bfca19d [file] [log] [blame]
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2018 The University of Texas at Austin. All Rights Reserved.
#
# FS QA Test 520
#
# Test case created by CrashMonkey
#
# Test if we create a hard link to a file and persist either of the files, all
# the names persist.
#
. ./common/preamble
_begin_fstest auto quick log
# Override the default cleanup function.
_cleanup()
{
_cleanup_flakey
cd /
rm -f $tmp.*
}
# Import common functions.
. ./common/filter
. ./common/dmflakey
# 256MB in byte
fssize=$((2**20 * 256))
_require_scratch_nocheck
_require_dm_target flakey
# initialize scratch device
_scratch_mkfs_sized $fssize >> $seqres.full 2>&1
_require_metadata_journaling $SCRATCH_DEV
_init_flakey
stat_opt='-c "blocks: %b size: %s inode: %i links: %h"'
before=""
after=""
# Using _scratch_mkfs instead of cleaning up the working directory,
# adds about 10 seconds of delay in total for the 37 tests.
clean_dir()
{
_mount_flakey
rm -rf $(find $SCRATCH_MNT/* | grep -v "lost+found")
_unmount_flakey
}
check_consistency()
{
_flakey_drop_and_remount
if [ -f $1 ]; then
after=`stat "$stat_opt" $1`
fi
if [ "$before" != "$after" ] && [ $2 -ne 1 ]; then
echo "Before: $before"
echo "After: $after"
fi
_unmount_flakey
_check_scratch_fs $FLAKEY_DEV
}
# create a hard link $2 to file $1, and fsync $3, followed by power-cut
test_link_fsync()
{
local sibling=0
local src=$SCRATCH_MNT/$1
local dest=$SCRATCH_MNT/$2
before=""
after=""
if [ "$3" == "./" ]; then
fsync=$SCRATCH_MNT
else
fsync=$SCRATCH_MNT/$3
fi
echo -ne "\n=== link $src $dest with fsync $fsync ===\n" | \
_filter_scratch
_mount_flakey
# Now execute the workload
# Create the directory in which the source and destination files
# will be created
mkdir -p "${src%/*}"
mkdir -p "${dest%/*}"
touch $src
ln $src $dest
# If the file being persisted is a sibling, create it first
if [ ! -f $fsync ]; then
sibling=1
touch $fsync
fi
$XFS_IO_PROG -c "fsync" $fsync
if [ $sibling -ne 1 ]; then
before=`stat "$stat_opt" $src`
fi
check_consistency $src $sibling
clean_dir
}
# create a hard link $2 to file $1, and sync, followed by power-cut
test_link_sync()
{
local src=$SCRATCH_MNT/$1
local dest=$SCRATCH_MNT/$2
before=""
after=""
echo -ne "\n=== link $src $dest with sync ===\n" | _filter_scratch
_mount_flakey
# now execute the workload
# Create the directory in which the source and destination files
# will be created
mkdir -p "${src%/*}"
mkdir -p "${dest%/*}"
touch $src
ln $src $dest
_scratch_sync
before=`stat "$stat_opt" $src`
check_consistency $src 0
clean_dir
}
# Create different combinations to run the link test
# Group 0: Both files within root directory
file_names[0]="foo bar"
fsync_names[0]="./ foo bar"
# Group 1: Create hard link in a sub directory
file_names[1]="foo A/bar"
fsync_names[1]="./ foo bar A A/bar A/foo"
# Group 2: Create hard link in parent directory
file_names[2]="A/foo bar"
fsync_names[2]="./ foo bar A A/bar A/foo"
# Group 3: Both files within a directory other than root
file_names[3]="A/foo A/bar"
fsync_names[3]="./ A A/bar A/foo"
#Group 4: Exercise name reuse : Link file in sub-directory
file_names[4]="bar A/bar"
fsync_names[4]="./ foo bar A A/bar A/foo"
#Group 5: Exercise name reuse : Link file in parent directory
file_names[5]="A/bar bar"
fsync_names[5]="./ foo bar A A/bar A/foo"
for ((test_group = 0; test_group < 6; test_group++)); do
for file in ${fsync_names[$test_group]}; do
test_link_fsync ${file_names[$test_group]} $file
done
test_link_sync ${file_names[$test_group]}
done
# success, all done
status=0
exit