|
@@ -126,13 +126,14 @@ void ubifs_delete_orphan(struct ubifs_info *c, ino_t inum)
|
|
|
else if (inum > o->inum)
|
|
|
p = p->rb_right;
|
|
|
else {
|
|
|
- if (o->dnext) {
|
|
|
+ if (o->del) {
|
|
|
spin_unlock(&c->orphan_lock);
|
|
|
dbg_gen("deleted twice ino %lu",
|
|
|
(unsigned long)inum);
|
|
|
return;
|
|
|
}
|
|
|
if (o->cmt) {
|
|
|
+ o->del = 1;
|
|
|
o->dnext = c->orph_dnext;
|
|
|
c->orph_dnext = o;
|
|
|
spin_unlock(&c->orphan_lock);
|
|
@@ -447,6 +448,7 @@ static void erase_deleted(struct ubifs_info *c)
|
|
|
orphan = dnext;
|
|
|
dnext = orphan->dnext;
|
|
|
ubifs_assert(!orphan->new);
|
|
|
+ ubifs_assert(orphan->del);
|
|
|
rb_erase(&orphan->rb, &c->orph_tree);
|
|
|
list_del(&orphan->list);
|
|
|
c->tot_orphans -= 1;
|
|
@@ -536,6 +538,7 @@ static int insert_dead_orphan(struct ubifs_info *c, ino_t inum)
|
|
|
rb_link_node(&orphan->rb, parent, p);
|
|
|
rb_insert_color(&orphan->rb, &c->orph_tree);
|
|
|
list_add_tail(&orphan->list, &c->orph_list);
|
|
|
+ orphan->del = 1;
|
|
|
orphan->dnext = c->orph_dnext;
|
|
|
c->orph_dnext = orphan;
|
|
|
dbg_mnt("ino %lu, new %d, tot %d", (unsigned long)inum,
|