public inbox for linux-btrfs@vger.kernel.org
 help / color / mirror / Atom feed
From: Qu Wenruo <quwenruo.btrfs@gmx.com>
To: Naohiro Aota <naohiro.aota@wdc.com>, linux-btrfs@vger.kernel.org
Cc: Shinichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Subject: Re: [PATCH] btrfs: fix invalid mapping xarray state
Date: Fri, 9 Aug 2024 17:28:40 +0930	[thread overview]
Message-ID: <813a933c-9358-4ece-9e59-897900642628@gmx.com> (raw)
In-Reply-To: <cb40bca119cc0519bb5e17f6a9060a35a839ea28.1723189951.git.naohiro.aota@wdc.com>



在 2024/8/9 17:24, Naohiro Aota 写道:
> In __extent_writepage_io(), we call btrfs_set_range_writeback() ->
> folio_start_writeback(), which clears PAGECACHE_TAG_DIRTY mark from the
> mapping xarray if the folio is not dirty. This worked fine before commit
> 97713b1a2ced ("btrfs: do not clear page dirty inside
> extent_write_locked_range()").
>
> After the commit, however, the folio is still dirty at this point, so the
> mapping DIRTY tag is not cleared anymore. Then, __extent_writepage_io()
> calls btrfs_folio_clear_dirty() to clear the folio's dirty flag. That
> results in the page beging unlocked with a "strange" state. The page is not
> PageDirty, but the mapping tag is set as PAGECACHE_TAG_DIRTY.
>
> This strange state looks like causing a hang with a call trace below when
> running fstests generic/091 on a null_blk device. It is waiting for a folio
> lock.
>
> While I don't have an exact relation between this hang and the strange
> state, fixing the state also fixes the hang. And, that state is worth
> fixing anyway.
>
> This commit reorders btrfs_folio_clear_dirty() and
> btrfs_set_range_writeback() in __extent_writepage_io(), so that the
> PAGECACHE_TAG_DIRTY tag is properly removed from the xarray.
>
>    [ 2464.274674][  T245] task:fsx             state:D stack:0     pid:3034  tgid:3034  ppid:2853   flags:0x00004002
>    [ 2464.286991][  T245] Call Trace:
>    [ 2464.291683][  T245]  <TASK>
>    [ 2464.295876][  T245]  __schedule+0x10ed/0x6260
>    [ 2464.301804][  T245]  ? __pfx___blk_flush_plug+0x10/0x10
>    [ 2464.308703][  T245]  ? __submit_bio+0x37c/0x450
>    [ 2464.314833][  T245]  ? __pfx___schedule+0x10/0x10
>    [ 2464.321245][  T245]  ? lock_release+0x567/0x790
>    [ 2464.327480][  T245]  ? __pfx_lock_acquire+0x10/0x10
>    [ 2464.334033][  T245]  ? __pfx_lock_release+0x10/0x10
>    [ 2464.340674][  T245]  ? __pfx_lock_acquire+0x10/0x10
>    [ 2464.347254][  T245]  ? __pfx_lock_release+0x10/0x10
>    [ 2464.353732][  T245]  ? do_raw_spin_lock+0x12e/0x270
>    [ 2464.360305][  T245]  schedule+0xdf/0x3b0
>    [ 2464.365705][  T245]  io_schedule+0x8f/0xf0
>    [ 2464.371417][  T245]  folio_wait_bit_common+0x2ca/0x6d0
>    [ 2464.378260][  T245]  ? folio_wait_bit_common+0x1cc/0x6d0
>    [ 2464.385314][  T245]  ? __pfx_folio_wait_bit_common+0x10/0x10
>    [ 2464.392658][  T245]  ? __pfx_filemap_get_folios_tag+0x10/0x10
>    [ 2464.400173][  T245]  ? __pfx_wake_page_function+0x10/0x10
>    [ 2464.407309][  T245]  ? __pfx___might_resched+0x10/0x10
>    [ 2464.414120][  T245]  ? do_raw_spin_unlock+0x58/0x1f0
>    [ 2464.420688][  T245]  extent_write_cache_pages+0xe49/0x1620 [btrfs]
>    [ 2464.428894][  T245]  ? lock_acquire+0x435/0x500
>    [ 2464.435024][  T245]  ? __pfx_extent_write_cache_pages+0x10/0x10 [btrfs]
>    [ 2464.443736][  T245]  ? btrfs_do_write_iter+0x493/0x640 [btrfs]
>    [ 2464.451523][  T245]  ? orc_find.part.0+0x1d4/0x380
>    [ 2464.457938][  T245]  ? __pfx_lock_release+0x10/0x10
>    [ 2464.464544][  T245]  ? __pfx_lock_release+0x10/0x10
>    [ 2464.471066][  T245]  ? btrfs_do_write_iter+0x493/0x640 [btrfs]
>    [ 2464.478722][  T245]  btrfs_writepages+0x1cc/0x460 [btrfs]
>    [ 2464.485913][  T245]  ? __pfx_btrfs_writepages+0x10/0x10 [btrfs]
>    [ 2464.493675][  T245]  ? is_bpf_text_address+0x6e/0x100
>    [ 2464.500476][  T245]  ? kernel_text_address+0x145/0x160
>    [ 2464.507359][  T245]  ? unwind_get_return_address+0x5e/0xa0
>    [ 2464.514709][  T245]  ? arch_stack_walk+0xac/0x100
>    [ 2464.521090][  T245]  do_writepages+0x176/0x780
>    [ 2464.527189][  T245]  ? lock_release+0x567/0x790
>    [ 2464.533402][  T245]  ? __pfx_do_writepages+0x10/0x10
>    [ 2464.540069][  T245]  ? __pfx_lock_acquire+0x10/0x10
>    [ 2464.546724][  T245]  ? __pfx_stack_trace_save+0x10/0x10
>    [ 2464.553598][  T245]  ? do_raw_spin_lock+0x12e/0x270
>    [ 2464.560158][  T245]  ? do_raw_spin_unlock+0x58/0x1f0
>    [ 2464.566760][  T245]  ? _raw_spin_unlock+0x23/0x40
>    [ 2464.573105][  T245]  ? wbc_attach_and_unlock_inode+0x3da/0x7d0
>    [ 2464.580664][  T245]  filemap_fdatawrite_wbc+0x113/0x180
>    [ 2464.587706][  T245]  ? prepare_pages.constprop.0+0x13c/0x5c0 [btrfs]
>    [ 2464.596015][  T245]  __filemap_fdatawrite_range+0xaf/0xf0
>    [ 2464.603159][  T245]  ? __pfx___filemap_fdatawrite_range+0x10/0x10
>    [ 2464.611102][  T245]  ? trace_irq_enable.constprop.0+0xce/0x110
>    [ 2464.618689][  T245]  ? kasan_quarantine_put+0xd7/0x1e0
>    [ 2464.625641][  T245]  btrfs_start_ordered_extent+0x46f/0x570 [btrfs]
>    [ 2464.633843][  T245]  ? __pfx_btrfs_start_ordered_extent+0x10/0x10 [btrfs]
>    [ 2464.642777][  T245]  ? __clear_extent_bit+0x2c0/0x9d0 [btrfs]
>    [ 2464.650522][  T245]  btrfs_lock_and_flush_ordered_range+0xc6/0x180 [btrfs]
>    [ 2464.659525][  T245]  ? __pfx_btrfs_lock_and_flush_ordered_range+0x10/0x10 [btrfs]
>    [ 2464.669173][  T245]  btrfs_read_folio+0x12a/0x1d0 [btrfs]
>    [ 2464.676520][  T245]  ? __pfx_btrfs_read_folio+0x10/0x10 [btrfs]
>    [ 2464.684449][  T245]  ? __pfx_filemap_add_folio+0x10/0x10
>    [ 2464.691733][  T245]  ? __pfx___might_resched+0x10/0x10
>    [ 2464.698736][  T245]  ? __filemap_get_folio+0x1c5/0x450
>    [ 2464.705739][  T245]  prepare_uptodate_page+0x12e/0x4d0 [btrfs]
>    [ 2464.713624][  T245]  prepare_pages.constprop.0+0x13c/0x5c0 [btrfs]
>    [ 2464.721758][  T245]  ? fault_in_iov_iter_readable+0xd2/0x240
>    [ 2464.729292][  T245]  btrfs_buffered_write+0x5bd/0x12f0 [btrfs]
>    [ 2464.737106][  T245]  ? __pfx_btrfs_buffered_write+0x10/0x10 [btrfs]
>    [ 2464.745448][  T245]  ? __pfx_lock_release+0x10/0x10
>    [ 2464.752085][  T245]  ? generic_write_checks+0x275/0x400
>    [ 2464.759126][  T245]  ? down_write+0x118/0x1f0
>    [ 2464.765188][  T245]  ? up_write+0x19b/0x500
>    [ 2464.770947][  T245]  btrfs_direct_write+0x731/0xba0 [btrfs]
>    [ 2464.778148][  T245]  ? __pfx_btrfs_direct_write+0x10/0x10 [btrfs]
>    [ 2464.785902][  T245]  ? __pfx___might_resched+0x10/0x10
>    [ 2464.792460][  T245]  ? lock_acquire+0x435/0x500
>    [ 2464.798466][  T245]  ? lock_acquire+0x435/0x500
>    [ 2464.804450][  T245]  btrfs_do_write_iter+0x494/0x640 [btrfs]
>    [ 2464.811630][  T245]  ? __pfx_btrfs_do_write_iter+0x10/0x10 [btrfs]
>    [ 2464.819386][  T245]  ? __pfx___might_resched+0x10/0x10
>    [ 2464.825952][  T245]  ? rw_verify_area+0x6d/0x590
>    [ 2464.831937][  T245]  vfs_write+0x5d7/0xf50
>    [ 2464.837412][  T245]  ? __might_fault+0x9d/0x120
>    [ 2464.843363][  T245]  ? __pfx_vfs_write+0x10/0x10
>    [ 2464.849417][  T245]  ? btrfs_file_llseek+0xb1/0xfb0 [btrfs]
>    [ 2464.856493][  T245]  ? lock_release+0x567/0x790
>    [ 2464.862348][  T245]  ksys_write+0xfb/0x1d0
>    [ 2464.867723][  T245]  ? __pfx_ksys_write+0x10/0x10
>    [ 2464.873781][  T245]  ? _raw_spin_unlock+0x23/0x40
>    [ 2464.879858][  T245]  ? btrfs_getattr+0x4af/0x670 [btrfs]
>    [ 2464.886649][  T245]  ? vfs_getattr_nosec+0x79/0x340
>    [ 2464.892929][  T245]  do_syscall_64+0x95/0x180
>    [ 2464.898578][  T245]  ? __do_sys_newfstat+0xde/0xf0
>    [ 2464.904728][  T245]  ? __pfx___do_sys_newfstat+0x10/0x10
>    [ 2464.911454][  T245]  ? trace_irq_enable.constprop.0+0xce/0x110
>    [ 2464.918797][  T245]  ? syscall_exit_to_user_mode+0xac/0x2a0
>    [ 2464.925851][  T245]  ? do_syscall_64+0xa1/0x180
>    [ 2464.931715][  T245]  ? trace_irq_enable.constprop.0+0xce/0x110
>    [ 2464.939106][  T245]  ? trace_irq_enable.constprop.0+0xce/0x110
>    [ 2464.946406][  T245]  ? syscall_exit_to_user_mode+0xac/0x2a0
>    [ 2464.953501][  T245]  ? btrfs_file_llseek+0xb1/0xfb0 [btrfs]
>    [ 2464.960625][  T245]  ? do_syscall_64+0xa1/0x180
>    [ 2464.966482][  T245]  ? btrfs_file_llseek+0xb1/0xfb0 [btrfs]
>    [ 2464.973570][  T245]  ? trace_irq_enable.constprop.0+0xce/0x110
>    [ 2464.980915][  T245]  ? syscall_exit_to_user_mode+0xac/0x2a0
>    [ 2464.987978][  T245]  ? __pfx_btrfs_file_llseek+0x10/0x10 [btrfs]
>    [ 2464.995542][  T245]  ? trace_irq_enable.constprop.0+0xce/0x110
>    [ 2465.002901][  T245]  ? __pfx_btrfs_file_llseek+0x10/0x10 [btrfs]
>    [ 2465.010462][  T245]  ? do_syscall_64+0xa1/0x180
>    [ 2465.016429][  T245]  ? lock_release+0x567/0x790
>    [ 2465.022388][  T245]  ? __pfx_lock_acquire+0x10/0x10
>    [ 2465.028622][  T245]  ? __pfx_lock_release+0x10/0x10
>    [ 2465.034894][  T245]  ? trace_irq_enable.constprop.0+0xce/0x110
>    [ 2465.042309][  T245]  ? syscall_exit_to_user_mode+0xac/0x2a0
>    [ 2465.049458][  T245]  ? do_syscall_64+0xa1/0x180
>    [ 2465.055421][  T245]  ? syscall_exit_to_user_mode+0xac/0x2a0
>    [ 2465.062429][  T245]  ? do_syscall_64+0xa1/0x180
>    [ 2465.068391][  T245]  ? syscall_exit_to_user_mode+0xac/0x2a0
>    [ 2465.075416][  T245]  ? do_syscall_64+0xa1/0x180
>    [ 2465.081383][  T245]  ? clear_bhb_loop+0x25/0x80
>    [ 2465.087346][  T245]  ? clear_bhb_loop+0x25/0x80
>    [ 2465.093282][  T245]  ? clear_bhb_loop+0x25/0x80
>    [ 2465.099197][  T245]  entry_SYSCALL_64_after_hwframe+0x76/0x7e
>    [ 2465.106399][  T245] RIP: 0033:0x7f093b8ee784
>    [ 2465.111990][  T245] RSP: 002b:00007ffc29d31b28 EFLAGS: 00000202 ORIG_RAX: 0000000000000001
>    [ 2465.122130][  T245] RAX: ffffffffffffffda RBX: 0000000000006000 RCX: 00007f093b8ee784
>    [ 2465.131698][  T245] RDX: 000000000001de00 RSI: 00007f093b6ed200 RDI: 0000000000000003
>    [ 2465.141390][  T245] RBP: 000000000001de00 R08: 0000000000006000 R09: 0000000000000000
>    [ 2465.150994][  T245] R10: 0000000000023e00 R11: 0000000000000202 R12: 0000000000006000
>    [ 2465.160533][  T245] R13: 0000000000023e00 R14: 0000000000023e00 R15: 0000000000000001
>    [ 2465.170157][  T245]  </TASK>
>    [ 2465.174240][  T245] INFO: lockdep is turned off.
>
> Reported-by: Shinichiro Kawasaki <shinichiro.kawasaki@wdc.com>
> Fixes: 97713b1a2ced ("btrfs: do not clear page dirty inside extent_write_locked_range()")

Reviewed-by: Qu Wenruo <wqu@suse.com>

Thanks for exposing and fixing the bug.
Qu

> Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com>
> ---
>   fs/btrfs/extent_io.c | 14 +++++++-------
>   1 file changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
> index 040c92541bc9..271a1ad9fe88 100644
> --- a/fs/btrfs/extent_io.c
> +++ b/fs/btrfs/extent_io.c
> @@ -1478,6 +1478,13 @@ static noinline_for_stack int __extent_writepage_io(struct btrfs_inode *inode,
>   		free_extent_map(em);
>   		em = NULL;
>
> +		/*
> +		 * Although the PageDirty bit might be cleared before entering
> +		 * this function, subpage dirty bit is not cleared.
> +		 * So clear subpage dirty bit here so next time we won't submit
> +		 * page for range already written to disk.
> +		 */
> +		btrfs_folio_clear_dirty(fs_info, folio, cur, iosize);
>   		btrfs_set_range_writeback(inode, cur, cur + iosize - 1);
>   		if (!folio_test_writeback(folio)) {
>   			btrfs_err(inode->root->fs_info,
> @@ -1485,13 +1492,6 @@ static noinline_for_stack int __extent_writepage_io(struct btrfs_inode *inode,
>   			       folio->index, cur, end);
>   		}
>
> -		/*
> -		 * Although the PageDirty bit is cleared before entering this
> -		 * function, subpage dirty bit is not cleared.
> -		 * So clear subpage dirty bit here so next time we won't submit
> -		 * folio for range already written to disk.
> -		 */
> -		btrfs_folio_clear_dirty(fs_info, folio, cur, iosize);
>
>   		submit_extent_folio(bio_ctrl, disk_bytenr, folio,
>   				    iosize, cur - folio_pos(folio));

  reply	other threads:[~2024-08-09  7:58 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-08-09  7:54 [PATCH] btrfs: fix invalid mapping xarray state Naohiro Aota
2024-08-09  7:58 ` Qu Wenruo [this message]
2024-08-09 15:08 ` David Sterba
2024-08-12  5:17   ` Qu Wenruo
2024-08-13 13:36     ` David Sterba

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=813a933c-9358-4ece-9e59-897900642628@gmx.com \
    --to=quwenruo.btrfs@gmx.com \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=naohiro.aota@wdc.com \
    --cc=shinichiro.kawasaki@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