• Zhihao Cheng's avatar
    ubifs: Fix unattached xattr inode if powercut happens after deleting · 02eb1846
    Zhihao Cheng authored
    When powercut happens after deleting file, the xattr inode could be
    alone existing in TNC but its' xattr entry cannot be found in TNC.
    File inode and xattr inode are added into orphan list after deleting
    file, file inode's nlink is 0 but xattr inode's nlink is not 0 (PS:
    zero nlink xattr inode is written on disk in evicting process by
    ubifs_jnl_write_inode). So, following process could happen:
     1. touch file
     2. setxattr(file)
     3. unlink file
        // inode(nlink=0), xattr inode(nlink=1) are added into orphan list
     4. commit
        // write inode inum and xattr inum into orphan area
     5. powercut
     6. mount
        do_kill_orphans
         // inode(nlink=0) is deleted from TNC by ubifs_tnc_remove_range,
         // xattr entry is deleted too.
         // xattr inode(nlink=1) is not deleted from TNC
    Finally we could see following error while debugging UBIFS:
     UBIFS error (ubi0:0 pid 1093): dbg_check_filesystem [ubifs]: inode 66
     nlink is 1, but calculated nlink is 0
     UBIFS (ubi0:0): dump of the inode 66 sitting in LEB 12:2128
       node_type      0 (inode node)
       group_type     1 (in node group)
       len            197
       key            (66, inode)
       size           37
       nlink          1
       flags          0x20
       xattr_cnt      0
       xattr_size     0
       xattr_names    0
       data len       37
    
    Fix it by removing entire inode with it's xattrs while replaying orphan,
    just replace function ubifs_tnc_remove_range by ubifs_tnc_remove_ino.
    
    Fixes: ee1438ce ("ubifs: Check link count of inodes when killing orphans.")
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=218661Signed-off-by: default avatarZhihao Cheng <chengzhihao1@huawei.com>
    Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
    02eb1846
orphan.c 26.1 KB