100 lines
2.4 KiB
C
100 lines
2.4 KiB
C
/*
|
|
* Copyright 1996-2004 by Hans Reiser, licensing governed by
|
|
* reiserfsprogs/README
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
# include <config.h>
|
|
#endif
|
|
|
|
#include "reiserfs/libreiserfs.h"
|
|
|
|
/* returns 1 if buf looks like an internal node, 0 otherwise */
|
|
int reiserfs_internal_correct (reiserfs_bh_t *bh) {
|
|
reiserfs_node_head_t * blkh;
|
|
unsigned int nr;
|
|
int used_space;
|
|
|
|
blkh = (reiserfs_node_head_t *)bh->b_data;
|
|
|
|
if (!reiserfs_int_head (bh))
|
|
return 0;
|
|
|
|
nr = reiserfs_nh_get_items (blkh);
|
|
if (nr > (bh->b_size - REISERFS_NODEH_SIZE - REISERFS_DC_SIZE) /
|
|
(REISERFS_KEY_SIZE + REISERFS_DC_SIZE))
|
|
{
|
|
/* for internal which is not root we might check min number of keys */
|
|
return 0;
|
|
}
|
|
|
|
used_space = REISERFS_NODEH_SIZE + REISERFS_KEY_SIZE * nr +
|
|
REISERFS_DC_SIZE * (nr + 1);
|
|
|
|
if (used_space != bh->b_size - reiserfs_nh_get_free (blkh))
|
|
return 0;
|
|
|
|
// one may imagine much more checks
|
|
return 1;
|
|
}
|
|
|
|
/* this prints internal nodes (4 keys/items in line) (dc_number,
|
|
dc_size)[k_dirid, k_objectid, k_offset, k_uniqueness](dc_number,
|
|
dc_size)...*/
|
|
int reiserfs_internal_print (FILE * fp,
|
|
reiserfs_bh_t * bh,
|
|
int first, int last)
|
|
{
|
|
reiserfs_key_t * key;
|
|
reiserfs_dc_t * dc;
|
|
int i;
|
|
int from, to;
|
|
|
|
if (!reiserfs_int_head (bh))
|
|
return 1;
|
|
|
|
if (first == -1) {
|
|
from = 0;
|
|
to = reiserfs_node_items (bh);
|
|
} else {
|
|
from = first;
|
|
to = last < reiserfs_node_items (bh) ? last : reiserfs_node_items (bh);
|
|
}
|
|
|
|
reiserfs_warning (fp, "INTERNAL NODE (%ld) contains %b\n",
|
|
bh->b_blocknr, bh);
|
|
|
|
dc = reiserfs_int_at (bh, from);
|
|
reiserfs_warning (fp, "PTR %d: %y ", from, dc);
|
|
|
|
for (i = from, key = reiserfs_int_key_at (bh, from), dc ++;
|
|
i < to; i ++, key ++, dc ++)
|
|
{
|
|
reiserfs_warning (fp, "KEY %d: %20k PTR %d: %20y ",
|
|
i, key, i + 1, dc);
|
|
|
|
if (i && i % 4 == 0)
|
|
reiserfs_warning (fp, "\n");
|
|
}
|
|
|
|
reiserfs_warning (fp, "\n");
|
|
return 0;
|
|
}
|
|
|
|
/* internal node bh must point to block */
|
|
int reiserfs_internal_get_pos (reiserfs_bh_t * bh,
|
|
unsigned long block)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i <= reiserfs_node_items (bh); i ++) {
|
|
if (reiserfs_dc_get_nr (reiserfs_int_at (bh, i)) == block)
|
|
return i;
|
|
}
|
|
|
|
misc_die ("An internal pointer to the block (%lu) cannot be "
|
|
"found in the node (%lu)", block, bh->b_blocknr);
|
|
|
|
return 0;
|
|
}
|