diff options
| author | Cody P Schafer <cody@linux.vnet.ibm.com> | 2014-01-23 18:56:10 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-01-23 19:37:03 -0500 |
| commit | d1866bd06101eb8ab2bb9d180b47c052c04b7cee (patch) | |
| tree | 0bd031db9537dfc911f22c91e8612b79d5438aab | |
| parent | bb25e49ff8ab0ef0b3c073c09d55cf10ef8a2aa0 (diff) | |
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: Cody P Schafer <cody@linux.vnet.ibm.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Cc: Michel Lespinasse <walken@google.com>
Cc: Theodore Ts'o <tytso@mit.edu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
| -rw-r--r-- | fs/ext4/block_validity.c | 33 | ||||
| -rw-r--r-- | fs/ext4/dir.c | 35 |
2 files changed, 9 insertions, 59 deletions
diff --git a/fs/ext4/block_validity.c b/fs/ext4/block_validity.c index 3f11656bd72e..41eb9dcfac7e 100644 --- a/fs/ext4/block_validity.c +++ b/fs/ext4/block_validity.c | |||
| @@ -180,37 +180,12 @@ int ext4_setup_system_zone(struct super_block *sb) | |||
| 180 | /* Called when the filesystem is unmounted */ | 180 | /* Called when the filesystem is unmounted */ |
| 181 | void ext4_release_system_zone(struct super_block *sb) | 181 | void ext4_release_system_zone(struct super_block *sb) |
| 182 | { | 182 | { |
| 183 | struct rb_node *n = EXT4_SB(sb)->system_blks.rb_node; | 183 | struct ext4_system_zone *entry, *n; |
| 184 | struct rb_node *parent; | ||
| 185 | struct ext4_system_zone *entry; | ||
| 186 | 184 | ||
| 187 | while (n) { | 185 | rbtree_postorder_for_each_entry_safe(entry, n, |
| 188 | /* Do the node's children first */ | 186 | &EXT4_SB(sb)->system_blks, node) |
| 189 | if (n->rb_left) { | ||
| 190 | n = n->rb_left; | ||
| 191 | continue; | ||
| 192 | } | ||
| 193 | if (n->rb_right) { | ||
| 194 | n = n->rb_right; | ||
| 195 | continue; | ||
| 196 | } | ||
| 197 | /* | ||
| 198 | * The node has no children; free it, and then zero | ||
| 199 | * out parent's link to it. Finally go to the | ||
| 200 | * beginning of the loop and try to free the parent | ||
| 201 | * node. | ||
| 202 | */ | ||
| 203 | parent = rb_parent(n); | ||
| 204 | entry = rb_entry(n, struct ext4_system_zone, node); | ||
| 205 | kmem_cache_free(ext4_system_zone_cachep, entry); | 187 | kmem_cache_free(ext4_system_zone_cachep, entry); |
| 206 | if (!parent) | 188 | |
| 207 | EXT4_SB(sb)->system_blks = RB_ROOT; | ||
| 208 | else if (parent->rb_left == n) | ||
| 209 | parent->rb_left = NULL; | ||
| 210 | else if (parent->rb_right == n) | ||
| 211 | parent->rb_right = NULL; | ||
| 212 | n = parent; | ||
| 213 | } | ||
| 214 | EXT4_SB(sb)->system_blks = RB_ROOT; | 189 | EXT4_SB(sb)->system_blks = RB_ROOT; |
| 215 | } | 190 | } |
| 216 | 191 | ||
diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c index 680bb3388919..d638c57e996e 100644 --- a/fs/ext4/dir.c +++ b/fs/ext4/dir.c | |||
| @@ -353,41 +353,16 @@ struct fname { | |||
| 353 | */ | 353 | */ |
| 354 | static void free_rb_tree_fname(struct rb_root *root) | 354 | static void free_rb_tree_fname(struct rb_root *root) |
| 355 | { | 355 | { |
| 356 | struct rb_node *n = root->rb_node; | 356 | struct fname *fname, *next; |
| 357 | struct rb_node *parent; | 357 | |
| 358 | struct fname *fname; | 358 | rbtree_postorder_for_each_entry_safe(fname, next, root, rb_hash) |
| 359 | |||
| 360 | while (n) { | ||
| 361 | /* Do the node's children first */ | ||
| 362 | if (n->rb_left) { | ||
| 363 | n = n->rb_left; | ||
| 364 | continue; | ||
| 365 | } | ||
| 366 | if (n->rb_right) { | ||
| 367 | n = n->rb_right; | ||
| 368 | continue; | ||
| 369 | } | ||
| 370 | /* | ||
| 371 | * The node has no children; free it, and then zero | ||
| 372 | * out parent's link to it. Finally go to the | ||
| 373 | * beginning of the loop and try to free the parent | ||
| 374 | * node. | ||
| 375 | */ | ||
| 376 | parent = rb_parent(n); | ||
| 377 | fname = rb_entry(n, struct fname, rb_hash); | ||
| 378 | while (fname) { | 359 | while (fname) { |
| 379 | struct fname *old = fname; | 360 | struct fname *old = fname; |
| 380 | fname = fname->next; | 361 | fname = fname->next; |
| 381 | kfree(old); | 362 | kfree(old); |
| 382 | } | 363 | } |
| 383 | if (!parent) | 364 | |
| 384 | *root = RB_ROOT; | 365 | *root = RB_ROOT; |
| 385 | else if (parent->rb_left == n) | ||
| 386 | parent->rb_left = NULL; | ||
| 387 | else if (parent->rb_right == n) | ||
| 388 | parent->rb_right = NULL; | ||
| 389 | n = parent; | ||
| 390 | } | ||
| 391 | } | 366 | } |
| 392 | 367 | ||
| 393 | 368 | ||
