aboutsummaryrefslogtreecommitdiff
path: root/fs/btrfs/transaction.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2007-06-09 08:19:57 -0400
committerDavid Woodhouse <dwmw2@hera.kernel.org>2007-06-09 08:19:57 -0400
commitad693af684757478e5fcb225aef319cab7ba6c75 (patch)
tree10340bc4d3c10d500487aa337ac58eef60808739 /fs/btrfs/transaction.c
parentfacda1e787d43191a3368c322f682054991c41b8 (diff)
Btrfs: reap dead roots right after commit
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/transaction.c')
-rw-r--r--fs/btrfs/transaction.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c
index b859db395fd..a2c5820f1d3 100644
--- a/fs/btrfs/transaction.c
+++ b/fs/btrfs/transaction.c
@@ -371,13 +371,6 @@ void btrfs_transaction_cleaner(struct work_struct *work)
int ret;
INIT_LIST_HEAD(&dirty_roots);
- mutex_lock(&root->fs_info->trans_mutex);
- list_splice_init(&root->fs_info->dead_roots, &dirty_roots);
- mutex_unlock(&root->fs_info->trans_mutex);
-
- if (!list_empty(&dirty_roots)) {
- drop_dirty_roots(root, &dirty_roots);
- }
mutex_lock(&root->fs_info->fs_mutex);
mutex_lock(&root->fs_info->trans_mutex);
cur = root->fs_info->running_transaction;
@@ -396,6 +389,14 @@ void btrfs_transaction_cleaner(struct work_struct *work)
ret = btrfs_commit_transaction(trans, root);
out:
mutex_unlock(&root->fs_info->fs_mutex);
+
+ mutex_lock(&root->fs_info->trans_mutex);
+ list_splice_init(&root->fs_info->dead_roots, &dirty_roots);
+ mutex_unlock(&root->fs_info->trans_mutex);
+
+ if (!list_empty(&dirty_roots)) {
+ drop_dirty_roots(root, &dirty_roots);
+ }
btrfs_transaction_queue_work(root, delay);
}