Commit 8d7be552 authored by Chris Mason's avatar Chris Mason Committed by David Woodhouse

Btrfs: fix check_node and check_leaf to use less cpu

Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
parent e37c9e69
...@@ -130,15 +130,17 @@ static int comp_keys(struct btrfs_disk_key *disk, struct btrfs_key *k2) ...@@ -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, static int check_node(struct btrfs_root *root, struct btrfs_path *path,
int level) int level)
{ {
int i;
struct btrfs_node *parent = NULL; struct btrfs_node *parent = NULL;
struct btrfs_node *node = btrfs_buffer_node(path->nodes[level]); struct btrfs_node *node = btrfs_buffer_node(path->nodes[level]);
int parent_slot; int parent_slot;
int slot;
struct btrfs_key cpukey;
u32 nritems = btrfs_header_nritems(&node->header); u32 nritems = btrfs_header_nritems(&node->header);
if (path->nodes[level + 1]) if (path->nodes[level + 1])
parent = btrfs_buffer_node(path->nodes[level + 1]); parent = btrfs_buffer_node(path->nodes[level + 1]);
parent_slot = path->slots[level + 1]; parent_slot = path->slots[level + 1];
slot = path->slots[level];
BUG_ON(nritems == 0); BUG_ON(nritems == 0);
if (parent) { if (parent) {
struct btrfs_disk_key *parent_key; struct btrfs_disk_key *parent_key;
...@@ -149,10 +151,13 @@ static int check_node(struct btrfs_root *root, struct btrfs_path *path, ...@@ -149,10 +151,13 @@ static int check_node(struct btrfs_root *root, struct btrfs_path *path,
btrfs_header_blocknr(&node->header)); btrfs_header_blocknr(&node->header));
} }
BUG_ON(nritems > BTRFS_NODEPTRS_PER_BLOCK(root)); BUG_ON(nritems > BTRFS_NODEPTRS_PER_BLOCK(root));
for (i = 0; nritems > 1 && i < nritems - 2; i++) { if (slot != 0) {
struct btrfs_key cpukey; btrfs_disk_key_to_cpu(&cpukey, &node->ptrs[slot - 1].key);
btrfs_disk_key_to_cpu(&cpukey, &node->ptrs[i + 1].key); BUG_ON(comp_keys(&node->ptrs[slot].key, &cpukey) <= 0);
BUG_ON(comp_keys(&node->ptrs[i].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; return 0;
} }
...@@ -160,10 +165,12 @@ static int check_node(struct btrfs_root *root, struct btrfs_path *path, ...@@ -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, static int check_leaf(struct btrfs_root *root, struct btrfs_path *path,
int level) int level)
{ {
int i;
struct btrfs_leaf *leaf = btrfs_buffer_leaf(path->nodes[level]); struct btrfs_leaf *leaf = btrfs_buffer_leaf(path->nodes[level]);
struct btrfs_node *parent = NULL; struct btrfs_node *parent = NULL;
int parent_slot; int parent_slot;
int slot = path->slots[0];
struct btrfs_key cpukey;
u32 nritems = btrfs_header_nritems(&leaf->header); u32 nritems = btrfs_header_nritems(&leaf->header);
if (path->nodes[level + 1]) if (path->nodes[level + 1])
...@@ -182,19 +189,20 @@ static int check_leaf(struct btrfs_root *root, struct btrfs_path *path, ...@@ -182,19 +189,20 @@ static int check_leaf(struct btrfs_root *root, struct btrfs_path *path,
BUG_ON(btrfs_node_blockptr(parent, parent_slot) != BUG_ON(btrfs_node_blockptr(parent, parent_slot) !=
btrfs_header_blocknr(&leaf->header)); btrfs_header_blocknr(&leaf->header));
} }
for (i = 0; nritems > 1 && i < nritems - 2; i++) { if (slot != 0) {
struct btrfs_key cpukey; btrfs_disk_key_to_cpu(&cpukey, &leaf->items[slot - 1].key);
btrfs_disk_key_to_cpu(&cpukey, &leaf->items[i + 1].key); BUG_ON(comp_keys(&leaf->items[slot].key, &cpukey) <= 0);
BUG_ON(comp_keys(&leaf->items[i].key, BUG_ON(btrfs_item_offset(leaf->items + slot - 1) !=
&cpukey) >= 0); btrfs_item_end(leaf->items + slot));
BUG_ON(btrfs_item_offset(leaf->items + i) != }
btrfs_item_end(leaf->items + i + 1)); if (slot < nritems - 1) {
if (i == 0) { btrfs_disk_key_to_cpu(&cpukey, &leaf->items[slot + 1].key);
BUG_ON(btrfs_item_offset(leaf->items + i) + BUG_ON(comp_keys(&leaf->items[slot].key, &cpukey) >= 0);
btrfs_item_size(leaf->items + i) != BUG_ON(btrfs_item_offset(leaf->items + slot) !=
BTRFS_LEAF_DATA_SIZE(root)); 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; return 0;
} }
......
...@@ -235,7 +235,7 @@ struct btrfs_block_group_cache *btrfs_find_block_group(struct btrfs_root *root, ...@@ -235,7 +235,7 @@ struct btrfs_block_group_cache *btrfs_find_block_group(struct btrfs_root *root,
hint->key.offset - 1, hint->key.offset - 1,
BTRFS_BLOCK_GROUP_AVAIL); BTRFS_BLOCK_GROUP_AVAIL);
} }
last = hint->key.offset * 2; last = hint->key.offset * 3;
if (hint->key.objectid >= last) if (hint->key.objectid >= last)
last = max(search_start + hint->key.offset - 1, last = max(search_start + hint->key.offset - 1,
hint->key.objectid - last); hint->key.objectid - last);
...@@ -554,8 +554,8 @@ static int update_block_group(struct btrfs_trans_handle *trans, ...@@ -554,8 +554,8 @@ static int update_block_group(struct btrfs_trans_handle *trans,
blocknr + i); blocknr + i);
} }
} }
if (old_val < (cache->key.offset * 8) / 10 && if (old_val < (cache->key.offset * 6) / 10 &&
old_val + num >= (cache->key.offset * 8) / 10) { old_val + num >= (cache->key.offset * 6) / 10) {
printk("group %Lu now available\n", cache->key.objectid); printk("group %Lu now available\n", cache->key.objectid);
radix_tree_tag_set(cache->radix, radix_tree_tag_set(cache->radix,
cache->key.objectid + cache->key.objectid +
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment