mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
defrag: add options to _defrag helper
Sometimes it is not easy to know number of expected extents in advance. In that case it is reasonable to provide sane MIN and MAX values. Also helper will check that number of extents before defragmentaion is not greather than after. Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:
committed by
Dave Chinner
parent
6bcae5cbe4
commit
2f87a77e0f
+93
-8
@@ -43,29 +43,114 @@ _require_defrag()
|
||||
|
||||
_extent_count()
|
||||
{
|
||||
$XFS_IO_PROG -c "fiemap" $1 | tail -n +2 | grep -v hole | wc -l
|
||||
$XFS_IO_PROG -c "fiemap" $1 >> $seqres.full 2>&1
|
||||
$XFS_IO_PROG -c "fiemap" $1 | tail -n +2 | grep -v hole | wc -l| $AWK_PROG '{print $1}'
|
||||
}
|
||||
|
||||
_check_extent_count()
|
||||
{
|
||||
min=$1
|
||||
max=$2
|
||||
ext_cnt=$3
|
||||
|
||||
[ "$min" -gt "$ext_cnt" ] && _fail "Found $ext_cnt extents min:$max"
|
||||
[ "$max" -ne -1 ] && [ "$ext_cnt" -gt "$max" ] && _fail "Found $ext_cnt max: $max"
|
||||
|
||||
if [ $max -ne $min ]; then
|
||||
echo "in_range($min, $max)"
|
||||
else
|
||||
echo "$ext_cnt"
|
||||
fi
|
||||
return $ext_cnt
|
||||
}
|
||||
|
||||
# Defrag file, check it, and remove it.
|
||||
_defrag()
|
||||
{
|
||||
min_before=0
|
||||
max_before=-1
|
||||
min_after=0
|
||||
max_after=-1
|
||||
csum=1
|
||||
mtime=1
|
||||
|
||||
while [ $# -gt 1 ]
|
||||
do
|
||||
case $1
|
||||
in
|
||||
--min_before)
|
||||
[ -z "$2" ] && _fail "missing argument for --min_before"
|
||||
min_before=$2
|
||||
shift
|
||||
;;
|
||||
--max_before)
|
||||
[ -z "$2" ] && _fail "missing argument for --max_before"
|
||||
max_before=$2
|
||||
shift
|
||||
;;
|
||||
--min_after)
|
||||
[ -z "$2" ] && _fail "missing argument for --min_after"
|
||||
min_after=$2
|
||||
shift
|
||||
;;
|
||||
--max_after)
|
||||
[ -z "$2" ] && _fail "missing argument for --max_after"
|
||||
max_after=$2
|
||||
shift
|
||||
;;
|
||||
--before)
|
||||
[ -z "$2" ] && _fail "missing argument for --before"
|
||||
min_before=$2
|
||||
max_before=$2
|
||||
shift
|
||||
;;
|
||||
--after)
|
||||
[ -z "$2" ] && _fail "missing argument for --after"
|
||||
min_after=$2
|
||||
max_after=$2
|
||||
shift
|
||||
;;
|
||||
--no_csum)
|
||||
csum=
|
||||
;;
|
||||
--no_mtime)
|
||||
mtime=
|
||||
;;
|
||||
--no_unlink)
|
||||
no_unlink=1
|
||||
;;
|
||||
*)
|
||||
_fail "invalid argument to common/dump function: $1"
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
echo -n "Before: "
|
||||
_extent_count $1
|
||||
CSUM_BEFORE=`md5sum $1`
|
||||
ext_before=$(_extent_count $1)
|
||||
_check_extent_count $min_before $max_before $ext_before
|
||||
|
||||
[ ! -z $csum ] && CSUM_BEFORE=`md5sum $1`
|
||||
STAT_BEFORE=`stat -c "a: %x m: %y c: %z" $1`
|
||||
$DEFRAG_PROG -v $1 >> $seqres.full 2>&1
|
||||
|
||||
_scratch_remount
|
||||
STAT_AFTER=`stat -c "a: %x m: %y c: %z" $1`
|
||||
CSUM_AFTER=`md5sum $1`
|
||||
[ ! -z $csum ] && CSUM_AFTER=`md5sum $1`
|
||||
|
||||
echo -n "After: "
|
||||
_extent_count $1
|
||||
if [ "$CSUM_BEFORE" != "$CSUM_AFTER" ]; then
|
||||
ext_after=$(_extent_count $1)
|
||||
_check_extent_count $min_after $max_after $ext_after
|
||||
|
||||
[ "$ext_before" -lt "$ext_after" ] && \
|
||||
_fail "Number of extents increased after defragmentation," \
|
||||
" before:$ext_before, after:$ext_after"
|
||||
if [ ! -z $csum ] && [ "$CSUM_BEFORE" != "$CSUM_AFTER" ]; then
|
||||
_fail "file checksum changed post-defrag ($CSUM_BEFORE/$CSUM_AFTER)"
|
||||
fi
|
||||
if [ "$STAT_BEFORE" != "$STAT_AFTER" ]; then
|
||||
if [ ! -z $mtime ] && [ "$STAT_BEFORE" != "$STAT_AFTER" ]; then
|
||||
_fail "file timestamps changed post-defrag:\n$STAT_BEFORE\n$STAT_AFTER"
|
||||
fi
|
||||
rm -f $1
|
||||
[ -z $no_unlink ] && rm -f $1
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user