diff options
| author | Andrew Morton <akpm@osdl.org> | 2004-10-18 18:01:03 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2004-10-18 18:01:03 -0700 |
| commit | 91cd0c2bdb62901f3a8fcac3584b392f3c8115b0 (patch) | |
| tree | 9473db08461f774e396b077131be7c8e5e33f8d9 /include/linux/jbd.h | |
| parent | a8589849ae101ada752982b34ab4a6d8f81bfcb3 (diff) | |
[PATCH] jbd wakeup fix
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: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'include/linux/jbd.h')
| -rw-r--r-- | include/linux/jbd.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/include/linux/jbd.h b/include/linux/jbd.h index e65b90f1962c..dfdd307872bb 100644 --- a/include/linux/jbd.h +++ b/include/linux/jbd.h @@ -299,6 +299,7 @@ enum jbd_state_bits { BH_JBDDirty, /* Is dirty but journaled */ BH_State, /* Pins most journal_head state */ BH_JournalHead, /* Pins bh->b_private and jh->b_bh */ + BH_Unshadow, /* Dummy bit, for BJ_Shadow wakeup filtering */ }; BUFFER_FNS(JBD, jbd) |
