[PATCH] v9fs: Fix support for special files (devices, named pipes, etc.)
[deliverable/linux.git] / fs / reiserfs / prints.c
CommitLineData
1da177e4
LT
1/*
2 * Copyright 2000 by Hans Reiser, licensing governed by reiserfs/README
3 */
4
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>
11
12#include <stdarg.h>
13
14static char error_buf[1024];
15static char fmt_buf[1024];
16static char off_buf[80];
17
bd4c625c 18static char *reiserfs_cpu_offset(struct cpu_key *key)
1da177e4 19{
bd4c625c
LT
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;
1da177e4
LT
30}
31
bd4c625c 32static char *le_offset(struct reiserfs_key *key)
1da177e4 33{
bd4c625c 34 int version;
1da177e4 35
bd4c625c
LT
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;
1da177e4
LT
47}
48
bd4c625c 49static char *cpu_type(struct cpu_key *key)
1da177e4 50{
bd4c625c
LT
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";
1da177e4
LT
60}
61
bd4c625c 62static char *le_type(struct reiserfs_key *key)
1da177e4 63{
bd4c625c 64 int version;
1da177e4 65
bd4c625c 66 version = le_key_version(key);
1da177e4 67
bd4c625c
LT
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";
77}
1da177e4
LT
78
79/* %k */
bd4c625c 80static void sprintf_le_key(char *buf, struct reiserfs_key *key)
1da177e4 81{
bd4c625c
LT
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]");
1da177e4
LT
88}
89
1da177e4 90/* %K */
bd4c625c 91static void sprintf_cpu_key(char *buf, struct cpu_key *key)
1da177e4 92{
bd4c625c
LT
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]");
1da177e4
LT
99}
100
bd4c625c 101static void sprintf_de_head(char *buf, struct reiserfs_de_head *deh)
1da177e4 102{
bd4c625c
LT
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]");
1da177e4
LT
110
111}
112
bd4c625c 113static void sprintf_item_head(char *buf, struct item_head *ih)
1da177e4 114{
bd4c625c
LT
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]");
1da177e4
LT
124}
125
bd4c625c 126static void sprintf_direntry(char *buf, struct reiserfs_dir_entry *de)
1da177e4 127{
bd4c625c 128 char name[20];
1da177e4 129
bd4c625c
LT
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);
1da177e4
LT
133}
134
bd4c625c 135static void sprintf_block_head(char *buf, struct buffer_head *bh)
1da177e4 136{
bd4c625c
LT
137 sprintf(buf, "level=%d, nr_items=%d, free_space=%d rdkey ",
138 B_LEVEL(bh), B_NR_ITEMS(bh), B_FREE_SPACE(bh));
1da177e4
LT
139}
140
bd4c625c 141static void sprintf_buffer_head(char *buf, struct buffer_head *bh)
1da177e4 142{
bd4c625c 143 char b[BDEVNAME_SIZE];
1da177e4 144
bd4c625c
LT
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");
1da177e4
LT
153}
154
bd4c625c 155static void sprintf_disk_child(char *buf, struct disk_child *dc)
1da177e4 156{
bd4c625c
LT
157 sprintf(buf, "[dc_number=%d, dc_size=%u]", dc_block_number(dc),
158 dc_size(dc));
1da177e4
LT
159}
160
bd4c625c 161static char *is_there_reiserfs_struct(char *fmt, int *what, int *skip)
1da177e4 162{
bd4c625c 163 char *k = fmt;
1da177e4 164
bd4c625c 165 *skip = 0;
1da177e4 166
bd4c625c
LT
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;
172 }
173 (*skip)++;
174 k++;
175 }
176 return k;
177}
1da177e4
LT
178
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);
190*/
191
bd4c625c
LT
192static void prepare_error_buf(const char *fmt, va_list args)
193{
194 char *fmt1 = fmt_buf;
195 char *k;
196 char *p = error_buf;
197 int i, j, what, skip;
198
199 strcpy(fmt1, fmt);
200
201 while ((k = is_there_reiserfs_struct(fmt1, &what, &skip)) != NULL) {
202 *k = 0;
203
204 p += vsprintf(p, fmt1, args);
205
206 for (i = 0; i < skip; i++)
207 j = va_arg(args, int);
208
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;
241 }
242
243 p += strlen(p);
244 fmt1 = k + 2;
245 }
246 vsprintf(p, fmt1, args);
1da177e4
LT
247
248}
249
1da177e4
LT
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
258*/
259
260#define do_reiserfs_warning(fmt)\
261{\
262 va_list args;\
263 va_start( args, fmt );\
264 prepare_error_buf( fmt, args );\
265 va_end( args );\
266}
267
bd4c625c 268void reiserfs_warning(struct super_block *sb, const char *fmt, ...)
1da177e4 269{
bd4c625c
LT
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);
1da177e4
LT
276}
277
278/* No newline.. reiserfs_info calls can be followed by printk's */
bd4c625c 279void reiserfs_info(struct super_block *sb, const char *fmt, ...)
1da177e4 280{
bd4c625c
LT
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);
1da177e4
LT
287}
288
289/* No newline.. reiserfs_printk calls can be followed by printk's */
bd4c625c 290static void reiserfs_printk(const char *fmt, ...)
1da177e4 291{
bd4c625c
LT
292 do_reiserfs_warning(fmt);
293 printk(error_buf);
1da177e4
LT
294}
295
bd4c625c 296void reiserfs_debug(struct super_block *s, int level, const char *fmt, ...)
1da177e4
LT
297{
298#ifdef CONFIG_REISERFS_CHECK
bd4c625c
LT
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);
1da177e4
LT
305#endif
306}
307
308/* The format:
309
310 maintainer-errorid: [function-name:] message
311
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.
317
318 Example:
319
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
325 );
326
327 Regular panic()s sometimes clear the screen before the message can
328 be read, thus the need for the while loop.
329
330 Numbering scheme for panic used by Vladimir and Anatoly( Hans completely ignores this scheme, and considers it
331 pointless complexity):
332
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
350
351 . */
352
1da177e4 353#ifdef CONFIG_REISERFS_CHECK
bd4c625c 354extern struct tree_balance *cur_tb;
1da177e4
LT
355#endif
356
bd4c625c 357void reiserfs_panic(struct super_block *sb, const char *fmt, ...)
1da177e4 358{
bd4c625c
LT
359 do_reiserfs_warning(fmt);
360 printk(KERN_EMERG "REISERFS: panic (device %s): %s\n",
361 reiserfs_bdevname(sb), error_buf);
362 BUG();
1da177e4 363
bd4c625c
LT
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);
1da177e4
LT
367}
368
bd4c625c 369void reiserfs_abort(struct super_block *sb, int errno, const char *fmt, ...)
1da177e4 370{
bd4c625c 371 do_reiserfs_warning(fmt);
1da177e4 372
bd4c625c
LT
373 if (reiserfs_error_panic(sb)) {
374 panic(KERN_CRIT "REISERFS: panic (device %s): %s\n",
375 reiserfs_bdevname(sb), error_buf);
376 }
1da177e4 377
bd4c625c
LT
378 if (sb->s_flags & MS_RDONLY)
379 return;
1da177e4 380
bd4c625c
LT
381 printk(KERN_CRIT "REISERFS: abort (device %s): %s\n",
382 reiserfs_bdevname(sb), error_buf);
1da177e4 383
bd4c625c
LT
384 sb->s_flags |= MS_RDONLY;
385 reiserfs_journal_abort(sb, errno);
1da177e4
LT
386}
387
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)...*/
bd4c625c 391static int print_internal(struct buffer_head *bh, int first, int last)
1da177e4 392{
bd4c625c
LT
393 struct reiserfs_key *key;
394 struct disk_child *dc;
395 int i;
396 int from, to;
1da177e4 397
bd4c625c
LT
398 if (!B_IS_KEYS_LEVEL(bh))
399 return 1;
1da177e4 400
bd4c625c 401 check_internal(bh);
1da177e4 402
bd4c625c
LT
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);
409 }
1da177e4 410
bd4c625c 411 reiserfs_printk("INTERNAL NODE (%ld) contains %z\n", bh->b_blocknr, bh);
1da177e4 412
bd4c625c
LT
413 dc = B_N_CHILD(bh, from);
414 reiserfs_printk("PTR %d: %y ", from, dc);
1da177e4 415
bd4c625c
LT
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");
421 }
422 printk("\n");
423 return 0;
424}
1da177e4 425
bd4c625c
LT
426static int print_leaf(struct buffer_head *bh, int print_mode, int first,
427 int last)
428{
429 struct block_head *blkh;
430 struct item_head *ih;
431 int i, nr;
432 int from, to;
1da177e4 433
bd4c625c
LT
434 if (!B_IS_ITEMS_LEVEL(bh))
435 return 1;
1da177e4 436
bd4c625c 437 check_leaf(bh);
1da177e4 438
bd4c625c
LT
439 blkh = B_BLK_HEAD(bh);
440 ih = B_N_PITEM_HEAD(bh, 0);
441 nr = blkh_nr_item(blkh);
1da177e4 442
bd4c625c
LT
443 printk
444 ("\n===================================================================\n");
445 reiserfs_printk("LEAF NODE (%ld) contains %z\n", bh->b_blocknr, bh);
1da177e4 446
bd4c625c
LT
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;
451 }
1da177e4 452
bd4c625c
LT
453 if (first < 0 || first > nr - 1)
454 from = 0;
455 else
456 from = first;
457
458 if (last < 0 || last > nr)
459 to = nr;
460 else
461 to = last;
462
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));
474 }
1da177e4 475
bd4c625c
LT
476 printk
477 ("===================================================================\n");
1da177e4 478
bd4c625c 479 return 0;
1da177e4
LT
480}
481
bd4c625c 482char *reiserfs_hashname(int code)
1da177e4 483{
bd4c625c
LT
484 if (code == YURA_HASH)
485 return "rupasov";
486 if (code == TEA_HASH)
487 return "tea";
488 if (code == R5_HASH)
489 return "r5";
1da177e4 490
bd4c625c 491 return "unknown";
1da177e4
LT
492}
493
494/* return 1 if this is not super block */
bd4c625c
LT
495static int print_super_block(struct buffer_head *bh)
496{
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];
502
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;
512 }
513
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 ;)
1da177e4 522// skipped = (bh->b_blocknr * bh->b_size) / sb_blocksize(rs);
bd4c625c
LT
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)));
539
540 printk("Tree height %d\n", sb_tree_height(rs));
541 return 0;
1da177e4
LT
542}
543
bd4c625c 544static int print_desc_block(struct buffer_head *bh)
1da177e4 545{
bd4c625c 546 struct reiserfs_journal_desc *desc;
1da177e4 547
bd4c625c
LT
548 if (memcmp(get_journal_desc_magic(bh), JOURNAL_DESC_MAGIC, 8))
549 return 1;
1da177e4 550
bd4c625c
LT
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));
1da177e4 555
bd4c625c 556 return 0;
1da177e4
LT
557}
558
bd4c625c 559void print_block(struct buffer_head *bh, ...) //int print_mode, int first, int last)
1da177e4 560{
bd4c625c
LT
561 va_list args;
562 int mode, first, last;
1da177e4 563
bd4c625c 564 va_start(args, bh);
1da177e4 565
bd4c625c
LT
566 if (!bh) {
567 printk("print_block: buffer is NULL\n");
568 return;
569 }
1da177e4 570
bd4c625c
LT
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);
1da177e4
LT
581}
582
1da177e4
LT
583static char print_tb_buf[2048];
584
585/* this stores initial state of tree balance in the print_tb_buf */
bd4c625c
LT
586void store_print_tb(struct tree_balance *tb)
587{
588 int h = 0;
589 int i;
590 struct buffer_head *tbSh, *tbFh;
591
592 if (!tb)
593 return;
594
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);
603
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;
615 }
616 sprintf(print_tb_buf + strlen(print_tb_buf),
617 "* %d * %3lld(%2d) * %3lld(%2d) * %3lld(%2d) * %5lld * %5lld * %5lld * %5lld * %5lld *\n",
618 h,
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));
1da177e4 634 }
1da177e4 635
bd4c625c
LT
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]);
644
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]);
1da177e4 654
bd4c625c
LT
655 sprintf(print_tb_buf + strlen(print_tb_buf),
656 "=====================================================================\n"
657 "FEB list: ");
1da177e4 658
bd4c625c
LT
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" : ", ");
1da177e4 670
bd4c625c
LT
671 sprintf(print_tb_buf + strlen(print_tb_buf),
672 "======================== the end ====================================\n");
1da177e4
LT
673}
674
bd4c625c
LT
675void print_cur_tb(char *mes)
676{
677 printk("%s\n%s", mes, print_tb_buf);
678}
1da177e4 679
bd4c625c 680static void check_leaf_block_head(struct buffer_head *bh)
1da177e4 681{
bd4c625c
LT
682 struct block_head *blkh;
683 int nr;
684
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);
1da177e4 695
1da177e4
LT
696}
697
bd4c625c
LT
698static void check_internal_block_head(struct buffer_head *bh)
699{
700 struct block_head *blkh;
701
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);
707
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);
712
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);
719
720}
1da177e4 721
bd4c625c 722void check_leaf(struct buffer_head *bh)
1da177e4 723{
bd4c625c
LT
724 int i;
725 struct item_head *ih;
726
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));
1da177e4
LT
732}
733
bd4c625c
LT
734void check_internal(struct buffer_head *bh)
735{
736 if (!bh)
737 return;
738 check_internal_block_head(bh);
739}
1da177e4 740
bd4c625c 741void print_statistics(struct super_block *s)
1da177e4
LT
742{
743
bd4c625c
LT
744 /*
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);
750 */
1da177e4
LT
751
752}
This page took 0.084886 seconds and 5 git commands to generate.