diff --git a/mm/readahead.c b/mm/readahead.c
index 86d54f5b38e5bcea551726130e2b5b5c173aa0fd..b59f8f4c57bcee02059ea4a7c33a67a79f8cf2d8 100644
--- a/mm/readahead.c
+++ b/mm/readahead.c
@@ -117,25 +117,27 @@ void do_page_cache_readahead(struct file *file,
 	/*
 	 * Preallocate as many pages as we will need.
 	 */
+	read_lock(&mapping->page_lock);
 	for (page_idx = 0; page_idx < nr_to_read; page_idx++) {
 		unsigned long page_offset = offset + page_idx;
 		
 		if (page_offset > end_index)
 			break;
 
-		read_lock(&mapping->page_lock);
 		page = radix_tree_lookup(&mapping->page_tree, page_offset);
-		read_unlock(&mapping->page_lock);
 		if (page)
 			continue;
 
+		read_unlock(&mapping->page_lock);
 		page = page_cache_alloc(mapping);
+		read_lock(&mapping->page_lock);
 		if (!page)
 			break;
 		page->index = page_offset;
 		list_add(&page->list, &page_pool);
 		nr_to_really_read++;
 	}
+	read_unlock(&mapping->page_lock);
 
 	/*
 	 * Now start the IO.  We ignore I/O errors - if the page is not