diff options
Diffstat (limited to 'fs/btrfs/delayed-ref.h')
| -rw-r--r-- | fs/btrfs/delayed-ref.h | 52 |
1 files changed, 51 insertions, 1 deletions
diff --git a/fs/btrfs/delayed-ref.h b/fs/btrfs/delayed-ref.h index c9d703693df0..f75fcaf79aeb 100644 --- a/fs/btrfs/delayed-ref.h +++ b/fs/btrfs/delayed-ref.h | |||
| @@ -132,6 +132,15 @@ struct btrfs_delayed_ref_root { | |||
| 132 | unsigned long num_heads_ready; | 132 | unsigned long num_heads_ready; |
| 133 | 133 | ||
| 134 | /* | 134 | /* |
| 135 | * bumped when someone is making progress on the delayed | ||
| 136 | * refs, so that other procs know they are just adding to | ||
| 137 | * contention intead of helping | ||
| 138 | */ | ||
| 139 | atomic_t procs_running_refs; | ||
| 140 | atomic_t ref_seq; | ||
| 141 | wait_queue_head_t wait; | ||
| 142 | |||
| 143 | /* | ||
| 135 | * set when the tree is flushing before a transaction commit, | 144 | * set when the tree is flushing before a transaction commit, |
| 136 | * used by the throttling code to decide if new updates need | 145 | * used by the throttling code to decide if new updates need |
| 137 | * to be run right away | 146 | * to be run right away |
| @@ -141,12 +150,47 @@ struct btrfs_delayed_ref_root { | |||
| 141 | u64 run_delayed_start; | 150 | u64 run_delayed_start; |
| 142 | }; | 151 | }; |
| 143 | 152 | ||
| 153 | extern struct kmem_cache *btrfs_delayed_ref_head_cachep; | ||
| 154 | extern struct kmem_cache *btrfs_delayed_tree_ref_cachep; | ||
| 155 | extern struct kmem_cache *btrfs_delayed_data_ref_cachep; | ||
| 156 | extern struct kmem_cache *btrfs_delayed_extent_op_cachep; | ||
| 157 | |||
| 158 | int btrfs_delayed_ref_init(void); | ||
| 159 | void btrfs_delayed_ref_exit(void); | ||
| 160 | |||
| 161 | static inline struct btrfs_delayed_extent_op * | ||
| 162 | btrfs_alloc_delayed_extent_op(void) | ||
| 163 | { | ||
| 164 | return kmem_cache_alloc(btrfs_delayed_extent_op_cachep, GFP_NOFS); | ||
| 165 | } | ||
| 166 | |||
| 167 | static inline void | ||
| 168 | btrfs_free_delayed_extent_op(struct btrfs_delayed_extent_op *op) | ||
| 169 | { | ||
| 170 | if (op) | ||
| 171 | kmem_cache_free(btrfs_delayed_extent_op_cachep, op); | ||
| 172 | } | ||
| 173 | |||
| 144 | static inline void btrfs_put_delayed_ref(struct btrfs_delayed_ref_node *ref) | 174 | static inline void btrfs_put_delayed_ref(struct btrfs_delayed_ref_node *ref) |
| 145 | { | 175 | { |
| 146 | WARN_ON(atomic_read(&ref->refs) == 0); | 176 | WARN_ON(atomic_read(&ref->refs) == 0); |
| 147 | if (atomic_dec_and_test(&ref->refs)) { | 177 | if (atomic_dec_and_test(&ref->refs)) { |
| 148 | WARN_ON(ref->in_tree); | 178 | WARN_ON(ref->in_tree); |
| 149 | kfree(ref); | 179 | switch (ref->type) { |
| 180 | case BTRFS_TREE_BLOCK_REF_KEY: | ||
| 181 | case BTRFS_SHARED_BLOCK_REF_KEY: | ||
| 182 | kmem_cache_free(btrfs_delayed_tree_ref_cachep, ref); | ||
| 183 | break; | ||
| 184 | case BTRFS_EXTENT_DATA_REF_KEY: | ||
| 185 | case BTRFS_SHARED_DATA_REF_KEY: | ||
| 186 | kmem_cache_free(btrfs_delayed_data_ref_cachep, ref); | ||
| 187 | break; | ||
| 188 | case 0: | ||
| 189 | kmem_cache_free(btrfs_delayed_ref_head_cachep, ref); | ||
| 190 | break; | ||
| 191 | default: | ||
| 192 | BUG(); | ||
| 193 | } | ||
| 150 | } | 194 | } |
| 151 | } | 195 | } |
| 152 | 196 | ||
| @@ -176,8 +220,14 @@ struct btrfs_delayed_ref_head * | |||
| 176 | btrfs_find_delayed_ref_head(struct btrfs_trans_handle *trans, u64 bytenr); | 220 | btrfs_find_delayed_ref_head(struct btrfs_trans_handle *trans, u64 bytenr); |
| 177 | int btrfs_delayed_ref_lock(struct btrfs_trans_handle *trans, | 221 | int btrfs_delayed_ref_lock(struct btrfs_trans_handle *trans, |
| 178 | struct btrfs_delayed_ref_head *head); | 222 | struct btrfs_delayed_ref_head *head); |
| 223 | static inline void btrfs_delayed_ref_unlock(struct btrfs_delayed_ref_head *head) | ||
| 224 | { | ||
| 225 | mutex_unlock(&head->mutex); | ||
| 226 | } | ||
| 227 | |||
| 179 | int btrfs_find_ref_cluster(struct btrfs_trans_handle *trans, | 228 | int btrfs_find_ref_cluster(struct btrfs_trans_handle *trans, |
| 180 | struct list_head *cluster, u64 search_start); | 229 | struct list_head *cluster, u64 search_start); |
| 230 | void btrfs_release_ref_cluster(struct list_head *cluster); | ||
| 181 | 231 | ||
| 182 | int btrfs_check_delayed_seq(struct btrfs_fs_info *fs_info, | 232 | int btrfs_check_delayed_seq(struct btrfs_fs_info *fs_info, |
| 183 | struct btrfs_delayed_ref_root *delayed_refs, | 233 | struct btrfs_delayed_ref_root *delayed_refs, |
