Skip to content

Commit

Permalink
btrfs: scrub: use generic ratelimit helpers to output error messages
Browse files Browse the repository at this point in the history
Currently scrub goes different ways to rate limits its error messages:

- regular btrfs_err_rl_in_rcu() helper for repaired sectors and
  the initial message for unrepaired sectors

- Manually rate limits scrub_print_common_warning()

I'd say the different rate limits could lead to cases where we only got
the "unable to fixup (regular) error" messages but the detailed report
about that corruption is ratelimited.

To make the whole rate limit works more consistently, change the rate
limit by:

- Always using btrfs_*_rl() helpers

- Remove the initial "unable to fixup (regular) error" message
  Since we're ensured to have at least one error message for each
  unrepaired sector (before rate limit), there is no need for
  a duplicated line.

  And if we hit rate limits, we will rate limit all the error messages
  together, not treating different error messages differently.

Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
  • Loading branch information
adam900710 authored and kdave committed Jan 23, 2025
1 parent 3a022d6 commit c4c101c
Showing 1 changed file with 8 additions and 18 deletions.
26 changes: 8 additions & 18 deletions fs/btrfs/scrub.c
Original file line number Diff line number Diff line change
Expand Up @@ -427,7 +427,7 @@ static int scrub_print_warning_inode(u64 inum, u64 offset, u64 num_bytes,
* hold all of the paths here
*/
for (i = 0; i < ipath->fspath->elem_cnt; ++i) {
btrfs_warn_in_rcu(fs_info,
btrfs_warn_rl_in_rcu(fs_info,
"%s at logical %llu on dev %s, physical %llu, root %llu, inode %llu, offset %llu, path: %s",
swarn->errstr, swarn->logical,
btrfs_dev_name(swarn->dev),
Expand All @@ -442,7 +442,7 @@ static int scrub_print_warning_inode(u64 inum, u64 offset, u64 num_bytes,
return 0;

err:
btrfs_warn_in_rcu(fs_info,
btrfs_warn_rl_in_rcu(fs_info,
"%s at logical %llu on dev %s, physical %llu, root %llu, inode %llu, offset %llu: path resolving failed with ret=%d",
swarn->errstr, swarn->logical,
btrfs_dev_name(swarn->dev),
Expand Down Expand Up @@ -500,15 +500,15 @@ static void scrub_print_common_warning(const char *errstr, struct btrfs_device *
break;
if (ret > 0)
break;
btrfs_warn_in_rcu(fs_info,
btrfs_warn_rl_in_rcu(fs_info,
"%s at logical %llu on dev %s, physical %llu: metadata %s (level %d) in tree %llu",
errstr, swarn.logical, btrfs_dev_name(dev),
swarn.physical, (ref_level ? "node" : "leaf"),
ref_level, ref_root);
swarn.message_printed = true;
}
if (!swarn.message_printed)
btrfs_warn_in_rcu(fs_info,
btrfs_warn_rl_in_rcu(fs_info,
"%s at metadata, logical %llu on dev %s physical %llu",
errstr, swarn.logical,
btrfs_dev_name(dev), swarn.physical);
Expand All @@ -527,7 +527,7 @@ static void scrub_print_common_warning(const char *errstr, struct btrfs_device *

iterate_extent_inodes(&ctx, true, scrub_print_warning_inode, &swarn);
if (!swarn.message_printed)
btrfs_warn_in_rcu(fs_info,
btrfs_warn_rl_in_rcu(fs_info,
"%s at data, filename unresolved, logical %llu on dev %s physical %llu",
errstr, swarn.logical,
btrfs_dev_name(dev), swarn.physical);
Expand Down Expand Up @@ -846,8 +846,6 @@ static void scrub_stripe_submit_repair_read(struct scrub_stripe *stripe,
static void scrub_stripe_report_errors(struct scrub_ctx *sctx,
struct scrub_stripe *stripe)
{
static DEFINE_RATELIMIT_STATE(rs, DEFAULT_RATELIMIT_INTERVAL,
DEFAULT_RATELIMIT_BURST);
struct btrfs_fs_info *fs_info = sctx->fs_info;
struct btrfs_device *dev = stripe->dev;
u64 stripe_physical = stripe->physical;
Expand Down Expand Up @@ -899,22 +897,14 @@ static void scrub_stripe_report_errors(struct scrub_ctx *sctx,
}

/* The remaining are all for unrepaired. */
btrfs_err_rl_in_rcu(fs_info,
"unable to fixup (regular) error at logical %llu on dev %s physical %llu",
logical, btrfs_dev_name(dev),
physical);

if (test_bit(sector_nr, &stripe->io_error_bitmap))
if (__ratelimit(&rs))
scrub_print_common_warning("i/o error", dev,
scrub_print_common_warning("i/o error", dev,
logical, physical);
if (test_bit(sector_nr, &stripe->csum_error_bitmap))
if (__ratelimit(&rs))
scrub_print_common_warning("checksum error", dev,
scrub_print_common_warning("checksum error", dev,
logical, physical);
if (test_bit(sector_nr, &stripe->meta_error_bitmap))
if (__ratelimit(&rs))
scrub_print_common_warning("header error", dev,
scrub_print_common_warning("header error", dev,
logical, physical);
}

Expand Down

0 comments on commit c4c101c

Please sign in to comment.