• Darrick J. Wong's avatar
    xfs: load uncached unlinked inodes into memory on demand · 68b957f6
    Darrick J. Wong authored
    shrikanth hegde reports that filesystems fail shortly after mount with
    the following failure:
    
    	WARNING: CPU: 56 PID: 12450 at fs/xfs/xfs_inode.c:1839 xfs_iunlink_lookup+0x58/0x80 [xfs]
    
    This of course is the WARN_ON_ONCE in xfs_iunlink_lookup:
    
    	ip = radix_tree_lookup(&pag->pag_ici_root, agino);
    	if (WARN_ON_ONCE(!ip || !ip->i_ino)) { ... }
    
    From diagnostic data collected by the bug reporters, it would appear
    that we cleanly mounted a filesystem that contained unlinked inodes.
    Unlinked inodes are only processed as a final step of log recovery,
    which means that clean mounts do not process the unlinked list at all.
    
    Prior to the introduction of the incore unlinked lists, this wasn't a
    problem because the unlink code would (very expensively) traverse the
    entire ondisk metadata iunlink chain to keep things up to date.
    However, the incore unlinked list code complains when it realizes that
    it is out of sync with the ondisk metadata and shuts down the fs, which
    is bad.
    
    Ritesh proposed to solve this problem by unconditionally parsing the
    unlinked lists at mount time, but this imposes a mount time cost for
    every filesystem to catch something that should be very infrequent.
    Instead, let's target the places where we can encounter a next_unlinked
    pointer that refers to an inode that is not in cache, and load it into
    cache.
    
    Note: This patch does not address the problem of iget loading an inode
    from the middle of the iunlink list and needing to set i_prev_unlinked
    correctly.
    Reported-by: default avatarshrikanth hegde <sshegde@linux.vnet.ibm.com>
    Triaged-by: default avatarRitesh Harjani <ritesh.list@gmail.com>
    Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
    Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
    68b957f6
xfs_inode.c 98.5 KB