On 19/04/2021 19:20, David Sterba wrote:
> On Mon, Apr 19, 2021 at 04:41:02PM +0900, Johannes Thumshirn wrote:
>> +void btrfs_reclaim_bgs_work(struct work_struct *work)
>> +{
>> + struct btrfs_fs_info *fs_info =
>> + container_of(work, struct btrfs_fs_info, reclaim_bgs_work);
>> + struct btrfs_block_group *bg;
>> + struct btrfs_space_info *space_info;
>> + int ret;
>> +
>> + if (!test_bit(BTRFS_FS_OPEN, &fs_info->flags))
>> + return;
>> +
>> + if (!btrfs_exclop_start(fs_info, BTRFS_EXCLOP_BALANCE))
>> + return;
>> +
>> + mutex_lock(&fs_info->reclaim_bgs_lock);
>> + spin_lock(&fs_info->unused_bgs_lock);
>> + while (!list_empty(&fs_info->reclaim_bgs)) {
>> + bg = list_first_entry(&fs_info->reclaim_bgs,
>> + struct btrfs_block_group,
>> + bg_list);
>> + list_del_init(&bg->bg_list);
>> +
>> + space_info = bg->space_info;
>> + spin_unlock(&fs_info->unused_bgs_lock);
>> +
>> + /* Don't want to race with allocators so take the groups_sem */
>> + down_write(&space_info->groups_sem);
>> +
>> + spin_lock(&bg->lock);
>> + if (bg->reserved || bg->pinned || bg->ro) {
>> + /*
>> + * We want to bail if we made new allocations or have
>> + * outstanding allocations in this block group. We do
>> + * the ro check in case balance is currently acting on
>> + * this block group.
>> + */
>> + spin_unlock(&bg->lock);
>> + up_write(&space_info->groups_sem);
>> + goto next;
>> + }
>> + spin_unlock(&bg->lock);
>> +
>> + /* Get out fast, in case we're unmounting the FS. */
>> + if (btrfs_fs_closing(fs_info)) {
>> + up_write(&space_info->groups_sem);
>> + goto next;
>> + }
>> +
>> + ret = inc_block_group_ro(bg, 0);
>> + up_write(&space_info->groups_sem);
>> + if (ret < 0)
>> + goto next;
>> +
>> + btrfs_info(fs_info, "reclaiming chunk %llu", bg->start);
>
> This could state the bg usage ratio, bg->used / bg->length .
OK, will do.