|
@@ -564,25 +564,10 @@ struct jffs2_node_frag *jffs2_lookup_node_frag(struct rb_root *fragtree, uint32_
|
|
they're killed. */
|
|
they're killed. */
|
|
void jffs2_kill_fragtree(struct rb_root *root, struct jffs2_sb_info *c)
|
|
void jffs2_kill_fragtree(struct rb_root *root, struct jffs2_sb_info *c)
|
|
{
|
|
{
|
|
- struct jffs2_node_frag *frag;
|
|
|
|
- struct jffs2_node_frag *parent;
|
|
|
|
-
|
|
|
|
- if (!root->rb_node)
|
|
|
|
- return;
|
|
|
|
|
|
+ struct jffs2_node_frag *frag, *next;
|
|
|
|
|
|
dbg_fragtree("killing\n");
|
|
dbg_fragtree("killing\n");
|
|
-
|
|
|
|
- frag = (rb_entry(root->rb_node, struct jffs2_node_frag, rb));
|
|
|
|
- while(frag) {
|
|
|
|
- if (frag->rb.rb_left) {
|
|
|
|
- frag = frag_left(frag);
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
- if (frag->rb.rb_right) {
|
|
|
|
- frag = frag_right(frag);
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
|
|
+ rbtree_postorder_for_each_entry_safe(frag, next, root, rb) {
|
|
if (frag->node && !(--frag->node->frags)) {
|
|
if (frag->node && !(--frag->node->frags)) {
|
|
/* Not a hole, and it's the final remaining frag
|
|
/* Not a hole, and it's the final remaining frag
|
|
of this node. Free the node */
|
|
of this node. Free the node */
|
|
@@ -591,17 +576,8 @@ void jffs2_kill_fragtree(struct rb_root *root, struct jffs2_sb_info *c)
|
|
|
|
|
|
jffs2_free_full_dnode(frag->node);
|
|
jffs2_free_full_dnode(frag->node);
|
|
}
|
|
}
|
|
- parent = frag_parent(frag);
|
|
|
|
- if (parent) {
|
|
|
|
- if (frag_left(parent) == frag)
|
|
|
|
- parent->rb.rb_left = NULL;
|
|
|
|
- else
|
|
|
|
- parent->rb.rb_right = NULL;
|
|
|
|
- }
|
|
|
|
|
|
|
|
jffs2_free_node_frag(frag);
|
|
jffs2_free_node_frag(frag);
|
|
- frag = parent;
|
|
|
|
-
|
|
|
|
cond_resched();
|
|
cond_resched();
|
|
}
|
|
}
|
|
}
|
|
}
|