diff --git a/[refs] b/[refs] index 99b8b35dd899..95fd2a868453 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 001281881067a5998384c6669bc8dbbbab8456c4 +refs/heads/master: 45726cb43d11b288c58243a26010f397054222f0 diff --git a/trunk/mm/filemap.c b/trunk/mm/filemap.c index b436cbb3a834..7989c44cb293 100644 --- a/trunk/mm/filemap.c +++ b/trunk/mm/filemap.c @@ -621,26 +621,27 @@ struct page *find_lock_page(struct address_space *mapping, { struct page *page; - read_lock_irq(&mapping->tree_lock); repeat: + read_lock_irq(&mapping->tree_lock); page = radix_tree_lookup(&mapping->page_tree, offset); if (page) { page_cache_get(page); if (TestSetPageLocked(page)) { read_unlock_irq(&mapping->tree_lock); __lock_page(page); - read_lock_irq(&mapping->tree_lock); /* Has the page been truncated while we slept? */ - if (unlikely(page->mapping != mapping || - page->index != offset)) { + if (unlikely(page->mapping != mapping)) { unlock_page(page); page_cache_release(page); goto repeat; } + VM_BUG_ON(page->index != offset); + goto out; } } read_unlock_irq(&mapping->tree_lock); +out: return page; } EXPORT_SYMBOL(find_lock_page);