79 lines
2.5 KiB
C
79 lines
2.5 KiB
C
/*
|
|
* 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
|