#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2023 Jan Kara, SUSE Linux.  All Rights Reserved.
#
# FS QA Test 707
#
# This is a test verifying whether the filesystem can gracefully handle
# modifying of a directory while it is being moved, in particular the cases
# where directory format changes
#
. ./common/preamble
_begin_fstest auto

_require_scratch

[ "$FSTYP" = "udf" ] && _fixed_by_kernel_commit f950fd052913 \
	"udf: Protect rename against modification of moved directory"
[[ "$FSTYP" =~ ext[0-9]+ ]] && _fixed_by_kernel_commit 0813299c586b \
	"ext4: Fix possible corruption when moving a directory"

_scratch_mkfs >>$seqres.full 2>&1
_scratch_mount

_cleanup()
{
	cd /
	rm -f $tmp.*
	if [ -n "$BGPID" ]; then
		# Stop background process
		kill -9 $BGPID &>/dev/null
		wait
	fi
}

# Loop multiple times trying to hit the race
loops=$((100*TIME_FACTOR))
files=500
moves=500

create_files()
{
	# We use slightly longer file name to make directory grow faster and
	# hopefully convert between various types
	for (( i = 0; i < $files; i++ )); do
		echo -n > somewhatlongerfilename$i
	done
}

for (( i = 0; i <= $moves; i++ )); do
	mkdir $SCRATCH_MNT/dir$i
done

start_dir=$PWD
for (( l = 0; l < $loops; l++ )); do
	mkdir $SCRATCH_MNT/dir0/dir
	cd $SCRATCH_MNT/dir0/dir
	create_files &
	BGPID=$!
	cd $start_dir
	for (( i = 0; i < $moves; i++ )); do
		mv $SCRATCH_MNT/dir$i/dir $SCRATCH_MNT/dir$((i+1))/dir
	done
	wait
	unset BGPID
	rm -r $SCRATCH_MNT/dir$moves/dir
done

echo "Silence is golden"
status=0
exit
