public inbox for fstests@vger.kernel.org
 help / color / mirror / Atom feed
From: Ojaswin Mujoo <ojaswin@linux.ibm.com>
To: Zorro Lang <zlang@redhat.com>, fstests@vger.kernel.org
Cc: Disha Goel <disgoel@linux.ibm.com>
Subject: [PATCH] ext4/307: Calculate donor size to avoid failures for 64k bs
Date: Mon,  2 Feb 2026 18:57:30 +0530	[thread overview]
Message-ID: <20260202132730.589621-1-ojaswin@linux.ibm.com> (raw)

Hard coding donor size to 250M causes the following failure in e4compat

e4compact.c:68: do_defrag_range: Assertion `donor->length >= len' failed.
./common/rc: line 4616: 1583182 Aborted                 (core dumped)

The issue is that e4compat asserts that the stat.st_size of all files
combined shouldn't be more than that of the donor file. In case of 64k
blocksize, fsstress often creates sparse files which have >3G size even
though their disk utilization is <100M. Since donor file is not big
enough, this trips e4compat causing the failure.

Fix this by dynamically calculating the donor file size based on the
size of all files. Also, make some changes to avoid future ENOSPC like
reducing the -n passed to fsstress to keep the size around 2G and making
sure we use the whole SCRATCH disk instead of 500M.

While we are at it, add some new lines to make the code bit more
readable.

Reported-by: Disha Goel <disgoel@linux.ibm.com>
Signed-off-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
---
 tests/ext4/307 | 41 +++++++++++++++++++++++++++++++++++++----
 1 file changed, 37 insertions(+), 4 deletions(-)

diff --git a/tests/ext4/307 b/tests/ext4/307
index 1f0e42ca..7e7fb9c8 100755
--- a/tests/ext4/307
+++ b/tests/ext4/307
@@ -12,24 +12,57 @@ _begin_fstest auto ioctl rw defrag prealloc
 # Import common functions.
 . ./common/filter
 . ./common/defrag
+
+# Get the total of stat.st_size of each file to determine the
+# size of donor file. We use st_size here instead of blocks used
+# because thats what e4compat.c checks against.
+get_bytes_used() {
+	local filelist="$1"
+	local total=0
+	local blksz=$(_get_block_size $SCRATCH_MNT)
+
+	while IFS= read -r f; do
+		echo -n "File: $f: " >> $seqres.full
+		[[ -z "$f" ]] && continue
+
+		if [[ -f "$f" ]]; then
+			local bytes
+			bytes=$(stat -c %s "$f")
+			total=$((total + bytes))
+			echo $bytes >> $seqres.full
+		fi
+	done < "$filelist"
+
+	echo "Total bytes: $total" >> $seqres.full
+	echo $total
+}
+
 # Disable all sync operations to get higher load
 FSSTRESS_AVOID="$FSSTRESS_AVOID -ffsync=0 -fsync=0 -ffdatasync=0"
 _workout()
 {
+	local blksz=$(_get_block_size $SCRATCH_MNT)
+
 	echo ""
 	echo "Run fsstress"
 	out=$SCRATCH_MNT/fsstress.$$
-	args=`_scale_fsstress_args -p4 -n999 -f setattr=1 -d $out`
+	args=`_scale_fsstress_args -p4 -n500 -f setattr=1 -d $out`
 	echo "fsstress $args" >> $seqres.full
 	_run_fsstress $args
+
 	find $out -type f > $out.list
 	cat $out.list | xargs  md5sum > $out.md5sum
-	usage=`du -sch $out | tail -n1 | gawk '{ print $1 }'`
+
+	bytes=`get_bytes_used $out.list`
+	echo "Total bytes used: $bytes" >> $seqres.full
+
 	echo "Allocate donor file"
-	$XFS_IO_PROG -c "falloc 0 250M" -f $SCRATCH_MNT/donor | _filter_xfs_io
+	$XFS_IO_PROG -c "falloc 0 $bytes" -f $SCRATCH_MNT/donor | _filter_xfs_io
+
 	echo "Perform compacting"
 	cat $out.list | run_check $here/src/e4compact \
 		-i -v -f $SCRATCH_MNT/donor  >> $seqres.full 2>&1
+
 	echo "Check data"
 	run_check md5sum -c $out.md5sum
 }
@@ -41,7 +74,7 @@ _require_scratch
 _require_defrag
 _require_xfs_io_command "falloc"
 
-_scratch_mkfs_sized $((512 * 1024 * 1024)) >> $seqres.full 2>&1
+_scratch_mkfs >> $seqres.full 2>&1
 _scratch_mount
 
 _workout
-- 
2.52.0


             reply	other threads:[~2026-02-02 13:27 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-02-02 13:27 Ojaswin Mujoo [this message]
2026-02-03  7:46 ` [PATCH] ext4/307: Calculate donor size to avoid failures for 64k bs Disha Goel
2026-02-08 17:54 ` Zorro Lang
2026-02-12  8:52   ` Ojaswin Mujoo
2026-02-12 18:53     ` Zorro Lang
2026-02-13  9:21       ` Ojaswin Mujoo
2026-02-24  9:45   ` Ojaswin Mujoo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260202132730.589621-1-ojaswin@linux.ibm.com \
    --to=ojaswin@linux.ibm.com \
    --cc=disgoel@linux.ibm.com \
    --cc=fstests@vger.kernel.org \
    --cc=zlang@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox