fs/btrfs/delayed-inode.c
Source file repositories/reference/linux-study-clean/fs/btrfs/delayed-inode.c
File Facts
- System
- Linux kernel
- Corpus path
fs/btrfs/delayed-inode.c- Extension
.c- Size
- 66546 bytes
- Lines
- 2229
- Domain
- Core OS
- Bucket
- VFS And Filesystem Core
- Inferred role
- Core OS: implementation source
- Status
- source implementation candidate
Why This File Exists
Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/slab.hlinux/iversion.hctree.hfs.hmessages.hmisc.hdelayed-inode.hdisk-io.htransaction.hqgroup.hlocking.hinode-item.hspace-info.haccessors.hfile-item.h
Detected Declarations
struct btrfs_async_delayed_workfunction btrfs_delayed_inode_initfunction btrfs_delayed_inode_exitfunction btrfs_init_delayed_rootfunction btrfs_init_delayed_nodefunction btrfs_queue_delayed_nodefunction btrfs_dequeue_delayed_nodefunction __btrfs_release_delayed_nodefunction btrfs_release_delayed_nodefunction btrfs_release_prepared_delayed_nodefunction delayed_item_index_cmpfunction btrfs_delayed_item_cmpfunction __btrfs_add_delayed_itemfunction finish_one_itemfunction __btrfs_remove_delayed_itemfunction btrfs_release_delayed_itemfunction btrfs_delayed_item_reserve_metadatafunction btrfs_delayed_item_release_metadatafunction btrfs_delayed_item_release_leavesfunction btrfs_delayed_inode_reserve_metadatafunction btrfs_delayed_inode_release_metadatafunction removedfunction list_for_each_entryfunction list_for_each_entryfunction list_for_each_entry_safefunction btrfs_insert_delayed_itemsfunction btrfs_batch_delete_itemsfunction list_for_each_entry_safefunction btrfs_delete_delayed_itemsfunction btrfs_release_delayed_inodefunction btrfs_release_delayed_ireffunction __btrfs_update_delayed_inodefunction btrfs_update_delayed_inodefunction __btrfs_commit_inode_delayed_itemsfunction __btrfs_run_delayed_itemsfunction btrfs_run_delayed_itemsfunction btrfs_run_delayed_items_nrfunction btrfs_commit_inode_delayed_itemsfunction btrfs_commit_inode_delayed_inodefunction btrfs_remove_delayed_nodefunction btrfs_async_run_delayed_rootfunction btrfs_wq_run_delayed_nodefunction btrfs_assert_delayed_root_emptyfunction could_end_waitfunction btrfs_balance_delayed_itemsfunction btrfs_release_dir_index_item_spacefunction btrfs_insert_delayed_dir_indexfunction btrfs_delete_delayed_insertion_item
Annotated Snippet
struct btrfs_async_delayed_work {
struct btrfs_delayed_root *delayed_root;
int nr;
struct btrfs_work work;
};
static void btrfs_async_run_delayed_root(struct btrfs_work *work)
{
struct btrfs_async_delayed_work *async_work;
struct btrfs_delayed_root *delayed_root;
struct btrfs_trans_handle *trans;
struct btrfs_path *path;
struct btrfs_delayed_node *delayed_node = NULL;
struct btrfs_ref_tracker delayed_node_tracker;
struct btrfs_root *root;
struct btrfs_block_rsv *block_rsv;
int total_done = 0;
async_work = container_of(work, struct btrfs_async_delayed_work, work);
delayed_root = async_work->delayed_root;
path = btrfs_alloc_path();
if (!path)
goto out;
do {
if (atomic_read(&delayed_root->items) <
BTRFS_DELAYED_BACKGROUND / 2)
break;
delayed_node = btrfs_first_prepared_delayed_node(delayed_root,
&delayed_node_tracker);
if (!delayed_node)
break;
root = delayed_node->root;
trans = btrfs_join_transaction(root);
if (IS_ERR(trans)) {
btrfs_release_path(path);
btrfs_release_prepared_delayed_node(delayed_node,
&delayed_node_tracker);
total_done++;
continue;
}
block_rsv = trans->block_rsv;
trans->block_rsv = &root->fs_info->delayed_block_rsv;
__btrfs_commit_inode_delayed_items(trans, path, delayed_node);
trans->block_rsv = block_rsv;
btrfs_end_transaction(trans);
btrfs_btree_balance_dirty_nodelay(root->fs_info);
btrfs_release_path(path);
btrfs_release_prepared_delayed_node(delayed_node,
&delayed_node_tracker);
total_done++;
} while ((async_work->nr == 0 && total_done < BTRFS_DELAYED_WRITEBACK)
|| total_done < async_work->nr);
btrfs_free_path(path);
out:
wake_up(&delayed_root->wait);
kfree(async_work);
}
static int btrfs_wq_run_delayed_node(struct btrfs_delayed_root *delayed_root,
struct btrfs_fs_info *fs_info, int nr)
{
struct btrfs_async_delayed_work *async_work;
async_work = kmalloc_obj(*async_work, GFP_NOFS);
if (!async_work)
return -ENOMEM;
async_work->delayed_root = delayed_root;
btrfs_init_work(&async_work->work, btrfs_async_run_delayed_root, NULL);
async_work->nr = nr;
btrfs_queue_work(fs_info->delayed_workers, &async_work->work);
return 0;
}
void btrfs_assert_delayed_root_empty(struct btrfs_fs_info *fs_info)
{
struct btrfs_ref_tracker delayed_node_tracker;
Annotation
- Immediate include surface: `linux/slab.h`, `linux/iversion.h`, `ctree.h`, `fs.h`, `messages.h`, `misc.h`, `delayed-inode.h`, `disk-io.h`.
- Detected declarations: `struct btrfs_async_delayed_work`, `function btrfs_delayed_inode_init`, `function btrfs_delayed_inode_exit`, `function btrfs_init_delayed_root`, `function btrfs_init_delayed_node`, `function btrfs_queue_delayed_node`, `function btrfs_dequeue_delayed_node`, `function __btrfs_release_delayed_node`, `function btrfs_release_delayed_node`, `function btrfs_release_prepared_delayed_node`.
- Atlas domain: Core OS / VFS And Filesystem Core.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.