From: Andy Shevchenko <andy.shevchenko@gmail.com>
To: Qu Wenruo <wqu@suse.com>
Cc: linux-btrfs@vger.kernel.org
Subject: Re: [PATCH 2/2] btrfs: make btrfs_truncate_block() zero folio range for certain subpage corner cases
Date: Sat, 12 Apr 2025 21:35:30 +0300 [thread overview]
Message-ID: <Z_qycnlLXbCgd7uF@surfacebook.localdomain> (raw)
In-Reply-To: <d66c922e591b3a57a230ca357b9085fe6ae53812.1744344865.git.wqu@suse.com>
Fri, Apr 11, 2025 at 02:44:01PM +0930, Qu Wenruo kirjoitti:
> [BUG]
> For the following fsx -e 1 run, the btrfs still fails the run on 64K
> page size with 4K fs block size:
>
> READ BAD DATA: offset = 0x26b3a, size = 0xfafa, fname = /mnt/btrfs/junk
> OFFSET GOOD BAD RANGE
> 0x26b3a 0x0000 0x15b4 0x0
> operation# (mod 256) for the bad data may be 21
[...]
> +static int zero_range_folio(struct btrfs_inode *inode, loff_t from, loff_t end,
> + u64 orig_start, u64 orig_end,
> + enum btrfs_truncate_where where)
> +{
> + const u32 blocksize = inode->root->fs_info->sectorsize;
> + struct address_space *mapping = inode->vfs_inode.i_mapping;
> + struct extent_io_tree *io_tree = &inode->io_tree;
> + struct extent_state *cached_state = NULL;
> + struct btrfs_ordered_extent *ordered;
> + pgoff_t index = (where == BTRFS_TRUNCATE_HEAD_BLOCK) ?
> + (from >> PAGE_SHIFT) : (end >> PAGE_SHIFT);
You want to use PFN_*() macros from the pfn.h perhaps?
> + struct folio *folio;
> + u64 block_start;
> + u64 block_end;
> + u64 clamp_start;
> + u64 clamp_end;
> + int ret = 0;
> +
> + /*
> + * The target head/tail block is already block aligned.
> + * If block size >= PAGE_SIZE, meaning it's impossible to mmap a
> + * page containing anything other than the target block.
> + */
> + if (blocksize >= PAGE_SIZE)
> + return 0;
> +again:
> + folio = filemap_lock_folio(mapping, index);
> + /* No folio present. */
> + if (IS_ERR(folio))
> + return 0;
> +
> + if (!folio_test_uptodate(folio)) {
> + ret = btrfs_read_folio(NULL, folio);
> + folio_lock(folio);
> + if (folio->mapping != mapping) {
> + folio_unlock(folio);
> + folio_put(folio);
> + goto again;
> + }
> + if (!folio_test_uptodate(folio)) {
> + ret = -EIO;
> + goto out_unlock;
> + }
> + }
> + folio_wait_writeback(folio);
> +
> + clamp_start = max_t(u64, folio_pos(folio), orig_start);
> + clamp_end = min_t(u64, folio_pos(folio) + folio_size(folio) - 1,
> + orig_end);
You probably wanted clamp() ?
> + block_start = round_down(clamp_start, block_size);
> + block_end = round_up(clamp_end + 1, block_size) - 1;
LKP rightfully complains, I believe you want to use ALIGN*() macros instead.
> + lock_extent(io_tree, block_start, block_end, &cached_state);
> + ordered = btrfs_lookup_ordered_range(inode, block_start, block_end + 1 - block_end);
> + if (ordered) {
> + unlock_extent(io_tree, block_start, block_end, &cached_state);
> + folio_unlock(folio);
> + folio_put(folio);
> + btrfs_start_ordered_extent(ordered);
> + btrfs_put_ordered_extent(ordered);
> + goto again;
> + }
> + folio_zero_range(folio, clamp_start - folio_pos(folio),
> + clamp_end - clamp_start + 1);
> + unlock_extent(io_tree, block_start, block_end, &cached_state);
> +
> +out_unlock:
> + folio_unlock(folio);
> + folio_put(folio);
> + return ret;
> +}
--
With Best Regards,
Andy Shevchenko
next prev parent reply other threads:[~2025-04-12 18:35 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-04-11 5:13 [PATCH 0/2] btrfs: fix corner cases for subpage generic/363 failures Qu Wenruo
2025-04-11 5:14 ` [PATCH 1/2] btrfs: make btrfs_truncate_block() to zero involved blocks in a folio Qu Wenruo
2025-04-11 7:02 ` Qu Wenruo
2025-04-11 5:14 ` [PATCH 2/2] btrfs: make btrfs_truncate_block() zero folio range for certain subpage corner cases Qu Wenruo
2025-04-12 5:12 ` kernel test robot
2025-04-12 5:54 ` kernel test robot
2025-04-12 18:35 ` Andy Shevchenko [this message]
2025-04-14 1:20 ` Qu Wenruo
2025-04-14 3:37 ` Qu Wenruo
2025-04-14 10:40 ` Andy Shevchenko
2025-04-15 18:18 ` David Sterba
2025-04-15 18:21 ` Andy Shevchenko
2025-04-15 23:57 ` Qu Wenruo
2025-04-16 5:57 ` Andy Shevchenko
2025-04-16 8:28 ` 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=Z_qycnlLXbCgd7uF@surfacebook.localdomain \
--to=andy.shevchenko@gmail.com \
--cc=linux-btrfs@vger.kernel.org \
--cc=wqu@suse.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