#! /bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (c) 2018 Oracle, Inc. All Rights Reserved. # # FS QA Test No. 442 # # Force enable all XFS quotas, run fsstress until the fs runs out of # space, and make sure the quotas are still correct when we're done. # This is a general regression/stress test for numerous quota bugs with # reflink and copy on write. # . ./common/preamble _begin_fstest auto stress clone quota # Override the default cleanup function. _cleanup() { cd / rm -f $tmp.* $KILLALL_PROG -9 fsstress > /dev/null 2>&1 } # Import common functions. . ./common/quota . ./common/filter . ./common/reflink # Modify as appropriate. _supported_fs xfs _require_scratch_reflink _require_quota _require_command "$KILLALL_PROG" "killall" report_quota_blocks() { $XFS_QUOTA_PROG -x -c "report $1" $SCRATCH_MNT | \ awk '{x += $2;} END { print(x); }' } compare_quota_to_du() { test $1 -eq $2 || echo "$3 quota $2 blocks does not match du $1 blocks?" } # Make sure the user/group/project quota block counts match the du output. # This ensures that we did the quota accounting correctly and that we're # accurately reporting cow preallocation blocks in stat. check_quota_du_blocks() { sync #$XFS_QUOTA_PROG -x -c 'report' $SCRATCH_MNT >> $seqres.full du_rep=$(du -ks $SCRATCH_MNT | awk '{print $1}') u_rep=$(report_quota_blocks -u) g_rep=$(report_quota_blocks -g) p_rep=$(report_quota_blocks -p) compare_quota_to_du $du_rep $u_rep "user" compare_quota_to_du $du_rep $g_rep "group" compare_quota_to_du $du_rep $p_rep "project" } echo "Format and fsstress" _qmount_option "usrquota,grpquota,prjquota" # We use a small volume so that we hit ENOSPC. This is critical for # regression testing a bug in the directio write code that could result in fs # corruption ("xfs: check reflink allocation mappings"). # # This started as a test for quota accounting problems ("xfs: treat CoW fork # operations as delalloc for quota accounting") and ("xfs: call # xfs_qm_dqattach before performing reflink operations") though each of those # tests now have separate faster-running regression tests. _scratch_mkfs_sized $((1600 * 1048576)) > $seqres.full 2>&1 _scratch_mount >> $seqres.full 2>&1 nr_cpus=$((LOAD_FACTOR * 4)) nr_ops=$((25000 * nr_cpus * TIME_FACTOR)) $FSSTRESS_PROG $FSSTRESS_AVOID -w -d $SCRATCH_MNT -n $nr_ops -p $nr_cpus >> $seqres.full echo "Check quota before remount" check_quota_du_blocks # Clear out all the preallocations before we quotacheck. # The count comparison in _check_quota_usage will be unhappy if we don't # manage to clean out all the cow preallocations before the remount. _scratch_unmount _scratch_mount # Make sure the usage doesn't change after quotacheck. echo "Check quota after remount" _check_quota_usage check_quota_du_blocks # success, all done status=0 exit