mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
a860a167d8
fstests only supports Linux, so get rid of this unnecessary predicate. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Eryu Guan <guaneryu@gmail.com>
170 lines
4.9 KiB
Bash
Executable File
170 lines
4.9 KiB
Bash
Executable File
#!/bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
# Copyright 2011 (C) Red Hat, Inc., Lukas Czerner <lczerner@redhat.com>
|
|
#
|
|
# FS QA Test No. 260
|
|
#
|
|
# Purpose of this test is to check FITRIM argument handling to make sure
|
|
# that the argument processing is right and that it does not overflow.
|
|
#
|
|
seq=`basename $0`
|
|
seqres=$RESULT_DIR/$seq
|
|
echo "QA output created by $seq"
|
|
|
|
here=`pwd`
|
|
tmp=/tmp/$$
|
|
status=0
|
|
trap "exit \$status" 0 1 2 3 15
|
|
chpid=0
|
|
mypid=$$
|
|
|
|
# get standard environment, filters and checks
|
|
. ./common/rc
|
|
. ./common/filter
|
|
|
|
# real QA test starts here
|
|
_supported_fs generic
|
|
_require_math
|
|
|
|
_require_scratch
|
|
_scratch_mkfs >/dev/null 2>&1
|
|
_scratch_mount
|
|
|
|
_require_batched_discard $SCRATCH_MNT
|
|
|
|
fssize=$($DF_PROG -k | grep "$SCRATCH_MNT" | grep "$SCRATCH_DEV" | awk '{print $3}')
|
|
|
|
beyond_eofs=$(_math "$fssize*2048")
|
|
max_64bit=$(_math "2^64 - 1")
|
|
|
|
# All these tests should return EINVAL
|
|
# since the start is beyond the end of
|
|
# the file system
|
|
|
|
echo "[+] Start beyond the end of fs (should fail)"
|
|
out=$($FSTRIM_PROG -o $beyond_eofs $SCRATCH_MNT 2>&1)
|
|
[ $? -eq 0 ] && status=1
|
|
echo $out | _filter_scratch
|
|
|
|
echo "[+] Start beyond the end of fs with len set (should fail)"
|
|
out=$($FSTRIM_PROG -o $beyond_eofs -l1M $SCRATCH_MNT 2>&1)
|
|
[ $? -eq 0 ] && status=1
|
|
echo $out | _filter_scratch
|
|
|
|
echo "[+] Start = 2^64-1 (should fail)"
|
|
out=$($FSTRIM_PROG -o $max_64bit $SCRATCH_MNT 2>&1)
|
|
[ $? -eq 0 ] && status=1
|
|
echo $out | _filter_scratch
|
|
|
|
echo "[+] Start = 2^64-1 and len is set (should fail)"
|
|
out=$($FSTRIM_PROG -o $max_64bit -l1M $SCRATCH_MNT 2>&1)
|
|
[ $? -eq 0 ] && status=1
|
|
echo $out | _filter_scratch
|
|
|
|
_scratch_unmount
|
|
_scratch_mkfs >/dev/null 2>&1
|
|
_scratch_mount
|
|
|
|
# All these tests should succeed
|
|
# since the length should be truncated
|
|
|
|
echo "[+] Default length (should succeed)"
|
|
$FSTRIM_PROG $SCRATCH_MNT
|
|
[ $? -ne 0 ] && status=1
|
|
echo "[+] Default length with start set (should succeed)"
|
|
$FSTRIM_PROG -o10M $SCRATCH_MNT
|
|
[ $? -ne 0 ] && status=1
|
|
echo "[+] Length beyond the end of fs (should succeed)"
|
|
$FSTRIM_PROG -l $beyond_eofs $SCRATCH_MNT
|
|
[ $? -ne 0 ] && status=1
|
|
echo "[+] Length beyond the end of fs with start set (should succeed)"
|
|
$FSTRIM_PROG -o10M -l $beyond_eofs $SCRATCH_MNT
|
|
[ $? -ne 0 ] && status=1
|
|
|
|
_scratch_unmount
|
|
_scratch_mkfs >/dev/null 2>&1
|
|
_scratch_mount
|
|
|
|
# This is a bit fuzzy, but since the file system is fresh
|
|
# there should be at least (fssize/2) free space to trim.
|
|
# This is supposed to catch wrong FITRIM argument handling
|
|
bytes=$($FSTRIM_PROG -v -o10M $SCRATCH_MNT | _filter_fstrim)
|
|
|
|
if [ $bytes -gt $(_math "$fssize*1024") ]; then
|
|
status=1
|
|
echo "After the full fs discard $bytes bytes were discarded"\
|
|
"however the file system is $(_math "$fssize*1024") bytes long."
|
|
fi
|
|
|
|
# Btrfs is special and this test does not apply to it
|
|
# It is because btrfs does not have not-yet-used parts of the device
|
|
# mapped and since we got here right after the mkfs, there is not
|
|
# enough free extents in the root tree.
|
|
if [ $bytes -le $(_math "$fssize*512") ] && [ $FSTYP != "btrfs" ]; then
|
|
status=1
|
|
echo "After the full fs discard $bytes bytes were discarded"\
|
|
"however the file system is $(_math "$fssize*1024") bytes long."
|
|
fi
|
|
|
|
# Now to catch overflows due to fsblk->allocation group number conversion
|
|
# This is different for every file system and it also apply just to some of
|
|
# them. In order to add check specific for file system you're interested in
|
|
# compute the arguments as you need and make the file system with proper
|
|
# alignment
|
|
|
|
# (2^32-1) + 2 (this is set to overflow 32bit variable by 2)
|
|
base=$(_math "2^32+1")
|
|
|
|
case $FSTYP in
|
|
ext[34])
|
|
agsize=32768
|
|
bsize=4096
|
|
start=$(_math "$base*$agsize*$bsize")
|
|
len=$start
|
|
export MKFS_OPTIONS="-F -b $bsize -g $agsize"
|
|
;;
|
|
xfs)
|
|
agsize=65538
|
|
bsize=4096
|
|
start=$(_math "$base*$agsize*$bsize")
|
|
len=$start
|
|
export MKFS_OPTIONS="-f -d agsize=$(_math "$agsize*$bsize") -b size=$bsize"
|
|
;;
|
|
*)
|
|
# (2^32-1) * 4096 * 65536 == 32bit max size * block size * ag size
|
|
start=$(_math "(2^32 - 1) * 4096 * 65536")
|
|
len=$start
|
|
;;
|
|
esac
|
|
|
|
_scratch_unmount
|
|
_scratch_mkfs >/dev/null 2>&1
|
|
_scratch_mount
|
|
# It should fail since $start is beyond the end of file system
|
|
$FSTRIM_PROG -o$start -l10M $SCRATCH_MNT &> /dev/null
|
|
if [ $? -eq 0 ]; then
|
|
status=1
|
|
echo "It seems that fs logic handling start"\
|
|
"argument overflows"
|
|
fi
|
|
|
|
_scratch_unmount
|
|
_scratch_mkfs >/dev/null 2>&1
|
|
_scratch_mount
|
|
|
|
# len should be big enough to cover the whole file system, so if the
|
|
# number of discarded bytes is smaller than file system size/2 then it
|
|
# most likely overflowed
|
|
# Btrfs is special and this test does not apply to it
|
|
# It is because btrfs does not have not-yet-used parts of the device
|
|
# mapped and since we got here right after the mkfs, there is not
|
|
# enough free extents in the root tree.
|
|
bytes=$($FSTRIM_PROG -v -l$len $SCRATCH_MNT | _filter_fstrim)
|
|
if [ $bytes -le $(_math "$fssize*512") ] && [ $FSTYP != "btrfs" ]; then
|
|
status=1
|
|
echo "It seems that fs logic handling len argument overflows"
|
|
fi
|
|
|
|
echo "Test done"
|
|
exit
|