Btrfs: Less aggressive readahead on deletes
authorChris Mason <chris.mason@oracle.com>
Fri, 21 Dec 2007 21:24:26 +0000 (16:24 -0500)
committerChris Mason <chris.mason@oracle.com>
Thu, 25 Sep 2008 15:03:58 +0000 (11:03 -0400)
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/ctree.c

index 7f764455f26e9a2b18237e27fc98bb6dd1d636d6..2b3ffa707eae36e4c4e4330d3cec728e562d2e5a 100644 (file)
@@ -987,9 +987,10 @@ static int push_nodes_for_insert(struct btrfs_trans_handle *trans,
  * readahead one full node of leaves
  */
 static void reada_for_search(struct btrfs_root *root, struct btrfs_path *path,
-                            int level, int slot)
+                            int level, int slot, u64 objectid)
 {
        struct extent_buffer *node;
+       struct btrfs_disk_key disk_key;
        u32 nritems;
        u64 search;
        u64 lowest_read;
@@ -1031,6 +1032,11 @@ static void reada_for_search(struct btrfs_root *root, struct btrfs_path *path,
                        if (nr >= nritems)
                                break;
                }
+               if (path->reada < 0 && objectid) {
+                       btrfs_node_key(node, &disk_key, nr);
+                       if (btrfs_disk_key_objectid(&disk_key) != objectid)
+                               break;
+               }
                search = btrfs_node_blockptr(node, nr);
                if ((search >= lowest_read && search <= highest_read) ||
                    (search < lowest_read && lowest_read - search <= 32768) ||
@@ -1136,7 +1142,8 @@ again:
                        bytenr = btrfs_node_blockptr(b, slot);
                        ptr_gen = btrfs_node_ptr_generation(b, slot);
                        if (should_reada)
-                               reada_for_search(root, p, level, slot);
+                               reada_for_search(root, p, level, slot,
+                                                key->objectid);
                        b = read_tree_block(root, bytenr,
                                            btrfs_level_size(root, level - 1));
                        if (ptr_gen != btrfs_header_generation(b)) {
@@ -2671,9 +2678,6 @@ int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path)
                if (next)
                        free_extent_buffer(next);
 
-               if (path->reada < 0)
-                       reada_for_search(root, path, level, slot);
-
                next = read_tree_block(root, bytenr,
                                       btrfs_level_size(root, level - 1));
                break;
@@ -2687,8 +2691,6 @@ int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path)
                path->slots[level] = 0;
                if (!level)
                        break;
-               if (path->reada)
-                       reada_for_search(root, path, level, 0);
                next = read_tree_block(root, btrfs_node_blockptr(next, 0),
                                       btrfs_level_size(root, level - 1));
        }
@@ -2726,7 +2728,7 @@ int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path)
                        free_extent_buffer(next);
 
                if (path->reada)
-                       reada_for_search(root, path, level, slot);
+                       reada_for_search(root, path, level, slot, 0);
 
                next = read_tree_block(root, bytenr,
                                       btrfs_level_size(root, level -1));
@@ -2742,7 +2744,7 @@ int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path)
                if (!level)
                        break;
                if (path->reada)
-                       reada_for_search(root, path, level, 0);
+                       reada_for_search(root, path, level, 0, 0);
                next = read_tree_block(root, btrfs_node_blockptr(next, 0),
                                       btrfs_level_size(root, level - 1));
        }