Btrfs: node->blockptrs endian fixes
Signed-off-by: Chris Mason <chris.mason@oracle.com>
This commit is contained in:
Родитель
0783fcfc4d
Коммит
1d4f8a0c1e
|
@ -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)
|
||||||
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)
|
||||||
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,
|
||||||
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,
|
||||||
|
|
||||||
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,
|
||||||
}
|
}
|
||||||
/* 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 @@ again:
|
||||||
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,
|
||||||
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,
|
||||||
(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,
|
||||||
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,
|
||||||
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)
|
||||||
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)
|
||||||
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 {
|
||||||
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 {
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче