diff options
author | akpm@osdl.org <akpm@osdl.org> | 2005-05-01 08:58:39 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-05-01 08:58:39 -0700 |
commit | de7d5a3b6c9ff8429bf046c36b56d3192b75c3da (patch) | |
tree | b7aae262a2e790bc736fa16534b3b2d7c9e51245 /fs/buffer.c | |
parent | 552fca4cbe552520d85b21e839f289c880fa48d2 (diff) | |
download | lwn-de7d5a3b6c9ff8429bf046c36b56d3192b75c3da.tar.gz lwn-de7d5a3b6c9ff8429bf046c36b56d3192b75c3da.zip |
[PATCH] drop_buffers() oops fix
In rare situations, drop_buffers() can be called for a page which has buffers,
but no ->mapping (it was truncated, but the buffers were left behind because
ext3 was still fiddling with them).
But if there was an I/O error in a buffer_head, drop_buffers() will try to get
at the address_space and will oops.
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/buffer.c')
-rw-r--r-- | fs/buffer.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/buffer.c b/fs/buffer.c index 3b12cf947aba..665db84a1f9f 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -2917,7 +2917,7 @@ drop_buffers(struct page *page, struct buffer_head **buffers_to_free) bh = head; do { - if (buffer_write_io_error(bh)) + if (buffer_write_io_error(bh) && page->mapping) set_bit(AS_EIO, &page->mapping->flags); if (buffer_busy(bh)) goto failed; |