• Darrick J. Wong's avatar
    xfs: proper replay of deferred ops queued during log recovery · e6fff81e
    Darrick J. Wong authored
    When we replay unfinished intent items that have been recovered from the
    log, it's possible that the replay will cause the creation of more
    deferred work items.  As outlined in commit 50995582 ("xfs: log
    recovery should replay deferred ops in order"), later work items have an
    implicit ordering dependency on earlier work items.  Therefore, recovery
    must replay the items (both recovered and created) in the same order
    that they would have been during normal operation.
    
    For log recovery, we enforce this ordering by using an empty transaction
    to collect deferred ops that get created in the process of recovering a
    log intent item to prevent them from being committed before the rest of
    the recovered intent items.  After we finish committing all the
    recovered log items, we allocate a transaction with an enormous block
    reservation, splice our huge list of created deferred ops into that
    transaction, and commit it, thereby finishing all those ops.
    
    This is /really/ hokey -- it's the one place in XFS where we allow
    nested transactions; the splicing of the defer ops list is is inelegant
    and has to be done twice per recovery function; and the broken way we
    handle inode pointers and block reservations cause subtle use-after-free
    and allocator problems that will be fixed by this patch and the two
    patches after it.
    
    Therefore, replace the hokey empty transaction with a structure designed
    to capture each chain of deferred ops that are created as part of
    recovering a single unfinished log intent.  Finally, refactor the loop
    that replays those chains to do so using one transaction per chain.
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    e6fff81e
xfs_trans.h 8.93 KB