Commit 7518a238 authored by Chris Mason's avatar Chris Mason Committed by David Woodhouse
Browse files

Btrfs: get/set for struct header fields

parent 83e15a28
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
* cleanup, add more error checking, get rid of BUG_ONs
* endian fixes
* Make IO functions look more like the page cache
* Fix ENOSPC handling
* make blocksize a mkfs parameter instead of #define
+126 −98

File changed.

Preview size limit exceeded, changes collapsed.

+59 −4
Original line number Diff line number Diff line
@@ -35,13 +35,10 @@ struct header {
	/* generation flags to be added */
} __attribute__ ((__packed__));

#define MAX_LEVEL 8
#define NODEPTRS_PER_BLOCK ((CTREE_BLOCKSIZE - sizeof(struct header)) / \
			    (sizeof(struct key) + sizeof(u64)))

#define MAX_LEVEL 8
#define node_level(f) ((f) & (MAX_LEVEL-1))
#define is_leaf(f) (node_level(f) == 0)

struct tree_buffer;

/*
@@ -144,6 +141,64 @@ struct ctree_path {
	int slots[MAX_LEVEL];
};

static inline u64 btrfs_header_blocknr(struct header *h)
{
	return h->blocknr;
}

static inline void btrfs_set_header_blocknr(struct header *h, u64 blocknr)
{
	h->blocknr = blocknr;
}

static inline u64 btrfs_header_parentid(struct header *h)
{
	return h->parentid;
}

static inline void btrfs_set_header_parentid(struct header *h, u64 parentid)
{
	h->parentid = parentid;
}

static inline u32 btrfs_header_nritems(struct header *h)
{
	return h->nritems;
}

static inline void btrfs_set_header_nritems(struct header *h, u32 val)
{
	h->nritems = val;
}

static inline u32 btrfs_header_flags(struct header *h)
{
	return h->flags;
}

static inline void btrfs_set_header_flags(struct header *h, u32 val)
{
	h->flags = val;
}

static inline int btrfs_header_level(struct header *h)
{
	return btrfs_header_flags(h) & (MAX_LEVEL - 1);
}

static inline void btrfs_set_header_level(struct header *h, int level)
{
	u32 flags;
	BUG_ON(level > MAX_LEVEL);
	flags = btrfs_header_flags(h) & ~(MAX_LEVEL - 1);
	btrfs_set_header_flags(h, flags | level);
}

static inline int btrfs_is_leaf(struct node *n)
{
	return (btrfs_header_level(&n->header) == 0);
}

struct tree_buffer *alloc_free_block(struct ctree_root *root);
int btrfs_inc_ref(struct ctree_root *root, struct tree_buffer *buf);
int free_extent(struct ctree_root *root, u64 blocknr, u64 num_blocks);
+4 −3
Original line number Diff line number Diff line
@@ -15,9 +15,10 @@ int cache_max = 10000;

static int check_tree_block(struct ctree_root *root, struct tree_buffer *buf)
{
	if (buf->blocknr != buf->node.header.blocknr)
	if (buf->blocknr != btrfs_header_blocknr(&buf->node.header))
		BUG();
	if (root->node && buf->node.header.parentid != root->node->node.header.parentid)
	if (root->node && btrfs_header_parentid(&buf->node.header) !=
	    btrfs_header_parentid(&root->node->node.header))
		BUG();
	return 0;
}
@@ -129,7 +130,7 @@ int write_tree_block(struct ctree_root *root, struct tree_buffer *buf)
	loff_t offset = blocknr * CTREE_BLOCKSIZE;
	int ret;

	if (buf->blocknr != buf->node.header.blocknr)
	if (buf->blocknr != btrfs_header_blocknr(&buf->node.header))
		BUG();
	ret = pwrite(root->fp, &buf->node, CTREE_BLOCKSIZE, offset);
	if (ret != CTREE_BLOCKSIZE)
+13 −40

File changed.

Preview size limit exceeded, changes collapsed.

Loading