• Andrew Morton's avatar
    [PATCH] jbd wakeup fix · 91cd0c2b
    Andrew Morton authored
    Processes can sleep in do_get_write_access(), waiting for buffers to be
    removed from the BJ_Shadow state.  We did this by doing a wake_up_buffer() in
    the commit path and sleeping on the buffer in do_get_write_access().
    
    With the filtered bit-level wakeup code this doesn't work properly any more -
    the wake_up_buffer() accidentally wakes up tasks which are sleeping in
    lock_buffer() as well.  Those tasks now implicitly assume that the buffer came
    unlocked.  Net effect: Bogus I/O errors when reading journal blocks, because
    the buffer isn't up to date yet.  Hence the recently spate of journal_bmap()
    failure reports.
    
    The patch creates a new jbd-private BH flag purely for this wakeup function.
    So a wake_up_bit(..., BH_Unshadow) doesn't wake up someone who is waiting for
    a wake_up_bit(BH_Lock).
    
    JBD was the only user of wake_up_buffer(), so remove it altogether.
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    91cd0c2b
transaction.c 61.9 KB