• Zhihao Cheng's avatar
    ubifs: Fix unattached inode when powercut happens in creating · 3af2d3a8
    Zhihao Cheng authored
    For selinux or encryption scenarios, UBIFS could become inconsistent
    while creating new files in powercut case. Encryption/selinux related
    xattrs will be created before creating file dentry, which makes creation
    process is not atomic, details are shown as:
    
    Encryption case:
    ubifs_create
     ubifs_new_inode
      fscrypt_set_context
       ubifs_xattr_set
        create_xattr
         ubifs_jnl_update  // Disk: xentry xinode inode(LAST_OF_NODE_GROUP)
     >> power cut <<
     ubifs_jnl_update  // Disk: dentry inode parent_inode(LAST_OF_NODE_GROUP)
    
    Selinux case:
    ubifs_create
     ubifs_new_inode
     ubifs_init_security
      security_inode_init_security
       ubifs_xattr_set
        create_xattr
         ubifs_jnl_update  // Disk: xentry xinode inode(LAST_OF_NODE_GROUP)
     >> power cut <<
     ubifs_jnl_update  // Disk: dentry inode parent_inode(LAST_OF_NODE_GROUP)
    
    Above process will make chk_fs failed in next mounting:
     UBIFS error (ubi0:0 pid 7995): dbg_check_filesystem [ubifs]: inode 66
     nlink is 1, but calculated nlink is 0
    
    Fix it by allocating orphan inode for each non-xattr file creation, then
    removing orphan list in journal writing process, which ensures that both
    xattr and dentry be effective in atomic when powercut happens.
    
    Fixes: d7f0b70d ("UBIFS: Add security.* XATTR support for the UBIFS")
    Fixes: d475a507 ("ubifs: Add skeleton for fscrypto")
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=218309Suggested-by: default avatarZhang Yi <yi.zhang@huawei.com>
    Signed-off-by: default avatarZhihao Cheng <chengzhihao1@huawei.com>
    Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
    3af2d3a8
journal.c 57.8 KB