Message ID | 20241007115248.16434-3-jth@kernel.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | btrfs: RST scrub fixes for prealloc | expand |
On Mon, Oct 07, 2024 at 01:52:48PM +0200, Johannes Thumshirn wrote: > From: Johannes Thumshirn <johannes.thumshirn@wdc.com> > > Performing the initial extent sector read on a RAID stripe-tree backed > filesystem with pre-allocated extents will cause the RAID stripe-tree > lookup code to return ENODATA, as pre-allocated extents do not have any > on-disk bytes and thus no RAID stripe-tree entries. > > But the current scrub read code marks these extens as errors, because the > lookup fails. > > If btrfs_map_block() returns -ENODATA, it means that the call to > btrfs_get_raid_extent_offset() returned -ENODATA, because there is no > entry for the corresponding range in the RAID stripe-tree. But as this > range is in the extent-tree it means we've hit a pre-allocated extent. In > this case, don't mark the sector in the stripe's error bitmaps as faulty > and carry on to the next. I've added summary of this paragraph as a comment to the code, using the ENODATA for a specific relations in the trees is quite unobvious.
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index e141132b5c8d..96ac6f9e5eee 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c @@ -1704,8 +1704,10 @@ static void scrub_submit_extent_sector_read(struct scrub_ctx *sctx, &stripe_len, &bioc, &io_stripe, &mirror); btrfs_put_bioc(bioc); if (err < 0) { - set_bit(i, &stripe->io_error_bitmap); - set_bit(i, &stripe->error_bitmap); + if (err != -ENODATA) { + set_bit(i, &stripe->io_error_bitmap); + set_bit(i, &stripe->error_bitmap); + } continue; }