|
@@ -458,6 +458,7 @@ static inline int on_list(struct list_head *obj, struct list_head *head)
|
|
|
void jffs2_mark_node_obsolete(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *ref)
|
|
|
{
|
|
|
struct jffs2_eraseblock *jeb;
|
|
|
+ struct jffs2_raw_node_ref *next_ref;
|
|
|
int blocknr;
|
|
|
struct jffs2_unknown_node n;
|
|
|
int ret, addedsize;
|
|
@@ -685,24 +686,23 @@ void jffs2_mark_node_obsolete(struct jffs2_sb_info *c, struct jffs2_raw_node_ref
|
|
|
|
|
|
/* Merge with the next node in the physical list, if there is one
|
|
|
and if it's also obsolete and if it doesn't belong to any inode */
|
|
|
- if (ref->next_phys && ref_obsolete(ref->next_phys) &&
|
|
|
- !ref->next_phys->next_in_ino) {
|
|
|
- struct jffs2_raw_node_ref *n = ref->next_phys;
|
|
|
+ next_ref = ref_next(ref);
|
|
|
|
|
|
+ if (next_ref && ref_obsolete(next_ref) && !next_ref->next_in_ino) {
|
|
|
spin_lock(&c->erase_completion_lock);
|
|
|
|
|
|
#ifdef TEST_TOTLEN
|
|
|
- ref->__totlen += n->__totlen;
|
|
|
+ ref->__totlen += next_ref->__totlen;
|
|
|
#endif
|
|
|
- ref->next_phys = n->next_phys;
|
|
|
- if (jeb->last_node == n) jeb->last_node = ref;
|
|
|
- if (jeb->gc_node == n) {
|
|
|
+ ref->next_phys = ref_next(next_ref);
|
|
|
+ if (jeb->last_node == next_ref) jeb->last_node = ref;
|
|
|
+ if (jeb->gc_node == next_ref) {
|
|
|
/* gc will be happy continuing gc on this node */
|
|
|
jeb->gc_node=ref;
|
|
|
}
|
|
|
spin_unlock(&c->erase_completion_lock);
|
|
|
|
|
|
- __jffs2_free_raw_node_ref(n);
|
|
|
+ __jffs2_free_raw_node_ref(next_ref);
|
|
|
}
|
|
|
|
|
|
/* Also merge with the previous node in the list, if there is one
|
|
@@ -712,8 +712,8 @@ void jffs2_mark_node_obsolete(struct jffs2_sb_info *c, struct jffs2_raw_node_ref
|
|
|
|
|
|
spin_lock(&c->erase_completion_lock);
|
|
|
|
|
|
- while (p->next_phys != ref)
|
|
|
- p = p->next_phys;
|
|
|
+ while ((next_ref = ref_next(ref)) != ref)
|
|
|
+ p = next_ref;
|
|
|
|
|
|
if (ref_obsolete(p) && !ref->next_in_ino) {
|
|
|
#ifdef TEST_TOTLEN
|
|
@@ -726,7 +726,7 @@ void jffs2_mark_node_obsolete(struct jffs2_sb_info *c, struct jffs2_raw_node_ref
|
|
|
/* gc will be happy continuing gc on this node */
|
|
|
jeb->gc_node=p;
|
|
|
}
|
|
|
- p->next_phys = ref->next_phys;
|
|
|
+ p->next_phys = ref_next(ref);
|
|
|
__jffs2_free_raw_node_ref(ref);
|
|
|
}
|
|
|
spin_unlock(&c->erase_completion_lock);
|