• kaixuxia's avatar
    xfs: Fix deadlock between AGI and AGF when target_ip exists in xfs_rename() · 93597ae8
    kaixuxia authored
    When target_ip exists in xfs_rename(), the xfs_dir_replace() call may
    need to hold the AGF lock to allocate more blocks, and then invoking
    the xfs_droplink() call to hold AGI lock to drop target_ip onto the
    unlinked list, so we get the lock order AGF->AGI. This would break the
    ordering constraint on AGI and AGF locking - inode allocation locks
    the AGI, then can allocate a new extent for new inodes, locking the
    AGF after the AGI.
    
    In this patch we check whether the replace operation need more
    blocks firstly. If so, acquire the agi lock firstly to preserve
    locking order(AGI/AGF). Actually, the locking order problem only
    occurs when we are locking the AGI/AGF of the same AG. For multiple
    AGs the AGI lock will be released after the transaction committed.
    Signed-off-by: default avatarkaixuxia <kaixuxia@tencent.com>
    Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    [darrick: reword the comment]
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    93597ae8
xfs_inode.c 108 KB