1 #include <linux/module.h>
5 #include "transaction.h"
7 static int total_trans
= 0;
8 extern struct kmem_cache
*btrfs_trans_handle_cachep
;
9 extern struct kmem_cache
*btrfs_transaction_cachep
;
11 #define BTRFS_ROOT_TRANS_TAG 0
13 #define TRANS_MAGIC 0xE1E10E
14 static void put_transaction(struct btrfs_transaction
*transaction
)
16 WARN_ON(transaction
->use_count
== 0);
17 transaction
->use_count
--;
18 WARN_ON(transaction
->magic
!= TRANS_MAGIC
);
19 if (transaction
->use_count
== 0) {
20 WARN_ON(total_trans
== 0);
22 memset(transaction
, 0, sizeof(*transaction
));
23 kmem_cache_free(btrfs_transaction_cachep
, transaction
);
27 static int join_transaction(struct btrfs_root
*root
)
29 struct btrfs_transaction
*cur_trans
;
30 cur_trans
= root
->fs_info
->running_transaction
;
32 cur_trans
= kmem_cache_alloc(btrfs_transaction_cachep
,
36 root
->fs_info
->generation
++;
37 root
->fs_info
->running_transaction
= cur_trans
;
38 cur_trans
->num_writers
= 0;
39 cur_trans
->transid
= root
->fs_info
->generation
;
40 init_waitqueue_head(&cur_trans
->writer_wait
);
41 init_waitqueue_head(&cur_trans
->commit_wait
);
42 cur_trans
->magic
= TRANS_MAGIC
;
43 cur_trans
->in_commit
= 0;
44 cur_trans
->use_count
= 1;
45 cur_trans
->commit_done
= 0;
47 cur_trans
->num_writers
++;
51 struct btrfs_trans_handle
*btrfs_start_transaction(struct btrfs_root
*root
,
54 struct btrfs_trans_handle
*h
=
55 kmem_cache_alloc(btrfs_trans_handle_cachep
, GFP_NOFS
);
59 mutex_lock(&root
->fs_info
->trans_mutex
);
60 ret
= join_transaction(root
);
62 running_trans_id
= root
->fs_info
->running_transaction
->transid
;
64 if (root
!= root
->fs_info
->tree_root
&& root
->last_trans
<
66 radix_tree_tag_set(&root
->fs_info
->fs_roots_radix
,
67 (unsigned long)root
->root_key
.objectid
,
68 BTRFS_ROOT_TRANS_TAG
);
69 root
->commit_root
= root
->node
;
72 root
->last_trans
= running_trans_id
;
73 h
->transid
= running_trans_id
;
74 h
->transaction
= root
->fs_info
->running_transaction
;
75 h
->blocks_reserved
= num_blocks
;
77 root
->fs_info
->running_transaction
->use_count
++;
78 mutex_unlock(&root
->fs_info
->trans_mutex
);
79 h
->magic
= h
->magic2
= TRANS_MAGIC
;
83 int btrfs_end_transaction(struct btrfs_trans_handle
*trans
,
84 struct btrfs_root
*root
)
86 struct btrfs_transaction
*cur_trans
;
88 WARN_ON(trans
->magic
!= TRANS_MAGIC
);
89 WARN_ON(trans
->magic2
!= TRANS_MAGIC
);
90 mutex_lock(&root
->fs_info
->trans_mutex
);
91 cur_trans
= root
->fs_info
->running_transaction
;
92 WARN_ON(cur_trans
->num_writers
< 1);
93 if (waitqueue_active(&cur_trans
->writer_wait
))
94 wake_up(&cur_trans
->writer_wait
);
95 cur_trans
->num_writers
--;
96 put_transaction(cur_trans
);
97 mutex_unlock(&root
->fs_info
->trans_mutex
);
98 memset(trans
, 0, sizeof(*trans
));
99 kmem_cache_free(btrfs_trans_handle_cachep
, trans
);
104 int btrfs_write_and_wait_transaction(struct btrfs_trans_handle
*trans
,
105 struct btrfs_root
*root
)
107 filemap_write_and_wait(root
->fs_info
->btree_inode
->i_mapping
);
111 int btrfs_commit_tree_roots(struct btrfs_trans_handle
*trans
,
112 struct btrfs_root
*root
)
115 u64 old_extent_block
;
116 struct btrfs_fs_info
*fs_info
= root
->fs_info
;
117 struct btrfs_root
*tree_root
= fs_info
->tree_root
;
118 struct btrfs_root
*extent_root
= fs_info
->extent_root
;
121 old_extent_block
= btrfs_root_blocknr(&extent_root
->root_item
);
122 if (old_extent_block
== bh_blocknr(extent_root
->node
))
124 btrfs_set_root_blocknr(&extent_root
->root_item
,
125 bh_blocknr(extent_root
->node
));
126 ret
= btrfs_update_root(trans
, tree_root
,
127 &extent_root
->root_key
,
128 &extent_root
->root_item
);
134 static int wait_for_commit(struct btrfs_root
*root
,
135 struct btrfs_transaction
*commit
)
138 while(!commit
->commit_done
) {
139 prepare_to_wait(&commit
->commit_wait
, &wait
,
140 TASK_UNINTERRUPTIBLE
);
141 if (commit
->commit_done
)
143 mutex_unlock(&root
->fs_info
->trans_mutex
);
145 mutex_lock(&root
->fs_info
->trans_mutex
);
147 finish_wait(&commit
->commit_wait
, &wait
);
152 struct list_head list
;
153 struct btrfs_key snap_key
;
154 struct buffer_head
*commit_root
;
155 struct btrfs_root
*root
;
158 int add_dirty_roots(struct btrfs_trans_handle
*trans
,
159 struct radix_tree_root
*radix
, struct list_head
*list
)
161 struct dirty_root
*dirty
;
162 struct btrfs_root
*gang
[8];
163 struct btrfs_root
*root
;
168 ret
= radix_tree_gang_lookup_tag(radix
, (void **)gang
, 0,
170 BTRFS_ROOT_TRANS_TAG
);
173 for (i
= 0; i
< ret
; i
++) {
175 radix_tree_tag_clear(radix
,
176 (unsigned long)root
->root_key
.objectid
,
177 BTRFS_ROOT_TRANS_TAG
);
178 if (root
->commit_root
== root
->node
) {
179 WARN_ON(bh_blocknr(root
->node
) !=
180 btrfs_root_blocknr(&root
->root_item
));
181 brelse(root
->commit_root
);
182 root
->commit_root
= NULL
;
185 dirty
= kmalloc(sizeof(*dirty
), GFP_NOFS
);
187 memcpy(&dirty
->snap_key
, &root
->root_key
,
188 sizeof(root
->root_key
));
189 dirty
->commit_root
= root
->commit_root
;
190 root
->commit_root
= NULL
;
192 root
->root_key
.offset
= root
->fs_info
->generation
;
193 btrfs_set_root_blocknr(&root
->root_item
,
194 bh_blocknr(root
->node
));
195 err
= btrfs_insert_root(trans
, root
->fs_info
->tree_root
,
199 list_add(&dirty
->list
, list
);
205 int drop_dirty_roots(struct btrfs_root
*tree_root
, struct list_head
*list
)
207 struct dirty_root
*dirty
;
208 struct btrfs_trans_handle
*trans
;
211 while(!list_empty(list
)) {
212 dirty
= list_entry(list
->next
, struct dirty_root
, list
);
213 list_del_init(&dirty
->list
);
214 trans
= btrfs_start_transaction(tree_root
, 1);
215 ret
= btrfs_drop_snapshot(trans
, dirty
->root
,
219 ret
= btrfs_del_root(trans
, tree_root
, &dirty
->snap_key
);
221 ret
= btrfs_end_transaction(trans
, tree_root
);
228 int btrfs_commit_transaction(struct btrfs_trans_handle
*trans
,
229 struct btrfs_root
*root
)
232 struct btrfs_transaction
*cur_trans
;
233 struct list_head dirty_fs_roots
;
236 INIT_LIST_HEAD(&dirty_fs_roots
);
238 mutex_lock(&root
->fs_info
->trans_mutex
);
239 if (trans
->transaction
->in_commit
) {
240 cur_trans
= trans
->transaction
;
241 trans
->transaction
->use_count
++;
242 btrfs_end_transaction(trans
, root
);
243 ret
= wait_for_commit(root
, cur_trans
);
245 put_transaction(cur_trans
);
246 mutex_unlock(&root
->fs_info
->trans_mutex
);
249 cur_trans
= trans
->transaction
;
250 trans
->transaction
->in_commit
= 1;
251 while (trans
->transaction
->num_writers
> 1) {
252 WARN_ON(cur_trans
!= trans
->transaction
);
253 prepare_to_wait(&trans
->transaction
->writer_wait
, &wait
,
254 TASK_UNINTERRUPTIBLE
);
255 if (trans
->transaction
->num_writers
<= 1)
257 mutex_unlock(&root
->fs_info
->trans_mutex
);
259 mutex_lock(&root
->fs_info
->trans_mutex
);
260 finish_wait(&trans
->transaction
->writer_wait
, &wait
);
262 finish_wait(&trans
->transaction
->writer_wait
, &wait
);
263 WARN_ON(cur_trans
!= trans
->transaction
);
264 add_dirty_roots(trans
, &root
->fs_info
->fs_roots_radix
, &dirty_fs_roots
);
265 ret
= btrfs_commit_tree_roots(trans
, root
);
267 cur_trans
= root
->fs_info
->running_transaction
;
268 root
->fs_info
->running_transaction
= NULL
;
269 btrfs_set_super_generation(root
->fs_info
->disk_super
,
270 root
->fs_info
->generation
+ 1);
271 mutex_unlock(&root
->fs_info
->trans_mutex
);
272 ret
= btrfs_write_and_wait_transaction(trans
, root
);
275 write_ctree_super(trans
, root
);
276 btrfs_finish_extent_commit(trans
, root
);
277 mutex_lock(&root
->fs_info
->trans_mutex
);
278 cur_trans
->commit_done
= 1;
279 wake_up(&cur_trans
->commit_wait
);
280 put_transaction(cur_trans
);
281 put_transaction(cur_trans
);
282 mutex_unlock(&root
->fs_info
->trans_mutex
);
283 kmem_cache_free(btrfs_trans_handle_cachep
, trans
);
285 drop_dirty_roots(root
->fs_info
->tree_root
, &dirty_fs_roots
);