Przeglądaj źródła

Btrfs: reap dead roots right after commit

Signed-off-by: Chris Mason <chris.mason@oracle.com>
Chris Mason 18 lat temu
rodzic
commit
ad693af684
1 zmienionych plików z 8 dodań i 7 usunięć
  1. 8 7
      fs/btrfs/transaction.c

+ 8 - 7
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);
 }