diff options
author | David Woodhouse <dwmw2@infradead.org> | 2006-05-26 16:19:05 -0400 |
---|---|---|
committer | David Woodhouse <dwmw2@infradead.org> | 2006-05-26 16:19:05 -0400 |
commit | 9bfeb691e75b21fdaa80ffae719083200b190381 (patch) | |
tree | 3c828820f1385249835f85e5073b4ffd10fcd09c /fs/jffs2/nodemgmt.c | |
parent | f75e5097ef298c5a0aa106faa211d1afdc92dc3d (diff) |
[JFFS2] Switch to using an array of jffs2_raw_node_refs instead of a list.
This allows us to drop another pointer from the struct jffs2_raw_node_ref,
shrinking it to 8 bytes on 32-bit machines (if the TEST_TOTLEN) paranoia
check is turned off, which will be committed soon).
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Diffstat (limited to 'fs/jffs2/nodemgmt.c')
-rw-r--r-- | fs/jffs2/nodemgmt.c | 51 |
1 files changed, 1 insertions, 50 deletions
diff --git a/fs/jffs2/nodemgmt.c b/fs/jffs2/nodemgmt.c index 73a06d01db48..71d1630609a5 100644 --- a/fs/jffs2/nodemgmt.c +++ b/fs/jffs2/nodemgmt.c | |||
@@ -458,14 +458,13 @@ static inline int on_list(struct list_head *obj, struct list_head *head) | |||
458 | void jffs2_mark_node_obsolete(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *ref) | 458 | void jffs2_mark_node_obsolete(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *ref) |
459 | { | 459 | { |
460 | struct jffs2_eraseblock *jeb; | 460 | struct jffs2_eraseblock *jeb; |
461 | struct jffs2_raw_node_ref *next_ref; | ||
462 | int blocknr; | 461 | int blocknr; |
463 | struct jffs2_unknown_node n; | 462 | struct jffs2_unknown_node n; |
464 | int ret, addedsize; | 463 | int ret, addedsize; |
465 | size_t retlen; | 464 | size_t retlen; |
466 | uint32_t freed_len; | 465 | uint32_t freed_len; |
467 | 466 | ||
468 | if(!ref) { | 467 | if(unlikely(!ref)) { |
469 | printk(KERN_NOTICE "EEEEEK. jffs2_mark_node_obsolete called with NULL node\n"); | 468 | printk(KERN_NOTICE "EEEEEK. jffs2_mark_node_obsolete called with NULL node\n"); |
470 | return; | 469 | return; |
471 | } | 470 | } |
@@ -683,54 +682,6 @@ void jffs2_mark_node_obsolete(struct jffs2_sb_info *c, struct jffs2_raw_node_ref | |||
683 | spin_unlock(&c->erase_completion_lock); | 682 | spin_unlock(&c->erase_completion_lock); |
684 | } | 683 | } |
685 | 684 | ||
686 | |||
687 | /* Merge with the next node in the physical list, if there is one | ||
688 | and if it's also obsolete and if it doesn't belong to any inode */ | ||
689 | next_ref = ref_next(ref); | ||
690 | |||
691 | if (next_ref && ref_obsolete(next_ref) && !next_ref->next_in_ino) { | ||
692 | spin_lock(&c->erase_completion_lock); | ||
693 | |||
694 | #ifdef TEST_TOTLEN | ||
695 | ref->__totlen += next_ref->__totlen; | ||
696 | #endif | ||
697 | ref->next_phys = ref_next(next_ref); | ||
698 | if (jeb->last_node == next_ref) jeb->last_node = ref; | ||
699 | if (jeb->gc_node == next_ref) { | ||
700 | /* gc will be happy continuing gc on this node */ | ||
701 | jeb->gc_node=ref; | ||
702 | } | ||
703 | spin_unlock(&c->erase_completion_lock); | ||
704 | |||
705 | __jffs2_free_raw_node_ref(next_ref); | ||
706 | } | ||
707 | |||
708 | /* Also merge with the previous node in the list, if there is one | ||
709 | and that one is obsolete */ | ||
710 | if (ref != jeb->first_node ) { | ||
711 | struct jffs2_raw_node_ref *p = jeb->first_node; | ||
712 | |||
713 | spin_lock(&c->erase_completion_lock); | ||
714 | |||
715 | while ((next_ref = ref_next(ref)) != ref) | ||
716 | p = next_ref; | ||
717 | |||
718 | if (ref_obsolete(p) && !ref->next_in_ino) { | ||
719 | #ifdef TEST_TOTLEN | ||
720 | p->__totlen += ref->__totlen; | ||
721 | #endif | ||
722 | if (jeb->last_node == ref) { | ||
723 | jeb->last_node = p; | ||
724 | } | ||
725 | if (jeb->gc_node == ref) { | ||
726 | /* gc will be happy continuing gc on this node */ | ||
727 | jeb->gc_node=p; | ||
728 | } | ||
729 | p->next_phys = ref_next(ref); | ||
730 | __jffs2_free_raw_node_ref(ref); | ||
731 | } | ||
732 | spin_unlock(&c->erase_completion_lock); | ||
733 | } | ||
734 | out_erase_sem: | 685 | out_erase_sem: |
735 | up(&c->erase_free_sem); | 686 | up(&c->erase_free_sem); |
736 | } | 687 | } |