summaryrefslogtreecommitdiff
path: root/fs/ext4
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ext4')
-rw-r--r--fs/ext4/inode.c27
1 files changed, 10 insertions, 17 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 617c9cbba182..c2e6af338234 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -2761,6 +2761,16 @@ static int write_cache_pages_da(struct address_space *mapping,
*done_index = page->index + 1;
+ /*
+ * If we can't merge this page, and we have
+ * accumulated an contiguous region, write it
+ */
+ if ((mpd->next_page != page->index) &&
+ (mpd->next_page != mpd->first_page)) {
+ mpage_da_map_and_submit(mpd);
+ goto ret_extent_tail;
+ }
+
lock_page(page);
/*
@@ -2784,25 +2794,8 @@ static int write_cache_pages_da(struct address_space *mapping,
BUG_ON(PageWriteback(page));
- /*
- * Can we merge this page to current extent?
- */
if (mpd->next_page != page->index) {
/*
- * Nope, we can't. So, we map
- * non-allocated blocks and start IO
- * on them
- */
- if (mpd->next_page != mpd->first_page) {
- mpage_da_map_and_submit(mpd);
- /*
- * skip rest of the page in the page_vec
- */
- unlock_page(page);
- goto ret_extent_tail;
- }
-
- /*
* Start next extent of pages and blocks
*/
mpd->first_page = page->index;