/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifndef REISERFS_NODE_H #define REISERFS_NODE_H /* * Picture represents a leaf of internal tree * ______________________________________________________ * | | Array of | | | * |Block | Object-Item | F r e e | Objects- | * | head | Headers | S p a c e | Items | * |______|_______________|___________________|___________| */ /* Header of a disk block. More precisely, header of a formatted leaf or internal node, and not the header of an unformatted node. */ struct reiserfs_node_head { __u16 blk2_level; /* Level of a block in the tree. */ __u16 blk2_nr_item; /* Number of keys/items in a block. */ __u16 blk2_free_space; /* Block free space in bytes. */ __u16 blk_reserved; __u32 reserved [4]; }; typedef struct reiserfs_node_head reiserfs_node_head_t; #define REISERFS_NODEH_SIZE (sizeof(reiserfs_node_head_t)) /* set/get fields of block head on disk with these defines */ #define reiserfs_nh_get_level(blkh) get_le16 (blkh, blk2_level) #define reiserfs_nh_set_level(blkh,val) set_le16 (blkh, blk2_level, val) #define reiserfs_nh_get_items(blkh) get_le16 (blkh, blk2_nr_item) #define reiserfs_nh_set_items(blkh,val) set_le16 (blkh, blk2_nr_item, val) #define reiserfs_nh_get_free(blkh) get_le16 (blkh, blk2_free_space) #define reiserfs_nh_set_free(blkh,val) set_le16 (blkh, blk2_free_space, val) /* * values for blk_type field */ #define FREE_LEVEL 0 /* Node of this level is out of the tree. */ #define LEAF_LEVEL 1 /* Leaf node level. */ /* Given the buffer head of a formatted node, resolve to the block head of that node. */ #define NODE_HEAD(p_s_bh) ((reiserfs_node_head_t *)((p_s_bh)->b_data)) #define reiserfs_node_items(bh) reiserfs_nh_get_items (NODE_HEAD(bh)) #define reiserfs_node_level(bh) reiserfs_nh_get_level (NODE_HEAD(bh)) #define reiserfs_node_free(bh) reiserfs_nh_get_free (NODE_HEAD(bh)) /* Does the buffer contain a disk block which is in the tree. */ #define REISERFS_NODE_INTREE(p_s_bh) \ (reiserfs_nh_get_level(NODE_HEAD (p_s_bh)) != FREE_LEVEL) #define REISERFS_NODE_SPACE(blocksize) ((blocksize) - REISERFS_NODEH_SIZE) /* amount of used space in buffer (not including block head) */ #define reiserfs_node_used(cur) (REISERFS_NODE_SPACE(cur->b_size) - \ (reiserfs_node_free(cur))) enum node_type { NT_LEAF = 0x1, NT_INTERNAL = 0x2, NT_SUPER = 0x3, NT_JDESC = 0x4, NT_IH_ARRAY = 0x5, NT_UNKNOWN }; typedef enum node_type node_type_t; extern void reiserfs_node_replace_key (reiserfs_bh_t * dest, int n_dest, reiserfs_bh_t * src, int n_src); extern void reiserfs_node_forget(reiserfs_filsys_t *fs, unsigned long blk); extern int reiserfs_node_formatted (reiserfs_bh_t * bh, int level); extern int reiserfs_node_type (reiserfs_bh_t *bh); extern char *reiserfs_node_type_name(int code); extern void reiserfs_node_print (FILE * fp, reiserfs_filsys_t *, reiserfs_bh_t * bh, ...); #endif