Btrfs: Further reduce the concurrency penalty of defrag and drop_snapshot
authorChris Mason <chris.mason@oracle.com>
Thu, 9 Aug 2007 00:17:12 +0000 (20:17 -0400)
committerDavid Woodhouse <dwmw2@hera.kernel.org>
Thu, 9 Aug 2007 00:17:12 +0000 (20:17 -0400)
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/extent-tree.c
fs/btrfs/transaction.c
fs/btrfs/tree-defrag.c

index ba50bd7b9a785f5fea638fc6fbadc4c650eee720..120c448f58f8121645d33170d3a7ace85e09c181 100644 (file)
@@ -1312,7 +1312,10 @@ static void reada_walk_down(struct btrfs_root *root,
                BUG_ON(ret);
                if (refs != 1)
                        continue;
+               mutex_unlock(&root->fs_info->fs_mutex);
                ret = readahead_tree_block(root, blocknr);
+               cond_resched();
+               mutex_lock(&root->fs_info->fs_mutex);
                if (ret)
                        break;
        }
@@ -1445,7 +1448,6 @@ int btrfs_drop_snapshot(struct btrfs_trans_handle *trans, struct btrfs_root
        struct btrfs_path *path;
        int i;
        int orig_level;
-       int num_walks = 0;
        struct btrfs_root_item *root_item = &root->root_item;
 
        path = btrfs_alloc_path();
@@ -1486,12 +1488,9 @@ int btrfs_drop_snapshot(struct btrfs_trans_handle *trans, struct btrfs_root
                        break;
                if (wret < 0)
                        ret = wret;
-               num_walks++;
-               if (num_walks > 2) {
-                       ret = -EAGAIN;
-                       get_bh(root->node);
-                       break;
-               }
+               ret = -EAGAIN;
+               get_bh(root->node);
+               break;
        }
        for (i = 0; i <= orig_level; i++) {
                if (path->nodes[i]) {
index e64ecec3f52eab3773f4b276ec29059e6774151d..204337c5ca0fa7d7d7e96c1d865ae03e49f3300d 100644 (file)
@@ -364,6 +364,9 @@ int btrfs_defrag_dirty_roots(struct btrfs_fs_info *info)
                                        break;
                        }
                        root->defrag_running = 0;
+                       radix_tree_tag_clear(&info->fs_roots_radix,
+                                    (unsigned long)root->root_key.objectid,
+                                    BTRFS_ROOT_DEFRAG_TAG);
                }
        }
        btrfs_end_transaction(trans, tree_root);
index 15d0a486fb593a706f3d4e4d41a85c8d5f34562b..7ea66b4aa5c2397247dd1bb7da9dc5ac9012d18f 100644 (file)
@@ -148,7 +148,6 @@ int btrfs_defrag_leaves(struct btrfs_trans_handle *trans,
        int level;
        int orig_level;
        int i;
-       int num_runs = 0;
 
        if (root->ref_cows == 0) {
                goto out;
@@ -200,10 +199,8 @@ int btrfs_defrag_leaves(struct btrfs_trans_handle *trans,
                        break;
                if (wret < 0)
                        ret = wret;
-               if (num_runs++ > 8) {
-                       ret = -EAGAIN;
-                       break;
-               }
+               ret = -EAGAIN;
+               break;
        }
        for (i = 0; i <= orig_level; i++) {
                if (path->nodes[i]) {