btrfs: don't print relocation messages from auto reclaim

When BTRFS is doing automatic block-group reclaim, it is spamming the
kernel log messages a lot.

Add a 'verbose' parameter to btrfs_relocate_chunk() and
btrfs_relocate_block_group() to control the verbosity of these log
message. This way the old behaviour of printing log messages on a
user-space initiated balance operation can be kept while excessive log
spamming due to auto reclaim is mitigated.

Reviewed-by: Boris Burkov <boris@bur.io>
Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Johannes Thumshirn 2025-07-08 08:55:03 +02:00 committed by David Sterba
parent a507904090
commit 5ae011bcbb
5 changed files with 21 additions and 13 deletions

View file

@ -1953,7 +1953,7 @@ void btrfs_reclaim_bgs_work(struct work_struct *work)
spin_unlock(&bg->lock); spin_unlock(&bg->lock);
trace_btrfs_reclaim_block_group(bg); trace_btrfs_reclaim_block_group(bg);
ret = btrfs_relocate_chunk(fs_info, bg->start); ret = btrfs_relocate_chunk(fs_info, bg->start, false);
if (ret) { if (ret) {
btrfs_dec_block_group_ro(bg); btrfs_dec_block_group_ro(bg);
btrfs_err(fs_info, "error relocating chunk %llu", btrfs_err(fs_info, "error relocating chunk %llu",

View file

@ -3908,7 +3908,8 @@ static const char *stage_to_string(enum reloc_stage stage)
/* /*
* function to relocate all extents in a block group. * function to relocate all extents in a block group.
*/ */
int btrfs_relocate_block_group(struct btrfs_fs_info *fs_info, u64 group_start) int btrfs_relocate_block_group(struct btrfs_fs_info *fs_info, u64 group_start,
bool verbose)
{ {
struct btrfs_block_group *bg; struct btrfs_block_group *bg;
struct btrfs_root *extent_root = btrfs_extent_root(fs_info, group_start); struct btrfs_root *extent_root = btrfs_extent_root(fs_info, group_start);
@ -4000,7 +4001,8 @@ int btrfs_relocate_block_group(struct btrfs_fs_info *fs_info, u64 group_start)
goto out; goto out;
} }
describe_relocation(rc->block_group); if (verbose)
describe_relocation(rc->block_group);
btrfs_wait_block_group_reservations(rc->block_group); btrfs_wait_block_group_reservations(rc->block_group);
btrfs_wait_nocow_writers(rc->block_group); btrfs_wait_nocow_writers(rc->block_group);
@ -4044,8 +4046,10 @@ int btrfs_relocate_block_group(struct btrfs_fs_info *fs_info, u64 group_start)
if (rc->extents_found == 0) if (rc->extents_found == 0)
break; break;
btrfs_info(fs_info, "found %llu extents, stage: %s", if (verbose)
rc->extents_found, stage_to_string(finishes_stage)); btrfs_info(fs_info, "found %llu extents, stage: %s",
rc->extents_found,
stage_to_string(finishes_stage));
} }
WARN_ON(rc->block_group->pinned > 0); WARN_ON(rc->block_group->pinned > 0);

View file

@ -12,7 +12,8 @@ struct btrfs_trans_handle;
struct btrfs_ordered_extent; struct btrfs_ordered_extent;
struct btrfs_pending_snapshot; struct btrfs_pending_snapshot;
int btrfs_relocate_block_group(struct btrfs_fs_info *fs_info, u64 group_start); int btrfs_relocate_block_group(struct btrfs_fs_info *fs_info, u64 group_start,
bool verbose);
int btrfs_init_reloc_root(struct btrfs_trans_handle *trans, struct btrfs_root *root); int btrfs_init_reloc_root(struct btrfs_trans_handle *trans, struct btrfs_root *root);
int btrfs_update_reloc_root(struct btrfs_trans_handle *trans, int btrfs_update_reloc_root(struct btrfs_trans_handle *trans,
struct btrfs_root *root); struct btrfs_root *root);

View file

@ -3412,7 +3412,8 @@ out:
return ret; return ret;
} }
int btrfs_relocate_chunk(struct btrfs_fs_info *fs_info, u64 chunk_offset) int btrfs_relocate_chunk(struct btrfs_fs_info *fs_info, u64 chunk_offset,
bool verbose)
{ {
struct btrfs_root *root = fs_info->chunk_root; struct btrfs_root *root = fs_info->chunk_root;
struct btrfs_trans_handle *trans; struct btrfs_trans_handle *trans;
@ -3442,7 +3443,7 @@ int btrfs_relocate_chunk(struct btrfs_fs_info *fs_info, u64 chunk_offset)
/* step one, relocate all the extents inside this chunk */ /* step one, relocate all the extents inside this chunk */
btrfs_scrub_pause(fs_info); btrfs_scrub_pause(fs_info);
ret = btrfs_relocate_block_group(fs_info, chunk_offset); ret = btrfs_relocate_block_group(fs_info, chunk_offset, true);
btrfs_scrub_continue(fs_info); btrfs_scrub_continue(fs_info);
if (ret) { if (ret) {
/* /*
@ -3552,7 +3553,8 @@ again:
btrfs_release_path(path); btrfs_release_path(path);
if (chunk_type & BTRFS_BLOCK_GROUP_SYSTEM) { if (chunk_type & BTRFS_BLOCK_GROUP_SYSTEM) {
ret = btrfs_relocate_chunk(fs_info, found_key.offset); ret = btrfs_relocate_chunk(fs_info, found_key.offset,
true);
if (ret == -ENOSPC) if (ret == -ENOSPC)
failed++; failed++;
else else
@ -4217,7 +4219,7 @@ again:
} }
} }
ret = btrfs_relocate_chunk(fs_info, found_key.offset); ret = btrfs_relocate_chunk(fs_info, found_key.offset, true);
mutex_unlock(&fs_info->reclaim_bgs_lock); mutex_unlock(&fs_info->reclaim_bgs_lock);
if (ret == -ENOSPC) { if (ret == -ENOSPC) {
enospc_errors++; enospc_errors++;
@ -4985,7 +4987,7 @@ again:
goto done; goto done;
} }
ret = btrfs_relocate_chunk(fs_info, chunk_offset); ret = btrfs_relocate_chunk(fs_info, chunk_offset, true);
mutex_unlock(&fs_info->reclaim_bgs_lock); mutex_unlock(&fs_info->reclaim_bgs_lock);
if (ret == -ENOSPC) { if (ret == -ENOSPC) {
failed++; failed++;
@ -8198,7 +8200,7 @@ static int relocating_repair_kthread(void *data)
btrfs_info(fs_info, btrfs_info(fs_info,
"zoned: relocating block group %llu to repair IO failure", "zoned: relocating block group %llu to repair IO failure",
target); target);
ret = btrfs_relocate_chunk(fs_info, target); ret = btrfs_relocate_chunk(fs_info, target, true);
out: out:
if (cache) if (cache)

View file

@ -763,7 +763,8 @@ void btrfs_describe_block_groups(u64 flags, char *buf, u32 size_buf);
int btrfs_resume_balance_async(struct btrfs_fs_info *fs_info); int btrfs_resume_balance_async(struct btrfs_fs_info *fs_info);
int btrfs_recover_balance(struct btrfs_fs_info *fs_info); int btrfs_recover_balance(struct btrfs_fs_info *fs_info);
int btrfs_pause_balance(struct btrfs_fs_info *fs_info); int btrfs_pause_balance(struct btrfs_fs_info *fs_info);
int btrfs_relocate_chunk(struct btrfs_fs_info *fs_info, u64 chunk_offset); int btrfs_relocate_chunk(struct btrfs_fs_info *fs_info, u64 chunk_offset,
bool verbose);
int btrfs_cancel_balance(struct btrfs_fs_info *fs_info); int btrfs_cancel_balance(struct btrfs_fs_info *fs_info);
bool btrfs_chunk_writeable(struct btrfs_fs_info *fs_info, u64 chunk_offset); bool btrfs_chunk_writeable(struct btrfs_fs_info *fs_info, u64 chunk_offset);
void btrfs_dev_stat_inc_and_print(struct btrfs_device *dev, int index); void btrfs_dev_stat_inc_and_print(struct btrfs_device *dev, int index);