All of lore.kernel.org
 help / color / mirror / Atom feed
From: Qu Wenruo <wqu@suse.com>
To: linux-btrfs@vger.kernel.org
Subject: [PATCH v2 24/26] btrfs: allow page to be unlocked by btrfs_page_end_writer_lock() even if it's locked by plain page_lock()
Date: Sun, 29 Aug 2021 13:24:56 +0800	[thread overview]
Message-ID: <20210829052458.15454-25-wqu@suse.com> (raw)
In-Reply-To: <20210829052458.15454-1-wqu@suse.com>

There are several call sites of extent_clear_unlock_delalloc() which
gets @locked_page = NULL.
So that extent_clear_unlock_delalloc() will try to call
process_one_page() to unlock every page even the first page is not
locked by btrfs_page_start_writer_lock().

This will trigger an ASSERT() in btrfs_subpage_end_and_test_writer() as
previously we require every page passed to
btrfs_subpage_end_and_test_writer() to be locked by
btrfs_page_start_writer_lock().

But compression path doesn't go that way.

Thankfully it's not hard to distinguish page locked by lock_page() and
btrfs_page_start_writer_lock().

So do the check in btrfs_subpage_end_and_test_writer() so now it can
handle both cases well.

Signed-off-by: Qu Wenruo <wqu@suse.com>
---
 fs/btrfs/subpage.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/fs/btrfs/subpage.c b/fs/btrfs/subpage.c
index 50b3d96289ca..39d63a21dcb9 100644
--- a/fs/btrfs/subpage.c
+++ b/fs/btrfs/subpage.c
@@ -292,6 +292,17 @@ bool btrfs_subpage_end_and_test_writer(const struct btrfs_fs_info *fs_info,
 
 	btrfs_subpage_assert(fs_info, page, start, len);
 
+	/*
+	 * We have call sites passing @lock_page into
+	 * extent_clear_unlock_delalloc() for compression path.
+	 *
+	 * Those @locked_page is locked by plain lock_page(), thus its
+	 * subpage::writers is 0.
+	 * Handle them specially.
+	 */
+	if (atomic_read(&subpage->writers) == 0)
+		return true;
+
 	ASSERT(atomic_read(&subpage->writers) >= nbits);
 	return atomic_sub_and_test(nbits, &subpage->writers);
 }
-- 
2.32.0


  parent reply	other threads:[~2021-08-29  5:25 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-29  5:24 [PATCH v2 00/26] btrfs: limited subpage compressed write support Qu Wenruo
2021-08-29  5:24 ` [PATCH v2 01/26] btrfs: remove unused parameter @nr_pages in add_ra_bio_pages() Qu Wenruo
2021-08-29  5:24 ` [PATCH v2 02/26] btrfs: remove unnecessary parameter @delalloc_start for writepage_delalloc() Qu Wenruo
2021-08-29  5:24 ` [PATCH v2 03/26] btrfs: use async_chunk::async_cow to replace the confusing pending pointer Qu Wenruo
2021-08-29  5:24 ` [PATCH v2 04/26] btrfs: don't pass compressed pages to btrfs_writepage_endio_finish_ordered() Qu Wenruo
2021-08-29  5:24 ` [PATCH v2 05/26] btrfs: make add_ra_bio_pages() to be subpage compatible Qu Wenruo
2021-08-29  5:24 ` [PATCH v2 06/26] btrfs: introduce compressed_bio::pending_sectors to trace compressed bio more elegantly Qu Wenruo
2021-08-29  5:24 ` [PATCH v2 07/26] btrfs: add subpage checked bitmap to make PageChecked flag to be subpage compatible Qu Wenruo
2021-08-29  5:24 ` [PATCH v2 08/26] btrfs: handle errors properly inside btrfs_submit_compressed_read() Qu Wenruo
2021-08-29  5:24 ` [PATCH v2 09/26] btrfs: handle errors properly inside btrfs_submit_compressed_write() Qu Wenruo
2021-08-29  5:24 ` [PATCH v2 10/26] btrfs: introduce submit_compressed_bio() for compression Qu Wenruo
2021-08-29  5:24 ` [PATCH v2 11/26] btrfs: introduce alloc_compressed_bio() " Qu Wenruo
2021-08-29  5:24 ` [PATCH v2 12/26] btrfs: make btrfs_submit_compressed_read() to determine stripe boundary at bio allocation time Qu Wenruo
2021-08-29  5:24 ` [PATCH v2 13/26] btrfs: make btrfs_submit_compressed_write() " Qu Wenruo
2021-08-29  5:24 ` [PATCH v2 14/26] btrfs: remove unused function btrfs_bio_fits_in_stripe() Qu Wenruo
2021-08-29  5:24 ` [PATCH v2 15/26] btrfs: refactor submit_compressed_extents() Qu Wenruo
2021-08-29  5:24 ` [PATCH v2 16/26] btrfs: cleanup for extent_write_locked_range() Qu Wenruo
2021-08-29  5:24 ` [PATCH v2 17/26] btrfs: make compress_file_range() to be subpage compatible Qu Wenruo
2021-08-29  5:24 ` [PATCH v2 18/26] btrfs: make btrfs_submit_compressed_write() " Qu Wenruo
2021-08-29  5:24 ` [PATCH v2 19/26] btrfs: make end_compressed_bio_writeback() to be subpage compatble Qu Wenruo
2021-08-29  5:24 ` [PATCH v2 20/26] btrfs: make extent_write_locked_range() to be subpage compatible Qu Wenruo
2021-08-29  5:24 ` [PATCH v2 21/26] btrfs: extract uncompressed async extent submission code into a new helper Qu Wenruo
2021-08-29  5:24 ` [PATCH v2 22/26] btrfs: rework lzo_compress_pages() to make it subpage compatible Qu Wenruo
2021-08-29  5:24 ` [PATCH v2 23/26] btrfs: teach __extent_writepage() to handle locked page differently Qu Wenruo
2021-08-29  5:24 ` Qu Wenruo [this message]
2021-08-29  5:24 ` [PATCH v2 25/26] btrfs: don't run delalloc range which is beyond the locked_page to prevent deadlock for subpage compression Qu Wenruo
2021-08-29  5:24 ` [PATCH v2 26/26] btrfs: only allow subpage compression if the range is fully page aligned Qu Wenruo
2021-08-29  6:16 ` [PATCH v2 00/26] btrfs: limited subpage compressed write support Qu Wenruo
2021-08-31 11:01 ` David Sterba
2021-09-07 18:02 ` David Sterba
2021-09-07 23:40   ` Qu Wenruo
2021-09-08 11:11     ` 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=20210829052458.15454-25-wqu@suse.com \
    --to=wqu@suse.com \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.