Messages in this thread | | | Date | Thu, 04 Nov 2010 10:11:40 -0400 | From | Rik van Riel <> | Subject | Re: [PATCH] Revalidate page->mapping in do_generic_file_read() |
| |
On 11/03/2010 06:09 PM, Dave Hansen wrote: > 70 hours into some stress tests of a 2.6.32-based enterprise kernel, > we ran into a NULL dereference in here: > > int block_is_partially_uptodate(struct page *page, read_descriptor_t *desc, > unsigned long from) > { > ----> struct inode *inode = page->mapping->host; > > It looks like page->mapping was the culprit. (xmon trace is below). > After closer examination, I realized that do_generic_file_read() does > a find_get_page(), and eventually locks the page before calling > block_is_partially_uptodate(). However, it doesn't revalidate the > page->mapping after the page is locked. So, there's a small window > between the find_get_page() and ->is_partially_uptodate() where the > page could get truncated and page->mapping cleared. > > We _have_ a reference, so it can't get reclaimed, but it certainly > can be truncated.
Acked-by: Rik van Riel <riel@redhat.com>
-- All rights reversed
| |