Commit 1d4f8a0c authored by Chris Mason's avatar Chris Mason Committed by David Woodhouse

Btrfs: node->blockptrs endian fixes

Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
parent 0783fcfc
...@@ -58,7 +58,8 @@ int btrfs_cow_block(struct ctree_root *root, ...@@ -58,7 +58,8 @@ int btrfs_cow_block(struct ctree_root *root,
free_extent(root, buf->blocknr, 1); free_extent(root, buf->blocknr, 1);
tree_block_release(root, buf); tree_block_release(root, buf);
} else { } else {
parent->node.blockptrs[parent_slot] = cow->blocknr; btrfs_set_node_blockptr(&parent->node, parent_slot,
cow->blocknr);
BUG_ON(list_empty(&parent->dirty)); BUG_ON(list_empty(&parent->dirty));
free_extent(root, buf->blocknr, 1); free_extent(root, buf->blocknr, 1);
} }
...@@ -133,7 +134,7 @@ int check_node(struct ctree_path *path, int level) ...@@ -133,7 +134,7 @@ int check_node(struct ctree_path *path, int level)
parent_key = &parent->keys[parent_slot]; parent_key = &parent->keys[parent_slot];
BUG_ON(memcmp(parent_key, node->keys, BUG_ON(memcmp(parent_key, node->keys,
sizeof(struct btrfs_disk_key))); sizeof(struct btrfs_disk_key)));
BUG_ON(parent->blockptrs[parent_slot] != BUG_ON(btrfs_node_blockptr(parent, parent_slot) !=
btrfs_header_blocknr(&node->header)); btrfs_header_blocknr(&node->header));
} }
BUG_ON(nritems > NODEPTRS_PER_BLOCK); BUG_ON(nritems > NODEPTRS_PER_BLOCK);
...@@ -166,7 +167,7 @@ int check_leaf(struct ctree_path *path, int level) ...@@ -166,7 +167,7 @@ int check_leaf(struct ctree_path *path, int level)
parent_key = &parent->keys[parent_slot]; parent_key = &parent->keys[parent_slot];
BUG_ON(memcmp(parent_key, &leaf->items[0].key, BUG_ON(memcmp(parent_key, &leaf->items[0].key,
sizeof(struct btrfs_disk_key))); sizeof(struct btrfs_disk_key)));
BUG_ON(parent->blockptrs[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++) { for (i = 0; nritems > 1 && i < nritems - 2; i++) {
...@@ -258,7 +259,7 @@ struct tree_buffer *read_node_slot(struct ctree_root *root, ...@@ -258,7 +259,7 @@ struct tree_buffer *read_node_slot(struct ctree_root *root,
return NULL; return NULL;
if (slot >= btrfs_header_nritems(&node->header)) if (slot >= btrfs_header_nritems(&node->header))
return NULL; return NULL;
return read_tree_block(root, node->blockptrs[slot]); return read_tree_block(root, btrfs_node_blockptr(node, slot));
} }
static int balance_level(struct ctree_root *root, struct ctree_path *path, static int balance_level(struct ctree_root *root, struct ctree_path *path,
...@@ -283,7 +284,7 @@ static int balance_level(struct ctree_root *root, struct ctree_path *path, ...@@ -283,7 +284,7 @@ static int balance_level(struct ctree_root *root, struct ctree_path *path,
mid_buf = path->nodes[level]; mid_buf = path->nodes[level];
mid = &mid_buf->node; mid = &mid_buf->node;
orig_ptr = mid->blockptrs[orig_slot]; orig_ptr = btrfs_node_blockptr(mid, orig_slot);
if (level < MAX_LEVEL - 1) if (level < MAX_LEVEL - 1)
parent_buf = path->nodes[level + 1]; parent_buf = path->nodes[level + 1];
...@@ -407,7 +408,8 @@ static int balance_level(struct ctree_root *root, struct ctree_path *path, ...@@ -407,7 +408,8 @@ static int balance_level(struct ctree_root *root, struct ctree_path *path,
} }
/* double check we haven't messed things up */ /* double check we haven't messed things up */
check_block(path, level); check_block(path, level);
if (orig_ptr != path->nodes[level]->node.blockptrs[path->slots[level]]) if (orig_ptr != btrfs_node_blockptr(&path->nodes[level]->node,
path->slots[level]))
BUG(); BUG();
if (right_buf) if (right_buf)
...@@ -482,7 +484,7 @@ int search_slot(struct ctree_root *root, struct btrfs_key *key, ...@@ -482,7 +484,7 @@ int search_slot(struct ctree_root *root, struct btrfs_key *key,
slot = p->slots[level]; slot = p->slots[level];
BUG_ON(btrfs_header_nritems(&c->header) == 1); BUG_ON(btrfs_header_nritems(&c->header) == 1);
} }
b = read_tree_block(root, c->blockptrs[slot]); b = read_tree_block(root, btrfs_node_blockptr(c, slot));
} else { } else {
struct leaf *l = (struct leaf *)c; struct leaf *l = (struct leaf *)c;
p->slots[level] = slot; p->slots[level] = slot;
...@@ -660,7 +662,7 @@ static int insert_new_root(struct ctree_root *root, ...@@ -660,7 +662,7 @@ static int insert_new_root(struct ctree_root *root,
else else
lower_key = lower->keys; lower_key = lower->keys;
memcpy(c->keys, lower_key, sizeof(struct btrfs_disk_key)); memcpy(c->keys, lower_key, sizeof(struct btrfs_disk_key));
c->blockptrs[0] = path->nodes[level-1]->blocknr; btrfs_set_node_blockptr(c, 0, path->nodes[level - 1]->blocknr);
/* the super has an extra ref to root->node */ /* the super has an extra ref to root->node */
tree_block_release(root, root->node); tree_block_release(root, root->node);
root->node = t; root->node = t;
...@@ -700,7 +702,7 @@ static int insert_ptr(struct ctree_root *root, ...@@ -700,7 +702,7 @@ static int insert_ptr(struct ctree_root *root,
(nritems - slot) * sizeof(u64)); (nritems - slot) * sizeof(u64));
} }
memcpy(lower->keys + slot, key, sizeof(struct btrfs_disk_key)); memcpy(lower->keys + slot, key, sizeof(struct btrfs_disk_key));
lower->blockptrs[slot] = blocknr; btrfs_set_node_blockptr(lower, slot, blocknr);
btrfs_set_header_nritems(&lower->header, nritems + 1); btrfs_set_header_nritems(&lower->header, nritems + 1);
if (lower->keys[1].objectid == 0) if (lower->keys[1].objectid == 0)
BUG(); BUG();
...@@ -820,7 +822,8 @@ static int push_leaf_right(struct ctree_root *root, struct ctree_path *path, ...@@ -820,7 +822,8 @@ static int push_leaf_right(struct ctree_root *root, struct ctree_path *path,
if (slot >= btrfs_header_nritems(&upper->node.header) - 1) { if (slot >= btrfs_header_nritems(&upper->node.header) - 1) {
return 1; return 1;
} }
right_buf = read_tree_block(root, upper->node.blockptrs[slot + 1]); right_buf = read_tree_block(root, btrfs_node_blockptr(&upper->node,
slot + 1));
right = &right_buf->leaf; right = &right_buf->leaf;
free_space = leaf_free_space(right); free_space = leaf_free_space(right);
if (free_space < data_size + sizeof(struct btrfs_item)) { if (free_space < data_size + sizeof(struct btrfs_item)) {
...@@ -926,7 +929,8 @@ static int push_leaf_left(struct ctree_root *root, struct ctree_path *path, ...@@ -926,7 +929,8 @@ static int push_leaf_left(struct ctree_root *root, struct ctree_path *path,
if (!path->nodes[1]) { if (!path->nodes[1]) {
return 1; return 1;
} }
t = read_tree_block(root, path->nodes[1]->node.blockptrs[slot - 1]); t = read_tree_block(root, btrfs_node_blockptr(&path->nodes[1]->node,
slot - 1));
left = &t->leaf; left = &t->leaf;
free_space = leaf_free_space(left); free_space = leaf_free_space(left);
if (free_space < data_size + sizeof(struct btrfs_item)) { if (free_space < data_size + sizeof(struct btrfs_item)) {
...@@ -1353,7 +1357,7 @@ int next_leaf(struct ctree_root *root, struct ctree_path *path) ...@@ -1353,7 +1357,7 @@ int next_leaf(struct ctree_root *root, struct ctree_path *path)
level++; level++;
continue; continue;
} }
blocknr = c->node.blockptrs[slot]; blocknr = btrfs_node_blockptr(&c->node, slot);
if (next) if (next)
tree_block_release(root, next); tree_block_release(root, next);
next = read_tree_block(root, blocknr); next = read_tree_block(root, blocknr);
...@@ -1368,7 +1372,8 @@ int next_leaf(struct ctree_root *root, struct ctree_path *path) ...@@ -1368,7 +1372,8 @@ int next_leaf(struct ctree_root *root, struct ctree_path *path)
path->slots[level] = 0; path->slots[level] = 0;
if (!level) if (!level)
break; break;
next = read_tree_block(root, next->node.blockptrs[0]); next = read_tree_block(root,
btrfs_node_blockptr(&next->node, 0));
} }
return 0; return 0;
} }
......
...@@ -128,7 +128,7 @@ struct leaf { ...@@ -128,7 +128,7 @@ struct leaf {
struct node { struct node {
struct btrfs_header header; struct btrfs_header header;
struct btrfs_disk_key keys[NODEPTRS_PER_BLOCK]; struct btrfs_disk_key keys[NODEPTRS_PER_BLOCK];
u64 blockptrs[NODEPTRS_PER_BLOCK]; __le64 blockptrs[NODEPTRS_PER_BLOCK];
} __attribute__ ((__packed__)); } __attribute__ ((__packed__));
/* /*
...@@ -153,6 +153,16 @@ struct ctree_path { ...@@ -153,6 +153,16 @@ struct ctree_path {
int slots[MAX_LEVEL]; int slots[MAX_LEVEL];
}; };
static inline u64 btrfs_node_blockptr(struct node *n, int nr)
{
return le64_to_cpu(n->blockptrs[nr]);
}
static inline void btrfs_set_node_blockptr(struct node *n, int nr, u64 val)
{
n->blockptrs[nr] = cpu_to_le64(val);
}
static inline u16 btrfs_item_offset(struct btrfs_item *item) static inline u16 btrfs_item_offset(struct btrfs_item *item)
{ {
return le16_to_cpu(item->offset); return le16_to_cpu(item->offset);
......
...@@ -85,7 +85,7 @@ int btrfs_inc_ref(struct ctree_root *root, struct tree_buffer *buf) ...@@ -85,7 +85,7 @@ int btrfs_inc_ref(struct ctree_root *root, struct tree_buffer *buf)
return 0; return 0;
for (i = 0; i < btrfs_header_nritems(&buf->node.header); i++) { for (i = 0; i < btrfs_header_nritems(&buf->node.header); i++) {
blocknr = buf->node.blockptrs[i]; blocknr = btrfs_node_blockptr(&buf->node, i);
inc_block_ref(root, blocknr); inc_block_ref(root, blocknr);
} }
return 0; return 0;
...@@ -437,7 +437,7 @@ int walk_down_tree(struct ctree_root *root, struct ctree_path *path, int *level) ...@@ -437,7 +437,7 @@ int walk_down_tree(struct ctree_root *root, struct ctree_path *path, int *level)
if (path->slots[*level] >= if (path->slots[*level] >=
btrfs_header_nritems(&cur->node.header)) btrfs_header_nritems(&cur->node.header))
break; break;
blocknr = cur->node.blockptrs[path->slots[*level]]; blocknr = btrfs_node_blockptr(&cur->node, path->slots[*level]);
ret = lookup_block_ref(root, blocknr, &refs); ret = lookup_block_ref(root, blocknr, &refs);
if (refs != 1 || *level == 1) { if (refs != 1 || *level == 1) {
path->slots[*level]++; path->slots[*level]++;
......
...@@ -54,12 +54,12 @@ void print_tree(struct ctree_root *root, struct tree_buffer *t) ...@@ -54,12 +54,12 @@ void print_tree(struct ctree_root *root, struct tree_buffer *t)
printf("\tkey %d (%Lu %u %Lu) block %Lu\n", printf("\tkey %d (%Lu %u %Lu) block %Lu\n",
i, i,
c->keys[i].objectid, c->keys[i].flags, c->keys[i].offset, c->keys[i].objectid, c->keys[i].flags, c->keys[i].offset,
c->blockptrs[i]); btrfs_node_blockptr(c, i));
fflush(stdout); fflush(stdout);
} }
for (i = 0; i < nr; i++) { for (i = 0; i < nr; i++) {
struct tree_buffer *next_buf = read_tree_block(root, struct tree_buffer *next_buf = read_tree_block(root,
c->blockptrs[i]); btrfs_node_blockptr(c, i));
struct node *next = &next_buf->node; struct node *next = &next_buf->node;
if (btrfs_is_leaf(next) && if (btrfs_is_leaf(next) &&
btrfs_header_level(&c->header) != 1) btrfs_header_level(&c->header) != 1)
......
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