diff options
Diffstat (limited to 'mm/readahead.c')
-rw-r--r-- | mm/readahead.c | 6 |
1 files changed, 2 insertions, 4 deletions
diff --git a/mm/readahead.c b/mm/readahead.c index fc52f9f1b80c..c5c8981469e7 100644 --- a/mm/readahead.c +++ b/mm/readahead.c | |||
@@ -149,20 +149,19 @@ __do_page_cache_readahead(struct address_space *mapping, struct file *filp, | |||
149 | /* | 149 | /* |
150 | * Preallocate as many pages as we will need. | 150 | * Preallocate as many pages as we will need. |
151 | */ | 151 | */ |
152 | read_lock_irq(&mapping->tree_lock); | ||
153 | for (page_idx = 0; page_idx < nr_to_read; page_idx++) { | 152 | for (page_idx = 0; page_idx < nr_to_read; page_idx++) { |
154 | pgoff_t page_offset = offset + page_idx; | 153 | pgoff_t page_offset = offset + page_idx; |
155 | 154 | ||
156 | if (page_offset > end_index) | 155 | if (page_offset > end_index) |
157 | break; | 156 | break; |
158 | 157 | ||
158 | rcu_read_lock(); | ||
159 | page = radix_tree_lookup(&mapping->page_tree, page_offset); | 159 | page = radix_tree_lookup(&mapping->page_tree, page_offset); |
160 | rcu_read_unlock(); | ||
160 | if (page) | 161 | if (page) |
161 | continue; | 162 | continue; |
162 | 163 | ||
163 | read_unlock_irq(&mapping->tree_lock); | ||
164 | page = page_cache_alloc_cold(mapping); | 164 | page = page_cache_alloc_cold(mapping); |
165 | read_lock_irq(&mapping->tree_lock); | ||
166 | if (!page) | 165 | if (!page) |
167 | break; | 166 | break; |
168 | page->index = page_offset; | 167 | page->index = page_offset; |
@@ -171,7 +170,6 @@ __do_page_cache_readahead(struct address_space *mapping, struct file *filp, | |||
171 | SetPageReadahead(page); | 170 | SetPageReadahead(page); |
172 | ret++; | 171 | ret++; |
173 | } | 172 | } |
174 | read_unlock_irq(&mapping->tree_lock); | ||
175 | 173 | ||
176 | /* | 174 | /* |
177 | * Now start the IO. We ignore I/O errors - if the page is not | 175 | * Now start the IO. We ignore I/O errors - if the page is not |