• Andrew Morton's avatar
    [PATCH] block_truncate_page fix · 9ff5178d
    Andrew Morton authored
    Fix bug in block_truncate_page().
    
    When buffers are attached to an uptodate page, they are marked as
    being uptodate.  To preserve buffer/page state coherency.  Dirtiness
    is handled in the same way.
    
    But block_truncate_page() assumes that a buffer which is unmapped and
    uptodate is over a hole.  That's not the case, and the net effect is
    that block_truncate_page() is failing to zero the block outside the
    truncation point.
    
    This only happens if the page has a disk mapping but has no attached
    buffers on entry to block_truncate_page().  That's never the case in
    current kernels, so the problem does not exhibit (it _does_ exhibit
    with direct-to-BIO bypass-the-buffers I/O).
    
    There are actually three possible states of buffer mappedness:
    
    - Buffer has a disk mapping            (buffer_mapped(bh) == true)
    
    - buffer is over a hole	               (buffer_mapped(bh) == false)
    
    - don't know.  Need to run get_block() (buffer_mapped(bh) == false)
    
    This ambiguity could be resolved by added another buffer state bit
    (BH_mapping_state_known?) but given that we already elide the get_block
    calls for the common case (buffer outside i_size) it is unlikely that
    the complexity is worthwhile.
    9ff5178d
inode.c 79.7 KB