Test how the filesystem can handle moving a directory to a different directory (so that parent pointer gets updated) while it is grown. Ext4 and UDF had a bug where if the directory got converted to a different type due to growth while rename is running, the filesystem got corrupted. Signed-off-by: Jan Kara <jack@xxxxxxx> --- tests/generic/707 | 54 +++++++++++++++++++++++++++++++++++++++++++ tests/generic/707.out | 2 ++ 2 files changed, 56 insertions(+) create mode 100755 tests/generic/707 create mode 100644 tests/generic/707.out diff --git a/tests/generic/707 b/tests/generic/707 new file mode 100755 index 000000000000..25cbb7e98a23 --- /dev/null +++ b/tests/generic/707 @@ -0,0 +1,54 @@ +#! /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 + +_supported_fs generic +_require_scratch + +_scratch_mkfs >>$seqres.full 2>&1 +_scratch_mount + +cd $SCRATCH_MNT + +# Loop multiple times trying to hit the race +loops=100 +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 + touch somewhatlongerfilename$i + done +} + +for (( i = 0; i <= $moves; i++ )); do + mkdir dir$i +done + +for (( l = 0; l < $loops; l++ )); do + mkdir dir0/dir + pushd dir0/dir &>/dev/null + create_files & + popd &>/dev/null + for (( i = 0; i < $moves; i++ )); do + mv dir$i/dir dir$((i+1))/dir + done + wait + rm -r dir$moves/dir +done + +echo "Silence is golden" +status=0 +exit diff --git a/tests/generic/707.out b/tests/generic/707.out new file mode 100644 index 000000000000..8e57a1d8c971 --- /dev/null +++ b/tests/generic/707.out @@ -0,0 +1,2 @@ +QA output created by 707 +Silence is golden -- 2.35.3