public inbox for linux-btrfs@vger.kernel.org
 help / color / mirror / Atom feed
From: Leo Martins <loemra.dev@gmail.com>
To: fstests@vger.kernel.org
Cc: linux-btrfs@vger.kernel.org, Filipe Manana <fdmanana@suse.com>,
	"Darrick J . Wong" <djwong@kernel.org>
Subject: [RFC] generic/301: flaky failure on btrfs after metadata overcommit change
Date: Mon, 23 Mar 2026 13:15:29 -0700	[thread overview]
Message-ID: <20260323201533.2648753-1-loemra.dev@gmail.com> (raw)

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 2414 bytes --]

Hi,

generic/301 has become flaky on btrfs after commit 0dc118b3c327 ("btrfs:
be less aggressive with metadata overcommit when we can do full
flushing") which landed in btrfs/for-next. Out of 30 runs, 8 fail with:

    +file2 badly fragmented

I bisected this to the above commit, which reduces the metadata
overcommit limit from 1/8th to 1/64th of available space for
full-flushing contexts. This is a legitimate fix for -ENOSPC transaction
aborts on small filesystems, but as a side effect it causes more
frequent transaction commits during writeback. The reduced batching
means the extent allocator has less opportunity to coalesce adjacent CoW
extents, resulting in higher extent counts that sometimes cross the
test's threshold.

The fragmentation check in question is:

    test $new_extents -lt $((internal_blks * 2 / 3)) || echo "file2 badly fragmented"

The 2/3 threshold was introduced in 9184ca155d7c ("xfs: test
fragmentation characteristics of copy-on-write") as part of a series
testing XFS's CoW extent size hint (cowextsize) mechanism. For btrfs,
this threshold is arbitrary — btrfs doesn't have XFS's cowextsize hint,
and its CoW extent allocation depends on factors like transaction commit
frequency and metadata reservation behavior, which is exactly what the
overcommit commit changed.

I see two possible fixes and would appreciate input on which is
preferred:

Option A: _notrun for btrfs
----------------------------

Skip the entire test since the fragmentation threshold is not applicable
to btrfs:

    test $FSTYP = "btrfs" && \
        _notrun "CoW fragmentation threshold not applicable to btrfs"

Option B: Skip only the extent count assertion for btrfs
---------------------------------------------------------

Keep the CoW + data integrity portion of the test (the md5sum checks
after random CoW writes and remount are still useful) and only skip the
fragmentation assertion:

    if [ "$FSTYP" != "btrfs" ]; then
        test $new_extents -lt $((internal_blks * 2 / 3)) || \
            echo "file2 badly fragmented"
    fi

I lean towards option B since the CoW write + remount + md5sum
verification is still a reasonable smoke test, but option A is cleaner
if the consensus is that this test isn't adding value for btrfs.

Thoughts?

Thanks,
Leo Martins

             reply	other threads:[~2026-03-23 20:15 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-23 20:15 Leo Martins [this message]
2026-03-23 22:51 ` [RFC] generic/301: flaky failure on btrfs after metadata overcommit change Darrick J. Wong
2026-03-24  3:03 ` Qu Wenruo

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=20260323201533.2648753-1-loemra.dev@gmail.com \
    --to=loemra.dev@gmail.com \
    --cc=djwong@kernel.org \
    --cc=fdmanana@suse.com \
    --cc=fstests@vger.kernel.org \
    --cc=linux-btrfs@vger.kernel.org \
    /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