93 lines
3.1 KiB
C
93 lines
3.1 KiB
C
/*
|
|
* 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
|