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.

Reply via email to