Btrfs: cleanup the redundant code for the block group allocation and init
Signed-off-by: Miao Xie <miaox@cn.fujitsu.com> Signed-off-by: Josef Bacik <jbacik@fb.com> Signed-off-by: Chris Mason <clm@fb.com>
This commit is contained in:
Родитель
26b47ff65b
Коммит
920e4a58d2
|
@ -8364,6 +8364,41 @@ static void __link_block_group(struct btrfs_space_info *space_info,
|
|||
up_write(&space_info->groups_sem);
|
||||
}
|
||||
|
||||
static struct btrfs_block_group_cache *
|
||||
btrfs_create_block_group_cache(struct btrfs_root *root, u64 start, u64 size)
|
||||
{
|
||||
struct btrfs_block_group_cache *cache;
|
||||
|
||||
cache = kzalloc(sizeof(*cache), GFP_NOFS);
|
||||
if (!cache)
|
||||
return NULL;
|
||||
|
||||
cache->free_space_ctl = kzalloc(sizeof(*cache->free_space_ctl),
|
||||
GFP_NOFS);
|
||||
if (!cache->free_space_ctl) {
|
||||
kfree(cache);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cache->key.objectid = start;
|
||||
cache->key.offset = size;
|
||||
cache->key.type = BTRFS_BLOCK_GROUP_ITEM_KEY;
|
||||
|
||||
cache->sectorsize = root->sectorsize;
|
||||
cache->fs_info = root->fs_info;
|
||||
cache->full_stripe_len = btrfs_full_stripe_len(root,
|
||||
&root->fs_info->mapping_tree,
|
||||
start);
|
||||
atomic_set(&cache->count, 1);
|
||||
spin_lock_init(&cache->lock);
|
||||
INIT_LIST_HEAD(&cache->list);
|
||||
INIT_LIST_HEAD(&cache->cluster_list);
|
||||
INIT_LIST_HEAD(&cache->new_bg_list);
|
||||
btrfs_init_free_space_ctl(cache);
|
||||
|
||||
return cache;
|
||||
}
|
||||
|
||||
int btrfs_read_block_groups(struct btrfs_root *root)
|
||||
{
|
||||
struct btrfs_path *path;
|
||||
|
@ -8399,26 +8434,16 @@ int btrfs_read_block_groups(struct btrfs_root *root)
|
|||
break;
|
||||
if (ret != 0)
|
||||
goto error;
|
||||
|
||||
leaf = path->nodes[0];
|
||||
btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]);
|
||||
cache = kzalloc(sizeof(*cache), GFP_NOFS);
|
||||
|
||||
cache = btrfs_create_block_group_cache(root, found_key.objectid,
|
||||
found_key.offset);
|
||||
if (!cache) {
|
||||
ret = -ENOMEM;
|
||||
goto error;
|
||||
}
|
||||
cache->free_space_ctl = kzalloc(sizeof(*cache->free_space_ctl),
|
||||
GFP_NOFS);
|
||||
if (!cache->free_space_ctl) {
|
||||
kfree(cache);
|
||||
ret = -ENOMEM;
|
||||
goto error;
|
||||
}
|
||||
|
||||
atomic_set(&cache->count, 1);
|
||||
spin_lock_init(&cache->lock);
|
||||
cache->fs_info = info;
|
||||
INIT_LIST_HEAD(&cache->list);
|
||||
INIT_LIST_HEAD(&cache->cluster_list);
|
||||
|
||||
if (need_clear) {
|
||||
/*
|
||||
|
@ -8439,16 +8464,10 @@ int btrfs_read_block_groups(struct btrfs_root *root)
|
|||
read_extent_buffer(leaf, &cache->item,
|
||||
btrfs_item_ptr_offset(leaf, path->slots[0]),
|
||||
sizeof(cache->item));
|
||||
memcpy(&cache->key, &found_key, sizeof(found_key));
|
||||
cache->flags = btrfs_block_group_flags(&cache->item);
|
||||
|
||||
key.objectid = found_key.objectid + found_key.offset;
|
||||
btrfs_release_path(path);
|
||||
cache->flags = btrfs_block_group_flags(&cache->item);
|
||||
cache->sectorsize = root->sectorsize;
|
||||
cache->full_stripe_len = btrfs_full_stripe_len(root,
|
||||
&root->fs_info->mapping_tree,
|
||||
found_key.objectid);
|
||||
btrfs_init_free_space_ctl(cache);
|
||||
|
||||
/*
|
||||
* We need to exclude the super stripes now so that the space
|
||||
|
@ -8462,8 +8481,7 @@ int btrfs_read_block_groups(struct btrfs_root *root)
|
|||
* case.
|
||||
*/
|
||||
free_excluded_extents(root, cache);
|
||||
kfree(cache->free_space_ctl);
|
||||
kfree(cache);
|
||||
btrfs_put_block_group(cache);
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
@ -8594,38 +8612,15 @@ int btrfs_make_block_group(struct btrfs_trans_handle *trans,
|
|||
|
||||
root->fs_info->last_trans_log_full_commit = trans->transid;
|
||||
|
||||
cache = kzalloc(sizeof(*cache), GFP_NOFS);
|
||||
cache = btrfs_create_block_group_cache(root, chunk_offset, size);
|
||||
if (!cache)
|
||||
return -ENOMEM;
|
||||
cache->free_space_ctl = kzalloc(sizeof(*cache->free_space_ctl),
|
||||
GFP_NOFS);
|
||||
if (!cache->free_space_ctl) {
|
||||
kfree(cache);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
cache->key.objectid = chunk_offset;
|
||||
cache->key.offset = size;
|
||||
cache->key.type = BTRFS_BLOCK_GROUP_ITEM_KEY;
|
||||
cache->sectorsize = root->sectorsize;
|
||||
cache->fs_info = root->fs_info;
|
||||
cache->full_stripe_len = btrfs_full_stripe_len(root,
|
||||
&root->fs_info->mapping_tree,
|
||||
chunk_offset);
|
||||
|
||||
atomic_set(&cache->count, 1);
|
||||
spin_lock_init(&cache->lock);
|
||||
INIT_LIST_HEAD(&cache->list);
|
||||
INIT_LIST_HEAD(&cache->cluster_list);
|
||||
INIT_LIST_HEAD(&cache->new_bg_list);
|
||||
|
||||
btrfs_init_free_space_ctl(cache);
|
||||
|
||||
btrfs_set_block_group_used(&cache->item, bytes_used);
|
||||
btrfs_set_block_group_chunk_objectid(&cache->item, chunk_objectid);
|
||||
cache->flags = type;
|
||||
btrfs_set_block_group_flags(&cache->item, type);
|
||||
|
||||
cache->flags = type;
|
||||
cache->last_byte_to_unpin = (u64)-1;
|
||||
cache->cached = BTRFS_CACHE_FINISHED;
|
||||
ret = exclude_super_stripes(root, cache);
|
||||
|
@ -8635,8 +8630,7 @@ int btrfs_make_block_group(struct btrfs_trans_handle *trans,
|
|||
* case.
|
||||
*/
|
||||
free_excluded_extents(root, cache);
|
||||
kfree(cache->free_space_ctl);
|
||||
kfree(cache);
|
||||
btrfs_put_block_group(cache);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче