From: Qu Wenruo <wqu@suse.com>
To: Tal Zussman <tz2294@columbia.edu>,
David Sterba <dsterba@suse.com>, Chris Mason <mason@kernel.org>
Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org>,
linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 2/7] btrfs: tests: convert test_find_delalloc() to use folios
Date: Wed, 9 Sep 2026 14:26:27 +0930 [thread overview]
Message-ID: <5b72f456-4b62-490a-956b-9ca40ca1054c@suse.com> (raw)
In-Reply-To: <20260907-btrfs-folio-conversions-v2-2-b5fe79f7607b@columbia.edu>
在 2026/9/8 05:49, Tal Zussman 写道:
> This removes the last btrfs callers of find_or_create_page(),
> find_lock_page(), SetPageDirty(), ClearPageDirty(), and get_page(), and
> 15 calls to compound_head(). The folio lookups return an ERR_PTR instead
> of NULL, so adjust the error handling.
>
> Update the comments and test messages accordingly.
>
> The test still works in PAGE_SIZE units, which relies on the test inode
> never getting large folios, so assert that the folios are order-0 where
> that matters.
>
> Signed-off-by: Tal Zussman <tz2294@columbia.edu>
Reviewed-by: Qu Wenruo <wqu@suse.com>
Thanks,
Qu> ---
> fs/btrfs/tests/extent-io-tests.c | 99 +++++++++++++++++++++-------------------
> 1 file changed, 51 insertions(+), 48 deletions(-)
>
> diff --git a/fs/btrfs/tests/extent-io-tests.c b/fs/btrfs/tests/extent-io-tests.c
> index 6eb55bfb2bd4..e7aa8bc04706 100644
> --- a/fs/btrfs/tests/extent-io-tests.c
> +++ b/fs/btrfs/tests/extent-io-tests.c
> @@ -112,8 +112,8 @@ static int test_find_delalloc(u32 sectorsize, u32 nodesize)
> struct btrfs_root *root = NULL;
> struct inode *inode = NULL;
> struct extent_io_tree *tmp;
> - struct page *page;
> - struct page *locked_page = NULL;
> + struct folio *folio;
> + struct folio *locked_folio = NULL;
> /* In this test we need at least 2 file extents at its maximum size */
> u64 max_bytes = BTRFS_MAX_EXTENT_SIZE;
> u64 total_dirty = 2 * max_bytes;
> @@ -152,23 +152,26 @@ static int test_find_delalloc(u32 sectorsize, u32 nodesize)
> btrfs_extent_io_tree_init(NULL, tmp, IO_TREE_SELFTEST);
>
> /*
> - * First go through and create and mark all of our pages dirty, we pin
> - * everything to make sure our pages don't get evicted and screw up our
> + * First go through and create and mark all of our folios dirty, we pin
> + * everything to make sure our folios don't get evicted and screw up our
> * test.
> */
> for (pgoff_t index = 0; index < (total_dirty >> PAGE_SHIFT); index++) {
> - page = find_or_create_page(inode->i_mapping, index, GFP_KERNEL);
> - if (!page) {
> - test_err("failed to allocate test page");
> - ret = -ENOMEM;
> + folio = __filemap_get_folio(inode->i_mapping, index,
> + FGP_LOCK | FGP_ACCESSED | FGP_CREAT, GFP_KERNEL);
> + if (IS_ERR(folio)) {
> + test_err("failed to allocate test folio");
> + ret = PTR_ERR(folio);
> goto out;
> }
> - SetPageDirty(page);
> + /* The ranges below assume page sized folios. */
> + ASSERT(folio_order(folio) == 0);
> + folio_set_dirty(folio);
> if (index) {
> - unlock_page(page);
> + folio_unlock(folio);
> } else {
> - get_page(page);
> - locked_page = page;
> + folio_get(folio);
> + locked_folio = folio;
> }
> }
>
> @@ -179,8 +182,7 @@ static int test_find_delalloc(u32 sectorsize, u32 nodesize)
> btrfs_set_extent_bit(tmp, 0, sectorsize - 1, EXTENT_DELALLOC, NULL);
> start = 0;
> end = start + PAGE_SIZE - 1;
> - found = find_lock_delalloc_range(inode, page_folio(locked_page), &start,
> - &end);
> + found = find_lock_delalloc_range(inode, locked_folio, &start, &end);
> if (!found) {
> test_err("should have found at least one delalloc");
> goto out_bits;
> @@ -191,8 +193,8 @@ static int test_find_delalloc(u32 sectorsize, u32 nodesize)
> goto out_bits;
> }
> btrfs_unlock_extent(tmp, start, end, NULL);
> - unlock_page(locked_page);
> - put_page(locked_page);
> + folio_unlock(locked_folio);
> + folio_put(locked_folio);
>
> /*
> * Test this scenario
> @@ -201,17 +203,18 @@ static int test_find_delalloc(u32 sectorsize, u32 nodesize)
> * |--- search ---|
> */
> test_start = SZ_64M;
> - locked_page = find_lock_page(inode->i_mapping,
> - test_start >> PAGE_SHIFT);
> - if (!locked_page) {
> - test_err("couldn't find the locked page");
> + locked_folio = filemap_lock_folio(inode->i_mapping,
> + test_start >> PAGE_SHIFT);
> + if (IS_ERR(locked_folio)) {
> + test_err("couldn't find the locked folio");
> + locked_folio = NULL;
> goto out_bits;
> }
> + ASSERT(folio_order(locked_folio) == 0);
> btrfs_set_extent_bit(tmp, sectorsize, max_bytes - 1, EXTENT_DELALLOC, NULL);
> start = test_start;
> end = start + PAGE_SIZE - 1;
> - found = find_lock_delalloc_range(inode, page_folio(locked_page), &start,
> - &end);
> + found = find_lock_delalloc_range(inode, locked_folio, &start, &end);
> if (!found) {
> test_err("couldn't find delalloc in our range");
> goto out_bits;
> @@ -223,12 +226,12 @@ static int test_find_delalloc(u32 sectorsize, u32 nodesize)
> }
> if (process_folio_range(inode, start, end,
> PROCESS_TEST_LOCKED | PROCESS_UNLOCK)) {
> - test_err("there were unlocked pages in the range");
> + test_err("there were unlocked folios in the range");
> goto out_bits;
> }
> btrfs_unlock_extent(tmp, start, end, NULL);
> - /* locked_page was unlocked above */
> - put_page(locked_page);
> + /* locked_folio was unlocked above */
> + folio_put(locked_folio);
>
> /*
> * Test this scenario
> @@ -236,16 +239,17 @@ static int test_find_delalloc(u32 sectorsize, u32 nodesize)
> * |--- search ---|
> */
> test_start = max_bytes + sectorsize;
> - locked_page = find_lock_page(inode->i_mapping, test_start >>
> - PAGE_SHIFT);
> - if (!locked_page) {
> - test_err("couldn't find the locked page");
> + locked_folio = filemap_lock_folio(inode->i_mapping,
> + test_start >> PAGE_SHIFT);
> + if (IS_ERR(locked_folio)) {
> + test_err("couldn't find the locked folio");
> + locked_folio = NULL;
> goto out_bits;
> }
> + ASSERT(folio_order(locked_folio) == 0);
> start = test_start;
> end = start + PAGE_SIZE - 1;
> - found = find_lock_delalloc_range(inode, page_folio(locked_page), &start,
> - &end);
> + found = find_lock_delalloc_range(inode, locked_folio, &start, &end);
> if (found) {
> test_err("found range when we shouldn't have");
> goto out_bits;
> @@ -265,8 +269,7 @@ static int test_find_delalloc(u32 sectorsize, u32 nodesize)
> btrfs_set_extent_bit(tmp, max_bytes, total_dirty - 1, EXTENT_DELALLOC, NULL);
> start = test_start;
> end = start + PAGE_SIZE - 1;
> - found = find_lock_delalloc_range(inode, page_folio(locked_page), &start,
> - &end);
> + found = find_lock_delalloc_range(inode, locked_folio, &start, &end);
> if (!found) {
> test_err("didn't find our range");
> goto out_bits;
> @@ -278,36 +281,36 @@ static int test_find_delalloc(u32 sectorsize, u32 nodesize)
> }
> if (process_folio_range(inode, start, end,
> PROCESS_TEST_LOCKED | PROCESS_UNLOCK)) {
> - test_err("pages in range were not all locked");
> + test_err("folios in range were not all locked");
> goto out_bits;
> }
> btrfs_unlock_extent(tmp, start, end, NULL);
>
> /*
> - * Now to test where we run into a page that is no longer dirty in the
> + * Now to test where we run into a folio that is no longer dirty in the
> * range we want to find.
> */
> - page = find_get_page(inode->i_mapping,
> - (max_bytes + SZ_1M) >> PAGE_SHIFT);
> - if (!page) {
> - test_err("couldn't find our page");
> + folio = filemap_get_folio(inode->i_mapping,
> + (max_bytes + SZ_1M) >> PAGE_SHIFT);
> + if (IS_ERR(folio)) {
> + test_err("couldn't find our folio");
> goto out_bits;
> }
> - ClearPageDirty(page);
> - put_page(page);
> + ASSERT(folio_order(folio) == 0);
> + folio_clear_dirty(folio);
> + folio_put(folio);
>
> /* We unlocked it in the previous test */
> - lock_page(locked_page);
> + folio_lock(locked_folio);
> start = test_start;
> end = start + PAGE_SIZE - 1;
> /*
> - * Currently if we fail to find dirty pages in the delalloc range we
> + * Currently if we fail to find dirty folios in the delalloc range we
> * will adjust max_bytes down to PAGE_SIZE and then re-search. If
> * this changes at any point in the future we will need to fix this
> * tests expected behavior.
> */
> - found = find_lock_delalloc_range(inode, page_folio(locked_page), &start,
> - &end);
> + found = find_lock_delalloc_range(inode, locked_folio, &start, &end);
> if (!found) {
> test_err("didn't find our range");
> goto out_bits;
> @@ -319,7 +322,7 @@ static int test_find_delalloc(u32 sectorsize, u32 nodesize)
> }
> if (process_folio_range(inode, start, end, PROCESS_TEST_LOCKED |
> PROCESS_UNLOCK)) {
> - test_err("pages in range were not all locked");
> + test_err("folios in range were not all locked");
> goto out_bits;
> }
> ret = 0;
> @@ -328,8 +331,8 @@ static int test_find_delalloc(u32 sectorsize, u32 nodesize)
> dump_extent_io_tree(tmp);
> btrfs_clear_extent_bit(tmp, 0, total_dirty - 1, (unsigned)-1, NULL);
> out:
> - if (locked_page)
> - put_page(locked_page);
> + if (locked_folio)
> + folio_put(locked_folio);
> process_folio_range(inode, 0, total_dirty - 1,
> PROCESS_UNLOCK | PROCESS_RELEASE);
> iput(inode);
>
next prev parent reply other threads:[~2026-09-09 4:56 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-07 20:19 [PATCH v2 0/7] btrfs: convert some struct page users to folios Tal Zussman
2026-09-07 20:19 ` [PATCH v2 1/7] btrfs: tests: rename process_page_range() to process_folio_range() Tal Zussman
2026-09-07 20:19 ` [PATCH v2 2/7] btrfs: tests: convert test_find_delalloc() to use folios Tal Zussman
2026-09-09 4:56 ` Qu Wenruo [this message]
2026-09-07 20:19 ` [PATCH v2 3/7] btrfs: tests: use eb folio helpers in extent buffer memory checks Tal Zussman
2026-09-07 20:19 ` [PATCH v2 4/7] btrfs: convert btrfs_compr_pool_scan() to use folios Tal Zussman
2026-09-07 20:19 ` [PATCH v2 5/7] btrfs: convert heuristic_collect_sample() " Tal Zussman
2026-09-09 1:26 ` David Sterba
2026-09-09 4:25 ` Tal Zussman
2026-09-07 20:20 ` [PATCH v2 6/7] btrfs: fix stale function references in compression comments Tal Zussman
2026-09-07 20:20 ` [PATCH v2 7/7] btrfs: use folios for reading super blocks from the block device Tal Zussman
2026-09-09 6:10 ` [PATCH v2 0/7] btrfs: convert some struct page users to folios Qu Wenruo
2026-09-09 14:03 ` David Sterba
2026-09-09 17:30 ` Tal Zussman
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=5b72f456-4b62-490a-956b-9ca40ca1054c@suse.com \
--to=wqu@suse.com \
--cc=dsterba@suse.com \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mason@kernel.org \
--cc=tz2294@columbia.edu \
--cc=willy@infradead.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
all inboxes | Powered by JetHome®