blob: 79d77485b176da5c37991c80e2f0a78a88da59be [file] [log] [blame]
/*
* Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*/
#ifndef REISERFS_INTERNAL_H
#define REISERFS_INTERNAL_H
/*
* Picture represents an internal node of the reiserfs tree
* ______________________________________________________
* | | Array of | Array of | Free |
* |block | keys | pointers | space |
* | head | N | N+1 | |
* |______|_______________|___________________|___________|
*/
/* Disk child pointer: The pointer from an internal node of the tree
to a node that is on disk. */
struct reiserfs_dc {
__u32 dc2_block_number; /* Disk child's block number. */
__u16 dc2_size; /* Disk child's used space. */
__u16 dc2_reserved;
} __attribute__ ((__packed__));
typedef struct reiserfs_dc reiserfs_dc_t;
#define REISERFS_DC_SIZE (sizeof(reiserfs_dc_t))
/* set/get fields of disk_child with these defines */
#define reiserfs_dc_get_nr(dc) get_le32 (dc, dc2_block_number)
#define reiserfs_dc_set_nr(dc,val) set_le32 (dc, dc2_block_number, val)
#define reiserfs_dc_get_size(dc) get_le16 (dc, dc2_size)
#define reiserfs_dc_set_size(dc,val) set_le16 (dc, dc2_size, val)
#define reiserfs_dc_init(dc, size, blocknr) \
({ \
reiserfs_dc_set_nr(dc, blocknr); \
reiserfs_dc_set_size(dc, size); \
set_le16(dc, dc2_reserved, 0); \
})
/* max and min number of keys in internal node */
#define REISERFS_INT_MAX(bh) \
((REISERFS_NODE_SPACE(bh->b_size) - REISERFS_DC_SIZE) / \
(REISERFS_KEY_SIZE+REISERFS_DC_SIZE))
#define REISERFS_INT_MIN(bh) (REISERFS_INT_MAX(bh) / 2)
/* get key */
#define reiserfs_int_key_at(bh,item_num) \
((reiserfs_key_t * )((bh)->b_data + REISERFS_NODEH_SIZE) + \
(item_num) )
/* Get disk child by buffer header and position in the tree node. */
#define reiserfs_int_at(p_s_bh,n_pos) \
((reiserfs_dc_t *) ((p_s_bh)->b_data + REISERFS_NODEH_SIZE + \
reiserfs_node_items(p_s_bh) * REISERFS_KEY_SIZE +\
REISERFS_DC_SIZE * (n_pos)))
#define reiserfs_int_head(bh) \
((reiserfs_nh_get_level (((reiserfs_node_head_t *)((bh)->b_data))) > \
LEAF_LEVEL) && \
(reiserfs_nh_get_level (((reiserfs_node_head_t *)((bh)->b_data))) <= \
REISERFS_TREE_HEIGHT_MAX))
extern int reiserfs_internal_correct (reiserfs_bh_t *bh);
extern int reiserfs_internal_print (FILE * fp,
reiserfs_bh_t * bh,
int first, int last);
extern int reiserfs_internal_get_pos (reiserfs_bh_t * bh,
unsigned long block);
#endif