diff options
Diffstat (limited to 'fs/ext4/inode.c')
-rw-r--r-- | fs/ext4/inode.c | 27 |
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; |