summary refs log tree commit diff
path: root/fs/btrfs/tree-defrag.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2007-10-15 16:22:11 -0400
committerChris Mason <chris.mason@oracle.com>2008-09-25 11:03:56 -0400
commitcf786e79e3f96f4bc037c69e1a7afb5fb85c6111 (patch)
tree5d6acee007d82cd477033d77115f4fb1362db41c /fs/btrfs/tree-defrag.c
parent304fced668079ce222200d5742657d34cc44af09 (diff)
downloadlinux-cf786e79e3f96f4bc037c69e1a7afb5fb85c6111.tar.gz
Btrfs: Defrag: only walk into nodes with the defrag bit set
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/tree-defrag.c')
-rw-r--r--fs/btrfs/tree-defrag.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/fs/btrfs/tree-defrag.c b/fs/btrfs/tree-defrag.c
index d31c21ac6f23..f86eccf511b9 100644
--- a/fs/btrfs/tree-defrag.c
+++ b/fs/btrfs/tree-defrag.c
@@ -87,8 +87,8 @@ static int defrag_walk_down(struct btrfs_trans_handle *trans,
 		if (cache_only) {
 			next = btrfs_find_tree_block(root, bytenr,
 					   btrfs_level_size(root, *level - 1));
-			/* FIXME, test for defrag */
-			if (!next || !btrfs_buffer_uptodate(next)) {
+			if (!next || !btrfs_buffer_uptodate(next) ||
+			    !btrfs_buffer_defrag(next)) {
 				free_extent_buffer(next);
 				path->slots[*level]++;
 				continue;
@@ -147,7 +147,8 @@ static int defrag_walk_up(struct btrfs_trans_handle *trans,
 			root->defrag_level = i;
 			return 0;
 		} else {
-			if (*level > 1 && path->nodes[*level] != root->node) {
+			if (*level > 1 && path->nodes[*level] != root->node &&
+			    btrfs_buffer_defrag(path->nodes[*level])) {
 				struct extent_buffer *next;
 				u64 last;
 				int ret;
@@ -168,7 +169,6 @@ static int defrag_walk_up(struct btrfs_trans_handle *trans,
 			}
 
 			btrfs_clear_buffer_defrag(path->nodes[*level]);
-			btrfs_clear_buffer_defrag_done(path->nodes[*level]);
 			free_extent_buffer(path->nodes[*level]);
 			path->nodes[*level] = NULL;
 			*level = i + 1;