blob: 87f6d3443d368c2ac0a2cee75b9a0a4a2c842823 [file] [log] [blame]
/*
* 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