Skip to content

Commit

Permalink
fs/ext3: 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>
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 e8bbeeb commit b1c8047
Showing 1 changed file with 5 additions and 31 deletions.
36 changes: 5 additions & 31 deletions fs/ext3/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -309,43 +309,17 @@ struct fname {
*/
static void free_rb_tree_fname(struct rb_root *root)
{
struct rb_node *n = root->rb_node;
struct rb_node *parent;
struct fname *fname;

while (n) {
/* Do the node's children first */
if (n->rb_left) {
n = n->rb_left;
continue;
}
if (n->rb_right) {
n = n->rb_right;
continue;
}
/*
* The node has no children; free it, and then zero
* out parent's link to it. Finally go to the
* beginning of the loop and try to free the parent
* node.
*/
parent = rb_parent(n);
fname = rb_entry(n, struct fname, rb_hash);
struct fname *fname, *next;

rbtree_postorder_for_each_entry_safe(fname, next, root, rb_hash)
while (fname) {
struct fname * old = fname;
fname = fname->next;
kfree (old);
}
if (!parent)
*root = RB_ROOT;
else if (parent->rb_left == n)
parent->rb_left = NULL;
else if (parent->rb_right == n)
parent->rb_right = NULL;
n = parent;
}
}

*root = RB_ROOT;
}

static struct dir_private_info *ext3_htree_create_dir_info(struct file *filp,
loff_t pos)
Expand Down

0 comments on commit b1c8047

Please sign in to comment.