• Yiwen Jiang's avatar
    ocfs2: fix a tiny case that inode can not removed · 928dda1f
    Yiwen Jiang authored
    When running dirop_fileop_racer we found a case that inode
    can not removed.
    
    Two nodes, say Node A and Node B, mount the same ocfs2 volume.  Create
    two dirs /race/1/ and /race/2/ in the filesystem.
    
      Node A                            Node B
      rm -r /race/2/
                                        mv /race/1/ /race/2/
      call ocfs2_unlink(), get
      the EX mode of /race/2/
                                        wait for B unlock /race/2/
      decrease i_nlink of /race/2/ to 0,
      and add inode of /race/2/ into
      orphan dir, unlock /race/2/
                                        got EX mode of /race/2/. because
                                        /race/1/ is dir, so inc i_nlink
                                        of /race/2/ and update into disk,
                                        unlock /race/2/
      because i_nlink of /race/2/
      is not zero, this inode will
      always remain in orphan dir
    
    This patch fixes this case by test whether i_nlink of new dir is zero.
    Signed-off-by: default avatarYiwen Jiang <jiangyiwen@huawei.com>
    Reviewed-by: default avatarMark Fasheh <mfasheh@suse.de>
    Cc: Joel Becker <jlbec@evilplan.org>
    Cc: Joseph Qi <joseph.qi@huawei.com>
    Cc: Xue jiufei <xuejiufei@huawei.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    928dda1f
namei.c 70.3 KB