• C
    xfs: log all dirty inodes in xfs_fs_sync_fs · be4f1ac8
    Christoph Hellwig 提交于
    Since Linux 2.6.36 the writeback code has introduces various measures for
    live lock prevention during sync().  Unfortunately some of these are
    actively harmful for the XFS model, where the inode gets marked dirty for
    metadata from the data I/O handler.
    
    The older_than_this checks that are now more strictly enforced since
    
        writeback: avoid livelocking WB_SYNC_ALL writeback
    
    by only calling into __writeback_inodes_sb and thus only sampling the
    current cut off time once.  But on a slow enough devices the previous
    asynchronous sync pass might not have fully completed yet, and thus XFS
    might mark metadata dirty only after that sampling of the cut off time for
    the blocking pass already happened.  I have not myself reproduced this
    myself on a real system, but by introducing artificial delay into the
    XFS I/O completion workqueues it can be reproduced easily.
    
    Fix this by iterating over all XFS inodes in ->sync_fs and log all that
    are dirty.  This might log inode that only got redirtied after the
    previous pass, but given how cheap delayed logging of inodes is it
    isn't a major concern for performance.
    Signed-off-by: NChristoph Hellwig <hch@lst.de>
    Reviewed-by: NDave Chinner <dchinner@redhat.com>
    Tested-by: NMark Tinguely <tinguely@sgi.com>
    Reviewed-by: NMark Tinguely <tinguely@sgi.com>
    Signed-off-by: NBen Myers <bpm@sgi.com>
    be4f1ac8
xfs_sync.c 29.5 KB