Btrfs: node->blockptrs endian fixes
authorChris Mason <chris.mason@oracle.com>
Tue, 13 Mar 2007 13:28:32 +0000 (09:28 -0400)
committerDavid Woodhouse <dwmw2@hera.kernel.org>
Tue, 13 Mar 2007 13:28:32 +0000 (09:28 -0400)
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/ctree.c
fs/btrfs/ctree.h
fs/btrfs/extent-tree.c
fs/btrfs/print-tree.c

index 1055564..7628107 100644 (file)
@@ -58,7 +58,8 @@ int btrfs_cow_block(struct ctree_root *root,
                        free_extent(root, buf->blocknr, 1);
                tree_block_release(root, buf);
        } else {
-               parent->node.blockptrs[parent_slot] = cow->blocknr;
+               btrfs_set_node_blockptr(&parent->node, parent_slot,
+                                       cow->blocknr);
                BUG_ON(list_empty(&parent->dirty));
                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];
                BUG_ON(memcmp(parent_key, node->keys,
                              sizeof(struct btrfs_disk_key)));
-               BUG_ON(parent->blockptrs[parent_slot] !=
+               BUG_ON(btrfs_node_blockptr(parent, parent_slot) !=
                       btrfs_header_blocknr(&node->header));
        }
        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];
                BUG_ON(memcmp(parent_key, &leaf->items[0].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));
        }
        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;
        if (slot >= btrfs_header_nritems(&node->header))
                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,
@@ -283,7 +284,7 @@ static int balance_level(struct ctree_root *root, struct ctree_path *path,
 
        mid_buf = path->nodes[level];
        mid = &mid_buf->node;
-       orig_ptr = mid->blockptrs[orig_slot];
+       orig_ptr = btrfs_node_blockptr(mid, orig_slot);
 
        if (level < MAX_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 */
        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();
 
        if (right_buf)
@@ -482,7 +484,7 @@ again:
                                slot = p->slots[level];
                                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 {
                        struct leaf *l = (struct leaf *)c;
                        p->slots[level] = slot;
@@ -660,7 +662,7 @@ static int insert_new_root(struct ctree_root *root,
        else
                lower_key = lower->keys;
        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 */
        tree_block_release(root, root->node);
        root->node = t;
@@ -700,7 +702,7 @@ static int insert_ptr(struct ctree_root *root,
                        (nritems - slot) * sizeof(u64));
        }
        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);
        if (lower->keys[1].objectid == 0)
                        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) {
                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;
        free_space = leaf_free_space(right);
        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]) {
                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;
        free_space = leaf_free_space(left);
        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++;
                        continue;
                }
-               blocknr = c->node.blockptrs[slot];
+               blocknr = btrfs_node_blockptr(&c->node, slot);
                if (next)
                        tree_block_release(root, next);
                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;
                if (!level)
                        break;
-               next = read_tree_block(root, next->node.blockptrs[0]);
+               next = read_tree_block(root,
+                                      btrfs_node_blockptr(&next->node, 0));
        }
        return 0;
 }
index b03df15..a8454c4 100644 (file)
@@ -128,7 +128,7 @@ struct leaf {
 struct node {
        struct btrfs_header header;
        struct btrfs_disk_key keys[NODEPTRS_PER_BLOCK];
-       u64 blockptrs[NODEPTRS_PER_BLOCK];
+       __le64 blockptrs[NODEPTRS_PER_BLOCK];
 } __attribute__ ((__packed__));
 
 /*
@@ -153,6 +153,16 @@ struct ctree_path {
        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)
 {
        return le16_to_cpu(item->offset);
index fdf95bd..e511f48 100644 (file)
@@ -85,7 +85,7 @@ int btrfs_inc_ref(struct ctree_root *root, struct tree_buffer *buf)
                return 0;
 
        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);
        }
        return 0;
@@ -437,7 +437,7 @@ int walk_down_tree(struct ctree_root *root, struct ctree_path *path, int *level)
                if (path->slots[*level] >=
                    btrfs_header_nritems(&cur->node.header))
                        break;
-               blocknr = cur->node.blockptrs[path->slots[*level]];
+               blocknr = btrfs_node_blockptr(&cur->node, path->slots[*level]);
                ret = lookup_block_ref(root, blocknr, &refs);
                if (refs != 1 || *level == 1) {
                        path->slots[*level]++;
index 33f5ee4..101278e 100644 (file)
@@ -54,12 +54,12 @@ void print_tree(struct ctree_root *root, struct tree_buffer *t)
                printf("\tkey %d (%Lu %u %Lu) block %Lu\n",
                       i,
                       c->keys[i].objectid, c->keys[i].flags, c->keys[i].offset,
-                      c->blockptrs[i]);
+                      btrfs_node_blockptr(c, i));
                fflush(stdout);
        }
        for (i = 0; i < nr; i++) {
                struct tree_buffer *next_buf = read_tree_block(root,
-                                                           c->blockptrs[i]);
+                                               btrfs_node_blockptr(c, i));
                struct node *next = &next_buf->node;
                if (btrfs_is_leaf(next) &&
                    btrfs_header_level(&c->header) != 1)