diff options
Diffstat (limited to 'fs/btrfs/extent_io.c')
-rw-r--r-- | fs/btrfs/extent_io.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index e2357e31609a..3915c9473e94 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -3132,12 +3132,12 @@ static inline void __do_contiguous_readpages(struct extent_io_tree *tree, | |||
3132 | get_extent_t *get_extent, | 3132 | get_extent_t *get_extent, |
3133 | struct extent_map **em_cached, | 3133 | struct extent_map **em_cached, |
3134 | struct bio **bio, int mirror_num, | 3134 | struct bio **bio, int mirror_num, |
3135 | unsigned long *bio_flags, int rw) | 3135 | unsigned long *bio_flags, int rw, |
3136 | u64 *prev_em_start) | ||
3136 | { | 3137 | { |
3137 | struct inode *inode; | 3138 | struct inode *inode; |
3138 | struct btrfs_ordered_extent *ordered; | 3139 | struct btrfs_ordered_extent *ordered; |
3139 | int index; | 3140 | int index; |
3140 | u64 prev_em_start = (u64)-1; | ||
3141 | 3141 | ||
3142 | inode = pages[0]->mapping->host; | 3142 | inode = pages[0]->mapping->host; |
3143 | while (1) { | 3143 | while (1) { |
@@ -3153,7 +3153,7 @@ static inline void __do_contiguous_readpages(struct extent_io_tree *tree, | |||
3153 | 3153 | ||
3154 | for (index = 0; index < nr_pages; index++) { | 3154 | for (index = 0; index < nr_pages; index++) { |
3155 | __do_readpage(tree, pages[index], get_extent, em_cached, bio, | 3155 | __do_readpage(tree, pages[index], get_extent, em_cached, bio, |
3156 | mirror_num, bio_flags, rw, &prev_em_start); | 3156 | mirror_num, bio_flags, rw, prev_em_start); |
3157 | page_cache_release(pages[index]); | 3157 | page_cache_release(pages[index]); |
3158 | } | 3158 | } |
3159 | } | 3159 | } |
@@ -3163,7 +3163,8 @@ static void __extent_readpages(struct extent_io_tree *tree, | |||
3163 | int nr_pages, get_extent_t *get_extent, | 3163 | int nr_pages, get_extent_t *get_extent, |
3164 | struct extent_map **em_cached, | 3164 | struct extent_map **em_cached, |
3165 | struct bio **bio, int mirror_num, | 3165 | struct bio **bio, int mirror_num, |
3166 | unsigned long *bio_flags, int rw) | 3166 | unsigned long *bio_flags, int rw, |
3167 | u64 *prev_em_start) | ||
3167 | { | 3168 | { |
3168 | u64 start = 0; | 3169 | u64 start = 0; |
3169 | u64 end = 0; | 3170 | u64 end = 0; |
@@ -3184,7 +3185,7 @@ static void __extent_readpages(struct extent_io_tree *tree, | |||
3184 | index - first_index, start, | 3185 | index - first_index, start, |
3185 | end, get_extent, em_cached, | 3186 | end, get_extent, em_cached, |
3186 | bio, mirror_num, bio_flags, | 3187 | bio, mirror_num, bio_flags, |
3187 | rw); | 3188 | rw, prev_em_start); |
3188 | start = page_start; | 3189 | start = page_start; |
3189 | end = start + PAGE_CACHE_SIZE - 1; | 3190 | end = start + PAGE_CACHE_SIZE - 1; |
3190 | first_index = index; | 3191 | first_index = index; |
@@ -3195,7 +3196,8 @@ static void __extent_readpages(struct extent_io_tree *tree, | |||
3195 | __do_contiguous_readpages(tree, &pages[first_index], | 3196 | __do_contiguous_readpages(tree, &pages[first_index], |
3196 | index - first_index, start, | 3197 | index - first_index, start, |
3197 | end, get_extent, em_cached, bio, | 3198 | end, get_extent, em_cached, bio, |
3198 | mirror_num, bio_flags, rw); | 3199 | mirror_num, bio_flags, rw, |
3200 | prev_em_start); | ||
3199 | } | 3201 | } |
3200 | 3202 | ||
3201 | static int __extent_read_full_page(struct extent_io_tree *tree, | 3203 | static int __extent_read_full_page(struct extent_io_tree *tree, |
@@ -4207,6 +4209,7 @@ int extent_readpages(struct extent_io_tree *tree, | |||
4207 | struct page *page; | 4209 | struct page *page; |
4208 | struct extent_map *em_cached = NULL; | 4210 | struct extent_map *em_cached = NULL; |
4209 | int nr = 0; | 4211 | int nr = 0; |
4212 | u64 prev_em_start = (u64)-1; | ||
4210 | 4213 | ||
4211 | for (page_idx = 0; page_idx < nr_pages; page_idx++) { | 4214 | for (page_idx = 0; page_idx < nr_pages; page_idx++) { |
4212 | page = list_entry(pages->prev, struct page, lru); | 4215 | page = list_entry(pages->prev, struct page, lru); |
@@ -4223,12 +4226,12 @@ int extent_readpages(struct extent_io_tree *tree, | |||
4223 | if (nr < ARRAY_SIZE(pagepool)) | 4226 | if (nr < ARRAY_SIZE(pagepool)) |
4224 | continue; | 4227 | continue; |
4225 | __extent_readpages(tree, pagepool, nr, get_extent, &em_cached, | 4228 | __extent_readpages(tree, pagepool, nr, get_extent, &em_cached, |
4226 | &bio, 0, &bio_flags, READ); | 4229 | &bio, 0, &bio_flags, READ, &prev_em_start); |
4227 | nr = 0; | 4230 | nr = 0; |
4228 | } | 4231 | } |
4229 | if (nr) | 4232 | if (nr) |
4230 | __extent_readpages(tree, pagepool, nr, get_extent, &em_cached, | 4233 | __extent_readpages(tree, pagepool, nr, get_extent, &em_cached, |
4231 | &bio, 0, &bio_flags, READ); | 4234 | &bio, 0, &bio_flags, READ, &prev_em_start); |
4232 | 4235 | ||
4233 | if (em_cached) | 4236 | if (em_cached) |
4234 | free_extent_map(em_cached); | 4237 | free_extent_map(em_cached); |