mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-09 07:23:14 +00:00
fs/jffs2: use rbtree postorder iteration helper instead of opencoding
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>
This commit is contained in:
parent
d1866bd061
commit
e8bbeeb755
@ -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 *frag, *next;
|
||||||
struct jffs2_node_frag *parent;
|
|
||||||
|
|
||||||
if (!root->rb_node)
|
|
||||||
return;
|
|
||||||
|
|
||||||
dbg_fragtree("killing\n");
|
dbg_fragtree("killing\n");
|
||||||
|
rbtree_postorder_for_each_entry_safe(frag, next, root, rb) {
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
static void jffs2_free_tmp_dnode_info_list(struct rb_root *list)
|
||||||
{
|
{
|
||||||
struct rb_node *this;
|
struct jffs2_tmp_dnode_info *tn, *next;
|
||||||
struct jffs2_tmp_dnode_info *tn;
|
|
||||||
|
|
||||||
this = list->rb_node;
|
rbtree_postorder_for_each_entry_safe(tn, next, list, rb) {
|
||||||
|
|
||||||
/* 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);
|
|
||||||
jffs2_free_full_dnode(tn->fn);
|
jffs2_free_full_dnode(tn->fn);
|
||||||
jffs2_free_tmp_dnode_info(tn);
|
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;
|
*list = RB_ROOT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user