public inbox for linux-btrfs@vger.kernel.org
 help / color / mirror / Atom feed
From: Josef Bacik <josef@toxicpanda.com>
To: linux-btrfs@vger.kernel.org
Cc: johannes.thumshirn@wdc.com, naohiro.aota@wdc.com
Subject: Zoned panic WRT btrfs_redirty_list_add
Date: Mon, 11 Sep 2023 09:51:46 -0400	[thread overview]
Message-ID: <20230911135146.GA2352074@perftesting> (raw)

Hello,

I hit the following panic on our CI this last week

assertion failed: PageDirty(eb->pages[i]), in fs/btrfs/extent_io.c:3809
------------[ cut here ]------------
kernel BUG at fs/btrfs/extent_io.c:3809!
invalid opcode: 0000 [#1] PREEMPT SMP NOPTI
CPU: 1 PID: 858183 Comm: fsstress Not tainted 6.5.0+ #1
RIP: 0010:set_extent_buffer_dirty+0x11a/0x210
RSP: 0018:ffffc9000631fa28 EFLAGS: 00010246
RAX: 0000000000000047 RBX: ffff888116642848 RCX: 0000000000000000
RDX: 0000000000000000 RSI: ffff88817bd21880 RDI: ffff88817bd21880
RBP: 0000000000000004 R08: 0000000000000000 R09: ffffc9000631f8c8
R10: 0000000000000003 R11: ffffffff8c534318 R12: 0000000000000004
R13: 0000000000004000 R14: 0000000000000004 R15: ffff888116642848
FS:  00007f6608d72740(0000) GS:ffff88817bd00000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 0000000000c98568 CR3: 000000011f3b8000 CR4: 0000000000350ee0
Call Trace:
 <TASK>
 ? die+0x36/0x90
 ? do_trap+0xda/0x100
 ? set_extent_buffer_dirty+0x11a/0x210
 ? set_extent_buffer_dirty+0x11a/0x210
 ? do_error_trap+0x81/0x110
 ? set_extent_buffer_dirty+0x11a/0x210
 ? exc_invalid_op+0x50/0x70
 ? set_extent_buffer_dirty+0x11a/0x210
 ? asm_exc_invalid_op+0x1a/0x20
 ? set_extent_buffer_dirty+0x11a/0x210
 ? set_extent_buffer_dirty+0x11a/0x210
 btrfs_redirty_list_add+0x75/0xd0
 btrfs_free_tree_block+0x243/0x2f0
 btrfs_del_leaf+0xba/0xe0
 btrfs_del_items+0x49c/0x520
 __btrfs_free_extent+0x615/0x1260
 __btrfs_run_delayed_refs+0x2d9/0x1310
 ? lock_is_held_type+0x9b/0x110
 ? find_held_lock+0x2b/0x80
 ? btrfs_start_dirty_block_groups+0x50/0x5b0
 btrfs_run_delayed_refs+0x59/0x220
 btrfs_start_dirty_block_groups+0x3bc/0x5b0
 ? btrfs_commit_transaction+0x41/0x1420
 ? btrfs_commit_transaction+0x41/0x1420
 btrfs_commit_transaction+0x106/0x1420
 ? btrfs_attach_transaction_barrier+0x22/0x60
 ? __pfx_sync_fs_one_sb+0x10/0x10
 iterate_supers+0x7e/0xf0

We have a check to make sure the pages we just dirtied are actually set to
dirty, and this is what's failing.

In btrfs_redirty_list_add() we have an ASSERT(!EXTENT_BUFFER_DIRTY), so we know
we're going through the path where we weren't dirty and now we are and thus
setting the pages dirty.

However we're doing the btrfs_redirty_list_add() outside of the
btrfs_tree_lock().  We always set the EXTENT_DIRTY for ->dirty_pages on the
transaction, however we never clear it, we rely on the EXTENT_BUFFER_DIRTY flag
to be the ultimate arbiter of whether or not to write the extent buffer.

Which means there's a race where we could be currently writing this extent
buffer out and calling btrfs_redirty_list_add() on the extent buffer.

I attempted to naively fix this by adjusting the btrfs_clear_buffer_dirty()
helper to simply not clear dirty for extent buffers if we were zoned, but that
keeps blowing up in my face and I'm not awake enough to figure out why.

I had also tried just wrapping this in btrfs_tree_lock() but there was an
immediate deadlock that I didn't look at because I tried the
btrfs_clear_buffer_dirty() thing next.

In any case this needs to be reworked with this race in mind.  Thanks,

Josef

                 reply	other threads:[~2023-09-11 22:07 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

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=20230911135146.GA2352074@perftesting \
    --to=josef@toxicpanda.com \
    --cc=johannes.thumshirn@wdc.com \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=naohiro.aota@wdc.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