Skip to content

Commit

Permalink
fs/jffs2: use rbtree postorder iteration helper instead of opencoding
Browse files Browse the repository at this point in the history
Use rbtree_postorder_for_each_entry_safe() to destroy the rbtree instead
of opencoding an alternate postorder iteration that modifies the tree

Signed-off-by: Cody P Schafer <cody@linux.vnet.ibm.com>
Cc: Michel Lespinasse <walken@google.com>
Cc: Jan Kara <jack@suse.cz>
Cc: David Woodhouse <dwmw2@infradead.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Cody P Schafer authored and Linus Torvalds committed Jan 24, 2014
1 parent d1866bd commit e8bbeeb
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 49 deletions.
28 changes: 2 additions & 26 deletions fs/jffs2/nodelist.c
Original file line number Diff line number Diff line change
Expand Up @@ -564,25 +564,10 @@ struct jffs2_node_frag *jffs2_lookup_node_frag(struct rb_root *fragtree, uint32_
they're killed. */
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");

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)) {
/* Not a hole, and it's the final remaining frag
of this node. Free the node */
Expand All @@ -591,17 +576,8 @@ void jffs2_kill_fragtree(struct rb_root *root, struct jffs2_sb_info *c)

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);
frag = parent;

cond_resched();
}
}
Expand Down
26 changes: 3 additions & 23 deletions fs/jffs2/readinode.c
Original file line number Diff line number Diff line change
Expand Up @@ -543,33 +543,13 @@ static int jffs2_build_inode_fragtree(struct jffs2_sb_info *c,

static void jffs2_free_tmp_dnode_info_list(struct rb_root *list)
{
struct rb_node *this;
struct jffs2_tmp_dnode_info *tn;

this = list->rb_node;
struct jffs2_tmp_dnode_info *tn, *next;

/* Now at bottom of tree */
while (this) {
if (this->rb_left)
this = this->rb_left;
else if (this->rb_right)
this = this->rb_right;
else {
tn = rb_entry(this, struct jffs2_tmp_dnode_info, rb);
rbtree_postorder_for_each_entry_safe(tn, next, list, rb) {
jffs2_free_full_dnode(tn->fn);
jffs2_free_tmp_dnode_info(tn);

this = rb_parent(this);
if (!this)
break;

if (this->rb_left == &tn->rb)
this->rb_left = NULL;
else if (this->rb_right == &tn->rb)
this->rb_right = NULL;
else BUG();
}
}

*list = RB_ROOT;
}

Expand Down

0 comments on commit e8bbeeb

Please sign in to comment.