• Younger Liu's avatar
    ocfs2: fix readonly issue in ocfs2_unlink() · b5a8bb71
    Younger Liu authored
    While deleting a file with ocfs2_unlink(), there is a bug in this
    function.  This bug will result in filesystem read-only.
    
    After calling ocfs2_orphan_add(), the file which will be deleted is
    added into orphan dir.  If ocfs2_delete_entry() fails, the file still
    exists in the parent dir.  And this scenario introduces a conflict of
    metadata.
    
    If a file is added into orphan dir, when we put inode of the file with
    iput(), the inode i_flags is setted (~OCFS2_VALID_FL) in
    ocfs2_remove_inode(), and then write back to disk.
    
    But as previously mentioned, the file still exists in the parent dir.
    On other nodes, the file can be still accessed.  When first read the
    file with ocfs2_read_blocks() from disk, It will check and avalidate
    inode using ocfs2_validate_inode_block().  So File system will be
    readonly because the inode is invalid.  In other words, the inode
    i_flags has been set (~OCFS2_VALID_FL).
    
    [akpm@linux-foundation.org: cleanups]
    [jeff.liu@oracle.com: s/inode_is_unlinkable/ocfs2_inode_is_unlinkable/]
    Signed-off-by: default avatarYounger Liu <younger.liu@huawei.com>
    Signed-off-by: default avatarJensen <shencanquan@huawei.com>
    Cc: Jie Liu <jeff.liu@oracle.com>
    Cc: Joel Becker <jlbec@evilplan.org>
    Cc: Mark Fasheh <mfasheh@suse.com>
    Cc: Sunil Mushran <sunil.mushran@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    b5a8bb71
namei.c 60.1 KB