2 * JFFS2 -- Journalling Flash File System, Version 2.
4 * Copyright © 2001-2007 Red Hat, Inc.
5 * Copyright © 2004-2010 David Woodhouse <dwmw2@infradead.org>
7 * Created by David Woodhouse <dwmw2@infradead.org>
9 * For licensing information, see the file 'LICENCE' in this directory.
13 #include <linux/kernel.h>
14 #include <linux/types.h>
15 #include <linux/pagemap.h>
16 #include <linux/crc32.h>
17 #include <linux/jffs2.h>
18 #include <linux/mtd/mtd.h>
19 #include <linux/slab.h>
23 #ifdef JFFS2_DBG_SANITY_CHECKS
26 __jffs2_dbg_acct_sanity_check_nolock(struct jffs2_sb_info *c,
27 struct jffs2_eraseblock *jeb)
29 if (unlikely(jeb && jeb->used_size + jeb->dirty_size +
30 jeb->free_size + jeb->wasted_size +
31 jeb->unchecked_size != c->sector_size)) {
32 JFFS2_ERROR("eeep, space accounting for block at 0x%08x is screwed.\n", jeb->offset);
33 JFFS2_ERROR("free %#08x + dirty %#08x + used %#08x + wasted %#08x + unchecked %#08x != total %#08x.\n",
34 jeb->free_size, jeb->dirty_size, jeb->used_size,
35 jeb->wasted_size, jeb->unchecked_size, c->sector_size);
39 if (unlikely(c->used_size + c->dirty_size + c->free_size + c->erasing_size + c->bad_size
40 + c->wasted_size + c->unchecked_size != c->flash_size)) {
41 JFFS2_ERROR("eeep, space accounting superblock info is screwed.\n");
42 JFFS2_ERROR("free %#08x + dirty %#08x + used %#08x + erasing %#08x + bad %#08x + wasted %#08x + unchecked %#08x != total %#08x.\n",
43 c->free_size, c->dirty_size, c->used_size, c->erasing_size, c->bad_size,
44 c->wasted_size, c->unchecked_size, c->flash_size);
50 __jffs2_dbg_acct_sanity_check(struct jffs2_sb_info *c,
51 struct jffs2_eraseblock *jeb)
53 spin_lock(&c->erase_completion_lock);
54 jffs2_dbg_acct_sanity_check_nolock(c, jeb);
55 spin_unlock(&c->erase_completion_lock);
58 #endif /* JFFS2_DBG_SANITY_CHECKS */
60 #ifdef JFFS2_DBG_PARANOIA_CHECKS
65 __jffs2_dbg_fragtree_paranoia_check(struct jffs2_inode_info *f)
68 __jffs2_dbg_fragtree_paranoia_check_nolock(f);
69 mutex_unlock(&f->sem);
73 __jffs2_dbg_fragtree_paranoia_check_nolock(struct jffs2_inode_info *f)
75 struct jffs2_node_frag *frag;
78 for (frag = frag_first(&f->fragtree); frag; frag = frag_next(frag)) {
79 struct jffs2_full_dnode *fn = frag->node;
84 if (ref_flags(fn->raw) == REF_PRISTINE) {
86 JFFS2_ERROR("REF_PRISTINE node at 0x%08x had %d frags. Tell dwmw2.\n",
87 ref_offset(fn->raw), fn->frags);
91 /* A hole node which isn't multi-page should be garbage-collected
92 and merged anyway, so we just check for the frag size here,
93 rather than mucking around with actually reading the node
94 and checking the compression type, which is the real way
95 to tell a hole node. */
96 if (frag->ofs & (PAGE_CACHE_SIZE-1) && frag_prev(frag)
97 && frag_prev(frag)->size < PAGE_CACHE_SIZE && frag_prev(frag)->node) {
98 JFFS2_ERROR("REF_PRISTINE node at 0x%08x had a previous non-hole frag in the same page. Tell dwmw2.\n",
103 if ((frag->ofs+frag->size) & (PAGE_CACHE_SIZE-1) && frag_next(frag)
104 && frag_next(frag)->size < PAGE_CACHE_SIZE && frag_next(frag)->node) {
105 JFFS2_ERROR("REF_PRISTINE node at 0x%08x (%08x-%08x) had a following non-hole frag in the same page. Tell dwmw2.\n",
106 ref_offset(fn->raw), frag->ofs, frag->ofs+frag->size);
113 JFFS2_ERROR("fragtree is corrupted.\n");
114 __jffs2_dbg_dump_fragtree_nolock(f);
120 * Check if the flash contains all 0xFF before we start writing.
123 __jffs2_dbg_prewrite_paranoia_check(struct jffs2_sb_info *c,
124 uint32_t ofs, int len)
130 buf = kmalloc(len, GFP_KERNEL);
134 ret = jffs2_flash_read(c, ofs, len, &retlen, buf);
135 if (ret || (retlen != len)) {
136 JFFS2_WARNING("read %d bytes failed or short. ret %d, retlen %zd.\n",
143 for (i = 0; i < len; i++)
148 JFFS2_ERROR("argh, about to write node to %#08x on flash, but there are data already there. The first corrupted byte is at %#08x offset.\n",
150 __jffs2_dbg_dump_buffer(buf, len, ofs);
158 void __jffs2_dbg_superblock_counts(struct jffs2_sb_info *c)
160 struct jffs2_eraseblock *jeb;
161 uint32_t free = 0, dirty = 0, used = 0, wasted = 0,
162 erasing = 0, bad = 0, unchecked = 0;
168 free += c->gcblock->free_size;
169 dirty += c->gcblock->dirty_size;
170 used += c->gcblock->used_size;
171 wasted += c->gcblock->wasted_size;
172 unchecked += c->gcblock->unchecked_size;
176 free += c->nextblock->free_size;
177 dirty += c->nextblock->dirty_size;
178 used += c->nextblock->used_size;
179 wasted += c->nextblock->wasted_size;
180 unchecked += c->nextblock->unchecked_size;
182 list_for_each_entry(jeb, &c->clean_list, list) {
184 free += jeb->free_size;
185 dirty += jeb->dirty_size;
186 used += jeb->used_size;
187 wasted += jeb->wasted_size;
188 unchecked += jeb->unchecked_size;
190 list_for_each_entry(jeb, &c->very_dirty_list, list) {
192 free += jeb->free_size;
193 dirty += jeb->dirty_size;
194 used += jeb->used_size;
195 wasted += jeb->wasted_size;
196 unchecked += jeb->unchecked_size;
198 list_for_each_entry(jeb, &c->dirty_list, list) {
200 free += jeb->free_size;
201 dirty += jeb->dirty_size;
202 used += jeb->used_size;
203 wasted += jeb->wasted_size;
204 unchecked += jeb->unchecked_size;
206 list_for_each_entry(jeb, &c->erasable_list, list) {
208 free += jeb->free_size;
209 dirty += jeb->dirty_size;
210 used += jeb->used_size;
211 wasted += jeb->wasted_size;
212 unchecked += jeb->unchecked_size;
214 list_for_each_entry(jeb, &c->erasable_pending_wbuf_list, list) {
216 free += jeb->free_size;
217 dirty += jeb->dirty_size;
218 used += jeb->used_size;
219 wasted += jeb->wasted_size;
220 unchecked += jeb->unchecked_size;
222 list_for_each_entry(jeb, &c->erase_pending_list, list) {
224 free += jeb->free_size;
225 dirty += jeb->dirty_size;
226 used += jeb->used_size;
227 wasted += jeb->wasted_size;
228 unchecked += jeb->unchecked_size;
230 list_for_each_entry(jeb, &c->free_list, list) {
232 free += jeb->free_size;
233 dirty += jeb->dirty_size;
234 used += jeb->used_size;
235 wasted += jeb->wasted_size;
236 unchecked += jeb->unchecked_size;
238 list_for_each_entry(jeb, &c->bad_used_list, list) {
240 free += jeb->free_size;
241 dirty += jeb->dirty_size;
242 used += jeb->used_size;
243 wasted += jeb->wasted_size;
244 unchecked += jeb->unchecked_size;
247 list_for_each_entry(jeb, &c->erasing_list, list) {
249 erasing += c->sector_size;
251 list_for_each_entry(jeb, &c->erase_checking_list, list) {
253 erasing += c->sector_size;
255 list_for_each_entry(jeb, &c->erase_complete_list, list) {
257 erasing += c->sector_size;
259 list_for_each_entry(jeb, &c->bad_list, list) {
261 bad += c->sector_size;
266 if (sz != c->sz##_size) { \
267 pr_warn("%s_size mismatch counted 0x%x, c->%s_size 0x%x\n", \
268 #sz, #sz, sz, c->sz##_size); \
283 if (nr_counted != c->nr_blocks) {
284 pr_warn("%s counted only 0x%x blocks of 0x%x. Where are the others?\n",
285 __func__, nr_counted, c->nr_blocks);
290 __jffs2_dbg_dump_block_lists_nolock(c);
296 * Check the space accounting and node_ref list correctness for the JFFS2 erasable block 'jeb'.
299 __jffs2_dbg_acct_paranoia_check(struct jffs2_sb_info *c,
300 struct jffs2_eraseblock *jeb)
302 spin_lock(&c->erase_completion_lock);
303 __jffs2_dbg_acct_paranoia_check_nolock(c, jeb);
304 spin_unlock(&c->erase_completion_lock);
308 __jffs2_dbg_acct_paranoia_check_nolock(struct jffs2_sb_info *c,
309 struct jffs2_eraseblock *jeb)
311 uint32_t my_used_size = 0;
312 uint32_t my_unchecked_size = 0;
313 uint32_t my_dirty_size = 0;
314 struct jffs2_raw_node_ref *ref2 = jeb->first_node;
317 uint32_t totlen = ref_totlen(c, jeb, ref2);
319 if (ref_offset(ref2) < jeb->offset ||
320 ref_offset(ref2) > jeb->offset + c->sector_size) {
321 JFFS2_ERROR("node_ref %#08x shouldn't be in block at %#08x.\n",
322 ref_offset(ref2), jeb->offset);
326 if (ref_flags(ref2) == REF_UNCHECKED)
327 my_unchecked_size += totlen;
328 else if (!ref_obsolete(ref2))
329 my_used_size += totlen;
331 my_dirty_size += totlen;
333 if ((!ref_next(ref2)) != (ref2 == jeb->last_node)) {
334 JFFS2_ERROR("node_ref for node at %#08x (mem %p) has next at %#08x (mem %p), last_node is at %#08x (mem %p).\n",
335 ref_offset(ref2), ref2, ref_offset(ref_next(ref2)), ref_next(ref2),
336 ref_offset(jeb->last_node), jeb->last_node);
339 ref2 = ref_next(ref2);
342 if (my_used_size != jeb->used_size) {
343 JFFS2_ERROR("Calculated used size %#08x != stored used size %#08x.\n",
344 my_used_size, jeb->used_size);
348 if (my_unchecked_size != jeb->unchecked_size) {
349 JFFS2_ERROR("Calculated unchecked size %#08x != stored unchecked size %#08x.\n",
350 my_unchecked_size, jeb->unchecked_size);
355 /* This should work when we implement ref->__totlen elemination */
356 if (my_dirty_size != jeb->dirty_size + jeb->wasted_size) {
357 JFFS2_ERROR("Calculated dirty+wasted size %#08x != stored dirty + wasted size %#08x\n",
358 my_dirty_size, jeb->dirty_size + jeb->wasted_size);
362 if (jeb->free_size == 0
363 && my_used_size + my_unchecked_size + my_dirty_size != c->sector_size) {
364 JFFS2_ERROR("The sum of all nodes in block (%#x) != size of block (%#x)\n",
365 my_used_size + my_unchecked_size + my_dirty_size,
371 if (!(c->flags & (JFFS2_SB_FLAG_BUILDING|JFFS2_SB_FLAG_SCANNING)))
372 __jffs2_dbg_superblock_counts(c);
377 __jffs2_dbg_dump_node_refs_nolock(c, jeb);
378 __jffs2_dbg_dump_jeb_nolock(jeb);
379 __jffs2_dbg_dump_block_lists_nolock(c);
383 #endif /* JFFS2_DBG_PARANOIA_CHECKS */
385 #if defined(JFFS2_DBG_DUMPS) || defined(JFFS2_DBG_PARANOIA_CHECKS)
387 * Dump the node_refs of the 'jeb' JFFS2 eraseblock.
390 __jffs2_dbg_dump_node_refs(struct jffs2_sb_info *c,
391 struct jffs2_eraseblock *jeb)
393 spin_lock(&c->erase_completion_lock);
394 __jffs2_dbg_dump_node_refs_nolock(c, jeb);
395 spin_unlock(&c->erase_completion_lock);
399 __jffs2_dbg_dump_node_refs_nolock(struct jffs2_sb_info *c,
400 struct jffs2_eraseblock *jeb)
402 struct jffs2_raw_node_ref *ref;
405 printk(JFFS2_DBG_MSG_PREFIX " Dump node_refs of the eraseblock %#08x\n", jeb->offset);
406 if (!jeb->first_node) {
407 printk(JFFS2_DBG_MSG_PREFIX " no nodes in the eraseblock %#08x\n", jeb->offset);
412 for (ref = jeb->first_node; ; ref = ref_next(ref)) {
413 printk("%#08x", ref_offset(ref));
415 printk("(%x)", ref->__totlen);
423 printk("\n" JFFS2_DBG);
430 * Dump an eraseblock's space accounting.
433 __jffs2_dbg_dump_jeb(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb)
435 spin_lock(&c->erase_completion_lock);
436 __jffs2_dbg_dump_jeb_nolock(jeb);
437 spin_unlock(&c->erase_completion_lock);
441 __jffs2_dbg_dump_jeb_nolock(struct jffs2_eraseblock *jeb)
446 printk(JFFS2_DBG_MSG_PREFIX " dump space accounting for the eraseblock at %#08x:\n",
449 printk(JFFS2_DBG "used_size: %#08x\n", jeb->used_size);
450 printk(JFFS2_DBG "dirty_size: %#08x\n", jeb->dirty_size);
451 printk(JFFS2_DBG "wasted_size: %#08x\n", jeb->wasted_size);
452 printk(JFFS2_DBG "unchecked_size: %#08x\n", jeb->unchecked_size);
453 printk(JFFS2_DBG "free_size: %#08x\n", jeb->free_size);
457 __jffs2_dbg_dump_block_lists(struct jffs2_sb_info *c)
459 spin_lock(&c->erase_completion_lock);
460 __jffs2_dbg_dump_block_lists_nolock(c);
461 spin_unlock(&c->erase_completion_lock);
465 __jffs2_dbg_dump_block_lists_nolock(struct jffs2_sb_info *c)
467 printk(JFFS2_DBG_MSG_PREFIX " dump JFFS2 blocks lists:\n");
469 printk(JFFS2_DBG "flash_size: %#08x\n", c->flash_size);
470 printk(JFFS2_DBG "used_size: %#08x\n", c->used_size);
471 printk(JFFS2_DBG "dirty_size: %#08x\n", c->dirty_size);
472 printk(JFFS2_DBG "wasted_size: %#08x\n", c->wasted_size);
473 printk(JFFS2_DBG "unchecked_size: %#08x\n", c->unchecked_size);
474 printk(JFFS2_DBG "free_size: %#08x\n", c->free_size);
475 printk(JFFS2_DBG "erasing_size: %#08x\n", c->erasing_size);
476 printk(JFFS2_DBG "bad_size: %#08x\n", c->bad_size);
477 printk(JFFS2_DBG "sector_size: %#08x\n", c->sector_size);
478 printk(JFFS2_DBG "jffs2_reserved_blocks size: %#08x\n",
479 c->sector_size * c->resv_blocks_write);
482 printk(JFFS2_DBG "nextblock: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
483 c->nextblock->offset, c->nextblock->used_size,
484 c->nextblock->dirty_size, c->nextblock->wasted_size,
485 c->nextblock->unchecked_size, c->nextblock->free_size);
487 printk(JFFS2_DBG "nextblock: NULL\n");
490 printk(JFFS2_DBG "gcblock: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
491 c->gcblock->offset, c->gcblock->used_size, c->gcblock->dirty_size,
492 c->gcblock->wasted_size, c->gcblock->unchecked_size, c->gcblock->free_size);
494 printk(JFFS2_DBG "gcblock: NULL\n");
496 if (list_empty(&c->clean_list)) {
497 printk(JFFS2_DBG "clean_list: empty\n");
499 struct list_head *this;
503 list_for_each(this, &c->clean_list) {
504 struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list);
506 dirty += jeb->wasted_size;
507 if (!(jeb->used_size == 0 && jeb->dirty_size == 0 && jeb->wasted_size == 0)) {
508 printk(JFFS2_DBG "clean_list: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
509 jeb->offset, jeb->used_size, jeb->dirty_size, jeb->wasted_size,
510 jeb->unchecked_size, jeb->free_size);
514 printk (JFFS2_DBG "Contains %d blocks with total wasted size %u, average wasted size: %u\n",
515 numblocks, dirty, dirty / numblocks);
518 if (list_empty(&c->very_dirty_list)) {
519 printk(JFFS2_DBG "very_dirty_list: empty\n");
521 struct list_head *this;
525 list_for_each(this, &c->very_dirty_list) {
526 struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list);
529 dirty += jeb->dirty_size;
530 if (!(jeb->used_size == 0 && jeb->dirty_size == 0 && jeb->wasted_size == 0)) {
531 printk(JFFS2_DBG "very_dirty_list: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
532 jeb->offset, jeb->used_size, jeb->dirty_size, jeb->wasted_size,
533 jeb->unchecked_size, jeb->free_size);
537 printk (JFFS2_DBG "Contains %d blocks with total dirty size %u, average dirty size: %u\n",
538 numblocks, dirty, dirty / numblocks);
541 if (list_empty(&c->dirty_list)) {
542 printk(JFFS2_DBG "dirty_list: empty\n");
544 struct list_head *this;
548 list_for_each(this, &c->dirty_list) {
549 struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list);
552 dirty += jeb->dirty_size;
553 if (!(jeb->used_size == 0 && jeb->dirty_size == 0 && jeb->wasted_size == 0)) {
554 printk(JFFS2_DBG "dirty_list: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
555 jeb->offset, jeb->used_size, jeb->dirty_size, jeb->wasted_size,
556 jeb->unchecked_size, jeb->free_size);
560 printk (JFFS2_DBG "contains %d blocks with total dirty size %u, average dirty size: %u\n",
561 numblocks, dirty, dirty / numblocks);
564 if (list_empty(&c->erasable_list)) {
565 printk(JFFS2_DBG "erasable_list: empty\n");
567 struct list_head *this;
569 list_for_each(this, &c->erasable_list) {
570 struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list);
572 if (!(jeb->used_size == 0 && jeb->dirty_size == 0 && jeb->wasted_size == 0)) {
573 printk(JFFS2_DBG "erasable_list: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
574 jeb->offset, jeb->used_size, jeb->dirty_size, jeb->wasted_size,
575 jeb->unchecked_size, jeb->free_size);
580 if (list_empty(&c->erasing_list)) {
581 printk(JFFS2_DBG "erasing_list: empty\n");
583 struct list_head *this;
585 list_for_each(this, &c->erasing_list) {
586 struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list);
588 if (!(jeb->used_size == 0 && jeb->dirty_size == 0 && jeb->wasted_size == 0)) {
589 printk(JFFS2_DBG "erasing_list: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
590 jeb->offset, jeb->used_size, jeb->dirty_size, jeb->wasted_size,
591 jeb->unchecked_size, jeb->free_size);
595 if (list_empty(&c->erase_checking_list)) {
596 printk(JFFS2_DBG "erase_checking_list: empty\n");
598 struct list_head *this;
600 list_for_each(this, &c->erase_checking_list) {
601 struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list);
603 if (!(jeb->used_size == 0 && jeb->dirty_size == 0 && jeb->wasted_size == 0)) {
604 printk(JFFS2_DBG "erase_checking_list: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
605 jeb->offset, jeb->used_size, jeb->dirty_size, jeb->wasted_size,
606 jeb->unchecked_size, jeb->free_size);
611 if (list_empty(&c->erase_pending_list)) {
612 printk(JFFS2_DBG "erase_pending_list: empty\n");
614 struct list_head *this;
616 list_for_each(this, &c->erase_pending_list) {
617 struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list);
619 if (!(jeb->used_size == 0 && jeb->dirty_size == 0 && jeb->wasted_size == 0)) {
620 printk(JFFS2_DBG "erase_pending_list: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
621 jeb->offset, jeb->used_size, jeb->dirty_size, jeb->wasted_size,
622 jeb->unchecked_size, jeb->free_size);
627 if (list_empty(&c->erasable_pending_wbuf_list)) {
628 printk(JFFS2_DBG "erasable_pending_wbuf_list: empty\n");
630 struct list_head *this;
632 list_for_each(this, &c->erasable_pending_wbuf_list) {
633 struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list);
635 if (!(jeb->used_size == 0 && jeb->dirty_size == 0 && jeb->wasted_size == 0)) {
636 printk(JFFS2_DBG "erasable_pending_wbuf_list: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
637 jeb->offset, jeb->used_size, jeb->dirty_size, jeb->wasted_size,
638 jeb->unchecked_size, jeb->free_size);
643 if (list_empty(&c->free_list)) {
644 printk(JFFS2_DBG "free_list: empty\n");
646 struct list_head *this;
648 list_for_each(this, &c->free_list) {
649 struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list);
651 if (!(jeb->used_size == 0 && jeb->dirty_size == 0 && jeb->wasted_size == 0)) {
652 printk(JFFS2_DBG "free_list: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
653 jeb->offset, jeb->used_size, jeb->dirty_size, jeb->wasted_size,
654 jeb->unchecked_size, jeb->free_size);
659 if (list_empty(&c->bad_list)) {
660 printk(JFFS2_DBG "bad_list: empty\n");
662 struct list_head *this;
664 list_for_each(this, &c->bad_list) {
665 struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list);
667 if (!(jeb->used_size == 0 && jeb->dirty_size == 0 && jeb->wasted_size == 0)) {
668 printk(JFFS2_DBG "bad_list: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
669 jeb->offset, jeb->used_size, jeb->dirty_size, jeb->wasted_size,
670 jeb->unchecked_size, jeb->free_size);
675 if (list_empty(&c->bad_used_list)) {
676 printk(JFFS2_DBG "bad_used_list: empty\n");
678 struct list_head *this;
680 list_for_each(this, &c->bad_used_list) {
681 struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list);
683 if (!(jeb->used_size == 0 && jeb->dirty_size == 0 && jeb->wasted_size == 0)) {
684 printk(JFFS2_DBG "bad_used_list: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
685 jeb->offset, jeb->used_size, jeb->dirty_size, jeb->wasted_size,
686 jeb->unchecked_size, jeb->free_size);
693 __jffs2_dbg_dump_fragtree(struct jffs2_inode_info *f)
696 jffs2_dbg_dump_fragtree_nolock(f);
697 mutex_unlock(&f->sem);
701 __jffs2_dbg_dump_fragtree_nolock(struct jffs2_inode_info *f)
703 struct jffs2_node_frag *this = frag_first(&f->fragtree);
704 uint32_t lastofs = 0;
707 printk(JFFS2_DBG_MSG_PREFIX " dump fragtree of ino #%u\n", f->inocache->ino);
710 printk(JFFS2_DBG "frag %#04x-%#04x: %#08x(%d) on flash (*%p), left (%p), right (%p), parent (%p)\n",
711 this->ofs, this->ofs+this->size, ref_offset(this->node->raw),
712 ref_flags(this->node->raw), this, frag_left(this), frag_right(this),
715 printk(JFFS2_DBG "frag %#04x-%#04x: hole (*%p). left (%p), right (%p), parent (%p)\n",
716 this->ofs, this->ofs+this->size, this, frag_left(this),
717 frag_right(this), frag_parent(this));
718 if (this->ofs != lastofs)
720 lastofs = this->ofs + this->size;
721 this = frag_next(this);
725 printk(JFFS2_DBG "metadata at 0x%08x\n", ref_offset(f->metadata->raw));
728 JFFS2_ERROR("frag tree got a hole in it.\n");
733 #define JFFS2_BUFDUMP_BYTES_PER_LINE 32
735 __jffs2_dbg_dump_buffer(unsigned char *buf, int len, uint32_t offs)
740 printk(JFFS2_DBG_MSG_PREFIX " dump from offset %#08x to offset %#08x (%x bytes).\n",
741 offs, offs + len, len);
742 i = skip = offs % JFFS2_BUFDUMP_BYTES_PER_LINE;
743 offs = offs & ~(JFFS2_BUFDUMP_BYTES_PER_LINE - 1);
746 printk(JFFS2_DBG "%#08x: ", offs);
752 if ((i % JFFS2_BUFDUMP_BYTES_PER_LINE) == 0 && i != len -1) {
755 offs += JFFS2_BUFDUMP_BYTES_PER_LINE;
756 printk(JFFS2_DBG "%0#8x: ", offs);
759 printk("%02x ", buf[i]);
771 __jffs2_dbg_dump_node(struct jffs2_sb_info *c, uint32_t ofs)
773 union jffs2_node_union node;
774 int len = sizeof(union jffs2_node_union);
779 printk(JFFS2_DBG_MSG_PREFIX " dump node at offset %#08x.\n", ofs);
781 ret = jffs2_flash_read(c, ofs, len, &retlen, (unsigned char *)&node);
782 if (ret || (retlen != len)) {
783 JFFS2_ERROR("read %d bytes failed or short. ret %d, retlen %zd.\n",
788 printk(JFFS2_DBG "magic:\t%#04x\n", je16_to_cpu(node.u.magic));
789 printk(JFFS2_DBG "nodetype:\t%#04x\n", je16_to_cpu(node.u.nodetype));
790 printk(JFFS2_DBG "totlen:\t%#08x\n", je32_to_cpu(node.u.totlen));
791 printk(JFFS2_DBG "hdr_crc:\t%#08x\n", je32_to_cpu(node.u.hdr_crc));
793 crc = crc32(0, &node.u, sizeof(node.u) - 4);
794 if (crc != je32_to_cpu(node.u.hdr_crc)) {
795 JFFS2_ERROR("wrong common header CRC.\n");
799 if (je16_to_cpu(node.u.magic) != JFFS2_MAGIC_BITMASK &&
800 je16_to_cpu(node.u.magic) != JFFS2_OLD_MAGIC_BITMASK)
802 JFFS2_ERROR("wrong node magic: %#04x instead of %#04x.\n",
803 je16_to_cpu(node.u.magic), JFFS2_MAGIC_BITMASK);
807 switch(je16_to_cpu(node.u.nodetype)) {
809 case JFFS2_NODETYPE_INODE:
811 printk(JFFS2_DBG "the node is inode node\n");
812 printk(JFFS2_DBG "ino:\t%#08x\n", je32_to_cpu(node.i.ino));
813 printk(JFFS2_DBG "version:\t%#08x\n", je32_to_cpu(node.i.version));
814 printk(JFFS2_DBG "mode:\t%#08x\n", node.i.mode.m);
815 printk(JFFS2_DBG "uid:\t%#04x\n", je16_to_cpu(node.i.uid));
816 printk(JFFS2_DBG "gid:\t%#04x\n", je16_to_cpu(node.i.gid));
817 printk(JFFS2_DBG "isize:\t%#08x\n", je32_to_cpu(node.i.isize));
818 printk(JFFS2_DBG "atime:\t%#08x\n", je32_to_cpu(node.i.atime));
819 printk(JFFS2_DBG "mtime:\t%#08x\n", je32_to_cpu(node.i.mtime));
820 printk(JFFS2_DBG "ctime:\t%#08x\n", je32_to_cpu(node.i.ctime));
821 printk(JFFS2_DBG "offset:\t%#08x\n", je32_to_cpu(node.i.offset));
822 printk(JFFS2_DBG "csize:\t%#08x\n", je32_to_cpu(node.i.csize));
823 printk(JFFS2_DBG "dsize:\t%#08x\n", je32_to_cpu(node.i.dsize));
824 printk(JFFS2_DBG "compr:\t%#02x\n", node.i.compr);
825 printk(JFFS2_DBG "usercompr:\t%#02x\n", node.i.usercompr);
826 printk(JFFS2_DBG "flags:\t%#04x\n", je16_to_cpu(node.i.flags));
827 printk(JFFS2_DBG "data_crc:\t%#08x\n", je32_to_cpu(node.i.data_crc));
828 printk(JFFS2_DBG "node_crc:\t%#08x\n", je32_to_cpu(node.i.node_crc));
830 crc = crc32(0, &node.i, sizeof(node.i) - 8);
831 if (crc != je32_to_cpu(node.i.node_crc)) {
832 JFFS2_ERROR("wrong node header CRC.\n");
837 case JFFS2_NODETYPE_DIRENT:
839 printk(JFFS2_DBG "the node is dirent node\n");
840 printk(JFFS2_DBG "pino:\t%#08x\n", je32_to_cpu(node.d.pino));
841 printk(JFFS2_DBG "version:\t%#08x\n", je32_to_cpu(node.d.version));
842 printk(JFFS2_DBG "ino:\t%#08x\n", je32_to_cpu(node.d.ino));
843 printk(JFFS2_DBG "mctime:\t%#08x\n", je32_to_cpu(node.d.mctime));
844 printk(JFFS2_DBG "nsize:\t%#02x\n", node.d.nsize);
845 printk(JFFS2_DBG "type:\t%#02x\n", node.d.type);
846 printk(JFFS2_DBG "node_crc:\t%#08x\n", je32_to_cpu(node.d.node_crc));
847 printk(JFFS2_DBG "name_crc:\t%#08x\n", je32_to_cpu(node.d.name_crc));
849 node.d.name[node.d.nsize] = '\0';
850 printk(JFFS2_DBG "name:\t\"%s\"\n", node.d.name);
852 crc = crc32(0, &node.d, sizeof(node.d) - 8);
853 if (crc != je32_to_cpu(node.d.node_crc)) {
854 JFFS2_ERROR("wrong node header CRC.\n");
860 printk(JFFS2_DBG "node type is unknown\n");
864 #endif /* JFFS2_DBG_DUMPS || JFFS2_DBG_PARANOIA_CHECKS */