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 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
15 #include <linux/kernel.h>
16 #include <linux/types.h>
17 #include <linux/pagemap.h>
18 #include <linux/crc32.h>
19 #include <linux/jffs2.h>
20 #include <linux/mtd/mtd.h>
21 #include <linux/slab.h>
25 #ifdef JFFS2_DBG_SANITY_CHECKS
28 __jffs2_dbg_acct_sanity_check_nolock(struct jffs2_sb_info
*c
,
29 struct jffs2_eraseblock
*jeb
)
31 if (unlikely(jeb
&& jeb
->used_size
+ jeb
->dirty_size
+
32 jeb
->free_size
+ jeb
->wasted_size
+
33 jeb
->unchecked_size
!= c
->sector_size
)) {
34 JFFS2_ERROR("eeep, space accounting for block at 0x%08x is screwed.\n", jeb
->offset
);
35 JFFS2_ERROR("free %#08x + dirty %#08x + used %#08x + wasted %#08x + unchecked %#08x != total %#08x.\n",
36 jeb
->free_size
, jeb
->dirty_size
, jeb
->used_size
,
37 jeb
->wasted_size
, jeb
->unchecked_size
, c
->sector_size
);
41 if (unlikely(c
->used_size
+ c
->dirty_size
+ c
->free_size
+ c
->erasing_size
+ c
->bad_size
42 + c
->wasted_size
+ c
->unchecked_size
!= c
->flash_size
)) {
43 JFFS2_ERROR("eeep, space accounting superblock info is screwed.\n");
44 JFFS2_ERROR("free %#08x + dirty %#08x + used %#08x + erasing %#08x + bad %#08x + wasted %#08x + unchecked %#08x != total %#08x.\n",
45 c
->free_size
, c
->dirty_size
, c
->used_size
, c
->erasing_size
, c
->bad_size
,
46 c
->wasted_size
, c
->unchecked_size
, c
->flash_size
);
52 __jffs2_dbg_acct_sanity_check(struct jffs2_sb_info
*c
,
53 struct jffs2_eraseblock
*jeb
)
55 spin_lock(&c
->erase_completion_lock
);
56 jffs2_dbg_acct_sanity_check_nolock(c
, jeb
);
57 spin_unlock(&c
->erase_completion_lock
);
60 #endif /* JFFS2_DBG_SANITY_CHECKS */
62 #ifdef JFFS2_DBG_PARANOIA_CHECKS
67 __jffs2_dbg_fragtree_paranoia_check(struct jffs2_inode_info
*f
)
70 __jffs2_dbg_fragtree_paranoia_check_nolock(f
);
71 mutex_unlock(&f
->sem
);
75 __jffs2_dbg_fragtree_paranoia_check_nolock(struct jffs2_inode_info
*f
)
77 struct jffs2_node_frag
*frag
;
80 for (frag
= frag_first(&f
->fragtree
); frag
; frag
= frag_next(frag
)) {
81 struct jffs2_full_dnode
*fn
= frag
->node
;
86 if (ref_flags(fn
->raw
) == REF_PRISTINE
) {
88 JFFS2_ERROR("REF_PRISTINE node at 0x%08x had %d frags. Tell dwmw2.\n",
89 ref_offset(fn
->raw
), fn
->frags
);
93 /* A hole node which isn't multi-page should be garbage-collected
94 and merged anyway, so we just check for the frag size here,
95 rather than mucking around with actually reading the node
96 and checking the compression type, which is the real way
97 to tell a hole node. */
98 if (frag
->ofs
& (PAGE_SIZE
-1) && frag_prev(frag
)
99 && frag_prev(frag
)->size
< PAGE_SIZE
&& frag_prev(frag
)->node
) {
100 JFFS2_ERROR("REF_PRISTINE node at 0x%08x had a previous non-hole frag in the same page. Tell dwmw2.\n",
101 ref_offset(fn
->raw
));
105 if ((frag
->ofs
+frag
->size
) & (PAGE_SIZE
-1) && frag_next(frag
)
106 && frag_next(frag
)->size
< PAGE_SIZE
&& frag_next(frag
)->node
) {
107 JFFS2_ERROR("REF_PRISTINE node at 0x%08x (%08x-%08x) had a following non-hole frag in the same page. Tell dwmw2.\n",
108 ref_offset(fn
->raw
), frag
->ofs
, frag
->ofs
+frag
->size
);
115 JFFS2_ERROR("fragtree is corrupted.\n");
116 __jffs2_dbg_dump_fragtree_nolock(f
);
122 * Check if the flash contains all 0xFF before we start writing.
125 __jffs2_dbg_prewrite_paranoia_check(struct jffs2_sb_info
*c
,
126 uint32_t ofs
, int len
)
132 buf
= kmalloc(len
, GFP_KERNEL
);
136 ret
= jffs2_flash_read(c
, ofs
, len
, &retlen
, buf
);
137 if (ret
|| (retlen
!= len
)) {
138 JFFS2_WARNING("read %d bytes failed or short. ret %d, retlen %zd.\n",
145 for (i
= 0; i
< len
; i
++)
150 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",
152 __jffs2_dbg_dump_buffer(buf
, len
, ofs
);
160 static void __jffs2_dbg_superblock_counts(struct jffs2_sb_info
*c
)
162 struct jffs2_eraseblock
*jeb
;
163 uint32_t free
= 0, dirty
= 0, used
= 0, wasted
= 0,
164 erasing
= 0, bad
= 0, unchecked
= 0;
170 free
+= c
->gcblock
->free_size
;
171 dirty
+= c
->gcblock
->dirty_size
;
172 used
+= c
->gcblock
->used_size
;
173 wasted
+= c
->gcblock
->wasted_size
;
174 unchecked
+= c
->gcblock
->unchecked_size
;
178 free
+= c
->nextblock
->free_size
;
179 dirty
+= c
->nextblock
->dirty_size
;
180 used
+= c
->nextblock
->used_size
;
181 wasted
+= c
->nextblock
->wasted_size
;
182 unchecked
+= c
->nextblock
->unchecked_size
;
184 list_for_each_entry(jeb
, &c
->clean_list
, list
) {
186 free
+= jeb
->free_size
;
187 dirty
+= jeb
->dirty_size
;
188 used
+= jeb
->used_size
;
189 wasted
+= jeb
->wasted_size
;
190 unchecked
+= jeb
->unchecked_size
;
192 list_for_each_entry(jeb
, &c
->very_dirty_list
, list
) {
194 free
+= jeb
->free_size
;
195 dirty
+= jeb
->dirty_size
;
196 used
+= jeb
->used_size
;
197 wasted
+= jeb
->wasted_size
;
198 unchecked
+= jeb
->unchecked_size
;
200 list_for_each_entry(jeb
, &c
->dirty_list
, list
) {
202 free
+= jeb
->free_size
;
203 dirty
+= jeb
->dirty_size
;
204 used
+= jeb
->used_size
;
205 wasted
+= jeb
->wasted_size
;
206 unchecked
+= jeb
->unchecked_size
;
208 list_for_each_entry(jeb
, &c
->erasable_list
, list
) {
210 free
+= jeb
->free_size
;
211 dirty
+= jeb
->dirty_size
;
212 used
+= jeb
->used_size
;
213 wasted
+= jeb
->wasted_size
;
214 unchecked
+= jeb
->unchecked_size
;
216 list_for_each_entry(jeb
, &c
->erasable_pending_wbuf_list
, list
) {
218 free
+= jeb
->free_size
;
219 dirty
+= jeb
->dirty_size
;
220 used
+= jeb
->used_size
;
221 wasted
+= jeb
->wasted_size
;
222 unchecked
+= jeb
->unchecked_size
;
224 list_for_each_entry(jeb
, &c
->erase_pending_list
, list
) {
226 free
+= jeb
->free_size
;
227 dirty
+= jeb
->dirty_size
;
228 used
+= jeb
->used_size
;
229 wasted
+= jeb
->wasted_size
;
230 unchecked
+= jeb
->unchecked_size
;
232 list_for_each_entry(jeb
, &c
->free_list
, list
) {
234 free
+= jeb
->free_size
;
235 dirty
+= jeb
->dirty_size
;
236 used
+= jeb
->used_size
;
237 wasted
+= jeb
->wasted_size
;
238 unchecked
+= jeb
->unchecked_size
;
240 list_for_each_entry(jeb
, &c
->bad_used_list
, list
) {
242 free
+= jeb
->free_size
;
243 dirty
+= jeb
->dirty_size
;
244 used
+= jeb
->used_size
;
245 wasted
+= jeb
->wasted_size
;
246 unchecked
+= jeb
->unchecked_size
;
249 list_for_each_entry(jeb
, &c
->erasing_list
, list
) {
251 erasing
+= c
->sector_size
;
253 list_for_each_entry(jeb
, &c
->erase_checking_list
, list
) {
255 erasing
+= c
->sector_size
;
257 list_for_each_entry(jeb
, &c
->erase_complete_list
, list
) {
259 erasing
+= c
->sector_size
;
261 list_for_each_entry(jeb
, &c
->bad_list
, list
) {
263 bad
+= c
->sector_size
;
268 if (sz != c->sz##_size) { \
269 pr_warn("%s_size mismatch counted 0x%x, c->%s_size 0x%x\n", \
270 #sz, sz, #sz, c->sz##_size); \
285 if (nr_counted
!= c
->nr_blocks
) {
286 pr_warn("%s counted only 0x%x blocks of 0x%x. Where are the others?\n",
287 __func__
, nr_counted
, c
->nr_blocks
);
292 __jffs2_dbg_dump_block_lists_nolock(c
);
298 * Check the space accounting and node_ref list correctness for the JFFS2 erasable block 'jeb'.
301 __jffs2_dbg_acct_paranoia_check(struct jffs2_sb_info
*c
,
302 struct jffs2_eraseblock
*jeb
)
304 spin_lock(&c
->erase_completion_lock
);
305 __jffs2_dbg_acct_paranoia_check_nolock(c
, jeb
);
306 spin_unlock(&c
->erase_completion_lock
);
310 __jffs2_dbg_acct_paranoia_check_nolock(struct jffs2_sb_info
*c
,
311 struct jffs2_eraseblock
*jeb
)
313 uint32_t my_used_size
= 0;
314 uint32_t my_unchecked_size
= 0;
315 uint32_t my_dirty_size
= 0;
316 struct jffs2_raw_node_ref
*ref2
= jeb
->first_node
;
319 uint32_t totlen
= ref_totlen(c
, jeb
, ref2
);
321 if (ref_offset(ref2
) < jeb
->offset
||
322 ref_offset(ref2
) > jeb
->offset
+ c
->sector_size
) {
323 JFFS2_ERROR("node_ref %#08x shouldn't be in block at %#08x.\n",
324 ref_offset(ref2
), jeb
->offset
);
328 if (ref_flags(ref2
) == REF_UNCHECKED
)
329 my_unchecked_size
+= totlen
;
330 else if (!ref_obsolete(ref2
))
331 my_used_size
+= totlen
;
333 my_dirty_size
+= totlen
;
335 if ((!ref_next(ref2
)) != (ref2
== jeb
->last_node
)) {
336 JFFS2_ERROR("node_ref for node at %#08x (mem %p) has next at %#08x (mem %p), last_node is at %#08x (mem %p).\n",
337 ref_offset(ref2
), ref2
, ref_offset(ref_next(ref2
)), ref_next(ref2
),
338 ref_offset(jeb
->last_node
), jeb
->last_node
);
341 ref2
= ref_next(ref2
);
344 if (my_used_size
!= jeb
->used_size
) {
345 JFFS2_ERROR("Calculated used size %#08x != stored used size %#08x.\n",
346 my_used_size
, jeb
->used_size
);
350 if (my_unchecked_size
!= jeb
->unchecked_size
) {
351 JFFS2_ERROR("Calculated unchecked size %#08x != stored unchecked size %#08x.\n",
352 my_unchecked_size
, jeb
->unchecked_size
);
357 /* This should work when we implement ref->__totlen elemination */
358 if (my_dirty_size
!= jeb
->dirty_size
+ jeb
->wasted_size
) {
359 JFFS2_ERROR("Calculated dirty+wasted size %#08x != stored dirty + wasted size %#08x\n",
360 my_dirty_size
, jeb
->dirty_size
+ jeb
->wasted_size
);
364 if (jeb
->free_size
== 0
365 && my_used_size
+ my_unchecked_size
+ my_dirty_size
!= c
->sector_size
) {
366 JFFS2_ERROR("The sum of all nodes in block (%#x) != size of block (%#x)\n",
367 my_used_size
+ my_unchecked_size
+ my_dirty_size
,
373 if (!(c
->flags
& (JFFS2_SB_FLAG_BUILDING
|JFFS2_SB_FLAG_SCANNING
)))
374 __jffs2_dbg_superblock_counts(c
);
379 __jffs2_dbg_dump_node_refs_nolock(c
, jeb
);
380 __jffs2_dbg_dump_jeb_nolock(jeb
);
381 __jffs2_dbg_dump_block_lists_nolock(c
);
385 #endif /* JFFS2_DBG_PARANOIA_CHECKS */
387 #if defined(JFFS2_DBG_DUMPS) || defined(JFFS2_DBG_PARANOIA_CHECKS)
389 * Dump the node_refs of the 'jeb' JFFS2 eraseblock.
392 __jffs2_dbg_dump_node_refs(struct jffs2_sb_info
*c
,
393 struct jffs2_eraseblock
*jeb
)
395 spin_lock(&c
->erase_completion_lock
);
396 __jffs2_dbg_dump_node_refs_nolock(c
, jeb
);
397 spin_unlock(&c
->erase_completion_lock
);
401 __jffs2_dbg_dump_node_refs_nolock(struct jffs2_sb_info
*c
,
402 struct jffs2_eraseblock
*jeb
)
404 struct jffs2_raw_node_ref
*ref
;
407 printk(JFFS2_DBG_MSG_PREFIX
" Dump node_refs of the eraseblock %#08x\n", jeb
->offset
);
408 if (!jeb
->first_node
) {
409 printk(JFFS2_DBG_MSG_PREFIX
" no nodes in the eraseblock %#08x\n", jeb
->offset
);
414 for (ref
= jeb
->first_node
; ; ref
= ref_next(ref
)) {
415 printk("%#08x", ref_offset(ref
));
417 printk("(%x)", ref
->__totlen
);
425 printk("\n" JFFS2_DBG
);
432 * Dump an eraseblock's space accounting.
435 __jffs2_dbg_dump_jeb(struct jffs2_sb_info
*c
, struct jffs2_eraseblock
*jeb
)
437 spin_lock(&c
->erase_completion_lock
);
438 __jffs2_dbg_dump_jeb_nolock(jeb
);
439 spin_unlock(&c
->erase_completion_lock
);
443 __jffs2_dbg_dump_jeb_nolock(struct jffs2_eraseblock
*jeb
)
448 printk(JFFS2_DBG_MSG_PREFIX
" dump space accounting for the eraseblock at %#08x:\n",
451 printk(JFFS2_DBG
"used_size: %#08x\n", jeb
->used_size
);
452 printk(JFFS2_DBG
"dirty_size: %#08x\n", jeb
->dirty_size
);
453 printk(JFFS2_DBG
"wasted_size: %#08x\n", jeb
->wasted_size
);
454 printk(JFFS2_DBG
"unchecked_size: %#08x\n", jeb
->unchecked_size
);
455 printk(JFFS2_DBG
"free_size: %#08x\n", jeb
->free_size
);
459 __jffs2_dbg_dump_block_lists(struct jffs2_sb_info
*c
)
461 spin_lock(&c
->erase_completion_lock
);
462 __jffs2_dbg_dump_block_lists_nolock(c
);
463 spin_unlock(&c
->erase_completion_lock
);
467 __jffs2_dbg_dump_block_lists_nolock(struct jffs2_sb_info
*c
)
469 printk(JFFS2_DBG_MSG_PREFIX
" dump JFFS2 blocks lists:\n");
471 printk(JFFS2_DBG
"flash_size: %#08x\n", c
->flash_size
);
472 printk(JFFS2_DBG
"used_size: %#08x\n", c
->used_size
);
473 printk(JFFS2_DBG
"dirty_size: %#08x\n", c
->dirty_size
);
474 printk(JFFS2_DBG
"wasted_size: %#08x\n", c
->wasted_size
);
475 printk(JFFS2_DBG
"unchecked_size: %#08x\n", c
->unchecked_size
);
476 printk(JFFS2_DBG
"free_size: %#08x\n", c
->free_size
);
477 printk(JFFS2_DBG
"erasing_size: %#08x\n", c
->erasing_size
);
478 printk(JFFS2_DBG
"bad_size: %#08x\n", c
->bad_size
);
479 printk(JFFS2_DBG
"sector_size: %#08x\n", c
->sector_size
);
480 printk(JFFS2_DBG
"jffs2_reserved_blocks size: %#08x\n",
481 c
->sector_size
* c
->resv_blocks_write
);
484 printk(JFFS2_DBG
"nextblock: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
485 c
->nextblock
->offset
, c
->nextblock
->used_size
,
486 c
->nextblock
->dirty_size
, c
->nextblock
->wasted_size
,
487 c
->nextblock
->unchecked_size
, c
->nextblock
->free_size
);
489 printk(JFFS2_DBG
"nextblock: NULL\n");
492 printk(JFFS2_DBG
"gcblock: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
493 c
->gcblock
->offset
, c
->gcblock
->used_size
, c
->gcblock
->dirty_size
,
494 c
->gcblock
->wasted_size
, c
->gcblock
->unchecked_size
, c
->gcblock
->free_size
);
496 printk(JFFS2_DBG
"gcblock: NULL\n");
498 if (list_empty(&c
->clean_list
)) {
499 printk(JFFS2_DBG
"clean_list: empty\n");
501 struct list_head
*this;
505 list_for_each(this, &c
->clean_list
) {
506 struct jffs2_eraseblock
*jeb
= list_entry(this, struct jffs2_eraseblock
, list
);
508 dirty
+= jeb
->wasted_size
;
509 if (!(jeb
->used_size
== 0 && jeb
->dirty_size
== 0 && jeb
->wasted_size
== 0)) {
510 printk(JFFS2_DBG
"clean_list: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
511 jeb
->offset
, jeb
->used_size
, jeb
->dirty_size
, jeb
->wasted_size
,
512 jeb
->unchecked_size
, jeb
->free_size
);
516 printk (JFFS2_DBG
"Contains %d blocks with total wasted size %u, average wasted size: %u\n",
517 numblocks
, dirty
, dirty
/ numblocks
);
520 if (list_empty(&c
->very_dirty_list
)) {
521 printk(JFFS2_DBG
"very_dirty_list: empty\n");
523 struct list_head
*this;
527 list_for_each(this, &c
->very_dirty_list
) {
528 struct jffs2_eraseblock
*jeb
= list_entry(this, struct jffs2_eraseblock
, list
);
531 dirty
+= jeb
->dirty_size
;
532 if (!(jeb
->used_size
== 0 && jeb
->dirty_size
== 0 && jeb
->wasted_size
== 0)) {
533 printk(JFFS2_DBG
"very_dirty_list: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
534 jeb
->offset
, jeb
->used_size
, jeb
->dirty_size
, jeb
->wasted_size
,
535 jeb
->unchecked_size
, jeb
->free_size
);
539 printk (JFFS2_DBG
"Contains %d blocks with total dirty size %u, average dirty size: %u\n",
540 numblocks
, dirty
, dirty
/ numblocks
);
543 if (list_empty(&c
->dirty_list
)) {
544 printk(JFFS2_DBG
"dirty_list: empty\n");
546 struct list_head
*this;
550 list_for_each(this, &c
->dirty_list
) {
551 struct jffs2_eraseblock
*jeb
= list_entry(this, struct jffs2_eraseblock
, list
);
554 dirty
+= jeb
->dirty_size
;
555 if (!(jeb
->used_size
== 0 && jeb
->dirty_size
== 0 && jeb
->wasted_size
== 0)) {
556 printk(JFFS2_DBG
"dirty_list: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
557 jeb
->offset
, jeb
->used_size
, jeb
->dirty_size
, jeb
->wasted_size
,
558 jeb
->unchecked_size
, jeb
->free_size
);
562 printk (JFFS2_DBG
"contains %d blocks with total dirty size %u, average dirty size: %u\n",
563 numblocks
, dirty
, dirty
/ numblocks
);
566 if (list_empty(&c
->erasable_list
)) {
567 printk(JFFS2_DBG
"erasable_list: empty\n");
569 struct list_head
*this;
571 list_for_each(this, &c
->erasable_list
) {
572 struct jffs2_eraseblock
*jeb
= list_entry(this, struct jffs2_eraseblock
, list
);
574 if (!(jeb
->used_size
== 0 && jeb
->dirty_size
== 0 && jeb
->wasted_size
== 0)) {
575 printk(JFFS2_DBG
"erasable_list: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
576 jeb
->offset
, jeb
->used_size
, jeb
->dirty_size
, jeb
->wasted_size
,
577 jeb
->unchecked_size
, jeb
->free_size
);
582 if (list_empty(&c
->erasing_list
)) {
583 printk(JFFS2_DBG
"erasing_list: empty\n");
585 struct list_head
*this;
587 list_for_each(this, &c
->erasing_list
) {
588 struct jffs2_eraseblock
*jeb
= list_entry(this, struct jffs2_eraseblock
, list
);
590 if (!(jeb
->used_size
== 0 && jeb
->dirty_size
== 0 && jeb
->wasted_size
== 0)) {
591 printk(JFFS2_DBG
"erasing_list: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
592 jeb
->offset
, jeb
->used_size
, jeb
->dirty_size
, jeb
->wasted_size
,
593 jeb
->unchecked_size
, jeb
->free_size
);
597 if (list_empty(&c
->erase_checking_list
)) {
598 printk(JFFS2_DBG
"erase_checking_list: empty\n");
600 struct list_head
*this;
602 list_for_each(this, &c
->erase_checking_list
) {
603 struct jffs2_eraseblock
*jeb
= list_entry(this, struct jffs2_eraseblock
, list
);
605 if (!(jeb
->used_size
== 0 && jeb
->dirty_size
== 0 && jeb
->wasted_size
== 0)) {
606 printk(JFFS2_DBG
"erase_checking_list: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
607 jeb
->offset
, jeb
->used_size
, jeb
->dirty_size
, jeb
->wasted_size
,
608 jeb
->unchecked_size
, jeb
->free_size
);
613 if (list_empty(&c
->erase_pending_list
)) {
614 printk(JFFS2_DBG
"erase_pending_list: empty\n");
616 struct list_head
*this;
618 list_for_each(this, &c
->erase_pending_list
) {
619 struct jffs2_eraseblock
*jeb
= list_entry(this, struct jffs2_eraseblock
, list
);
621 if (!(jeb
->used_size
== 0 && jeb
->dirty_size
== 0 && jeb
->wasted_size
== 0)) {
622 printk(JFFS2_DBG
"erase_pending_list: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
623 jeb
->offset
, jeb
->used_size
, jeb
->dirty_size
, jeb
->wasted_size
,
624 jeb
->unchecked_size
, jeb
->free_size
);
629 if (list_empty(&c
->erasable_pending_wbuf_list
)) {
630 printk(JFFS2_DBG
"erasable_pending_wbuf_list: empty\n");
632 struct list_head
*this;
634 list_for_each(this, &c
->erasable_pending_wbuf_list
) {
635 struct jffs2_eraseblock
*jeb
= list_entry(this, struct jffs2_eraseblock
, list
);
637 if (!(jeb
->used_size
== 0 && jeb
->dirty_size
== 0 && jeb
->wasted_size
== 0)) {
638 printk(JFFS2_DBG
"erasable_pending_wbuf_list: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
639 jeb
->offset
, jeb
->used_size
, jeb
->dirty_size
, jeb
->wasted_size
,
640 jeb
->unchecked_size
, jeb
->free_size
);
645 if (list_empty(&c
->free_list
)) {
646 printk(JFFS2_DBG
"free_list: empty\n");
648 struct list_head
*this;
650 list_for_each(this, &c
->free_list
) {
651 struct jffs2_eraseblock
*jeb
= list_entry(this, struct jffs2_eraseblock
, list
);
653 if (!(jeb
->used_size
== 0 && jeb
->dirty_size
== 0 && jeb
->wasted_size
== 0)) {
654 printk(JFFS2_DBG
"free_list: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
655 jeb
->offset
, jeb
->used_size
, jeb
->dirty_size
, jeb
->wasted_size
,
656 jeb
->unchecked_size
, jeb
->free_size
);
661 if (list_empty(&c
->bad_list
)) {
662 printk(JFFS2_DBG
"bad_list: empty\n");
664 struct list_head
*this;
666 list_for_each(this, &c
->bad_list
) {
667 struct jffs2_eraseblock
*jeb
= list_entry(this, struct jffs2_eraseblock
, list
);
669 if (!(jeb
->used_size
== 0 && jeb
->dirty_size
== 0 && jeb
->wasted_size
== 0)) {
670 printk(JFFS2_DBG
"bad_list: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
671 jeb
->offset
, jeb
->used_size
, jeb
->dirty_size
, jeb
->wasted_size
,
672 jeb
->unchecked_size
, jeb
->free_size
);
677 if (list_empty(&c
->bad_used_list
)) {
678 printk(JFFS2_DBG
"bad_used_list: empty\n");
680 struct list_head
*this;
682 list_for_each(this, &c
->bad_used_list
) {
683 struct jffs2_eraseblock
*jeb
= list_entry(this, struct jffs2_eraseblock
, list
);
685 if (!(jeb
->used_size
== 0 && jeb
->dirty_size
== 0 && jeb
->wasted_size
== 0)) {
686 printk(JFFS2_DBG
"bad_used_list: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
687 jeb
->offset
, jeb
->used_size
, jeb
->dirty_size
, jeb
->wasted_size
,
688 jeb
->unchecked_size
, jeb
->free_size
);
695 __jffs2_dbg_dump_fragtree(struct jffs2_inode_info
*f
)
698 jffs2_dbg_dump_fragtree_nolock(f
);
699 mutex_unlock(&f
->sem
);
703 __jffs2_dbg_dump_fragtree_nolock(struct jffs2_inode_info
*f
)
705 struct jffs2_node_frag
*this = frag_first(&f
->fragtree
);
706 uint32_t lastofs
= 0;
709 printk(JFFS2_DBG_MSG_PREFIX
" dump fragtree of ino #%u\n", f
->inocache
->ino
);
712 printk(JFFS2_DBG
"frag %#04x-%#04x: %#08x(%d) on flash (*%p), left (%p), right (%p), parent (%p)\n",
713 this->ofs
, this->ofs
+this->size
, ref_offset(this->node
->raw
),
714 ref_flags(this->node
->raw
), this, frag_left(this), frag_right(this),
717 printk(JFFS2_DBG
"frag %#04x-%#04x: hole (*%p). left (%p), right (%p), parent (%p)\n",
718 this->ofs
, this->ofs
+this->size
, this, frag_left(this),
719 frag_right(this), frag_parent(this));
720 if (this->ofs
!= lastofs
)
722 lastofs
= this->ofs
+ this->size
;
723 this = frag_next(this);
727 printk(JFFS2_DBG
"metadata at 0x%08x\n", ref_offset(f
->metadata
->raw
));
730 JFFS2_ERROR("frag tree got a hole in it.\n");
735 #define JFFS2_BUFDUMP_BYTES_PER_LINE 32
737 __jffs2_dbg_dump_buffer(unsigned char *buf
, int len
, uint32_t offs
)
742 printk(JFFS2_DBG_MSG_PREFIX
" dump from offset %#08x to offset %#08x (%x bytes).\n",
743 offs
, offs
+ len
, len
);
744 i
= skip
= offs
% JFFS2_BUFDUMP_BYTES_PER_LINE
;
745 offs
= offs
& ~(JFFS2_BUFDUMP_BYTES_PER_LINE
- 1);
748 printk(JFFS2_DBG
"%#08x: ", offs
);
754 if ((i
% JFFS2_BUFDUMP_BYTES_PER_LINE
) == 0 && i
!= len
-1) {
757 offs
+= JFFS2_BUFDUMP_BYTES_PER_LINE
;
758 printk(JFFS2_DBG
"%0#8x: ", offs
);
761 printk("%02x ", buf
[i
]);
773 __jffs2_dbg_dump_node(struct jffs2_sb_info
*c
, uint32_t ofs
)
775 union jffs2_node_union node
;
776 int len
= sizeof(union jffs2_node_union
);
781 printk(JFFS2_DBG_MSG_PREFIX
" dump node at offset %#08x.\n", ofs
);
783 ret
= jffs2_flash_read(c
, ofs
, len
, &retlen
, (unsigned char *)&node
);
784 if (ret
|| (retlen
!= len
)) {
785 JFFS2_ERROR("read %d bytes failed or short. ret %d, retlen %zd.\n",
790 printk(JFFS2_DBG
"magic:\t%#04x\n", je16_to_cpu(node
.u
.magic
));
791 printk(JFFS2_DBG
"nodetype:\t%#04x\n", je16_to_cpu(node
.u
.nodetype
));
792 printk(JFFS2_DBG
"totlen:\t%#08x\n", je32_to_cpu(node
.u
.totlen
));
793 printk(JFFS2_DBG
"hdr_crc:\t%#08x\n", je32_to_cpu(node
.u
.hdr_crc
));
795 crc
= crc32(0, &node
.u
, sizeof(node
.u
) - 4);
796 if (crc
!= je32_to_cpu(node
.u
.hdr_crc
)) {
797 JFFS2_ERROR("wrong common header CRC.\n");
801 if (je16_to_cpu(node
.u
.magic
) != JFFS2_MAGIC_BITMASK
&&
802 je16_to_cpu(node
.u
.magic
) != JFFS2_OLD_MAGIC_BITMASK
)
804 JFFS2_ERROR("wrong node magic: %#04x instead of %#04x.\n",
805 je16_to_cpu(node
.u
.magic
), JFFS2_MAGIC_BITMASK
);
809 switch(je16_to_cpu(node
.u
.nodetype
)) {
811 case JFFS2_NODETYPE_INODE
:
813 printk(JFFS2_DBG
"the node is inode node\n");
814 printk(JFFS2_DBG
"ino:\t%#08x\n", je32_to_cpu(node
.i
.ino
));
815 printk(JFFS2_DBG
"version:\t%#08x\n", je32_to_cpu(node
.i
.version
));
816 printk(JFFS2_DBG
"mode:\t%#08x\n", node
.i
.mode
.m
);
817 printk(JFFS2_DBG
"uid:\t%#04x\n", je16_to_cpu(node
.i
.uid
));
818 printk(JFFS2_DBG
"gid:\t%#04x\n", je16_to_cpu(node
.i
.gid
));
819 printk(JFFS2_DBG
"isize:\t%#08x\n", je32_to_cpu(node
.i
.isize
));
820 printk(JFFS2_DBG
"atime:\t%#08x\n", je32_to_cpu(node
.i
.atime
));
821 printk(JFFS2_DBG
"mtime:\t%#08x\n", je32_to_cpu(node
.i
.mtime
));
822 printk(JFFS2_DBG
"ctime:\t%#08x\n", je32_to_cpu(node
.i
.ctime
));
823 printk(JFFS2_DBG
"offset:\t%#08x\n", je32_to_cpu(node
.i
.offset
));
824 printk(JFFS2_DBG
"csize:\t%#08x\n", je32_to_cpu(node
.i
.csize
));
825 printk(JFFS2_DBG
"dsize:\t%#08x\n", je32_to_cpu(node
.i
.dsize
));
826 printk(JFFS2_DBG
"compr:\t%#02x\n", node
.i
.compr
);
827 printk(JFFS2_DBG
"usercompr:\t%#02x\n", node
.i
.usercompr
);
828 printk(JFFS2_DBG
"flags:\t%#04x\n", je16_to_cpu(node
.i
.flags
));
829 printk(JFFS2_DBG
"data_crc:\t%#08x\n", je32_to_cpu(node
.i
.data_crc
));
830 printk(JFFS2_DBG
"node_crc:\t%#08x\n", je32_to_cpu(node
.i
.node_crc
));
832 crc
= crc32(0, &node
.i
, sizeof(node
.i
) - 8);
833 if (crc
!= je32_to_cpu(node
.i
.node_crc
)) {
834 JFFS2_ERROR("wrong node header CRC.\n");
839 case JFFS2_NODETYPE_DIRENT
:
841 printk(JFFS2_DBG
"the node is dirent node\n");
842 printk(JFFS2_DBG
"pino:\t%#08x\n", je32_to_cpu(node
.d
.pino
));
843 printk(JFFS2_DBG
"version:\t%#08x\n", je32_to_cpu(node
.d
.version
));
844 printk(JFFS2_DBG
"ino:\t%#08x\n", je32_to_cpu(node
.d
.ino
));
845 printk(JFFS2_DBG
"mctime:\t%#08x\n", je32_to_cpu(node
.d
.mctime
));
846 printk(JFFS2_DBG
"nsize:\t%#02x\n", node
.d
.nsize
);
847 printk(JFFS2_DBG
"type:\t%#02x\n", node
.d
.type
);
848 printk(JFFS2_DBG
"node_crc:\t%#08x\n", je32_to_cpu(node
.d
.node_crc
));
849 printk(JFFS2_DBG
"name_crc:\t%#08x\n", je32_to_cpu(node
.d
.name_crc
));
851 node
.d
.name
[node
.d
.nsize
] = '\0';
852 printk(JFFS2_DBG
"name:\t\"%s\"\n", node
.d
.name
);
854 crc
= crc32(0, &node
.d
, sizeof(node
.d
) - 8);
855 if (crc
!= je32_to_cpu(node
.d
.node_crc
)) {
856 JFFS2_ERROR("wrong node header CRC.\n");
862 printk(JFFS2_DBG
"node type is unknown\n");
866 #endif /* JFFS2_DBG_DUMPS || JFFS2_DBG_PARANOIA_CHECKS */