Files
apfstests/tests/overlay/046
T
zhangyi (F) 2815cda6ac overlay: fix exit code for some fsck.overlay valid cases
Some valid test cases about fsck.overlay may be not valid enough now,
they lose the impure xattr on the parent directory of the simluated
redirect directory, and lose the whiteout which use to cover the origin
lower object. Then fsck.overlay will fix these two inconsistency which
are not those test cases want to cover, thus it will lead to
fsck.overlay return FSCK_NONDESTRUCT instead of FSCK_OK. Fix these by
complement the missing overlay related features.

Signed-off-by: zhangyi (F) <yi.zhang@huawei.com>
Reviewed-by: Eryu Guan <guaneryu@gmail.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
2019-06-02 15:48:31 +08:00

252 lines
6.7 KiB
Bash
Executable File

#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2018 Huawei. All Rights Reserved.
#
# FS QA Test No. 046
#
# Test fsck.overlay how to deal with redirect xattr in overlayfs.
#
seq=`basename $0`
seqres=$RESULT_DIR/$seq
echo "QA output created by $seq"
here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default!
trap "_cleanup; exit \$status" 0 1 2 3 15
_cleanup()
{
cd /
rm -f $tmp.*
}
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
. ./common/attr
# remove previous $seqres.full before test
rm -f $seqres.full
# real QA test starts here
_supported_fs overlay
_supported_os Linux
_require_scratch_nocheck
_require_attrs
_require_command "$FSCK_OVERLAY_PROG" fsck.overlay
# remove all files from previous tests
_scratch_mkfs
OVL_XATTR_OPAQUE_VAL=y
OVL_XATTR_IMPURE_VAL=y
# Create impure directories
make_impure_dir()
{
for dir in $*; do
mkdir -p $dir
$SETFATTR_PROG -n $OVL_XATTR_IMPURE -v $OVL_XATTR_IMPURE_VAL $dir
done
}
# Create a redirect directory
make_redirect_dir()
{
local target=$1
local value=$2
mkdir -p $target
$SETFATTR_PROG -n $OVL_XATTR_REDIRECT -v $value $target
}
# Check redirect xattr
check_redirect()
{
local target=$1
local expect=$2
value=$(_getfattr --absolute-names --only-values -n \
$OVL_XATTR_REDIRECT $target)
[[ "$value" == "$expect" ]] || echo "Redirect xattr incorrect"
}
check_no_redirect()
{
local target=$1
value=$(_getfattr --absolute-names -d -m \
$OVL_XATTR_REDIRECT $target)
[[ -z "$value" ]] || echo "Redirect xattr not empty"
}
# Check opaque xattr
check_opaque()
{
local target=$1
value=$(_getfattr --absolute-names --only-values -n \
$OVL_XATTR_OPAQUE $target)
[[ "$value" == "$OVL_XATTR_OPAQUE_VAL" ]] || \
echo "Opaque xattr incorrect"
}
# Create a whiteout
make_whiteout()
{
for arg in $*; do
mknod $arg c 0 0
done
}
# Check whiteout
check_whiteout()
{
for arg in $*; do
local ttype=`stat -c "%F:%t,%T" $arg`
[[ "$ttype" == "character special file:0,0" ]] || \
echo "Valid whiteout removed incorrectly"
done
}
# Create test directories
lowerdir=$OVL_BASE_SCRATCH_MNT/lower
lowerdir2=$OVL_BASE_SCRATCH_MNT/lower2
upperdir=$OVL_BASE_SCRATCH_MNT/upper
workdir=$OVL_BASE_SCRATCH_MNT/workdir
make_test_dirs()
{
rm -rf $lowerdir $lowerdir2 $upperdir $workdir
mkdir -p $lowerdir $lowerdir2 $upperdir $workdir
}
# Test invalid redirect xattr point to a nonexistent origin, should remove
echo "+ Invalid redirect"
make_test_dirs
make_redirect_dir $upperdir/testdir "invalid"
_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
echo "+ Invalid redirect(2)"
make_test_dirs
touch $lowerdir/origin
make_redirect_dir $upperdir/testdir "origin"
_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,
# should not remove
echo "+ Valid redirect"
make_test_dirs
mkdir $lowerdir/origin
make_whiteout $upperdir/origin
make_redirect_dir $upperdir/testdir "origin"
make_impure_dir $upperdir
_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
# should not remove
echo "+ Valid redirect(2)"
make_test_dirs
mkdir $lowerdir/origin
make_whiteout $upperdir/origin
make_redirect_dir $upperdir/testdir1/testdir2 "/origin"
make_impure_dir $upperdir/testdir1
_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,
# should fix whiteout
echo "+ Missing whiteout"
make_test_dirs
mkdir $lowerdir/origin
make_redirect_dir $upperdir/testdir "origin"
_overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -p
check_redirect $upperdir/testdir "origin"
check_whiteout $upperdir/origin
# Test valid redirect xattrs exchanged by rename, should not remove
echo "+ Valid redirect(3)"
make_test_dirs
mkdir $lowerdir/{testdir1,testdir2}
make_redirect_dir $upperdir/testdir1 "testdir2"
make_redirect_dir $upperdir/testdir2 "testdir1"
make_impure_dir $upperdir
_overlay_fsck_expect $FSCK_OK $lowerdir $upperdir $workdir -p
check_redirect $upperdir/testdir1 "testdir2"
check_redirect $upperdir/testdir2 "testdir1"
# Test invalid redirect xattr with lower same name directory exists,
# should remove invalid redirect xattr and set opaque in yes mode
echo "+ Invalid redirect(3)"
make_test_dirs
mkdir $lowerdir/testdir
make_redirect_dir $upperdir/testdir "invalid"
# Question get yes answer: Should set opaque dir ?
_overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -y
check_no_redirect $upperdir/testdir
check_opaque $upperdir/testdir
# Test duplicate redirect xattrs point to one origin, should fail in
# auto mode, and should remove either of the duplicates in yes mode
echo "+ Duplicate redirect"
make_test_dirs
mkdir $lowerdir2/origin
make_redirect_dir $lowerdir/testdir1 "origin"
make_redirect_dir $lowerdir/testdir2 "origin"
make_redirect_dir $upperdir/testdir3 "origin"
_overlay_fsck_expect $FSCK_UNCORRECTED "$lowerdir:$lowerdir2" $upperdir $workdir -p
# Question get yes answer: Duplicate redirect directory, remove xattr ?
_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"
check_no_redirect $upperdir/testdir3
# Test duplicate redirect xattr duplicate with merge directory, should
# fail in auto mode, and should remove the redirect xattr in yes mode
echo "+ Duplicate redirect(2)"
make_test_dirs
mkdir $lowerdir/origin $upperdir/origin
make_redirect_dir $upperdir/testdir "origin"
_overlay_fsck_expect $FSCK_UNCORRECTED $lowerdir $upperdir $workdir -p
# Question get yes answer: Duplicate redirect directory, remove xattr ?
_overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -y
check_no_redirect $upperdir/testdir
# Test duplicate redirect xattr with lower same name directory exists,
# should remove the duplicate redirect xattr and set opaque in yes mode
echo "+ Duplicate redirect(3)"
make_test_dirs
mkdir $lowerdir/{origin,testdir} $upperdir/origin
make_redirect_dir $upperdir/testdir "invalid"
# Question one get yes answer: Duplicate redirect directory, remove xattr?
# Question two get yes answer: Should set opaque dir ?
_overlay_fsck_expect $FSCK_NONDESTRUCT $lowerdir $upperdir $workdir -y
check_no_redirect $upperdir/testdir
check_opaque $upperdir/testdir
# success, all done
status=0
exit