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 list_del_init(&transaction
->list
);
23 memset(transaction
, 0, sizeof(*transaction
));
24 kmem_cache_free(btrfs_transaction_cachep
, transaction
);
28 static int join_transaction(struct btrfs_root
*root
)
30 struct btrfs_transaction
*cur_trans
;
31 cur_trans
= root
->fs_info
->running_transaction
;
33 cur_trans
= kmem_cache_alloc(btrfs_transaction_cachep
,
37 root
->fs_info
->generation
++;
38 root
->fs_info
->running_transaction
= cur_trans
;
39 cur_trans
->num_writers
= 0;
40 cur_trans
->transid
= root
->fs_info
->generation
;
41 init_waitqueue_head(&cur_trans
->writer_wait
);
42 init_waitqueue_head(&cur_trans
->commit_wait
);
43 cur_trans
->magic
= TRANS_MAGIC
;
44 cur_trans
->in_commit
= 0;
45 cur_trans
->use_count
= 1;
46 cur_trans
->commit_done
= 0;
47 list_add_tail(&cur_trans
->list
, &root
->fs_info
->trans_list
);
49 cur_trans
->num_writers
++;
53 struct btrfs_trans_handle
*btrfs_start_transaction(struct btrfs_root
*root
,
56 struct btrfs_trans_handle
*h
=
57 kmem_cache_alloc(btrfs_trans_handle_cachep
, GFP_NOFS
);
61 mutex_lock(&root
->fs_info
->trans_mutex
);
62 ret
= join_transaction(root
);
64 running_trans_id
= root
->fs_info
->running_transaction
->transid
;
66 if (root
!= root
->fs_info
->tree_root
&& root
->last_trans
<
68 radix_tree_tag_set(&root
->fs_info
->fs_roots_radix
,
69 (unsigned long)root
->root_key
.objectid
,
70 BTRFS_ROOT_TRANS_TAG
);
71 root
->commit_root
= root
->node
;
74 root
->last_trans
= running_trans_id
;
75 h
->transid
= running_trans_id
;
76 h
->transaction
= root
->fs_info
->running_transaction
;
77 h
->blocks_reserved
= num_blocks
;
79 root
->fs_info
->running_transaction
->use_count
++;
80 mutex_unlock(&root
->fs_info
->trans_mutex
);
81 h
->magic
= h
->magic2
= TRANS_MAGIC
;
85 int btrfs_end_transaction(struct btrfs_trans_handle
*trans
,
86 struct btrfs_root
*root
)
88 struct btrfs_transaction
*cur_trans
;
90 WARN_ON(trans
->magic
!= TRANS_MAGIC
);
91 WARN_ON(trans
->magic2
!= TRANS_MAGIC
);
92 mutex_lock(&root
->fs_info
->trans_mutex
);
93 cur_trans
= root
->fs_info
->running_transaction
;
94 WARN_ON(cur_trans
->num_writers
< 1);
95 if (waitqueue_active(&cur_trans
->writer_wait
))
96 wake_up(&cur_trans
->writer_wait
);
97 cur_trans
->num_writers
--;
98 put_transaction(cur_trans
);
99 mutex_unlock(&root
->fs_info
->trans_mutex
);
100 memset(trans
, 0, sizeof(*trans
));
101 kmem_cache_free(btrfs_trans_handle_cachep
, trans
);
106 int btrfs_write_and_wait_transaction(struct btrfs_trans_handle
*trans
,
107 struct btrfs_root
*root
)
109 filemap_write_and_wait(root
->fs_info
->btree_inode
->i_mapping
);
113 int btrfs_commit_tree_roots(struct btrfs_trans_handle
*trans
,
114 struct btrfs_root
*root
)
117 u64 old_extent_block
;
118 struct btrfs_fs_info
*fs_info
= root
->fs_info
;
119 struct btrfs_root
*tree_root
= fs_info
->tree_root
;
120 struct btrfs_root
*extent_root
= fs_info
->extent_root
;
121 struct btrfs_root
*dev_root
= fs_info
->dev_root
;
123 if (btrfs_super_device_root(fs_info
->disk_super
) !=
124 bh_blocknr(dev_root
->node
)) {
125 btrfs_set_super_device_root(fs_info
->disk_super
,
126 bh_blocknr(dev_root
->node
));
129 old_extent_block
= btrfs_root_blocknr(&extent_root
->root_item
);
130 if (old_extent_block
== bh_blocknr(extent_root
->node
))
132 btrfs_set_root_blocknr(&extent_root
->root_item
,
133 bh_blocknr(extent_root
->node
));
134 ret
= btrfs_update_root(trans
, tree_root
,
135 &extent_root
->root_key
,
136 &extent_root
->root_item
);
142 static int wait_for_commit(struct btrfs_root
*root
,
143 struct btrfs_transaction
*commit
)
146 while(!commit
->commit_done
) {
147 prepare_to_wait(&commit
->commit_wait
, &wait
,
148 TASK_UNINTERRUPTIBLE
);
149 if (commit
->commit_done
)
151 mutex_unlock(&root
->fs_info
->trans_mutex
);
153 mutex_lock(&root
->fs_info
->trans_mutex
);
155 finish_wait(&commit
->commit_wait
, &wait
);
160 struct list_head list
;
161 struct btrfs_key snap_key
;
162 struct buffer_head
*commit_root
;
163 struct btrfs_root
*root
;
166 int add_dirty_roots(struct btrfs_trans_handle
*trans
,
167 struct radix_tree_root
*radix
, struct list_head
*list
)
169 struct dirty_root
*dirty
;
170 struct btrfs_root
*gang
[8];
171 struct btrfs_root
*root
;
176 ret
= radix_tree_gang_lookup_tag(radix
, (void **)gang
, 0,
178 BTRFS_ROOT_TRANS_TAG
);
181 for (i
= 0; i
< ret
; i
++) {
183 radix_tree_tag_clear(radix
,
184 (unsigned long)root
->root_key
.objectid
,
185 BTRFS_ROOT_TRANS_TAG
);
186 if (root
->commit_root
== root
->node
) {
187 WARN_ON(bh_blocknr(root
->node
) !=
188 btrfs_root_blocknr(&root
->root_item
));
189 brelse(root
->commit_root
);
190 root
->commit_root
= NULL
;
193 dirty
= kmalloc(sizeof(*dirty
), GFP_NOFS
);
195 memcpy(&dirty
->snap_key
, &root
->root_key
,
196 sizeof(root
->root_key
));
197 dirty
->commit_root
= root
->commit_root
;
198 root
->commit_root
= NULL
;
200 root
->root_key
.offset
= root
->fs_info
->generation
;
201 btrfs_set_root_blocknr(&root
->root_item
,
202 bh_blocknr(root
->node
));
203 err
= btrfs_insert_root(trans
, root
->fs_info
->tree_root
,
207 list_add(&dirty
->list
, list
);
213 int drop_dirty_roots(struct btrfs_root
*tree_root
, struct list_head
*list
)
215 struct dirty_root
*dirty
;
216 struct btrfs_trans_handle
*trans
;
219 while(!list_empty(list
)) {
220 dirty
= list_entry(list
->next
, struct dirty_root
, list
);
221 list_del_init(&dirty
->list
);
222 trans
= btrfs_start_transaction(tree_root
, 1);
223 ret
= btrfs_drop_snapshot(trans
, dirty
->root
,
227 ret
= btrfs_del_root(trans
, tree_root
, &dirty
->snap_key
);
229 ret
= btrfs_end_transaction(trans
, tree_root
);
236 int btrfs_commit_transaction(struct btrfs_trans_handle
*trans
,
237 struct btrfs_root
*root
)
240 struct btrfs_transaction
*cur_trans
;
241 struct btrfs_transaction
*prev_trans
= NULL
;
242 struct list_head dirty_fs_roots
;
245 INIT_LIST_HEAD(&dirty_fs_roots
);
247 mutex_lock(&root
->fs_info
->trans_mutex
);
248 if (trans
->transaction
->in_commit
) {
249 cur_trans
= trans
->transaction
;
250 trans
->transaction
->use_count
++;
251 btrfs_end_transaction(trans
, root
);
252 ret
= wait_for_commit(root
, cur_trans
);
254 put_transaction(cur_trans
);
255 mutex_unlock(&root
->fs_info
->trans_mutex
);
258 cur_trans
= trans
->transaction
;
259 trans
->transaction
->in_commit
= 1;
260 while (trans
->transaction
->num_writers
> 1) {
261 WARN_ON(cur_trans
!= trans
->transaction
);
262 prepare_to_wait(&trans
->transaction
->writer_wait
, &wait
,
263 TASK_UNINTERRUPTIBLE
);
264 if (trans
->transaction
->num_writers
<= 1)
266 mutex_unlock(&root
->fs_info
->trans_mutex
);
268 mutex_lock(&root
->fs_info
->trans_mutex
);
269 finish_wait(&trans
->transaction
->writer_wait
, &wait
);
271 finish_wait(&trans
->transaction
->writer_wait
, &wait
);
272 WARN_ON(cur_trans
!= trans
->transaction
);
273 add_dirty_roots(trans
, &root
->fs_info
->fs_roots_radix
, &dirty_fs_roots
);
274 ret
= btrfs_commit_tree_roots(trans
, root
);
276 cur_trans
= root
->fs_info
->running_transaction
;
277 root
->fs_info
->running_transaction
= NULL
;
278 if (cur_trans
->list
.prev
!= &root
->fs_info
->trans_list
) {
279 prev_trans
= list_entry(cur_trans
->list
.prev
,
280 struct btrfs_transaction
, list
);
281 if (prev_trans
->commit_done
)
284 prev_trans
->use_count
++;
286 mutex_unlock(&root
->fs_info
->trans_mutex
);
287 mutex_unlock(&root
->fs_info
->fs_mutex
);
288 ret
= btrfs_write_and_wait_transaction(trans
, root
);
290 mutex_lock(&root
->fs_info
->trans_mutex
);
291 wait_for_commit(root
, prev_trans
);
292 put_transaction(prev_trans
);
293 mutex_unlock(&root
->fs_info
->trans_mutex
);
295 btrfs_set_super_generation(root
->fs_info
->disk_super
,
298 write_ctree_super(trans
, root
);
300 mutex_lock(&root
->fs_info
->fs_mutex
);
301 btrfs_finish_extent_commit(trans
, root
);
302 mutex_lock(&root
->fs_info
->trans_mutex
);
303 cur_trans
->commit_done
= 1;
304 wake_up(&cur_trans
->commit_wait
);
305 put_transaction(cur_trans
);
306 put_transaction(cur_trans
);
307 mutex_unlock(&root
->fs_info
->trans_mutex
);
308 kmem_cache_free(btrfs_trans_handle_cachep
, trans
);
310 drop_dirty_roots(root
->fs_info
->tree_root
, &dirty_fs_roots
);