Imported reiserfsprogs-3.6.20
This commit is contained in:
1 parent
0ed773997f
commit
dac518d099
189 files changed
+43353
-29787
No files matched your search
@@ -0,0 +1,99 @@
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
Reference in new issue
Block a user