]> git.karo-electronics.de Git - linux-beck.git/commitdiff
Btrfs: fix check_node and check_leaf to use less cpu
authorChris Mason <chris.mason@oracle.com>
Thu, 10 May 2007 15:24:42 +0000 (11:24 -0400)
committerDavid Woodhouse <dwmw2@hera.kernel.org>
Thu, 10 May 2007 15:24:42 +0000 (11:24 -0400)
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/ctree.c
fs/btrfs/extent-tree.c

index dbd3f636dd3d324c3bdea49c6845078e0f660659..990d297a7a1395361d2aebd18f439dea9dc2c4b5 100644 (file)
@@ -130,15 +130,17 @@ static int comp_keys(struct btrfs_disk_key *disk, struct btrfs_key *k2)
 static int check_node(struct btrfs_root *root, struct btrfs_path *path,
                      int level)
 {
-       int i;
        struct btrfs_node *parent = NULL;
        struct btrfs_node *node = btrfs_buffer_node(path->nodes[level]);
        int parent_slot;
+       int slot;
+       struct btrfs_key cpukey;
        u32 nritems = btrfs_header_nritems(&node->header);
 
        if (path->nodes[level + 1])
                parent = btrfs_buffer_node(path->nodes[level + 1]);
        parent_slot = path->slots[level + 1];
+       slot = path->slots[level];
        BUG_ON(nritems == 0);
        if (parent) {
                struct btrfs_disk_key *parent_key;
@@ -149,10 +151,13 @@ static int check_node(struct btrfs_root *root, struct btrfs_path *path,
                       btrfs_header_blocknr(&node->header));
        }
        BUG_ON(nritems > BTRFS_NODEPTRS_PER_BLOCK(root));
-       for (i = 0; nritems > 1 && i < nritems - 2; i++) {
-               struct btrfs_key cpukey;
-               btrfs_disk_key_to_cpu(&cpukey, &node->ptrs[i + 1].key);
-               BUG_ON(comp_keys(&node->ptrs[i].key, &cpukey) >= 0);
+       if (slot != 0) {
+               btrfs_disk_key_to_cpu(&cpukey, &node->ptrs[slot - 1].key);
+               BUG_ON(comp_keys(&node->ptrs[slot].key, &cpukey) <= 0);
+       }
+       if (slot < nritems - 1) {
+               btrfs_disk_key_to_cpu(&cpukey, &node->ptrs[slot + 1].key);
+               BUG_ON(comp_keys(&node->ptrs[slot].key, &cpukey) >= 0);
        }
        return 0;
 }
@@ -160,10 +165,12 @@ static int check_node(struct btrfs_root *root, struct btrfs_path *path,
 static int check_leaf(struct btrfs_root *root, struct btrfs_path *path,
                      int level)
 {
-       int i;
        struct btrfs_leaf *leaf = btrfs_buffer_leaf(path->nodes[level]);
        struct btrfs_node *parent = NULL;
        int parent_slot;
+       int slot = path->slots[0];
+       struct btrfs_key cpukey;
+
        u32 nritems = btrfs_header_nritems(&leaf->header);
 
        if (path->nodes[level + 1])
@@ -182,19 +189,20 @@ static int check_leaf(struct btrfs_root *root, struct btrfs_path *path,
                BUG_ON(btrfs_node_blockptr(parent, parent_slot) !=
                       btrfs_header_blocknr(&leaf->header));
        }
-       for (i = 0; nritems > 1 && i < nritems - 2; i++) {
-               struct btrfs_key cpukey;
-               btrfs_disk_key_to_cpu(&cpukey, &leaf->items[i + 1].key);
-               BUG_ON(comp_keys(&leaf->items[i].key,
-                                &cpukey) >= 0);
-               BUG_ON(btrfs_item_offset(leaf->items + i) !=
-                       btrfs_item_end(leaf->items + i + 1));
-               if (i == 0) {
-                       BUG_ON(btrfs_item_offset(leaf->items + i) +
-                              btrfs_item_size(leaf->items + i) !=
-                              BTRFS_LEAF_DATA_SIZE(root));
-               }
+       if (slot != 0) {
+               btrfs_disk_key_to_cpu(&cpukey, &leaf->items[slot - 1].key);
+               BUG_ON(comp_keys(&leaf->items[slot].key, &cpukey) <= 0);
+               BUG_ON(btrfs_item_offset(leaf->items + slot - 1) !=
+                       btrfs_item_end(leaf->items + slot));
+       }
+       if (slot < nritems - 1) {
+               btrfs_disk_key_to_cpu(&cpukey, &leaf->items[slot + 1].key);
+               BUG_ON(comp_keys(&leaf->items[slot].key, &cpukey) >= 0);
+               BUG_ON(btrfs_item_offset(leaf->items + slot) !=
+                       btrfs_item_end(leaf->items + slot + 1));
        }
+       BUG_ON(btrfs_item_offset(leaf->items) +
+              btrfs_item_size(leaf->items) != BTRFS_LEAF_DATA_SIZE(root));
        return 0;
 }
 
index 3ac9da453472bfdbc629de7bc33cb25c5c681fd4..1497ff98f0d3b5967e4f9ba2039c08b1fde421f3 100644 (file)
@@ -235,7 +235,7 @@ struct btrfs_block_group_cache *btrfs_find_block_group(struct btrfs_root *root,
                                             hint->key.offset - 1,
                                             BTRFS_BLOCK_GROUP_AVAIL);
                }
-               last = hint->key.offset * 2;
+               last = hint->key.offset * 3;
                if (hint->key.objectid >= last)
                        last = max(search_start + hint->key.offset - 1,
                                   hint->key.objectid - last);
@@ -554,8 +554,8 @@ static int update_block_group(struct btrfs_trans_handle *trans,
                                                      blocknr + i);
                                }
                        }
-                       if (old_val < (cache->key.offset * 8) / 10 &&
-                           old_val + num >= (cache->key.offset * 8) / 10) {
+                       if (old_val < (cache->key.offset * 6) / 10 &&
+                           old_val + num >= (cache->key.offset * 6) / 10) {
 printk("group %Lu now available\n", cache->key.objectid);
                                radix_tree_tag_set(cache->radix,
                                                   cache->key.objectid +