• Andrew Morton's avatar
    [PATCH] Fix race between ll_rw_block() and block_write_full_page() · c2179a48
    Andrew Morton authored
    Fix a race which was identified by Daniel McNeil <daniel@osdl.org>
    
    If a buffer_head is under I/O due to JBD's ordered data writeout (which uses
    ll_rw_block()) then either filemap_fdatawrite() or filemap_fdatawait() need
    to wait on the buffer's existing I/O.
    
    Presently neither will do so, because __block_write_full_page() will not
    actually submit any I/O and will hence not mark the page as being under
    writeback.
    
    The best-performing fix would be to somehow mark the page as being under
    writeback and defer waiting for the ll_rw_block-initiated I/O until
    filemap_fdatawait()-time.  But this is hard, because in
    __block_write_full_page() we do not have control of the buffer_head's end_io
    handler.  Possibly we could make JBD call into end_buffer_async_write(), but
    that gets nasty.
    
    This patch makes __block_write_full_page() wait for any buffer_head I/O to
    complete before inspecting the buffer_head state.  It only does this in the
    case where __block_write_full_page() was called for a "data-integrity" write:
    (wbc->sync_mode != WB_SYNC_NONE).
    
    Probably it doesn't matter, because kjournald is currently submitting (or has
    already submitted) all dirty buffers anyway.
    c2179a48
buffer.c 80.1 KB