-o workdir=$workdir $*
}
+# Run fsck and check for expected return value
+_overlay_fsck_expect()
+{
+ # The first arguments is the expected fsck program exit code, the
+ # remaining arguments are the input parameters of the fsck program.
+ local expect_ret=$1
+ local lowerdir=$2
+ local upperdir=$3
+ local workdir=$4
+ shift 4
+
+ _overlay_fsck_dirs $lowerdir $upperdir $workdir $* >> \
+ $seqres.full 2>&1
+ fsck_ret=$?
+
+ [[ "$fsck_ret" == "$expect_ret" ]] || \
+ echo "expect fsck.overlay to return $expect_ret, but got $fsck_ret"
+}
+
_overlay_check_dirs()
{
local lowerdir=$1
make_test_dirs
make_whiteout $lowerdir/foo $upperdir/{foo,bar}
-_overlay_fsck_dirs $lowerdir $upperdir $workdir -p >> $seqres.full 2>&1 || \
- echo "fsck should not fail"
+_overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
ls $lowerdir
ls $upperdir
touch $lowerdir2/{foo,bar}
make_whiteout $upperdir/foo $lowerdir/bar
-_overlay_fsck_dirs "$lowerdir:$lowerdir2" $upperdir $workdir -p >> \
- $seqres.full 2>&1 || echo "fsck should not fail"
+_overlay_fsck_expect $FSCK_OK "$lowerdir:$lowerdir2" $upperdir $workdir -p
check_whiteout $upperdir/foo $lowerdir/bar
# Test orphan whiteout in opaque directory, should remove
make_opaque_dir $upperdir/testdir
make_whiteout $upperdir/testdir/foo
-_overlay_fsck_dirs $lowerdir $upperdir $workdir -p >> $seqres.full 2>&1 || \
- echo "fsck should not fail"
+_overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
ls $upperdir/testdir
# Test orphan whiteout whose parent path is not an merged directory,
make_opaque_dir $lowerdir/testdir3
make_whiteout $upperdir/{testdir1/foo,/testdir2/foo,testdir3/foo,testdir4/foo}
-_overlay_fsck_dirs "$lowerdir:$lowerdir2" $upperdir $workdir -p >> \
- $seqres.full 2>&1 || echo "fsck should not fail"
+_overlay_fsck_expect $FSCK_NONDESTRUCT "$lowerdir:$lowerdir2" $upperdir $workdir -p
ls $upperdir/testdir1
ls $upperdir/testdir2
ls $upperdir/testdir3
make_redirect_dir $upperdir/testdir "origin"
make_whiteout $upperdir/testdir/foo
-_overlay_fsck_dirs $lowerdir $upperdir $workdir -p >> $seqres.full 2>&1 || \
- echo "fsck should not fail"
+_overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
ls $upperdir/testdir
# Test valid whiteout in redirect directory cover file in lower
make_redirect_dir $upperdir/testdir "origin"
make_whiteout $upperdir/testdir/foo
-_overlay_fsck_dirs $lowerdir $upperdir $workdir -p >> $seqres.full 2>&1 || \
- echo "fsck should not fail"
+_overlay_fsck_expect $FSCK_OK $lowerdir $upperdir $workdir -p
check_whiteout $upperdir/testdir/foo
# Test valid whiteout covering lower target whose parent directory
mkdir -p $upperdir/testdir/subdir
make_whiteout $upperdir/testdir/subdir/foo
-_overlay_fsck_dirs "$lowerdir:$lowerdir2" $upperdir $workdir -p \
- >> $seqres.full 2>&1 || echo "fsck should not fail"
+_overlay_fsck_expect $FSCK_OK "$lowerdir:$lowerdir2" $upperdir $workdir -p
check_whiteout $upperdir/testdir/subdir/foo
# Test invalid whiteout in opaque subdirectory in a redirect directory,
make_opaque_dir $upperdir/testdir/subdir
make_whiteout $upperdir/testdir/subdir/foo
-_overlay_fsck_dirs $lowerdir $upperdir $workdir -p >> $seqres.full 2>&1 || \
- echo "fsck should not fail"
+_overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
ls $upperdir/testdir/subdir
# Test valid whiteout in reidrect subdirectory in a opaque directory
make_redirect_dir $upperdir/testdir/subdir "/origin"
make_whiteout $upperdir/testdir/subdir/foo
-_overlay_fsck_dirs $lowerdir $upperdir $workdir -p >> $seqres.full 2>&1 || \
- echo "fsck should not fail"
+_overlay_fsck_expect $FSCK_OK $lowerdir $upperdir $workdir -p
check_whiteout $upperdir/testdir/subdir/foo
# success, all done
make_test_dirs
make_redirect_dir $upperdir/testdir "invalid"
-_overlay_fsck_dirs $lowerdir $upperdir $workdir -p >> $seqres.full 2>&1 || \
- echo "fsck should not fail"
+_overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
check_no_redirect $upperdir/testdir
# Test invalid redirect xattr point to a file origin, should remove
touch $lowerdir/origin
make_redirect_dir $upperdir/testdir "origin"
-_overlay_fsck_dirs $lowerdir $upperdir $workdir -p >> $seqres.full 2>&1 || \
- echo "fsck should not fail"
+_overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
check_no_redirect $upperdir/testdir
# Test valid redirect xattr point to a directory origin in the same directory,
make_whiteout $upperdir/origin
make_redirect_dir $upperdir/testdir "origin"
-_overlay_fsck_dirs $lowerdir $upperdir $workdir -p >> $seqres.full 2>&1 || \
- echo "fsck should not fail"
+_overlay_fsck_expect $FSCK_OK $lowerdir $upperdir $workdir -p
check_redirect $upperdir/testdir "origin"
# Test valid redirect xattr point to a directory origin in different directories
make_whiteout $upperdir/origin
make_redirect_dir $upperdir/testdir1/testdir2 "/origin"
-_overlay_fsck_dirs $lowerdir $upperdir $workdir -p >> $seqres.full 2>&1 || \
- echo "fsck should not fail"
+_overlay_fsck_expect $FSCK_OK $lowerdir $upperdir $workdir -p
check_redirect $upperdir/testdir1/testdir2 "/origin"
# Test valid redirect xattr but missing whiteout to cover lower target,
mkdir $lowerdir/origin
make_redirect_dir $upperdir/testdir "origin"
-_overlay_fsck_dirs $lowerdir $upperdir $workdir -p >> $seqres.full 2>&1 || \
- echo "fsck should not fail"
+_overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
check_redirect $upperdir/testdir "origin"
check_whiteout $upperdir/origin
make_redirect_dir $upperdir/testdir1 "testdir2"
make_redirect_dir $upperdir/testdir2 "testdir1"
-_overlay_fsck_dirs $lowerdir $upperdir $workdir -p >> $seqres.full 2>&1 || \
- echo "fsck should not fail"
+_overlay_fsck_expect $FSCK_OK $lowerdir $upperdir $workdir -p
check_redirect $upperdir/testdir1 "testdir2"
check_redirect $upperdir/testdir2 "testdir1"
make_redirect_dir $upperdir/testdir "invalid"
# Question get yes answer: Should set opaque dir ?
-_overlay_fsck_dirs $lowerdir $upperdir $workdir -y >> $seqres.full 2>&1 || \
- echo "fsck should not fail"
+_overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -y
check_no_redirect $upperdir/testdir
check_opaque $upperdir/testdir
make_redirect_dir $lowerdir/testdir2 "origin"
make_redirect_dir $upperdir/testdir3 "origin"
-_overlay_fsck_dirs "$lowerdir:$lowerdir2" $upperdir $workdir -p >> \
- $seqres.full 2>&1 && echo "fsck should fail"
+_overlay_fsck_expect $FSCK_UNCORRECTED "$lowerdir:$lowerdir2" $upperdir $workdir -p
# Question get yes answer: Duplicate redirect directory, remove xattr ?
-_overlay_fsck_dirs "$lowerdir:$lowerdir2" $upperdir $workdir -y >> \
- $seqres.full 2>&1 || echo "fsck should not fail"
+_overlay_fsck_expect $FSCK_NONDESTRUCT "$lowerdir:$lowerdir2" $upperdir $workdir -y
redirect_1=`check_redirect $lowerdir/testdir1 "origin" 2>/dev/null`
redirect_2=`check_redirect $lowerdir/testdir2 "origin" 2>/dev/null`
[[ $redirect_1 == $redirect_2 ]] && echo "Redirect xattr incorrect"
mkdir $lowerdir/origin $upperdir/origin
make_redirect_dir $upperdir/testdir "origin"
-_overlay_fsck_dirs $lowerdir $upperdir $workdir -p >> $seqres.full 2>&1 && \
- echo "fsck should fail"
+_overlay_fsck_expect $FSCK_UNCORRECTED $lowerdir $upperdir $workdir -p
# Question get yes answer: Duplicate redirect directory, remove xattr ?
-_overlay_fsck_dirs $lowerdir $upperdir $workdir -y >> $seqres.full 2>&1 || \
- echo "fsck should not fail"
+_overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -y
check_no_redirect $upperdir/testdir
# Test duplicate redirect xattr with lower same name directory exists,
# Question one get yes answer: Duplicate redirect directory, remove xattr?
# Question two get yes answer: Should set opaque dir ?
-_overlay_fsck_dirs $lowerdir $upperdir $workdir -y >> $seqres.full 2>&1 || \
- echo "fsck should not fail"
+_overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -y
check_no_redirect $upperdir/testdir
check_opaque $upperdir/testdir
remove_impure $upperdir/testdir1
remove_impure $upperdir/testdir2
-_overlay_fsck_dirs $lowerdir $upperdir $workdir -p >> $seqres.full 2>&1 || \
- echo "fsck should not fail"
+_overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
check_impure $upperdir/testdir1
check_impure $upperdir/testdir2
mkdir $lowerdir/origin
make_redirect_dir $upperdir/testdir/subdir "/origin"
-_overlay_fsck_dirs $lowerdir $upperdir $workdir -p >> $seqres.full 2>&1 || \
- echo "fsck should not fail"
+_overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
check_impure $upperdir/testdir
# Test missing impure xattr in directory which has merge directories,
make_test_dirs
mkdir $lowerdir/testdir $upperdir/testdir
-_overlay_fsck_dirs $lowerdir $upperdir $workdir -p >> $seqres.full 2>&1 || \
- echo "fsck should not fail"
+_overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
check_impure $upperdir
# success, all done