| #! /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 |