Btrfs: Add btree locking to the tree defragmentation code
[linux-2.6-block.git] / fs / btrfs / extent-tree.c
index 89cc4f611869b82d62e026a0d831e016297fd5d5..a9b3a25a45b79a216ec3fb854ccd119bcdd2c21b 100644 (file)
@@ -2201,6 +2201,7 @@ int drop_snap_lookup_refcount(struct btrfs_root *root, u64 start, u64 len,
 {
        mutex_unlock(&root->fs_info->alloc_mutex);
        lookup_extent_ref(NULL, root, start, len, refs);
+       cond_resched();
        mutex_lock(&root->fs_info->alloc_mutex);
        return lookup_extent_ref(NULL, root, start, len, refs);
 }
@@ -2280,6 +2281,7 @@ static int noinline walk_down_tree(struct btrfs_trans_handle *trans,
 
                        next = read_tree_block(root, bytenr, blocksize,
                                               ptr_gen);
+                       cond_resched();
                        mutex_lock(&root->fs_info->alloc_mutex);
 
                        /* we've dropped the lock, double check */
@@ -2329,6 +2331,7 @@ out:
        *level += 1;
        BUG_ON(ret);
        mutex_unlock(&root->fs_info->alloc_mutex);
+       cond_resched();
        return 0;
 }
 
@@ -2448,6 +2451,10 @@ int btrfs_drop_snapshot(struct btrfs_trans_handle *trans, struct btrfs_root
                        break;
                if (wret < 0)
                        ret = wret;
+               if (trans->transaction->in_commit) {
+                       ret = -EAGAIN;
+                       break;
+               }
        }
        for (i = 0; i <= orig_level; i++) {
                if (path->nodes[i]) {