|
@@ -2241,47 +2241,6 @@ static int __mpage_da_writepage(struct page *page,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * mpage_da_writepages - walk the list of dirty pages of the given
|
|
|
- * address space, allocates non-allocated blocks, maps newly-allocated
|
|
|
- * blocks to existing bhs and issue IO them
|
|
|
- *
|
|
|
- * @mapping: address space structure to write
|
|
|
- * @wbc: subtract the number of written pages from *@wbc->nr_to_write
|
|
|
- *
|
|
|
- * This is a library function, which implements the writepages()
|
|
|
- * address_space_operation.
|
|
|
- */
|
|
|
-static int mpage_da_writepages(struct address_space *mapping,
|
|
|
- struct writeback_control *wbc,
|
|
|
- struct mpage_da_data *mpd)
|
|
|
-{
|
|
|
- int ret;
|
|
|
-
|
|
|
- mpd->b_size = 0;
|
|
|
- mpd->b_state = 0;
|
|
|
- mpd->b_blocknr = 0;
|
|
|
- mpd->first_page = 0;
|
|
|
- mpd->next_page = 0;
|
|
|
- mpd->io_done = 0;
|
|
|
- mpd->pages_written = 0;
|
|
|
- mpd->retval = 0;
|
|
|
-
|
|
|
- ret = write_cache_pages(mapping, wbc, __mpage_da_writepage, mpd);
|
|
|
- /*
|
|
|
- * Handle last extent of pages
|
|
|
- */
|
|
|
- if (!mpd->io_done && mpd->next_page != mpd->first_page) {
|
|
|
- if (mpage_da_map_blocks(mpd) == 0)
|
|
|
- mpage_da_submit_io(mpd);
|
|
|
-
|
|
|
- mpd->io_done = 1;
|
|
|
- ret = MPAGE_DA_EXTENT_TAIL;
|
|
|
- }
|
|
|
- wbc->nr_to_write -= mpd->pages_written;
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
* this is a special callback for ->write_begin() only
|
|
|
* it's intention is to return mapped block or reserve space
|
|
@@ -2571,7 +2530,38 @@ retry:
|
|
|
dump_stack();
|
|
|
goto out_writepages;
|
|
|
}
|
|
|
- ret = mpage_da_writepages(mapping, wbc, &mpd);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Now call __mpage_da_writepage to find the next
|
|
|
+ * contiguous region of logical blocks that need
|
|
|
+ * blocks to be allocated by ext4. We don't actually
|
|
|
+ * submit the blocks for I/O here, even though
|
|
|
+ * write_cache_pages thinks it will, and will set the
|
|
|
+ * pages as clean for write before calling
|
|
|
+ * __mpage_da_writepage().
|
|
|
+ */
|
|
|
+ mpd.b_size = 0;
|
|
|
+ mpd.b_state = 0;
|
|
|
+ mpd.b_blocknr = 0;
|
|
|
+ mpd.first_page = 0;
|
|
|
+ mpd.next_page = 0;
|
|
|
+ mpd.io_done = 0;
|
|
|
+ mpd.pages_written = 0;
|
|
|
+ mpd.retval = 0;
|
|
|
+ ret = write_cache_pages(mapping, wbc, __mpage_da_writepage,
|
|
|
+ &mpd);
|
|
|
+ /*
|
|
|
+ * If we have a contigous extent of pages and we
|
|
|
+ * haven't done the I/O yet, map the blocks and submit
|
|
|
+ * them for I/O.
|
|
|
+ */
|
|
|
+ if (!mpd.io_done && mpd.next_page != mpd.first_page) {
|
|
|
+ if (mpage_da_map_blocks(&mpd) == 0)
|
|
|
+ mpage_da_submit_io(&mpd);
|
|
|
+ mpd.io_done = 1;
|
|
|
+ ret = MPAGE_DA_EXTENT_TAIL;
|
|
|
+ }
|
|
|
+ wbc->nr_to_write -= mpd.pages_written;
|
|
|
|
|
|
ext4_journal_stop(handle);
|
|
|
|