• B
    xfs: serialize unaligned dio writes against all other dio writes · 17e3abba
    Brian Foster 提交于
    commit 2032a8a27b5cc0f578d37fa16fa2494b80a0d00a upstream.
    
    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: NBrian Foster <bfoster@redhat.com>
    Reviewed-by: NAllison Henderson <allison.henderson@oracle.com>
    Reviewed-by: NDave Chinner <dchinner@redhat.com>
    Reviewed-by: NDarrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: NDarrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: NAlvin Zheng <Alvin@linux.alibaba.com>
    Acked-by: NJoseph Qi <joseph.qi@linux.alibaba.com>
    17e3abba
xfs_file.c 30.3 KB