• Dave Chinner's avatar
    xfs: async CIL flushes need pending pushes to be made stable · 70447e0a
    Dave Chinner authored
    When the AIL tries to flush the CIL, it relies on the CIL push
    ending up on stable storage without having to wait for and
    manipulate iclog state directly. However, if there is already a
    pending CIL push when the AIL tries to flush the CIL, it won't set
    the cil->xc_push_commit_stable flag and so the CIL push will not
    actively flush the commit record iclog.
    
    generic/530 when run on a single CPU test VM can trigger this fairly
    reliably. This test exercises unlinked inode recovery, and can
    result in inodes being pinned in memory by ongoing modifications to
    the inode cluster buffer to record unlinked list modifications. As a
    result, the first inode unlinked in a buffer can pin the tail of the
    log whilst the inode cluster buffer is pinned by the current
    checkpoint that has been pushed but isn't on stable storage because
    because the cil->xc_push_commit_stable was not set. This results in
    the log/AIL effectively deadlocking until something triggers the
    commit record iclog to be pushed to stable storage (i.e. the
    periodic log worker calling xfs_log_force()).
    
    The fix is two-fold - first we should always set the
    cil->xc_push_commit_stable when xlog_cil_flush() is called,
    regardless of whether there is already a pending push or not.
    
    Second, if the CIL is empty, we should trigger an iclog flush to
    ensure that the iclogs of the last checkpoint have actually been
    submitted to disk as that checkpoint may not have been run under
    stable completion constraints.
    Reported-and-tested-by: default avatarMatthew Wilcox <willy@infradead.org>
    Fixes: 0020a190 ("xfs: AIL needs asynchronous CIL forcing")
    Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
    Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
    70447e0a
xfs_log_cil.c 48.2 KB