aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/extent-tree.c
diff options
context:
space:
mode:
authorYan Zheng <zheng.yan@oracle.com>2009-07-30 09:40:40 -0400
committerChris Mason <chris.mason@oracle.com>2009-07-30 09:40:40 -0400
commit276e680d192a67d222fcea51af37b056feffb665 (patch)
tree137bae016c30f24e7fafcbc8073e3411b732eb31 /fs/btrfs/extent-tree.c
parentf25784b35f590c81d5fb8245a8cd45e1afb6f1b2 (diff)
Btrfs: preserve commit_root for async caching
The async block group caching code uses the commit_root pointer to get a stable version of the extent allocation tree for scanning. This copy of the tree root isn't going to change and it significantly reduces the complexity of the scanning code. During a commit, we have a loop where we update the extent allocation tree root. We need to loop because updating the root pointer in the tree of tree roots may allocate blocks which may change the extent allocation tree. Right now the commit_root pointer is changed inside this loop. It is more correct to change the commit_root pointer only after all the looping is done. Signed-off-by: Yan Zheng <zheng.yan@oracle.com> Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/extent-tree.c')
-rw-r--r--fs/btrfs/extent-tree.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index fadf69a2764b..2fe21fa74913 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -267,7 +267,7 @@ static int caching_kthread(void *data)
267 last = max_t(u64, block_group->key.objectid, BTRFS_SUPER_INFO_OFFSET); 267 last = max_t(u64, block_group->key.objectid, BTRFS_SUPER_INFO_OFFSET);
268again: 268again:
269 /* need to make sure the commit_root doesn't disappear */ 269 /* need to make sure the commit_root doesn't disappear */
270 down_read(&fs_info->extent_root->commit_root_sem); 270 down_read(&fs_info->extent_commit_sem);
271 271
272 /* 272 /*
273 * We don't want to deadlock with somebody trying to allocate a new 273 * We don't want to deadlock with somebody trying to allocate a new
@@ -304,7 +304,7 @@ again:
304 304
305 if (need_resched()) { 305 if (need_resched()) {
306 btrfs_release_path(fs_info->extent_root, path); 306 btrfs_release_path(fs_info->extent_root, path);
307 up_read(&fs_info->extent_root->commit_root_sem); 307 up_read(&fs_info->extent_commit_sem);
308 cond_resched(); 308 cond_resched();
309 goto again; 309 goto again;
310 } 310 }
@@ -345,7 +345,7 @@ next:
345 345
346err: 346err:
347 btrfs_free_path(path); 347 btrfs_free_path(path);
348 up_read(&fs_info->extent_root->commit_root_sem); 348 up_read(&fs_info->extent_commit_sem);
349 atomic_dec(&block_group->space_info->caching_threads); 349 atomic_dec(&block_group->space_info->caching_threads);
350 wake_up(&block_group->caching_q); 350 wake_up(&block_group->caching_q);
351 351