diff options
author | akpm@osdl.org <akpm@osdl.org> | 2005-05-01 11:58:39 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-05-01 11:58:39 -0400 |
commit | de7d5a3b6c9ff8429bf046c36b56d3192b75c3da (patch) | |
tree | b7aae262a2e790bc736fa16534b3b2d7c9e51245 | |
parent | 552fca4cbe552520d85b21e839f289c880fa48d2 (diff) |
[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>
-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) | |||
2917 | 2917 | ||
2918 | bh = head; | 2918 | bh = head; |
2919 | do { | 2919 | do { |
2920 | if (buffer_write_io_error(bh)) | 2920 | if (buffer_write_io_error(bh) && page->mapping) |
2921 | set_bit(AS_EIO, &page->mapping->flags); | 2921 | set_bit(AS_EIO, &page->mapping->flags); |
2922 | if (buffer_busy(bh)) | 2922 | if (buffer_busy(bh)) |
2923 | goto failed; | 2923 | goto failed; |