* owner of the block and the number of references
*/
struct extent_item {
- u32 refs;
- u64 owner;
+ __le32 refs;
+ __le64 owner;
} __attribute__ ((__packed__));
/*
int slots[MAX_LEVEL];
};
+static inline u64 btrfs_extent_owner(struct extent_item *ei)
+{
+ return le64_to_cpu(ei->owner);
+}
+
+static inline void btrfs_set_extent_owner(struct extent_item *ei, u64 val)
+{
+ ei->owner = cpu_to_le64(val);
+}
+
+static inline u32 btrfs_extent_refs(struct extent_item *ei)
+{
+ return le32_to_cpu(ei->refs);
+}
+
+static inline void btrfs_set_extent_refs(struct extent_item *ei, u32 val)
+{
+ ei->refs = cpu_to_le32(val);
+}
+
static inline u64 btrfs_node_blockptr(struct node *n, int nr)
{
return le64_to_cpu(n->blockptrs[nr]);
struct leaf *l;
struct extent_item *item;
struct btrfs_key ins;
+ u32 refs;
find_free_extent(root->extent_root, 0, 0, (u64)-1, &ins);
init_path(&path);
l = &path.nodes[0]->leaf;
item = (struct extent_item *)(l->data + btrfs_item_offset(l->items +
path.slots[0]));
- item->refs++;
+ refs = btrfs_extent_refs(item);
+ btrfs_set_extent_refs(item, refs + 1);
BUG_ON(list_empty(&path.nodes[0]->dirty));
release_path(root->extent_root, &path);
item = (struct extent_item *)(l->data +
btrfs_item_offset(l->items +
path.slots[0]));
- *refs = item->refs;
+ *refs = btrfs_extent_refs(item);
release_path(root->extent_root, &path);
return 0;
}
int i;
int ret;
- extent_item.refs = 1;
- extent_item.owner =
- btrfs_header_parentid(&extent_root->node->node.header);
+ btrfs_set_extent_refs(&extent_item, 1);
+ btrfs_set_extent_owner(&extent_item,
+ btrfs_header_parentid(&extent_root->node->node.header));
ins.offset = 1;
ins.flags = 0;
struct btrfs_item *item;
struct extent_item *ei;
struct btrfs_key ins;
+ u32 refs;
key.objectid = blocknr;
key.flags = 0;
ei = (struct extent_item *)(path.nodes[0]->leaf.data +
btrfs_item_offset(item));
BUG_ON(ei->refs == 0);
- ei->refs--;
- if (ei->refs == 0) {
+ refs = btrfs_extent_refs(ei) - 1;
+ btrfs_set_extent_refs(ei, refs);
+ if (refs == 0) {
if (root == extent_root) {
int err;
radix_tree_preload(GFP_KERNEL);
struct ctree_root *extent_root = root->extent_root;
struct extent_item extent_item;
- extent_item.refs = 1;
- extent_item.owner = owner;
+ btrfs_set_extent_refs(&extent_item, 1);
+ btrfs_set_extent_owner(&extent_item, owner);
if (root == extent_root) {
BUG_ON(extent_root->current_insert.offset == 0);
btrfs_set_item_offset(&item,
LEAF_DATA_SIZE - sizeof(struct extent_item));
btrfs_set_item_size(&item, sizeof(struct extent_item));
- extent_item.refs = 1;
- extent_item.owner = 0;
+ btrfs_set_extent_refs(&extent_item, 1);
+ btrfs_set_extent_owner(&extent_item, 0);
memcpy(empty_leaf.items, &item, sizeof(item));
memcpy(empty_leaf.data + btrfs_item_offset(&item), &extent_item,
btrfs_item_size(&item));
btrfs_set_key_offset(&item.key, 1);
btrfs_set_item_offset(&item,
LEAF_DATA_SIZE - sizeof(struct extent_item) * 2);
- extent_item.owner = 1;
+ btrfs_set_extent_owner(&extent_item, 1);
memcpy(empty_leaf.items + 1, &item, sizeof(item));
memcpy(empty_leaf.data + btrfs_item_offset(&item), &extent_item,
btrfs_item_size(&item));
btrfs_set_key_offset(&item.key, 1);
btrfs_set_item_offset(&item,
LEAF_DATA_SIZE - sizeof(struct extent_item) * 3);
- extent_item.owner = 2;
+ btrfs_set_extent_owner(&extent_item, 2);
memcpy(empty_leaf.items + 2, &item, sizeof(item));
memcpy(empty_leaf.data + btrfs_item_offset(&item), &extent_item,
btrfs_item_size(&item));