• Brian Foster's avatar
    xfs: serialize unaligned dio writes against all other dio writes · 2032a8a2
    Brian Foster authored
    XFS applies more strict serialization constraints to unaligned
    direct writes to accommodate things like direct I/O layer zeroing,
    unwritten extent conversion, etc. Unaligned submissions acquire the
    exclusive iolock and wait for in-flight dio to complete to ensure
    multiple submissions do not race on the same block and cause data
    corruption.
    
    This generally works in the case of an aligned dio followed by an
    unaligned dio, but the serialization is lost if I/Os occur in the
    opposite order. If an unaligned write is submitted first and
    immediately followed by an overlapping, aligned write, the latter
    submits without the typical unaligned serialization barriers because
    there is no indication of an unaligned dio still in-flight. This can
    lead to unpredictable results.
    
    To provide proper unaligned dio serialization, require that such
    direct writes are always the only dio allowed in-flight at one time
    for a particular inode. We already acquire the exclusive iolock and
    drain pending dio before submitting the unaligned dio. Wait once
    more after the dio submission to hold the iolock across the I/O and
    prevent further submissions until the unaligned I/O completes. This
    is heavy handed, but consistent with the current pre-submission
    serialization for unaligned direct writes.
    Signed-off-by: default avatarBrian Foster <bfoster@redhat.com>
    Reviewed-by: default avatarAllison Henderson <allison.henderson@oracle.com>
    Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    2032a8a2
xfs_file.c 31.9 KB