Skip to content

Commit

Permalink
fs/ubifs: 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 <[email protected]>
Cc: Michel Lespinasse <[email protected]>
Cc: Jan Kara <[email protected]>
Cc: Artem Bityutskiy <[email protected]>
Cc: Adrian Hunter <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
codyps authored and torvalds committed Jan 24, 2014
1 parent b182837 commit bb25e49
Show file tree
Hide file tree
Showing 6 changed files with 17 additions and 114 deletions.
22 changes: 3 additions & 19 deletions fs/ubifs/debug.c
Original file line number Diff line number Diff line change
Expand Up @@ -2118,26 +2118,10 @@ static int check_leaf(struct ubifs_info *c, struct ubifs_zbranch *zbr,
*/
static void free_inodes(struct fsck_data *fsckd)
{
struct rb_node *this = fsckd->inodes.rb_node;
struct fsck_inode *fscki;
struct fsck_inode *fscki, *n;

while (this) {
if (this->rb_left)
this = this->rb_left;
else if (this->rb_right)
this = this->rb_right;
else {
fscki = rb_entry(this, struct fsck_inode, rb);
this = rb_parent(this);
if (this) {
if (this->rb_left == &fscki->rb)
this->rb_left = NULL;
else
this->rb_right = NULL;
}
kfree(fscki);
}
}
rbtree_postorder_for_each_entry_safe(fscki, n, &fsckd->inodes, rb)
kfree(fscki);
}

/**
Expand Down
21 changes: 2 additions & 19 deletions fs/ubifs/log.c
Original file line number Diff line number Diff line change
Expand Up @@ -574,27 +574,10 @@ static int done_already(struct rb_root *done_tree, int lnum)
*/
static void destroy_done_tree(struct rb_root *done_tree)
{
struct rb_node *this = done_tree->rb_node;
struct done_ref *dr;
struct done_ref *dr, *n;

while (this) {
if (this->rb_left) {
this = this->rb_left;
continue;
} else if (this->rb_right) {
this = this->rb_right;
continue;
}
dr = rb_entry(this, struct done_ref, rb);
this = rb_parent(this);
if (this) {
if (this->rb_left == &dr->rb)
this->rb_left = NULL;
else
this->rb_right = NULL;
}
rbtree_postorder_for_each_entry_safe(dr, n, done_tree, rb)
kfree(dr);
}
}

/**
Expand Down
21 changes: 2 additions & 19 deletions fs/ubifs/orphan.c
Original file line number Diff line number Diff line change
Expand Up @@ -815,27 +815,10 @@ static int dbg_find_check_orphan(struct rb_root *root, ino_t inum)

static void dbg_free_check_tree(struct rb_root *root)
{
struct rb_node *this = root->rb_node;
struct check_orphan *o;
struct check_orphan *o, *n;

while (this) {
if (this->rb_left) {
this = this->rb_left;
continue;
} else if (this->rb_right) {
this = this->rb_right;
continue;
}
o = rb_entry(this, struct check_orphan, rb);
this = rb_parent(this);
if (this) {
if (this->rb_left == &o->rb)
this->rb_left = NULL;
else
this->rb_right = NULL;
}
rbtree_postorder_for_each_entry_safe(o, n, root, rb)
kfree(o);
}
}

static int dbg_orphan_check(struct ubifs_info *c, struct ubifs_zbranch *zbr,
Expand Down
21 changes: 3 additions & 18 deletions fs/ubifs/recovery.c
Original file line number Diff line number Diff line change
Expand Up @@ -1335,29 +1335,14 @@ static void remove_ino(struct ubifs_info *c, ino_t inum)
*/
void ubifs_destroy_size_tree(struct ubifs_info *c)
{
struct rb_node *this = c->size_tree.rb_node;
struct size_entry *e;
struct size_entry *e, *n;

while (this) {
if (this->rb_left) {
this = this->rb_left;
continue;
} else if (this->rb_right) {
this = this->rb_right;
continue;
}
e = rb_entry(this, struct size_entry, rb);
rbtree_postorder_for_each_entry_safe(e, n, &c->size_tree, rb) {
if (e->inode)
iput(e->inode);
this = rb_parent(this);
if (this) {
if (this->rb_left == &e->rb)
this->rb_left = NULL;
else
this->rb_right = NULL;
}
kfree(e);
}

c->size_tree = RB_ROOT;
}

Expand Down
24 changes: 4 additions & 20 deletions fs/ubifs/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -873,26 +873,10 @@ static void free_orphans(struct ubifs_info *c)
*/
static void free_buds(struct ubifs_info *c)
{
struct rb_node *this = c->buds.rb_node;
struct ubifs_bud *bud;

while (this) {
if (this->rb_left)
this = this->rb_left;
else if (this->rb_right)
this = this->rb_right;
else {
bud = rb_entry(this, struct ubifs_bud, rb);
this = rb_parent(this);
if (this) {
if (this->rb_left == &bud->rb)
this->rb_left = NULL;
else
this->rb_right = NULL;
}
kfree(bud);
}
}
struct ubifs_bud *bud, *n;

rbtree_postorder_for_each_entry_safe(bud, n, &c->buds, rb)
kfree(bud);
}

/**
Expand Down
22 changes: 3 additions & 19 deletions fs/ubifs/tnc.c
Original file line number Diff line number Diff line change
Expand Up @@ -178,27 +178,11 @@ static int ins_clr_old_idx_znode(struct ubifs_info *c,
*/
void destroy_old_idx(struct ubifs_info *c)
{
struct rb_node *this = c->old_idx.rb_node;
struct ubifs_old_idx *old_idx;
struct ubifs_old_idx *old_idx, *n;

while (this) {
if (this->rb_left) {
this = this->rb_left;
continue;
} else if (this->rb_right) {
this = this->rb_right;
continue;
}
old_idx = rb_entry(this, struct ubifs_old_idx, rb);
this = rb_parent(this);
if (this) {
if (this->rb_left == &old_idx->rb)
this->rb_left = NULL;
else
this->rb_right = NULL;
}
rbtree_postorder_for_each_entry_safe(old_idx, n, &c->old_idx, rb)
kfree(old_idx);
}

c->old_idx = RB_ROOT;
}

Expand Down

0 comments on commit bb25e49

Please sign in to comment.