blob: fda829f2a5aa809720fb75fcd2eee1eb973aed83 [file] [log] [blame]
/*
* Copyright 2000-2004 by Hans Reiser, licensing governed by
* reiserfsprogs/README
*
* Leaf balancing method declarations.
*
*/
#ifndef REISERFS_LEAF_H
#define REISERFS_LEAF_H
#include <reiserfs/types.h>
#include <misc/bitops.h>
/* size of item header */
#define REISERFS_IH_SIZE (sizeof(reiserfs_ih_t))
/* set/get fields of item head on disk with these defines */
#define reiserfs_ih_get_entries(ih) get_le16 (ih, u.ih2_entry_count)
#define reiserfs_ih_set_entries(ih,val) set_le16 (ih, u.ih2_entry_count, val)
#define reiserfs_ih_get_free(ih) get_le16 (ih, u.ih2_free_space)
#define reiserfs_ih_set_free(ih,val) set_le16 (ih, u.ih2_free_space, 0)
#define reiserfs_ih_get_len(ih) get_le16 (ih, ih2_item_len)
#define reiserfs_ih_set_len(ih,val) set_le16 (ih, ih2_item_len, val)
#define reiserfs_ih_get_loc(ih) get_le16 (ih, ih2_item_location)
#define reiserfs_ih_set_loc(ih,val) set_le16 (ih, ih2_item_location, val)
#define reiserfs_ih_format_v1(ih) (reiserfs_ih_get_format (ih) == KEY_FORMAT_1)
#define IH_Unreachable 0
#define IH_Was_Tail 1
#define IH_Checked 2
#define IH_Writable 3
/* Unreachable bit is set on tree rebuilding and is cleared in semantic pass */
#define reiserfs_ih_clflags(ih) reiserfs_ih_set_flags (ih, 0)
#define reiserfs_ih_isreach(ih) \
(!(reiserfs_ih_get_flags (ih) & (1 << IH_Unreachable)))
#define reiserfs_ih_clunreach(ih) reiserfs_ih_set_flags (ih, \
reiserfs_ih_get_flags (ih) & ~(1 << IH_Unreachable))
#define reiserfs_ih_mkunreach(ih) reiserfs_ih_set_flags (ih, \
reiserfs_ih_get_flags (ih) | (1 << IH_Unreachable))
#define reiserfs_ih_wastail(ih) \
(reiserfs_ih_get_flags (ih) & (1 << IH_Was_Tail))
#define reiserfs_ih_mktail(ih) reiserfs_ih_set_flags (ih, \
reiserfs_ih_get_flags (ih) | (1 << IH_Was_Tail))
#define reiserfs_ih_cltail(ih) reiserfs_ih_set_flags (ih, \
reiserfs_ih_get_flags (ih) & ~(1 << IH_Was_Tail))
#define reiserfs_ih_ischeck(ih) \
(reiserfs_ih_get_flags (ih) & (1 << IH_Checked))
#define reiserfs_ih_mkcheck(ih) reiserfs_ih_set_flags (ih, \
reiserfs_ih_get_flags (ih) | (1 << IH_Checked))
#define reiserfs_ih_clcheck(ih) reiserfs_ih_set_flags (ih, \
reiserfs_ih_get_flags (ih) & ~(1 << IH_Checked))
#define reiserfs_ih_iswrite(ih) \
(reiserfs_ih_get_flags (ih) & (1 << IH_Writable))
#define reiserfs_ih_mkwrite(ih) reiserfs_ih_set_flags (ih, \
reiserfs_ih_get_flags (ih) | (1 << IH_Writable))
#define reiserfs_ih_clwrite(ih) reiserfs_ih_set_flags (ih, \
reiserfs_ih_get_flags (ih) & ~(1 << IH_Writable))
#define reiserfs_ih_stat(p_s_ih) reiserfs_key_stat(&((p_s_ih)->ih_key))
#define reiserfs_ih_dir(p_s_ih) reiserfs_key_dir(&((p_s_ih)->ih_key))
#define reiserfs_ih_direct(p_s_ih) reiserfs_key_direct(&((p_s_ih)->ih_key))
#define reiserfs_ih_ext(p_s_ih) reiserfs_key_ext(&((p_s_ih)->ih_key))
/* maximal length of item */
#define REISERFS_ITEM_MAX(block_size) \
(block_size - REISERFS_NODEH_SIZE - REISERFS_IH_SIZE)
#define REISERFS_ITEM_MIN 1
#define REISERFS_DIRECT_MAX(size) \
((size) - REISERFS_NODEH_SIZE - 2 * REISERFS_IH_SIZE - \
REISERFS_SD_SIZE - REISERFS_EXT_SIZE)
/* get the item header */
#define reiserfs_ih_at(bh,item_num) \
((reiserfs_ih_t * )((bh)->b_data + REISERFS_NODEH_SIZE) + (item_num))
/* get the key */
#define reiserfs_ih_key_at(bh,item_num) \
(&(reiserfs_ih_at(bh,item_num)->ih_key))
/* get item body */
#define reiserfs_item_at(bh,item_num) \
( (bh)->b_data + reiserfs_ih_get_loc (reiserfs_ih_at((bh),(item_num))))
/* following defines use reiserfs buffer header and item header */
/* get item body */
#define reiserfs_item_by_ih(bh,ih) ((bh)->b_data + reiserfs_ih_get_loc(ih))
#define reiserfs_leaf_head(bh) \
(reiserfs_nh_get_level ((reiserfs_node_head_t *)((bh)->b_data)) \
== LEAF_LEVEL)
/* check whether byte number 'offset' is in this item */
#define reiserfs_item_has_off(p_s_ih, n_offset, n_blocksize) \
(reiserfs_key_get_off(&(p_s_ih)->ih_key) <= (n_offset) && \
reiserfs_key_get_off(&(p_s_ih)->ih_key) + \
reiserfs_leaf_ibytes(p_s_ih,n_blocksize) > (n_offset) )
#define reiserfs_item_has_key(p_s_ih, p_s_key, n_blocksize) \
(!reiserfs_key_comp2(p_s_ih, p_s_key) && \
reiserfs_item_has_off(p_s_ih, reiserfs_key_get_off (p_s_key), \
n_blocksize))
#define reiserfs_item_off_at(ih, pos, bs) \
(reiserfs_key_get_off (&(ih)->ih_key) + \
(pos) * (reiserfs_ih_direct(ih) ? 1 : (bs)))
#define reiserfs_dir(ih, item) \
((reiserfs_ih_stat(ih) && !not_a_directory(item)) || \
reiserfs_ih_dir(ih))
#define reiserfs_item_count(ih) \
(reiserfs_ih_ext(ih) ? reiserfs_ext_count(ih) : \
reiserfs_ih_direct(ih) ? reiserfs_ih_get_len(ih) : \
reiserfs_ih_dir(ih) ? reiserfs_ih_get_entries(ih) : \
reiserfs_ih_stat(ih) ? 1 : 0)
extern void reiserfs_leaf_mkempty (reiserfs_bh_t *bh);
extern int reiserfs_leaf_mergeable (reiserfs_ih_t *left,
reiserfs_ih_t *right,
int bsize);
extern int reiserfs_leaf_count_items(reiserfs_bh_t *bh);
extern int reiserfs_leaf_free_count(reiserfs_bh_t *bh);
extern int reiserfs_leaf_estimate_items(reiserfs_bh_t * bh);
extern int reiserfs_leaf_valid(reiserfs_bh_t *bh);
typedef void (*ih_func_t) (reiserfs_ih_t * ih);
typedef void (*item_func_t) (reiserfs_bh_t * bh,
reiserfs_ih_t * ih);
extern void reiserfs_leaf_traverse(reiserfs_bh_t * bh,
ih_func_t action,
item_func_t * actions);
extern void reiserfs_leaf_delete_item (reiserfs_filsys_t *,
reiserfs_bh_t * bh,
int item_num);
extern void reiserfs_leaf_delete_entry (reiserfs_filsys_t *,
reiserfs_bh_t * bh,
int item_num,
int entry_num,
int del_count);
extern int reiserfs_leaf_correct_at (reiserfs_filsys_t *,
reiserfs_ih_t *, char *,
unfm_func_t, int);
extern __u32 reiserfs_leaf_ibytes (const reiserfs_ih_t * ih,
int blocksize);
extern int reiserfs_leaf_print(FILE * fp,
reiserfs_filsys_t * fs,
reiserfs_bh_t * bh,
int print_mode,
int first,
int last);
/* key format is stored in 12 bits starting from 0-th of item_head's ih2_format*/
extern __u16 reiserfs_ih_get_format(const reiserfs_ih_t *ih);
extern void reiserfs_ih_set_format(reiserfs_ih_t *ih, __u16 val);
extern __u16 reiserfs_ih_get_flags(const reiserfs_ih_t *ih);
extern void reiserfs_ih_set_flags(reiserfs_ih_t *ih, __u16 val);
enum leaf_print {
LP_LEAF_DETAILS = 0x1,
LP_DIRECT_ITEMS = 0x2,
LP_LAST
};
#endif