Commit e2bc322bf05936ec7160d62bc3fd45cbf4aa405a

Authored by David Woodhouse
1 parent 697fa9721c

[JFFS2] Add erase_checking_list to hold blocks being marked.

Just to keep the debug code happy when it's adding all the blocks up.
Otherwise, they disappear for a while while the locks are dropped to
check them and write the cleanmarker.

Signed-off-by: David Woodhouse <dwmw2@infradead.org>

Showing 4 changed files with 25 additions and 4 deletions Side-by-side Diff

... ... @@ -345,6 +345,7 @@
345 345 INIT_LIST_HEAD(&c->dirty_list);
346 346 INIT_LIST_HEAD(&c->erasable_list);
347 347 INIT_LIST_HEAD(&c->erasing_list);
  348 + INIT_LIST_HEAD(&c->erase_checking_list);
348 349 INIT_LIST_HEAD(&c->erase_pending_list);
349 350 INIT_LIST_HEAD(&c->erasable_pending_wbuf_list);
350 351 INIT_LIST_HEAD(&c->erase_complete_list);
... ... @@ -246,6 +246,10 @@
246 246 nr_counted++;
247 247 erasing += c->sector_size;
248 248 }
  249 + list_for_each_entry(jeb, &c->erase_checking_list, list) {
  250 + nr_counted++;
  251 + erasing += c->sector_size;
  252 + }
249 253 list_for_each_entry(jeb, &c->erase_complete_list, list) {
250 254 nr_counted++;
251 255 erasing += c->sector_size;
... ... @@ -577,6 +581,21 @@
577 581  
578 582 if (!(jeb->used_size == 0 && jeb->dirty_size == 0 && jeb->wasted_size == 0)) {
579 583 printk(JFFS2_DBG "erasing_list: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
  584 + jeb->offset, jeb->used_size, jeb->dirty_size, jeb->wasted_size,
  585 + jeb->unchecked_size, jeb->free_size);
  586 + }
  587 + }
  588 + }
  589 + if (list_empty(&c->erase_checking_list)) {
  590 + printk(JFFS2_DBG "erase_checking_list: empty\n");
  591 + } else {
  592 + struct list_head *this;
  593 +
  594 + list_for_each(this, &c->erase_checking_list) {
  595 + struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list);
  596 +
  597 + if (!(jeb->used_size == 0 && jeb->dirty_size == 0 && jeb->wasted_size == 0)) {
  598 + printk(JFFS2_DBG "erase_checking_list: %#08x (used %#08x, dirty %#08x, wasted %#08x, unchecked %#08x, free %#08x)\n",
580 599 jeb->offset, jeb->used_size, jeb->dirty_size, jeb->wasted_size,
581 600 jeb->unchecked_size, jeb->free_size);
582 601 }
... ... @@ -116,7 +116,7 @@
116 116  
117 117 if (!list_empty(&c->erase_complete_list)) {
118 118 jeb = list_entry(c->erase_complete_list.next, struct jffs2_eraseblock, list);
119   - list_del(&jeb->list);
  119 + list_move(&jeb->list, &c->erase_checking_list);
120 120 spin_unlock(&c->erase_completion_lock);
121 121 mutex_unlock(&c->erase_free_sem);
122 122 jffs2_mark_erased_block(c, jeb);
... ... @@ -465,7 +465,7 @@
465 465 if (c->cleanmarker_size && !jffs2_cleanmarker_oob(c))
466 466 jffs2_link_node_ref(c, jeb, jeb->offset | REF_NORMAL, c->cleanmarker_size, NULL);
467 467  
468   - list_add_tail(&jeb->list, &c->free_list);
  468 + list_move_tail(&jeb->list, &c->free_list);
469 469 c->nr_erasing_blocks--;
470 470 c->nr_free_blocks++;
471 471  
... ... @@ -482,7 +482,7 @@
482 482 spin_lock(&c->erase_completion_lock);
483 483 /* Stick it on a list (any list) so erase_failed can take it
484 484 right off again. Silly, but shouldn't happen often. */
485   - list_add(&jeb->list, &c->erasing_list);
  485 + list_move(&jeb->list, &c->erasing_list);
486 486 spin_unlock(&c->erase_completion_lock);
487 487 mutex_unlock(&c->erase_free_sem);
488 488 jffs2_erase_failed(c, jeb, bad_offset);
... ... @@ -493,7 +493,7 @@
493 493 jffs2_erase_pending_trigger(c);
494 494 mutex_lock(&c->erase_free_sem);
495 495 spin_lock(&c->erase_completion_lock);
496   - list_add(&jeb->list, &c->erase_complete_list);
  496 + list_move(&jeb->list, &c->erase_complete_list);
497 497 spin_unlock(&c->erase_completion_lock);
498 498 mutex_unlock(&c->erase_free_sem);
499 499 return;
fs/jffs2/jffs2_fs_sb.h
... ... @@ -87,6 +87,7 @@
87 87 struct list_head erasable_list; /* Blocks which are completely dirty, and need erasing */
88 88 struct list_head erasable_pending_wbuf_list; /* Blocks which need erasing but only after the current wbuf is flushed */
89 89 struct list_head erasing_list; /* Blocks which are currently erasing */
  90 + struct list_head erase_checking_list; /* Blocks which are being checked and marked */
90 91 struct list_head erase_pending_list; /* Blocks which need erasing now */
91 92 struct list_head erase_complete_list; /* Blocks which are erased and need the clean marker written to them */
92 93 struct list_head free_list; /* Blocks which are free and ready to be used */