• Andrew Morton's avatar
    [PATCH] block_read_full_page() get_block() error handling fix · c64610ba
    Andrew Morton authored
    If block_read_full_page() detects an error when running get_block() it will
    run SetPageError(), then it will zero out the block in pagecache and will mark
    the buffer_head uptodate.
    
    So at the end of readahead we end up with a non-uptodate pagecache page which
    is marked PageError.  But it has uptodate buffers.
    
    The pagefault code will run ClearPageError, will launch readpage a second time
    and block_read_full_page() will notice the uptodate buffers and will mark the
    page uptodate as well.  We end up with an uptodate, !PageError page full of
    zeros and the error is lost.
    
    (It seems a little odd that filemap_nopage() runs ClearPageError().  I guess
    all of this adds up to meaning that for each attempted access to the page, the
    pagefault handler will retry the I/O.  Which is good and bad.  If the app is
    ignoring SIGBUS for some reason we could get a lot of back-to-back I/O
    errors.)
    
    Fix it by not marking the pagecache buffer_head as uptodate if the attempt to
    map that buffer to a disk block failed.
    
    Credit-to: Qu Fuping <fs@ercist.iscas.ac.cn>
    
      For reporting the bug and identifying its source.
    Signed-off-by: default avatarQu Fuping <fs@ercist.iscas.ac.cn>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    c64610ba
buffer.c 81.9 KB