/* * 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