Commit | Line | Data |
---|---|---|
9888c340 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
16cdcec7 MX |
2 | /* |
3 | * Copyright (C) 2011 Fujitsu. All rights reserved. | |
4 | * Written by Miao Xie <miaox@cn.fujitsu.com> | |
16cdcec7 MX |
5 | */ |
6 | ||
9888c340 DS |
7 | #ifndef BTRFS_DELAYED_INODE_H |
8 | #define BTRFS_DELAYED_INODE_H | |
16cdcec7 MX |
9 | |
10 | #include <linux/rbtree.h> | |
11 | #include <linux/spinlock.h> | |
12 | #include <linux/mutex.h> | |
13 | #include <linux/list.h> | |
14 | #include <linux/wait.h> | |
60063497 | 15 | #include <linux/atomic.h> |
6de5f18e | 16 | #include <linux/refcount.h> |
16cdcec7 MX |
17 | #include "ctree.h" |
18 | ||
19 | /* types of the delayed item */ | |
20 | #define BTRFS_DELAYED_INSERTION_ITEM 1 | |
21 | #define BTRFS_DELAYED_DELETION_ITEM 2 | |
22 | ||
23 | struct btrfs_delayed_root { | |
24 | spinlock_t lock; | |
25 | struct list_head node_list; | |
26 | /* | |
27 | * Used for delayed nodes which is waiting to be dealt with by the | |
28 | * worker. If the delayed node is inserted into the work queue, we | |
29 | * drop it from this list. | |
30 | */ | |
31 | struct list_head prepare_list; | |
32 | atomic_t items; /* for delayed items */ | |
de3cb945 | 33 | atomic_t items_seq; /* for delayed items */ |
16cdcec7 MX |
34 | int nodes; /* for delayed nodes */ |
35 | wait_queue_head_t wait; | |
36 | }; | |
37 | ||
7cf35d91 MX |
38 | #define BTRFS_DELAYED_NODE_IN_LIST 0 |
39 | #define BTRFS_DELAYED_NODE_INODE_DIRTY 1 | |
67de1176 | 40 | #define BTRFS_DELAYED_NODE_DEL_IREF 2 |
7cf35d91 | 41 | |
16cdcec7 MX |
42 | struct btrfs_delayed_node { |
43 | u64 inode_id; | |
44 | u64 bytes_reserved; | |
45 | struct btrfs_root *root; | |
46 | /* Used to add the node into the delayed root's node list. */ | |
47 | struct list_head n_list; | |
48 | /* | |
49 | * Used to add the node into the prepare list, the nodes in this list | |
50 | * is waiting to be dealt with by the async worker. | |
51 | */ | |
52 | struct list_head p_list; | |
53 | struct rb_root ins_root; | |
54 | struct rb_root del_root; | |
55 | struct mutex mutex; | |
56 | struct btrfs_inode_item inode_item; | |
6de5f18e | 57 | refcount_t refs; |
16cdcec7 | 58 | u64 index_cnt; |
7cf35d91 | 59 | unsigned long flags; |
16cdcec7 MX |
60 | int count; |
61 | }; | |
62 | ||
63 | struct btrfs_delayed_item { | |
64 | struct rb_node rb_node; | |
65 | struct btrfs_key key; | |
66 | struct list_head tree_list; /* used for batch insert/delete items */ | |
67 | struct list_head readdir_list; /* used for readdir items */ | |
68 | u64 bytes_reserved; | |
16cdcec7 | 69 | struct btrfs_delayed_node *delayed_node; |
089e77e1 | 70 | refcount_t refs; |
16cdcec7 MX |
71 | int ins_or_del; |
72 | u32 data_len; | |
73 | char data[0]; | |
74 | }; | |
75 | ||
76 | static inline void btrfs_init_delayed_root( | |
77 | struct btrfs_delayed_root *delayed_root) | |
78 | { | |
79 | atomic_set(&delayed_root->items, 0); | |
de3cb945 | 80 | atomic_set(&delayed_root->items_seq, 0); |
16cdcec7 MX |
81 | delayed_root->nodes = 0; |
82 | spin_lock_init(&delayed_root->lock); | |
83 | init_waitqueue_head(&delayed_root->wait); | |
84 | INIT_LIST_HEAD(&delayed_root->node_list); | |
85 | INIT_LIST_HEAD(&delayed_root->prepare_list); | |
86 | } | |
87 | ||
88 | int btrfs_insert_delayed_dir_index(struct btrfs_trans_handle *trans, | |
2ff7e61e JM |
89 | struct btrfs_fs_info *fs_info, |
90 | const char *name, int name_len, | |
6f45d185 | 91 | struct btrfs_inode *dir, |
16cdcec7 MX |
92 | struct btrfs_disk_key *disk_key, u8 type, |
93 | u64 index); | |
94 | ||
95 | int btrfs_delete_delayed_dir_index(struct btrfs_trans_handle *trans, | |
2ff7e61e | 96 | struct btrfs_fs_info *fs_info, |
e67bbbb9 | 97 | struct btrfs_inode *dir, u64 index); |
16cdcec7 | 98 | |
f5cc7b80 | 99 | int btrfs_inode_delayed_dir_index_count(struct btrfs_inode *inode); |
16cdcec7 | 100 | |
e5c304e6 NB |
101 | int btrfs_run_delayed_items(struct btrfs_trans_handle *trans); |
102 | int btrfs_run_delayed_items_nr(struct btrfs_trans_handle *trans, int nr); | |
16cdcec7 | 103 | |
2ff7e61e | 104 | void btrfs_balance_delayed_items(struct btrfs_fs_info *fs_info); |
16cdcec7 MX |
105 | |
106 | int btrfs_commit_inode_delayed_items(struct btrfs_trans_handle *trans, | |
5f4b32e9 | 107 | struct btrfs_inode *inode); |
16cdcec7 | 108 | /* Used for evicting the inode. */ |
f48d1cf5 | 109 | void btrfs_remove_delayed_node(struct btrfs_inode *inode); |
4ccb5c72 | 110 | void btrfs_kill_delayed_inode_items(struct btrfs_inode *inode); |
aa79021f | 111 | int btrfs_commit_inode_delayed_inode(struct btrfs_inode *inode); |
16cdcec7 MX |
112 | |
113 | ||
114 | int btrfs_delayed_update_inode(struct btrfs_trans_handle *trans, | |
115 | struct btrfs_root *root, struct inode *inode); | |
2f7e33d4 | 116 | int btrfs_fill_inode(struct inode *inode, u32 *rdev); |
e07222c7 | 117 | int btrfs_delayed_delete_inode_ref(struct btrfs_inode *inode); |
16cdcec7 MX |
118 | |
119 | /* Used for drop dead root */ | |
120 | void btrfs_kill_all_delayed_nodes(struct btrfs_root *root); | |
121 | ||
67cde344 | 122 | /* Used for clean the transaction */ |
ccdf9b30 | 123 | void btrfs_destroy_delayed_inodes(struct btrfs_fs_info *fs_info); |
67cde344 | 124 | |
16cdcec7 | 125 | /* Used for readdir() */ |
02dbfc99 OS |
126 | bool btrfs_readdir_get_delayed_items(struct inode *inode, |
127 | struct list_head *ins_list, | |
128 | struct list_head *del_list); | |
129 | void btrfs_readdir_put_delayed_items(struct inode *inode, | |
130 | struct list_head *ins_list, | |
131 | struct list_head *del_list); | |
16cdcec7 MX |
132 | int btrfs_should_delete_dir_index(struct list_head *del_list, |
133 | u64 index); | |
9cdda8d3 | 134 | int btrfs_readdir_delayed_dir_index(struct dir_context *ctx, |
d2fbb2b5 | 135 | struct list_head *ins_list); |
16cdcec7 MX |
136 | |
137 | /* for init */ | |
138 | int __init btrfs_delayed_inode_init(void); | |
e67c718b | 139 | void __cold btrfs_delayed_inode_exit(void); |
e999376f CM |
140 | |
141 | /* for debugging */ | |
ccdf9b30 | 142 | void btrfs_assert_delayed_root_empty(struct btrfs_fs_info *fs_info); |
e999376f | 143 | |
16cdcec7 | 144 | #endif |