mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
4fbdfbe246
Currently, we call repquota to report the latest quota information after each test case. But repquota will invoke Q_SYNC on the ext4 file system with old quota, which may be time consuming on the low speed or busy scratch device. If we call repquota between the "overcome softlimit" and the "overcome hardlimit" cases, the softlimit grace time may be exceed after repquota return, and lead to test failure. Now, we capture the following failure when the disk is busy: pwrite: Disk quota exceeded Touch 3+4 Touch 5+6 +touch: cannot touch 'SCRATCH_MNT/file5': Disk quota exceeded touch: cannot touch 'SCRATCH_MNT/file6': Disk quota exceeded Touch 5 touch: cannot touch 'SCRATCH_MNT/file5': Disk quota exceeded This patch reset grace time before the "overcome hardlimit" case to avoid this failure. Signed-off-by: zhangyi (F) <yi.zhang@huawei.com> Acked-by: Jan Kara <jack@suse.cz> Signed-off-by: Eryu Guan <guaneryu@gmail.com>
146 lines
4.8 KiB
Bash
Executable File
146 lines
4.8 KiB
Bash
Executable File
#! /bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
# Copyright (c) 2010 Jan Kara. All Rights Reserved.
|
|
# Copyright (c) 2005 Silicon Graphics, Inc. All Rights Reserved.
|
|
#
|
|
# FS QA Test No. 230
|
|
#
|
|
# Simple quota enforcement test.
|
|
#
|
|
seq=`basename $0`
|
|
seqres=$RESULT_DIR/$seq
|
|
echo "QA output created by $seq"
|
|
|
|
here=`pwd`
|
|
tmp=/tmp/$$
|
|
status=1 # failure is the default!
|
|
trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15
|
|
|
|
# get standard environment, filters and checks
|
|
. ./common/rc
|
|
. ./common/filter
|
|
. ./common/quota
|
|
|
|
# real QA test starts here
|
|
_supported_fs generic
|
|
_supported_os Linux
|
|
_require_scratch
|
|
_require_quota
|
|
_require_user
|
|
|
|
test_files()
|
|
{
|
|
echo; echo "### create files, setting up ownership (type=$type)"
|
|
touch $SCRATCH_MNT/file{1,2} 2>/dev/null
|
|
chown $qa_user $SCRATCH_MNT/file{1,2} 2>/dev/null
|
|
chgrp $qa_user $SCRATCH_MNT/file{1,2} 2>/dev/null
|
|
chmod 777 $SCRATCH_MNT 2>/dev/null
|
|
}
|
|
|
|
test_enforcement()
|
|
{
|
|
echo "### some buffered IO (type=$type)"
|
|
echo "--- initiating IO..." >>$seqres.full
|
|
# Firstly fit below block soft limit
|
|
echo "Write 225 blocks..."
|
|
su $qa_user -c "$XFS_IO_PROG -c 'pwrite 0 $((225 * $BLOCK_SIZE))' -c fsync \
|
|
$SCRATCH_MNT/file1" 2>&1 >>$seqres.full | \
|
|
_filter_xfs_io_error | tee -a $seqres.full
|
|
repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seqres.full 2>&1
|
|
# Secondly overcome block soft limit
|
|
echo "Rewrite 250 blocks plus 1 byte..."
|
|
su $qa_user -c "$XFS_IO_PROG -c 'pwrite 0 $((250 * $BLOCK_SIZE + 1))' -c fsync \
|
|
$SCRATCH_MNT/file1" 2>&1 >>$seqres.full | \
|
|
_filter_xfs_io_error | tee -a $seqres.full
|
|
repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seqres.full 2>&1
|
|
# Now try to overcome block hardlimit
|
|
# Reset grace time here due to the repquota will invoke Q_SYNC on
|
|
# old quota which may be time consuming on the low speed or busy
|
|
# scratch device that may leed to grace time exceed.
|
|
setquota -$type $qa_user -T $grace $grace $SCRATCH_MNT 2>/dev/null
|
|
echo "Write 250 blocks..."
|
|
su $qa_user -c "$XFS_IO_PROG -c 'pwrite 0 $((250 * $BLOCK_SIZE))' -c fsync \
|
|
$SCRATCH_MNT/file2" 2>&1 >>$seqres.full | \
|
|
_filter_xfs_io_error | tee -a $seqres.full
|
|
repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seqres.full 2>&1
|
|
# Now sleep for grace time and check that softlimit got enforced
|
|
sleep $((grace+1))
|
|
echo "Write 1 block..."
|
|
su $qa_user -c "$XFS_IO_PROG -c 'truncate 0' -c 'pwrite 0 $BLOCK_SIZE' \
|
|
$SCRATCH_MNT/file2" 2>&1 >>$seqres.full | \
|
|
_filter_xfs_io_error | tee -a $seqres.full
|
|
repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seqres.full 2>&1
|
|
# And now the softlimit test for inodes
|
|
# First reset space limits so that we don't have problems with
|
|
# space reservations on XFS
|
|
setquota -$type $qa_user 0 0 3 5 $SCRATCH_MNT
|
|
echo "Touch 3+4"
|
|
su $qa_user -c "touch $SCRATCH_MNT/file3 $SCRATCH_MNT/file4" \
|
|
2>&1 >>$seqres.full | _filter_scratch | tee -a $seqres.full
|
|
repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seqres.full 2>&1
|
|
# Try to exceed inode hardlimit
|
|
# Reset grace time here due to the repquota will invoke Q_SYNC on
|
|
# old quota which may be time consuming on the low speed or busy
|
|
# scratch device that may leed to grace time exceed.
|
|
setquota -$type $qa_user -T $grace $grace $SCRATCH_MNT 2>/dev/null
|
|
echo "Touch 5+6"
|
|
su $qa_user -c "touch $SCRATCH_MNT/file5 $SCRATCH_MNT/file6" \
|
|
2>&1 >>$seqres.full | _filter_scratch | tee -a $seqres.full
|
|
repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seqres.full 2>&1
|
|
# Wait and check grace time enforcement
|
|
rm -f $SCRATCH_MNT/file5 >>$seqres.full 2>&1
|
|
sleep $((grace+1))
|
|
echo "Touch 5"
|
|
su $qa_user -c "touch $SCRATCH_MNT/file5" 2>&1 >>$seqres.full |
|
|
_filter_scratch | tee -a $seqres.full
|
|
repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seqres.full 2>&1
|
|
echo "--- completed IO ($type)" >>$seqres.full
|
|
}
|
|
|
|
cleanup_files()
|
|
{
|
|
rm -f $SCRATCH_MNT/file{1,2,3,4,5,6}
|
|
}
|
|
|
|
# real QA test starts here
|
|
rm -f $seqres.full
|
|
|
|
grace=2
|
|
|
|
# Test only the quota type specified in each _scratch_mount clause below.
|
|
_qmount_option 'defaults'
|
|
|
|
_scratch_mkfs >> $seqres.full 2>&1
|
|
_scratch_mount "-o usrquota,grpquota"
|
|
BLOCK_SIZE=$(_get_file_block_size $SCRATCH_MNT)
|
|
quotacheck -u -g $SCRATCH_MNT 2>/dev/null
|
|
quotaon $SCRATCH_MNT 2>/dev/null
|
|
setquota -u $qa_user $((250 * $BLOCK_SIZE / 1024)) \
|
|
$((500 * $BLOCK_SIZE / 1024)) 3 5 $SCRATCH_MNT
|
|
setquota -u -t $grace $grace $SCRATCH_MNT
|
|
setquota -g $qa_user $((250 * $BLOCK_SIZE / 1024)) \
|
|
$((500 * $BLOCK_SIZE / 1024)) 3 5 $SCRATCH_MNT
|
|
setquota -g -t $grace $grace $SCRATCH_MNT
|
|
_scratch_unmount
|
|
|
|
echo; echo "### test user limit enforcement"
|
|
_scratch_mount "-o usrquota"
|
|
quotaon $SCRATCH_MNT 2>/dev/null
|
|
type=u
|
|
test_files
|
|
test_enforcement
|
|
cleanup_files
|
|
_scratch_unmount 2>/dev/null
|
|
|
|
echo; echo "### test group limit enforcement"
|
|
_scratch_mount "-o grpquota"
|
|
quotaon $SCRATCH_MNT 2>/dev/null
|
|
type=g
|
|
test_files
|
|
test_enforcement
|
|
cleanup_files
|
|
_scratch_unmount 2>/dev/null
|
|
|
|
status=0
|
|
exit
|