aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ubifs
diff options
context:
space:
mode:
authorCody P Schafer <cody@linux.vnet.ibm.com>2014-01-23 18:56:08 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2014-01-23 19:37:03 -0500
commitbb25e49ff8ab0ef0b3c073c09d55cf10ef8a2aa0 (patch)
tree0eb5d1ca02d4e9caccd9716e35d5baa448eb73c8 /fs/ubifs
parentb182837ac111e87f8e82cbcb0046449d9412187f (diff)
fs/ubifs: 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: Artem Bityutskiy <dedekind1@gmail.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/ubifs')
-rw-r--r--fs/ubifs/debug.c22
-rw-r--r--fs/ubifs/log.c21
-rw-r--r--fs/ubifs/orphan.c21
-rw-r--r--fs/ubifs/recovery.c21
-rw-r--r--fs/ubifs/super.c24
-rw-r--r--fs/ubifs/tnc.c22
6 files changed, 17 insertions, 114 deletions
diff --git a/fs/ubifs/debug.c b/fs/ubifs/debug.c
index cc1febd8fadf..5157b866a853 100644
--- a/fs/ubifs/debug.c
+++ b/fs/ubifs/debug.c
@@ -2118,26 +2118,10 @@ out_free:
2118 */ 2118 */
2119static void free_inodes(struct fsck_data *fsckd) 2119static void free_inodes(struct fsck_data *fsckd)
2120{ 2120{
2121 struct rb_node *this = fsckd->inodes.rb_node; 2121 struct fsck_inode *fscki, *n;
2122 struct fsck_inode *fscki;
2123 2122
2124 while (this) { 2123 rbtree_postorder_for_each_entry_safe(fscki, n, &fsckd->inodes, rb)
2125 if (this->rb_left) 2124 kfree(fscki);
2126 this = this->rb_left;
2127 else if (this->rb_right)
2128 this = this->rb_right;
2129 else {
2130 fscki = rb_entry(this, struct fsck_inode, rb);
2131 this = rb_parent(this);
2132 if (this) {
2133 if (this->rb_left == &fscki->rb)
2134 this->rb_left = NULL;
2135 else
2136 this->rb_right = NULL;
2137 }
2138 kfree(fscki);
2139 }
2140 }
2141} 2125}
2142 2126
2143/** 2127/**
diff --git a/fs/ubifs/log.c b/fs/ubifs/log.c
index 36bd4efd0819..a902c5919e42 100644
--- a/fs/ubifs/log.c
+++ b/fs/ubifs/log.c
@@ -574,27 +574,10 @@ static int done_already(struct rb_root *done_tree, int lnum)
574 */ 574 */
575static void destroy_done_tree(struct rb_root *done_tree) 575static void destroy_done_tree(struct rb_root *done_tree)
576{ 576{
577 struct rb_node *this = done_tree->rb_node; 577 struct done_ref *dr, *n;
578 struct done_ref *dr;
579 578
580 while (this) { 579 rbtree_postorder_for_each_entry_safe(dr, n, done_tree, rb)
581 if (this->rb_left) {
582 this = this->rb_left;
583 continue;
584 } else if (this->rb_right) {
585 this = this->rb_right;
586 continue;
587 }
588 dr = rb_entry(this, struct done_ref, rb);
589 this = rb_parent(this);
590 if (this) {
591 if (this->rb_left == &dr->rb)
592 this->rb_left = NULL;
593 else
594 this->rb_right = NULL;
595 }
596 kfree(dr); 580 kfree(dr);
597 }
598} 581}
599 582
600/** 583/**
diff --git a/fs/ubifs/orphan.c b/fs/ubifs/orphan.c
index ba32da3fe08a..f1c3e5a1b315 100644
--- a/fs/ubifs/orphan.c
+++ b/fs/ubifs/orphan.c
@@ -815,27 +815,10 @@ static int dbg_find_check_orphan(struct rb_root *root, ino_t inum)
815 815
816static void dbg_free_check_tree(struct rb_root *root) 816static void dbg_free_check_tree(struct rb_root *root)
817{ 817{
818 struct rb_node *this = root->rb_node; 818 struct check_orphan *o, *n;
819 struct check_orphan *o;
820 819
821 while (this) { 820 rbtree_postorder_for_each_entry_safe(o, n, root, rb)
822 if (this->rb_left) {
823 this = this->rb_left;
824 continue;
825 } else if (this->rb_right) {
826 this = this->rb_right;
827 continue;
828 }
829 o = rb_entry(this, struct check_orphan, rb);
830 this = rb_parent(this);
831 if (this) {
832 if (this->rb_left == &o->rb)
833 this->rb_left = NULL;
834 else
835 this->rb_right = NULL;
836 }
837 kfree(o); 821 kfree(o);
838 }
839} 822}
840 823
841static int dbg_orphan_check(struct ubifs_info *c, struct ubifs_zbranch *zbr, 824static int dbg_orphan_check(struct ubifs_info *c, struct ubifs_zbranch *zbr,
diff --git a/fs/ubifs/recovery.c b/fs/ubifs/recovery.c
index 065096e36ed9..c14adb2f420c 100644
--- a/fs/ubifs/recovery.c
+++ b/fs/ubifs/recovery.c
@@ -1335,29 +1335,14 @@ static void remove_ino(struct ubifs_info *c, ino_t inum)
1335 */ 1335 */
1336void ubifs_destroy_size_tree(struct ubifs_info *c) 1336void ubifs_destroy_size_tree(struct ubifs_info *c)
1337{ 1337{
1338 struct rb_node *this = c->size_tree.rb_node; 1338 struct size_entry *e, *n;
1339 struct size_entry *e;
1340 1339
1341 while (this) { 1340 rbtree_postorder_for_each_entry_safe(e, n, &c->size_tree, rb) {
1342 if (this->rb_left) {
1343 this = this->rb_left;
1344 continue;
1345 } else if (this->rb_right) {
1346 this = this->rb_right;
1347 continue;
1348 }
1349 e = rb_entry(this, struct size_entry, rb);
1350 if (e->inode) 1341 if (e->inode)
1351 iput(e->inode); 1342 iput(e->inode);
1352 this = rb_parent(this);
1353 if (this) {
1354 if (this->rb_left == &e->rb)
1355 this->rb_left = NULL;
1356 else
1357 this->rb_right = NULL;
1358 }
1359 kfree(e); 1343 kfree(e);
1360 } 1344 }
1345
1361 c->size_tree = RB_ROOT; 1346 c->size_tree = RB_ROOT;
1362} 1347}
1363 1348
diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c
index f69daa514a57..5ded8490c0c6 100644
--- a/fs/ubifs/super.c
+++ b/fs/ubifs/super.c
@@ -873,26 +873,10 @@ static void free_orphans(struct ubifs_info *c)
873 */ 873 */
874static void free_buds(struct ubifs_info *c) 874static void free_buds(struct ubifs_info *c)
875{ 875{
876 struct rb_node *this = c->buds.rb_node; 876 struct ubifs_bud *bud, *n;
877 struct ubifs_bud *bud; 877
878 878 rbtree_postorder_for_each_entry_safe(bud, n, &c->buds, rb)
879 while (this) { 879 kfree(bud);
880 if (this->rb_left)
881 this = this->rb_left;
882 else if (this->rb_right)
883 this = this->rb_right;
884 else {
885 bud = rb_entry(this, struct ubifs_bud, rb);
886 this = rb_parent(this);
887 if (this) {
888 if (this->rb_left == &bud->rb)
889 this->rb_left = NULL;
890 else
891 this->rb_right = NULL;
892 }
893 kfree(bud);
894 }
895 }
896} 880}
897 881
898/** 882/**
diff --git a/fs/ubifs/tnc.c b/fs/ubifs/tnc.c
index 349f31a30f40..9083bc7ed4ae 100644
--- a/fs/ubifs/tnc.c
+++ b/fs/ubifs/tnc.c
@@ -178,27 +178,11 @@ static int ins_clr_old_idx_znode(struct ubifs_info *c,
178 */ 178 */
179void destroy_old_idx(struct ubifs_info *c) 179void destroy_old_idx(struct ubifs_info *c)
180{ 180{
181 struct rb_node *this = c->old_idx.rb_node; 181 struct ubifs_old_idx *old_idx, *n;
182 struct ubifs_old_idx *old_idx;
183 182
184 while (this) { 183 rbtree_postorder_for_each_entry_safe(old_idx, n, &c->old_idx, rb)
185 if (this->rb_left) {
186 this = this->rb_left;
187 continue;
188 } else if (this->rb_right) {
189 this = this->rb_right;
190 continue;
191 }
192 old_idx = rb_entry(this, struct ubifs_old_idx, rb);
193 this = rb_parent(this);
194 if (this) {
195 if (this->rb_left == &old_idx->rb)
196 this->rb_left = NULL;
197 else
198 this->rb_right = NULL;
199 }
200 kfree(old_idx); 184 kfree(old_idx);
201 } 185
202 c->old_idx = RB_ROOT; 186 c->old_idx = RB_ROOT;
203} 187}
204 188