]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
ubifs: Remove insert_dead_orphan from replaying orphan process
authorZhihao Cheng <chengzhihao1@huawei.com>
Wed, 10 Apr 2024 07:37:46 +0000 (15:37 +0800)
committerRichard Weinberger <richard@nod.at>
Fri, 12 Jul 2024 19:38:22 +0000 (21:38 +0200)
UBIFS will do commit at the end of mounting process(rw mode), dead
orphans(added by insert_dead_orphan in replaying orphan) are deleted
by ubifs_orphan_end_commit(). The only reason why dead orphans are
added into orphan list is that old orpans may be lost when powercut
happens in ubifs_orphan_end_commit():
ubifs_orphan_end_commit  // TNC(updated by orphans) is not written yet
 if (c->cmt_orphans != 0)
  commit_orphans
   consolidate // traverse orphan list
  write_orph_nodes // rewrite all orphans by ubifs_leb_change
  // If dead orphans are not in list, they will be lost when powercut
  // happens, then TNC won't be updated by old orphans in next mounting.
Luckily, the condition 'c->cmt_orphans != 0' will never be true in
mounting process, there can't be new orphans added into orphan list
before mounting returned, but commit will be done at the end of mounting.

Signed-off-by: Zhihao Cheng <chengzhihao1@huawei.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
fs/ubifs/orphan.c

index 88fbf331ad8c0fc6b08060385d0579a7ec80bfd2..6e843e8fc3dbb1f2f561cc07cf0e1f952c967d19 100644 (file)
@@ -513,51 +513,6 @@ int ubifs_clear_orphans(struct ubifs_info *c)
        return 0;
 }
 
-/**
- * insert_dead_orphan - insert an orphan.
- * @c: UBIFS file-system description object
- * @inum: orphan inode number
- *
- * This function is a helper to the 'do_kill_orphans()' function. The orphan
- * must be kept until the next commit, so it is added to the rb-tree and the
- * deletion list.
- */
-static int insert_dead_orphan(struct ubifs_info *c, ino_t inum)
-{
-       struct ubifs_orphan *orphan, *o;
-       struct rb_node **p, *parent = NULL;
-
-       orphan = kzalloc(sizeof(struct ubifs_orphan), GFP_KERNEL);
-       if (!orphan)
-               return -ENOMEM;
-       orphan->inum = inum;
-
-       p = &c->orph_tree.rb_node;
-       while (*p) {
-               parent = *p;
-               o = rb_entry(parent, struct ubifs_orphan, rb);
-               if (inum < o->inum)
-                       p = &(*p)->rb_left;
-               else if (inum > o->inum)
-                       p = &(*p)->rb_right;
-               else {
-                       /* Already added - no problem */
-                       kfree(orphan);
-                       return 0;
-               }
-       }
-       c->tot_orphans += 1;
-       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,
-               c->new_orphans, c->tot_orphans);
-       return 0;
-}
-
 /**
  * do_kill_orphans - remove orphan inodes from the index.
  * @c: UBIFS file-system description object
@@ -655,10 +610,6 @@ static int do_kill_orphans(struct ubifs_info *c, struct ubifs_scan_leb *sleb,
                                if (err)
                                        goto out_ro;
                        }
-
-                       err = insert_dead_orphan(c, inum);
-                       if (err)
-                               goto out_free;
                }
 
                *last_cmt_no = cmt_no;