Commit b4d7c3c9 authored by Li Zefan's avatar Li Zefan Committed by Chris Mason

Btrfs: kill free_space pointer from inode structure

Inodes always allocate free space with BTRFS_BLOCK_GROUP_DATA type,
which means every inode has the same BTRFS_I(inode)->free_space pointer.

This shrinks struct btrfs_inode by 4 bytes (or 8 bytes on 64 bits).
Signed-off-by: default avatarLi Zefan <lizefan@huawei.com>
parent d5b025d5
...@@ -87,9 +87,6 @@ struct btrfs_inode { ...@@ -87,9 +87,6 @@ struct btrfs_inode {
/* node for the red-black tree that links inodes in subvolume root */ /* node for the red-black tree that links inodes in subvolume root */
struct rb_node rb_node; struct rb_node rb_node;
/* the space_info for where this inode's data allocations are done */
struct btrfs_space_info *space_info;
unsigned long runtime_flags; unsigned long runtime_flags;
/* full 64 bit generation number, struct vfs_inode doesn't have a big /* full 64 bit generation number, struct vfs_inode doesn't have a big
......
...@@ -1240,6 +1240,8 @@ struct btrfs_fs_info { ...@@ -1240,6 +1240,8 @@ struct btrfs_fs_info {
*/ */
struct list_head space_info; struct list_head space_info;
struct btrfs_space_info *data_sinfo;
struct reloc_control *reloc_ctl; struct reloc_control *reloc_ctl;
spinlock_t delalloc_lock; spinlock_t delalloc_lock;
...@@ -2607,7 +2609,6 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans, ...@@ -2607,7 +2609,6 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans,
struct btrfs_root *root, u64 group_start); struct btrfs_root *root, u64 group_start);
u64 btrfs_reduce_alloc_profile(struct btrfs_root *root, u64 flags); u64 btrfs_reduce_alloc_profile(struct btrfs_root *root, u64 flags);
u64 btrfs_get_alloc_profile(struct btrfs_root *root, int data); u64 btrfs_get_alloc_profile(struct btrfs_root *root, int data);
void btrfs_set_inode_space_info(struct btrfs_root *root, struct inode *ionde);
void btrfs_clear_space_info_full(struct btrfs_fs_info *info); void btrfs_clear_space_info_full(struct btrfs_fs_info *info);
int btrfs_check_data_free_space(struct inode *inode, u64 bytes); int btrfs_check_data_free_space(struct inode *inode, u64 bytes);
void btrfs_free_reserved_data_space(struct inode *inode, u64 bytes); void btrfs_free_reserved_data_space(struct inode *inode, u64 bytes);
......
...@@ -3139,6 +3139,8 @@ static int update_space_info(struct btrfs_fs_info *info, u64 flags, ...@@ -3139,6 +3139,8 @@ static int update_space_info(struct btrfs_fs_info *info, u64 flags,
init_waitqueue_head(&found->wait); init_waitqueue_head(&found->wait);
*space_info = found; *space_info = found;
list_add_rcu(&found->list, &info->space_info); list_add_rcu(&found->list, &info->space_info);
if (flags & BTRFS_BLOCK_GROUP_DATA)
info->data_sinfo = found;
return 0; return 0;
} }
...@@ -3268,12 +3270,6 @@ u64 btrfs_get_alloc_profile(struct btrfs_root *root, int data) ...@@ -3268,12 +3270,6 @@ u64 btrfs_get_alloc_profile(struct btrfs_root *root, int data)
return get_alloc_profile(root, flags); return get_alloc_profile(root, flags);
} }
void btrfs_set_inode_space_info(struct btrfs_root *root, struct inode *inode)
{
BTRFS_I(inode)->space_info = __find_space_info(root->fs_info,
BTRFS_BLOCK_GROUP_DATA);
}
/* /*
* This will check the space that the inode allocates from to make sure we have * This will check the space that the inode allocates from to make sure we have
* enough space for bytes. * enough space for bytes.
...@@ -3282,6 +3278,7 @@ int btrfs_check_data_free_space(struct inode *inode, u64 bytes) ...@@ -3282,6 +3278,7 @@ int btrfs_check_data_free_space(struct inode *inode, u64 bytes)
{ {
struct btrfs_space_info *data_sinfo; struct btrfs_space_info *data_sinfo;
struct btrfs_root *root = BTRFS_I(inode)->root; struct btrfs_root *root = BTRFS_I(inode)->root;
struct btrfs_fs_info *fs_info = root->fs_info;
u64 used; u64 used;
int ret = 0, committed = 0, alloc_chunk = 1; int ret = 0, committed = 0, alloc_chunk = 1;
...@@ -3294,7 +3291,7 @@ int btrfs_check_data_free_space(struct inode *inode, u64 bytes) ...@@ -3294,7 +3291,7 @@ int btrfs_check_data_free_space(struct inode *inode, u64 bytes)
committed = 1; committed = 1;
} }
data_sinfo = BTRFS_I(inode)->space_info; data_sinfo = fs_info->data_sinfo;
if (!data_sinfo) if (!data_sinfo)
goto alloc; goto alloc;
...@@ -3335,10 +3332,9 @@ int btrfs_check_data_free_space(struct inode *inode, u64 bytes) ...@@ -3335,10 +3332,9 @@ int btrfs_check_data_free_space(struct inode *inode, u64 bytes)
goto commit_trans; goto commit_trans;
} }
if (!data_sinfo) { if (!data_sinfo)
btrfs_set_inode_space_info(root, inode); data_sinfo = fs_info->data_sinfo;
data_sinfo = BTRFS_I(inode)->space_info;
}
goto again; goto again;
} }
...@@ -3385,7 +3381,7 @@ void btrfs_free_reserved_data_space(struct inode *inode, u64 bytes) ...@@ -3385,7 +3381,7 @@ void btrfs_free_reserved_data_space(struct inode *inode, u64 bytes)
/* make sure bytes are sectorsize aligned */ /* make sure bytes are sectorsize aligned */
bytes = (bytes + root->sectorsize - 1) & ~((u64)root->sectorsize - 1); bytes = (bytes + root->sectorsize - 1) & ~((u64)root->sectorsize - 1);
data_sinfo = BTRFS_I(inode)->space_info; data_sinfo = root->fs_info->data_sinfo;
spin_lock(&data_sinfo->lock); spin_lock(&data_sinfo->lock);
data_sinfo->bytes_may_use -= bytes; data_sinfo->bytes_may_use -= bytes;
trace_btrfs_space_reservation(root->fs_info, "space_info", trace_btrfs_space_reservation(root->fs_info, "space_info",
......
...@@ -4082,7 +4082,6 @@ static int btrfs_init_locked_inode(struct inode *inode, void *p) ...@@ -4082,7 +4082,6 @@ static int btrfs_init_locked_inode(struct inode *inode, void *p)
struct btrfs_iget_args *args = p; struct btrfs_iget_args *args = p;
inode->i_ino = args->ino; inode->i_ino = args->ino;
BTRFS_I(inode)->root = args->root; BTRFS_I(inode)->root = args->root;
btrfs_set_inode_space_info(args->root, inode);
return 0; return 0;
} }
...@@ -4667,7 +4666,6 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, ...@@ -4667,7 +4666,6 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,
BTRFS_I(inode)->root = root; BTRFS_I(inode)->root = root;
BTRFS_I(inode)->generation = trans->transid; BTRFS_I(inode)->generation = trans->transid;
inode->i_generation = BTRFS_I(inode)->generation; inode->i_generation = BTRFS_I(inode)->generation;
btrfs_set_inode_space_info(root, inode);
if (S_ISDIR(mode)) if (S_ISDIR(mode))
owner = 0; owner = 0;
...@@ -6944,7 +6942,6 @@ struct inode *btrfs_alloc_inode(struct super_block *sb) ...@@ -6944,7 +6942,6 @@ struct inode *btrfs_alloc_inode(struct super_block *sb)
return NULL; return NULL;
ei->root = NULL; ei->root = NULL;
ei->space_info = NULL;
ei->generation = 0; ei->generation = 0;
ei->last_trans = 0; ei->last_trans = 0;
ei->last_sub_trans = 0; ei->last_sub_trans = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment