[PATCH] Kprobes: Track kprobe on a per_cpu basis - ppc64 changes
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / fs / reiserfs / prints.c
blobd55e164bd5c22b66d80cff459af5bc2655c1dd81
1 /*
2 * Copyright 2000 by Hans Reiser, licensing governed by reiserfs/README
3 */
5 #include <linux/config.h>
6 #include <linux/time.h>
7 #include <linux/fs.h>
8 #include <linux/reiserfs_fs.h>
9 #include <linux/string.h>
10 #include <linux/buffer_head.h>
12 #include <stdarg.h>
14 static char error_buf[1024];
15 static char fmt_buf[1024];
16 static char off_buf[80];
18 static char *reiserfs_cpu_offset(struct cpu_key *key)
20 if (cpu_key_k_type(key) == TYPE_DIRENTRY)
21 sprintf(off_buf, "%Lu(%Lu)",
22 (unsigned long long)
23 GET_HASH_VALUE(cpu_key_k_offset(key)),
24 (unsigned long long)
25 GET_GENERATION_NUMBER(cpu_key_k_offset(key)));
26 else
27 sprintf(off_buf, "0x%Lx",
28 (unsigned long long)cpu_key_k_offset(key));
29 return off_buf;
32 static char *le_offset(struct reiserfs_key *key)
34 int version;
36 version = le_key_version(key);
37 if (le_key_k_type(version, key) == TYPE_DIRENTRY)
38 sprintf(off_buf, "%Lu(%Lu)",
39 (unsigned long long)
40 GET_HASH_VALUE(le_key_k_offset(version, key)),
41 (unsigned long long)
42 GET_GENERATION_NUMBER(le_key_k_offset(version, key)));
43 else
44 sprintf(off_buf, "0x%Lx",
45 (unsigned long long)le_key_k_offset(version, key));
46 return off_buf;
49 static char *cpu_type(struct cpu_key *key)
51 if (cpu_key_k_type(key) == TYPE_STAT_DATA)
52 return "SD";
53 if (cpu_key_k_type(key) == TYPE_DIRENTRY)
54 return "DIR";
55 if (cpu_key_k_type(key) == TYPE_DIRECT)
56 return "DIRECT";
57 if (cpu_key_k_type(key) == TYPE_INDIRECT)
58 return "IND";
59 return "UNKNOWN";
62 static char *le_type(struct reiserfs_key *key)
64 int version;
66 version = le_key_version(key);
68 if (le_key_k_type(version, key) == TYPE_STAT_DATA)
69 return "SD";
70 if (le_key_k_type(version, key) == TYPE_DIRENTRY)
71 return "DIR";
72 if (le_key_k_type(version, key) == TYPE_DIRECT)
73 return "DIRECT";
74 if (le_key_k_type(version, key) == TYPE_INDIRECT)
75 return "IND";
76 return "UNKNOWN";
79 /* %k */
80 static void sprintf_le_key(char *buf, struct reiserfs_key *key)
82 if (key)
83 sprintf(buf, "[%d %d %s %s]", le32_to_cpu(key->k_dir_id),
84 le32_to_cpu(key->k_objectid), le_offset(key),
85 le_type(key));
86 else
87 sprintf(buf, "[NULL]");
90 /* %K */
91 static void sprintf_cpu_key(char *buf, struct cpu_key *key)
93 if (key)
94 sprintf(buf, "[%d %d %s %s]", key->on_disk_key.k_dir_id,
95 key->on_disk_key.k_objectid, reiserfs_cpu_offset(key),
96 cpu_type(key));
97 else
98 sprintf(buf, "[NULL]");
101 static void sprintf_de_head(char *buf, struct reiserfs_de_head *deh)
103 if (deh)
104 sprintf(buf,
105 "[offset=%d dir_id=%d objectid=%d location=%d state=%04x]",
106 deh_offset(deh), deh_dir_id(deh), deh_objectid(deh),
107 deh_location(deh), deh_state(deh));
108 else
109 sprintf(buf, "[NULL]");
113 static void sprintf_item_head(char *buf, struct item_head *ih)
115 if (ih) {
116 strcpy(buf,
117 (ih_version(ih) == KEY_FORMAT_3_6) ? "*3.6* " : "*3.5*");
118 sprintf_le_key(buf + strlen(buf), &(ih->ih_key));
119 sprintf(buf + strlen(buf), ", item_len %d, item_location %d, "
120 "free_space(entry_count) %d",
121 ih_item_len(ih), ih_location(ih), ih_free_space(ih));
122 } else
123 sprintf(buf, "[NULL]");
126 static void sprintf_direntry(char *buf, struct reiserfs_dir_entry *de)
128 char name[20];
130 memcpy(name, de->de_name, de->de_namelen > 19 ? 19 : de->de_namelen);
131 name[de->de_namelen > 19 ? 19 : de->de_namelen] = 0;
132 sprintf(buf, "\"%s\"==>[%d %d]", name, de->de_dir_id, de->de_objectid);
135 static void sprintf_block_head(char *buf, struct buffer_head *bh)
137 sprintf(buf, "level=%d, nr_items=%d, free_space=%d rdkey ",
138 B_LEVEL(bh), B_NR_ITEMS(bh), B_FREE_SPACE(bh));
141 static void sprintf_buffer_head(char *buf, struct buffer_head *bh)
143 char b[BDEVNAME_SIZE];
145 sprintf(buf,
146 "dev %s, size %d, blocknr %llu, count %d, state 0x%lx, page %p, (%s, %s, %s)",
147 bdevname(bh->b_bdev, b), bh->b_size,
148 (unsigned long long)bh->b_blocknr, atomic_read(&(bh->b_count)),
149 bh->b_state, bh->b_page,
150 buffer_uptodate(bh) ? "UPTODATE" : "!UPTODATE",
151 buffer_dirty(bh) ? "DIRTY" : "CLEAN",
152 buffer_locked(bh) ? "LOCKED" : "UNLOCKED");
155 static void sprintf_disk_child(char *buf, struct disk_child *dc)
157 sprintf(buf, "[dc_number=%d, dc_size=%u]", dc_block_number(dc),
158 dc_size(dc));
161 static char *is_there_reiserfs_struct(char *fmt, int *what, int *skip)
163 char *k = fmt;
165 *skip = 0;
167 while ((k = strchr(k, '%')) != NULL) {
168 if (k[1] == 'k' || k[1] == 'K' || k[1] == 'h' || k[1] == 't' ||
169 k[1] == 'z' || k[1] == 'b' || k[1] == 'y' || k[1] == 'a') {
170 *what = k[1];
171 break;
173 (*skip)++;
174 k++;
176 return k;
179 /* debugging reiserfs we used to print out a lot of different
180 variables, like keys, item headers, buffer heads etc. Values of
181 most fields matter. So it took a long time just to write
182 appropriative printk. With this reiserfs_warning you can use format
183 specification for complex structures like you used to do with
184 printfs for integers, doubles and pointers. For instance, to print
185 out key structure you have to write just:
186 reiserfs_warning ("bad key %k", key);
187 instead of
188 printk ("bad key %lu %lu %lu %lu", key->k_dir_id, key->k_objectid,
189 key->k_offset, key->k_uniqueness);
192 static void prepare_error_buf(const char *fmt, va_list args)
194 char *fmt1 = fmt_buf;
195 char *k;
196 char *p = error_buf;
197 int i, j, what, skip;
199 strcpy(fmt1, fmt);
201 while ((k = is_there_reiserfs_struct(fmt1, &what, &skip)) != NULL) {
202 *k = 0;
204 p += vsprintf(p, fmt1, args);
206 for (i = 0; i < skip; i++)
207 j = va_arg(args, int);
209 switch (what) {
210 case 'k':
211 sprintf_le_key(p, va_arg(args, struct reiserfs_key *));
212 break;
213 case 'K':
214 sprintf_cpu_key(p, va_arg(args, struct cpu_key *));
215 break;
216 case 'h':
217 sprintf_item_head(p, va_arg(args, struct item_head *));
218 break;
219 case 't':
220 sprintf_direntry(p,
221 va_arg(args,
222 struct reiserfs_dir_entry *));
223 break;
224 case 'y':
225 sprintf_disk_child(p,
226 va_arg(args, struct disk_child *));
227 break;
228 case 'z':
229 sprintf_block_head(p,
230 va_arg(args, struct buffer_head *));
231 break;
232 case 'b':
233 sprintf_buffer_head(p,
234 va_arg(args, struct buffer_head *));
235 break;
236 case 'a':
237 sprintf_de_head(p,
238 va_arg(args,
239 struct reiserfs_de_head *));
240 break;
243 p += strlen(p);
244 fmt1 = k + 2;
246 vsprintf(p, fmt1, args);
250 /* in addition to usual conversion specifiers this accepts reiserfs
251 specific conversion specifiers:
252 %k to print little endian key,
253 %K to print cpu key,
254 %h to print item_head,
255 %t to print directory entry
256 %z to print block head (arg must be struct buffer_head *
257 %b to print buffer_head
260 #define do_reiserfs_warning(fmt)\
262 va_list args;\
263 va_start( args, fmt );\
264 prepare_error_buf( fmt, args );\
265 va_end( args );\
268 void reiserfs_warning(struct super_block *sb, const char *fmt, ...)
270 do_reiserfs_warning(fmt);
271 if (sb)
272 printk(KERN_WARNING "ReiserFS: %s: warning: %s\n",
273 reiserfs_bdevname(sb), error_buf);
274 else
275 printk(KERN_WARNING "ReiserFS: warning: %s\n", error_buf);
278 /* No newline.. reiserfs_info calls can be followed by printk's */
279 void reiserfs_info(struct super_block *sb, const char *fmt, ...)
281 do_reiserfs_warning(fmt);
282 if (sb)
283 printk(KERN_NOTICE "ReiserFS: %s: %s",
284 reiserfs_bdevname(sb), error_buf);
285 else
286 printk(KERN_NOTICE "ReiserFS: %s", error_buf);
289 /* No newline.. reiserfs_printk calls can be followed by printk's */
290 static void reiserfs_printk(const char *fmt, ...)
292 do_reiserfs_warning(fmt);
293 printk(error_buf);
296 void reiserfs_debug(struct super_block *s, int level, const char *fmt, ...)
298 #ifdef CONFIG_REISERFS_CHECK
299 do_reiserfs_warning(fmt);
300 if (s)
301 printk(KERN_DEBUG "ReiserFS: %s: %s\n",
302 reiserfs_bdevname(s), error_buf);
303 else
304 printk(KERN_DEBUG "ReiserFS: %s\n", error_buf);
305 #endif
308 /* The format:
310 maintainer-errorid: [function-name:] message
312 where errorid is unique to the maintainer and function-name is
313 optional, is recommended, so that anyone can easily find the bug
314 with a simple grep for the short to type string
315 maintainer-errorid. Don't bother with reusing errorids, there are
316 lots of numbers out there.
318 Example:
320 reiserfs_panic(
321 p_sb, "reiser-29: reiserfs_new_blocknrs: "
322 "one of search_start or rn(%d) is equal to MAX_B_NUM,"
323 "which means that we are optimizing location based on the bogus location of a temp buffer (%p).",
324 rn, bh
327 Regular panic()s sometimes clear the screen before the message can
328 be read, thus the need for the while loop.
330 Numbering scheme for panic used by Vladimir and Anatoly( Hans completely ignores this scheme, and considers it
331 pointless complexity):
333 panics in reiserfs_fs.h have numbers from 1000 to 1999
334 super.c 2000 to 2999
335 preserve.c (unused) 3000 to 3999
336 bitmap.c 4000 to 4999
337 stree.c 5000 to 5999
338 prints.c 6000 to 6999
339 namei.c 7000 to 7999
340 fix_nodes.c 8000 to 8999
341 dir.c 9000 to 9999
342 lbalance.c 10000 to 10999
343 ibalance.c 11000 to 11999 not ready
344 do_balan.c 12000 to 12999
345 inode.c 13000 to 13999
346 file.c 14000 to 14999
347 objectid.c 15000 - 15999
348 buffer.c 16000 - 16999
349 symlink.c 17000 - 17999
351 . */
353 #ifdef CONFIG_REISERFS_CHECK
354 extern struct tree_balance *cur_tb;
355 #endif
357 void reiserfs_panic(struct super_block *sb, const char *fmt, ...)
359 do_reiserfs_warning(fmt);
360 printk(KERN_EMERG "REISERFS: panic (device %s): %s\n",
361 reiserfs_bdevname(sb), error_buf);
362 BUG();
364 /* this is not actually called, but makes reiserfs_panic() "noreturn" */
365 panic("REISERFS: panic (device %s): %s\n",
366 reiserfs_bdevname(sb), error_buf);
369 void reiserfs_abort(struct super_block *sb, int errno, const char *fmt, ...)
371 do_reiserfs_warning(fmt);
373 if (reiserfs_error_panic(sb)) {
374 panic(KERN_CRIT "REISERFS: panic (device %s): %s\n",
375 reiserfs_bdevname(sb), error_buf);
378 if (sb->s_flags & MS_RDONLY)
379 return;
381 printk(KERN_CRIT "REISERFS: abort (device %s): %s\n",
382 reiserfs_bdevname(sb), error_buf);
384 sb->s_flags |= MS_RDONLY;
385 reiserfs_journal_abort(sb, errno);
388 /* this prints internal nodes (4 keys/items in line) (dc_number,
389 dc_size)[k_dirid, k_objectid, k_offset, k_uniqueness](dc_number,
390 dc_size)...*/
391 static int print_internal(struct buffer_head *bh, int first, int last)
393 struct reiserfs_key *key;
394 struct disk_child *dc;
395 int i;
396 int from, to;
398 if (!B_IS_KEYS_LEVEL(bh))
399 return 1;
401 check_internal(bh);
403 if (first == -1) {
404 from = 0;
405 to = B_NR_ITEMS(bh);
406 } else {
407 from = first;
408 to = last < B_NR_ITEMS(bh) ? last : B_NR_ITEMS(bh);
411 reiserfs_printk("INTERNAL NODE (%ld) contains %z\n", bh->b_blocknr, bh);
413 dc = B_N_CHILD(bh, from);
414 reiserfs_printk("PTR %d: %y ", from, dc);
416 for (i = from, key = B_N_PDELIM_KEY(bh, from), dc++; i < to;
417 i++, key++, dc++) {
418 reiserfs_printk("KEY %d: %k PTR %d: %y ", i, key, i + 1, dc);
419 if (i && i % 4 == 0)
420 printk("\n");
422 printk("\n");
423 return 0;
426 static int print_leaf(struct buffer_head *bh, int print_mode, int first,
427 int last)
429 struct block_head *blkh;
430 struct item_head *ih;
431 int i, nr;
432 int from, to;
434 if (!B_IS_ITEMS_LEVEL(bh))
435 return 1;
437 check_leaf(bh);
439 blkh = B_BLK_HEAD(bh);
440 ih = B_N_PITEM_HEAD(bh, 0);
441 nr = blkh_nr_item(blkh);
443 printk
444 ("\n===================================================================\n");
445 reiserfs_printk("LEAF NODE (%ld) contains %z\n", bh->b_blocknr, bh);
447 if (!(print_mode & PRINT_LEAF_ITEMS)) {
448 reiserfs_printk("FIRST ITEM_KEY: %k, LAST ITEM KEY: %k\n",
449 &(ih->ih_key), &((ih + nr - 1)->ih_key));
450 return 0;
453 if (first < 0 || first > nr - 1)
454 from = 0;
455 else
456 from = first;
458 if (last < 0 || last > nr)
459 to = nr;
460 else
461 to = last;
463 ih += from;
464 printk
465 ("-------------------------------------------------------------------------------\n");
466 printk
467 ("|##| type | key | ilen | free_space | version | loc |\n");
468 for (i = from; i < to; i++, ih++) {
469 printk
470 ("-------------------------------------------------------------------------------\n");
471 reiserfs_printk("|%2d| %h |\n", i, ih);
472 if (print_mode & PRINT_LEAF_ITEMS)
473 op_print_item(ih, B_I_PITEM(bh, ih));
476 printk
477 ("===================================================================\n");
479 return 0;
482 char *reiserfs_hashname(int code)
484 if (code == YURA_HASH)
485 return "rupasov";
486 if (code == TEA_HASH)
487 return "tea";
488 if (code == R5_HASH)
489 return "r5";
491 return "unknown";
494 /* return 1 if this is not super block */
495 static int print_super_block(struct buffer_head *bh)
497 struct reiserfs_super_block *rs =
498 (struct reiserfs_super_block *)(bh->b_data);
499 int skipped, data_blocks;
500 char *version;
501 char b[BDEVNAME_SIZE];
503 if (is_reiserfs_3_5(rs)) {
504 version = "3.5";
505 } else if (is_reiserfs_3_6(rs)) {
506 version = "3.6";
507 } else if (is_reiserfs_jr(rs)) {
508 version = ((sb_version(rs) == REISERFS_VERSION_2) ?
509 "3.6" : "3.5");
510 } else {
511 return 1;
514 printk("%s\'s super block is in block %llu\n", bdevname(bh->b_bdev, b),
515 (unsigned long long)bh->b_blocknr);
516 printk("Reiserfs version %s\n", version);
517 printk("Block count %u\n", sb_block_count(rs));
518 printk("Blocksize %d\n", sb_blocksize(rs));
519 printk("Free blocks %u\n", sb_free_blocks(rs));
520 // FIXME: this would be confusing if
521 // someone stores reiserfs super block in some data block ;)
522 // skipped = (bh->b_blocknr * bh->b_size) / sb_blocksize(rs);
523 skipped = bh->b_blocknr;
524 data_blocks = sb_block_count(rs) - skipped - 1 - sb_bmap_nr(rs) -
525 (!is_reiserfs_jr(rs) ? sb_jp_journal_size(rs) +
526 1 : sb_reserved_for_journal(rs)) - sb_free_blocks(rs);
527 printk
528 ("Busy blocks (skipped %d, bitmaps - %d, journal (or reserved) blocks - %d\n"
529 "1 super block, %d data blocks\n", skipped, sb_bmap_nr(rs),
530 (!is_reiserfs_jr(rs) ? (sb_jp_journal_size(rs) + 1) :
531 sb_reserved_for_journal(rs)), data_blocks);
532 printk("Root block %u\n", sb_root_block(rs));
533 printk("Journal block (first) %d\n", sb_jp_journal_1st_block(rs));
534 printk("Journal dev %d\n", sb_jp_journal_dev(rs));
535 printk("Journal orig size %d\n", sb_jp_journal_size(rs));
536 printk("FS state %d\n", sb_fs_state(rs));
537 printk("Hash function \"%s\"\n",
538 reiserfs_hashname(sb_hash_function_code(rs)));
540 printk("Tree height %d\n", sb_tree_height(rs));
541 return 0;
544 static int print_desc_block(struct buffer_head *bh)
546 struct reiserfs_journal_desc *desc;
548 if (memcmp(get_journal_desc_magic(bh), JOURNAL_DESC_MAGIC, 8))
549 return 1;
551 desc = (struct reiserfs_journal_desc *)(bh->b_data);
552 printk("Desc block %llu (j_trans_id %d, j_mount_id %d, j_len %d)",
553 (unsigned long long)bh->b_blocknr, get_desc_trans_id(desc),
554 get_desc_mount_id(desc), get_desc_trans_len(desc));
556 return 0;
559 void print_block(struct buffer_head *bh, ...) //int print_mode, int first, int last)
561 va_list args;
562 int mode, first, last;
564 va_start(args, bh);
566 if (!bh) {
567 printk("print_block: buffer is NULL\n");
568 return;
571 mode = va_arg(args, int);
572 first = va_arg(args, int);
573 last = va_arg(args, int);
574 if (print_leaf(bh, mode, first, last))
575 if (print_internal(bh, first, last))
576 if (print_super_block(bh))
577 if (print_desc_block(bh))
578 printk
579 ("Block %llu contains unformatted data\n",
580 (unsigned long long)bh->b_blocknr);
583 static char print_tb_buf[2048];
585 /* this stores initial state of tree balance in the print_tb_buf */
586 void store_print_tb(struct tree_balance *tb)
588 int h = 0;
589 int i;
590 struct buffer_head *tbSh, *tbFh;
592 if (!tb)
593 return;
595 sprintf(print_tb_buf, "\n"
596 "BALANCING %d\n"
597 "MODE=%c, ITEM_POS=%d POS_IN_ITEM=%d\n"
598 "=====================================================================\n"
599 "* h * S * L * R * F * FL * FR * CFL * CFR *\n",
600 REISERFS_SB(tb->tb_sb)->s_do_balance,
601 tb->tb_mode, PATH_LAST_POSITION(tb->tb_path),
602 tb->tb_path->pos_in_item);
604 for (h = 0; h < sizeof(tb->insert_size) / sizeof(tb->insert_size[0]);
605 h++) {
606 if (PATH_H_PATH_OFFSET(tb->tb_path, h) <=
607 tb->tb_path->path_length
608 && PATH_H_PATH_OFFSET(tb->tb_path,
609 h) > ILLEGAL_PATH_ELEMENT_OFFSET) {
610 tbSh = PATH_H_PBUFFER(tb->tb_path, h);
611 tbFh = PATH_H_PPARENT(tb->tb_path, h);
612 } else {
613 tbSh = NULL;
614 tbFh = NULL;
616 sprintf(print_tb_buf + strlen(print_tb_buf),
617 "* %d * %3lld(%2d) * %3lld(%2d) * %3lld(%2d) * %5lld * %5lld * %5lld * %5lld * %5lld *\n",
619 (tbSh) ? (long long)(tbSh->b_blocknr) : (-1LL),
620 (tbSh) ? atomic_read(&(tbSh->b_count)) : -1,
621 (tb->L[h]) ? (long long)(tb->L[h]->b_blocknr) : (-1LL),
622 (tb->L[h]) ? atomic_read(&(tb->L[h]->b_count)) : -1,
623 (tb->R[h]) ? (long long)(tb->R[h]->b_blocknr) : (-1LL),
624 (tb->R[h]) ? atomic_read(&(tb->R[h]->b_count)) : -1,
625 (tbFh) ? (long long)(tbFh->b_blocknr) : (-1LL),
626 (tb->FL[h]) ? (long long)(tb->FL[h]->
627 b_blocknr) : (-1LL),
628 (tb->FR[h]) ? (long long)(tb->FR[h]->
629 b_blocknr) : (-1LL),
630 (tb->CFL[h]) ? (long long)(tb->CFL[h]->
631 b_blocknr) : (-1LL),
632 (tb->CFR[h]) ? (long long)(tb->CFR[h]->
633 b_blocknr) : (-1LL));
636 sprintf(print_tb_buf + strlen(print_tb_buf),
637 "=====================================================================\n"
638 "* h * size * ln * lb * rn * rb * blkn * s0 * s1 * s1b * s2 * s2b * curb * lk * rk *\n"
639 "* 0 * %4d * %2d * %2d * %2d * %2d * %4d * %2d * %2d * %3d * %2d * %3d * %4d * %2d * %2d *\n",
640 tb->insert_size[0], tb->lnum[0], tb->lbytes, tb->rnum[0],
641 tb->rbytes, tb->blknum[0], tb->s0num, tb->s1num, tb->s1bytes,
642 tb->s2num, tb->s2bytes, tb->cur_blknum, tb->lkey[0],
643 tb->rkey[0]);
645 /* this prints balance parameters for non-leaf levels */
646 h = 0;
647 do {
648 h++;
649 sprintf(print_tb_buf + strlen(print_tb_buf),
650 "* %d * %4d * %2d * * %2d * * %2d *\n",
651 h, tb->insert_size[h], tb->lnum[h], tb->rnum[h],
652 tb->blknum[h]);
653 } while (tb->insert_size[h]);
655 sprintf(print_tb_buf + strlen(print_tb_buf),
656 "=====================================================================\n"
657 "FEB list: ");
659 /* print FEB list (list of buffers in form (bh (b_blocknr, b_count), that will be used for new nodes) */
660 h = 0;
661 for (i = 0; i < sizeof(tb->FEB) / sizeof(tb->FEB[0]); i++)
662 sprintf(print_tb_buf + strlen(print_tb_buf),
663 "%p (%llu %d)%s", tb->FEB[i],
664 tb->FEB[i] ? (unsigned long long)tb->FEB[i]->
665 b_blocknr : 0ULL,
666 tb->FEB[i] ? atomic_read(&(tb->FEB[i]->b_count)) : 0,
667 (i ==
668 sizeof(tb->FEB) / sizeof(tb->FEB[0]) -
669 1) ? "\n" : ", ");
671 sprintf(print_tb_buf + strlen(print_tb_buf),
672 "======================== the end ====================================\n");
675 void print_cur_tb(char *mes)
677 printk("%s\n%s", mes, print_tb_buf);
680 static void check_leaf_block_head(struct buffer_head *bh)
682 struct block_head *blkh;
683 int nr;
685 blkh = B_BLK_HEAD(bh);
686 nr = blkh_nr_item(blkh);
687 if (nr > (bh->b_size - BLKH_SIZE) / IH_SIZE)
688 reiserfs_panic(NULL,
689 "vs-6010: check_leaf_block_head: invalid item number %z",
690 bh);
691 if (blkh_free_space(blkh) > bh->b_size - BLKH_SIZE - IH_SIZE * nr)
692 reiserfs_panic(NULL,
693 "vs-6020: check_leaf_block_head: invalid free space %z",
694 bh);
698 static void check_internal_block_head(struct buffer_head *bh)
700 struct block_head *blkh;
702 blkh = B_BLK_HEAD(bh);
703 if (!(B_LEVEL(bh) > DISK_LEAF_NODE_LEVEL && B_LEVEL(bh) <= MAX_HEIGHT))
704 reiserfs_panic(NULL,
705 "vs-6025: check_internal_block_head: invalid level %z",
706 bh);
708 if (B_NR_ITEMS(bh) > (bh->b_size - BLKH_SIZE) / IH_SIZE)
709 reiserfs_panic(NULL,
710 "vs-6030: check_internal_block_head: invalid item number %z",
711 bh);
713 if (B_FREE_SPACE(bh) !=
714 bh->b_size - BLKH_SIZE - KEY_SIZE * B_NR_ITEMS(bh) -
715 DC_SIZE * (B_NR_ITEMS(bh) + 1))
716 reiserfs_panic(NULL,
717 "vs-6040: check_internal_block_head: invalid free space %z",
718 bh);
722 void check_leaf(struct buffer_head *bh)
724 int i;
725 struct item_head *ih;
727 if (!bh)
728 return;
729 check_leaf_block_head(bh);
730 for (i = 0, ih = B_N_PITEM_HEAD(bh, 0); i < B_NR_ITEMS(bh); i++, ih++)
731 op_check_item(ih, B_I_PITEM(bh, ih));
734 void check_internal(struct buffer_head *bh)
736 if (!bh)
737 return;
738 check_internal_block_head(bh);
741 void print_statistics(struct super_block *s)
745 printk ("reiserfs_put_super: session statistics: balances %d, fix_nodes %d, \
746 bmap with search %d, without %d, dir2ind %d, ind2dir %d\n",
747 REISERFS_SB(s)->s_do_balance, REISERFS_SB(s)->s_fix_nodes,
748 REISERFS_SB(s)->s_bmaps, REISERFS_SB(s)->s_bmaps_without_search,
749 REISERFS_SB(s)->s_direct2indirect, REISERFS_SB(s)->s_indirect2direct);