Commit d1866bd0 authored by Cody P Schafer's avatar Cody P Schafer Committed by Linus Torvalds

fs/ext4: 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: default avatarCody P Schafer <cody@linux.vnet.ibm.com>
Reviewed-by: default avatarJan Kara <jack@suse.cz>
Cc: Michel Lespinasse <walken@google.com>
Cc: Theodore Ts'o <tytso@mit.edu>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent bb25e49f
...@@ -180,37 +180,12 @@ int ext4_setup_system_zone(struct super_block *sb) ...@@ -180,37 +180,12 @@ int ext4_setup_system_zone(struct super_block *sb)
/* Called when the filesystem is unmounted */ /* Called when the filesystem is unmounted */
void ext4_release_system_zone(struct super_block *sb) void ext4_release_system_zone(struct super_block *sb)
{ {
struct rb_node *n = EXT4_SB(sb)->system_blks.rb_node; struct ext4_system_zone *entry, *n;
struct rb_node *parent;
struct ext4_system_zone *entry;
while (n) { rbtree_postorder_for_each_entry_safe(entry, n,
/* Do the node's children first */ &EXT4_SB(sb)->system_blks, node)
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);
entry = rb_entry(n, struct ext4_system_zone, node);
kmem_cache_free(ext4_system_zone_cachep, entry); kmem_cache_free(ext4_system_zone_cachep, entry);
if (!parent)
EXT4_SB(sb)->system_blks = RB_ROOT;
else if (parent->rb_left == n)
parent->rb_left = NULL;
else if (parent->rb_right == n)
parent->rb_right = NULL;
n = parent;
}
EXT4_SB(sb)->system_blks = RB_ROOT; EXT4_SB(sb)->system_blks = RB_ROOT;
} }
......
...@@ -353,41 +353,16 @@ struct fname { ...@@ -353,41 +353,16 @@ struct fname {
*/ */
static void free_rb_tree_fname(struct rb_root *root) static void free_rb_tree_fname(struct rb_root *root)
{ {
struct rb_node *n = root->rb_node; struct fname *fname, *next;
struct rb_node *parent;
struct fname *fname; rbtree_postorder_for_each_entry_safe(fname, next, root, rb_hash)
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);
while (fname) { while (fname) {
struct fname *old = fname; struct fname *old = fname;
fname = fname->next; fname = fname->next;
kfree(old); kfree(old);
} }
if (!parent)
*root = RB_ROOT; *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;
}
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment