• Darrick J. Wong's avatar
    xfs: don't ever put nlink > 0 inodes on the unlinked list · c4a6bf7f
    Darrick J. Wong authored
    When XFS creates an O_TMPFILE file, the inode is created with nlink = 1,
    put on the unlinked list, and then the VFS sets nlink = 0 in d_tmpfile.
    If we crash before anything logs the inode (it's dirty incore but the
    vfs doesn't tell us it's dirty so we never log that change), the iunlink
    processing part of recovery will then explode with a pile of:
    
    XFS: Assertion failed: VFS_I(ip)->i_nlink == 0, file:
    fs/xfs/xfs_log_recover.c, line: 5072
    
    Worse yet, since nlink is nonzero, the inodes also don't get cleaned up
    and they just leak until the next xfs_repair run.
    
    Therefore, change xfs_iunlink to require that inodes being put on the
    unlinked list have nlink == 0, change the tmpfile callers to instantiate
    nodes that way, and set the nlink to 1 just prior to calling d_tmpfile.
    Fix the comment for xfs_iunlink while we're at it.
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    c4a6bf7f
xfs_inode.c 107 KB