Btrfs: Less aggressive readahead on deletes

Signed-off-by: Chris Mason <chris.mason@oracle.com>
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
index 7f76445..2b3ffa7 100644
--- a/fs/btrfs/ctree.c
+++ b/fs/btrfs/ctree.c
@@ -987,9 +987,10 @@
  * 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 @@
 			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 @@
 			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 @@
 		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 @@
 		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 @@
 			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 @@
 		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));
 	}