summaryrefslogtreecommitdiff
path: root/fs/btrfs/delayed-inode.c
diff options
context:
space:
mode:
authorDavid Sterba <dsterba@suse.com>2026-01-09 18:17:40 +0100
committerDavid Sterba <dsterba@suse.com>2026-02-03 07:56:20 +0100
commitc8bafc8d6a78bdc484749816668d6f415d008fe8 (patch)
tree9af5c453f0e40e9b878ebd513df415c2101502c5 /fs/btrfs/delayed-inode.c
parent71e545d4e33f97258bf7416c132b10a6c1234255 (diff)
downloadlinux-next-c8bafc8d6a78bdc484749816668d6f415d008fe8.tar.gz
linux-next-c8bafc8d6a78bdc484749816668d6f415d008fe8.zip
btrfs: embed delayed root to struct btrfs_fs_info
The fs_info::delayed_root is allocated dynamically but there's only one instance per filesystem so we can embed it into the fs_info itself. The two object have the same lifetime and delayed roots are always present so we don't need to allocate it on demand from slab. There's still some space left in fs_info until the 4K so there won't be an spill over to next page on release config (size grows from 3880 to 3952). In case we want to shrink fs_info there are still holes to fill or we can separate other non-core or optional structures if needed. Link: https://lore.kernel.org/all/cover.1767979013.git.dsterba@suse.com/ Reviewed-by: Boris Burkov <boris@bur.io> Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'fs/btrfs/delayed-inode.c')
-rw-r--r--fs/btrfs/delayed-inode.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c
index 2286bee2c6d3..a752646257df 100644
--- a/fs/btrfs/delayed-inode.c
+++ b/fs/btrfs/delayed-inode.c
@@ -257,7 +257,7 @@ static struct btrfs_delayed_node *btrfs_next_delayed_node(
struct list_head *p;
struct btrfs_delayed_node *next = NULL;
- delayed_root = node->root->fs_info->delayed_root;
+ delayed_root = &node->root->fs_info->delayed_root;
spin_lock(&delayed_root->lock);
if (!test_bit(BTRFS_DELAYED_NODE_IN_LIST, &node->flags)) {
/* not in the list */
@@ -287,7 +287,7 @@ static void __btrfs_release_delayed_node(
if (!delayed_node)
return;
- delayed_root = delayed_node->root->fs_info->delayed_root;
+ delayed_root = &delayed_node->root->fs_info->delayed_root;
mutex_lock(&delayed_node->mutex);
if (delayed_node->count)
@@ -425,7 +425,7 @@ static int __btrfs_add_delayed_item(struct btrfs_delayed_node *delayed_node,
delayed_node->index_cnt = ins->index + 1;
delayed_node->count++;
- atomic_inc(&delayed_node->root->fs_info->delayed_root->items);
+ atomic_inc(&delayed_node->root->fs_info->delayed_root.items);
return 0;
}
@@ -452,7 +452,7 @@ static void __btrfs_remove_delayed_item(struct btrfs_delayed_item *delayed_item)
/* If it's in a rbtree, then we need to have delayed node locked. */
lockdep_assert_held(&delayed_node->mutex);
- delayed_root = delayed_node->root->fs_info->delayed_root;
+ delayed_root = &delayed_node->root->fs_info->delayed_root;
if (delayed_item->type == BTRFS_DELAYED_INSERTION_ITEM)
root = &delayed_node->ins_root;
@@ -988,7 +988,7 @@ static void btrfs_release_delayed_inode(struct btrfs_delayed_node *delayed_node)
clear_bit(BTRFS_DELAYED_NODE_INODE_DIRTY, &delayed_node->flags);
delayed_node->count--;
- delayed_root = delayed_node->root->fs_info->delayed_root;
+ delayed_root = &delayed_node->root->fs_info->delayed_root;
finish_one_item(delayed_root);
}
}
@@ -1002,7 +1002,7 @@ static void btrfs_release_delayed_iref(struct btrfs_delayed_node *delayed_node)
ASSERT(delayed_node->root);
delayed_node->count--;
- delayed_root = delayed_node->root->fs_info->delayed_root;
+ delayed_root = &delayed_node->root->fs_info->delayed_root;
finish_one_item(delayed_root);
}
}
@@ -1168,7 +1168,7 @@ static int __btrfs_run_delayed_items(struct btrfs_trans_handle *trans, int nr)
block_rsv = trans->block_rsv;
trans->block_rsv = &fs_info->delayed_block_rsv;
- delayed_root = fs_info->delayed_root;
+ delayed_root = &fs_info->delayed_root;
curr_node = btrfs_first_delayed_node(delayed_root, &curr_delayed_node_tracker);
while (curr_node && (!count || nr--)) {
@@ -1417,7 +1417,7 @@ void btrfs_assert_delayed_root_empty(struct btrfs_fs_info *fs_info)
struct btrfs_ref_tracker delayed_node_tracker;
struct btrfs_delayed_node *node;
- node = btrfs_first_delayed_node( fs_info->delayed_root, &delayed_node_tracker);
+ node = btrfs_first_delayed_node(&fs_info->delayed_root, &delayed_node_tracker);
if (WARN_ON(node)) {
btrfs_delayed_node_ref_tracker_free(node,
&delayed_node_tracker);
@@ -1440,7 +1440,7 @@ static bool could_end_wait(struct btrfs_delayed_root *delayed_root, int seq)
void btrfs_balance_delayed_items(struct btrfs_fs_info *fs_info)
{
- struct btrfs_delayed_root *delayed_root = fs_info->delayed_root;
+ struct btrfs_delayed_root *delayed_root = &fs_info->delayed_root;
if ((atomic_read(&delayed_root->items) < BTRFS_DELAYED_BACKGROUND) ||
btrfs_workqueue_normal_congested(fs_info->delayed_workers))
@@ -1970,7 +1970,7 @@ int btrfs_delayed_update_inode(struct btrfs_trans_handle *trans,
fill_stack_inode_item(trans, &delayed_node->inode_item, inode);
set_bit(BTRFS_DELAYED_NODE_INODE_DIRTY, &delayed_node->flags);
delayed_node->count++;
- atomic_inc(&root->fs_info->delayed_root->items);
+ atomic_inc(&root->fs_info->delayed_root.items);
release_node:
mutex_unlock(&delayed_node->mutex);
btrfs_release_delayed_node(delayed_node, &delayed_node_tracker);
@@ -2012,7 +2012,7 @@ int btrfs_delayed_delete_inode_ref(struct btrfs_inode *inode)
mutex_lock(&delayed_node->mutex);
if (!test_and_set_bit(BTRFS_DELAYED_NODE_DEL_IREF, &delayed_node->flags)) {
delayed_node->count++;
- atomic_inc(&fs_info->delayed_root->items);
+ atomic_inc(&fs_info->delayed_root.items);
}
mutex_unlock(&delayed_node->mutex);
btrfs_release_delayed_node(delayed_node, &delayed_node_tracker);
@@ -2118,7 +2118,7 @@ void btrfs_destroy_delayed_inodes(struct btrfs_fs_info *fs_info)
struct btrfs_delayed_node *curr_node, *prev_node;
struct btrfs_ref_tracker curr_delayed_node_tracker, prev_delayed_node_tracker;
- curr_node = btrfs_first_delayed_node(fs_info->delayed_root,
+ curr_node = btrfs_first_delayed_node(&fs_info->delayed_root,
&curr_delayed_node_tracker);
while (curr_node) {
__btrfs_kill_delayed_node(curr_node);