generic/587: fix rounding error in quota/stat block comparison
authorDarrick J. Wong <darrick.wong@oracle.com>
Wed, 18 Mar 2020 20:11:36 +0000 (13:11 -0700)
committerEryu Guan <guaneryu@gmail.com>
Sun, 22 Mar 2020 15:18:38 +0000 (23:18 +0800)
It turns out that repquota (which reports in units of 1k blocks) reports
rounded up numbers when the fs blocksize is 512 bytes.  However, xfs_io
stat always reports block counts in units of 512 bytes.  If the number
of (512b) file blocks is not an even number, the "$3 / 2" expression
will round down, causing the test to fail.  Round up to the nearest 1k
to match repquota's behavior.

Reported-by: zlang@redhat.com
Fixes: 6b04ed05456fc6c ("generic: test unwritten extent conversion extent mapping quota accounting")
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Zorro Lang <zlang@redhat.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
tests/generic/587

index 7b07d07dac82b5d93e2463de7fb0299409e2c02c..c218c09bffbf03ad6fc3302cf683456633d86a78 100755 (executable)
@@ -51,17 +51,21 @@ ENDL
 
 # Make sure that the quota blocks accounting for qa_user on the scratch fs
 # matches the stat blocks counter for the only file on the scratch fs that
-# is owned by qa_user.  Note that stat reports in units of 512b blocks whereas
-# repquota reports in units of 1k blocks.
+# is owned by qa_user.
 check_quota_accounting()
 {
+       # repquota rounds the raw numbers up to the nearest 1k when reporting
+       # space usage.  xfs_io stat always reports space usage in 512b units,
+       # so use an awk script to round this number up to the nearest 1k, just
+       # like repquota does.
        $XFS_IO_PROG -c stat $testfile > $tmp.out
        cat $tmp.out >> $seqres.full
-       local stat_blocks=$(grep 'stat.blocks' $tmp.out | awk '{print $3 / 2}')
+       local stat_blocks=$(grep 'stat.blocks' $tmp.out | \
+               awk '{printf("%d\n", ($3 + 1) / 2);}')
 
        _report_quota_blocks $SCRATCH_MNT > $tmp.out
        cat $tmp.out >> $seqres.full
-       awk -v qa_user=$qa_user -v blocks=$stat_blocks -f $tmp.awk $tmp.out
+       $AWK_PROG -v qa_user=$qa_user -v blocks=$stat_blocks -f $tmp.awk $tmp.out
 }
 
 _scratch_mkfs > $seqres.full