Add support for defragging files via btrfsctl -d. Avoid OOM on extent tree
authorChris Mason <chris.mason@oracle.com>
Mon, 10 Sep 2007 23:58:16 +0000 (19:58 -0400)
committerDavid Woodhouse <dwmw2@hera.kernel.org>
Mon, 10 Sep 2007 23:58:16 +0000 (19:58 -0400)
defrag.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/ctree.c
fs/btrfs/disk-io.h
fs/btrfs/extent_map.c
fs/btrfs/inode.c
fs/btrfs/tree-defrag.c

index 89e282c..b41f48a 100644 (file)
@@ -217,6 +217,9 @@ int btrfs_realloc_node(struct btrfs_trans_handle *trans,
                       root->fs_info->generation);
                WARN_ON(1);
        }
+       if (buffer_defrag_done(parent))
+               return 0;
+
        parent_node = btrfs_buffer_node(parent);
        parent_nritems = btrfs_header_nritems(&parent_node->header);
        parent_level = btrfs_header_level(&parent_node->header);
@@ -274,6 +277,7 @@ int btrfs_realloc_node(struct btrfs_trans_handle *trans,
                *last_ret = search_start;
                if (parent_level == 1)
                        clear_buffer_defrag(tmp_bh);
+               set_buffer_defrag_done(tmp_bh);
                brelse(tmp_bh);
        }
        return err;
index da6bb72..714fa87 100644 (file)
 enum btrfs_bh_state_bits {
        BH_Checked = BH_PrivateStart,
        BH_Defrag,
+       BH_DefragDone,
 };
 BUFFER_FNS(Checked, checked);
 BUFFER_FNS(Defrag, defrag);
+BUFFER_FNS(DefragDone, defrag_done);
 
 static inline struct btrfs_node *btrfs_buffer_node(struct buffer_head *bh)
 {
Simple merge
Simple merge
Simple merge