Skip to content

Commit 7efc34b

Browse files
Zhihao Chengrichardweinberger
authored andcommitted
ubifs: Fix adding orphan entry twice for the same inode
The tmpfile could be added into orphan list twice, first time is creation, the second time is removing after it is linked. The orphan entry could be added twice for tmpfile if following sequence is satisfied: ubifs_tmpfile ubifs_jnl_update ubifs_add_orphan // first time to add orphan entry P1 P2 ubifs_link do_commit ubifs_orphan_start_commit orphan->cmt = 1 ubifs_delete_orphan orphan_delete if (orph->cmt) orph->del = 1; // orphan entry is not deleted from tree return ubifs_unlink ubifs_jnl_update ubifs_add_orphan orphan_add // found old orphan entry, second time to add orphan entry ubifs_err(c, "orphaned twice") return -EINVAL // unlink failed! ubifs_orphan_end_commit erase_deleted // delete old orphan entry rb_erase(&orphan->rb, &c->orph_tree) Fix it by removing orphan entry from orphan tree in advance, rather than remove it from orphan tree in committing process. Fixes: 32fe905 ("ubifs: Fix O_TMPFILE corner case in ubifs_link()") Link: https://bugzilla.kernel.org/show_bug.cgi?id=218672 Signed-off-by: Zhihao Cheng <chengzhihao1@huawei.com> Signed-off-by: Richard Weinberger <richard@nod.at>
1 parent 6376d75 commit 7efc34b

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

fs/ubifs/orphan.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ static void orphan_delete(struct ubifs_info *c, struct ubifs_orphan *orph)
136136

137137
if (orph->cmt) {
138138
orph->del = 1;
139+
rb_erase(&orph->rb, &c->orph_tree);
139140
orph->dnext = c->orph_dnext;
140141
c->orph_dnext = orph;
141142
dbg_gen("delete later ino %lu", (unsigned long)orph->inum);
@@ -461,7 +462,6 @@ static void erase_deleted(struct ubifs_info *c)
461462
dnext = orphan->dnext;
462463
ubifs_assert(c, !orphan->new);
463464
ubifs_assert(c, orphan->del);
464-
rb_erase(&orphan->rb, &c->orph_tree);
465465
list_del(&orphan->list);
466466
c->tot_orphans -= 1;
467467
dbg_gen("deleting orphan ino %lu", (unsigned long)orphan->inum);

0 commit comments

Comments
 (0)