Commit 20970ba6 authored by Theodore Ts'o's avatar Theodore Ts'o

ext4: use ext4_da_writepages() for all modes

Rename ext4_da_writepages() to ext4_writepages() and use it for all
modes.  We still need to iterate over all the pages in the case of
data=journalling, but in the case of nodelalloc/data=ordered (which is
what file systems mounted using ext3 backwards compatibility will use)
this will allow us to use a much more efficient I/O submission path.
Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
parent f4afb4f4
...@@ -1799,7 +1799,7 @@ static int __ext4_journalled_writepage(struct page *page, ...@@ -1799,7 +1799,7 @@ static int __ext4_journalled_writepage(struct page *page,
* lock so we have to do some magic. * lock so we have to do some magic.
* *
* This function can get called via... * This function can get called via...
* - ext4_da_writepages after taking page lock (have journal handle) * - ext4_writepages after taking page lock (have journal handle)
* - journal_submit_inode_data_buffers (no journal handle) * - journal_submit_inode_data_buffers (no journal handle)
* - shrink_page_list via the kswapd/direct reclaim (no journal handle) * - shrink_page_list via the kswapd/direct reclaim (no journal handle)
* - grab_page_cache when doing write_begin (have journal handle) * - grab_page_cache when doing write_begin (have journal handle)
...@@ -2217,7 +2217,7 @@ static int mpage_map_and_submit_extent(handle_t *handle, ...@@ -2217,7 +2217,7 @@ static int mpage_map_and_submit_extent(handle_t *handle,
/* /*
* Calculate the total number of credits to reserve for one writepages * Calculate the total number of credits to reserve for one writepages
* iteration. This is called from ext4_da_writepages(). We map an extent of * iteration. This is called from ext4_writepages(). We map an extent of
* upto MAX_WRITEPAGES_EXTENT_LEN blocks and then we go on and finish mapping * upto MAX_WRITEPAGES_EXTENT_LEN blocks and then we go on and finish mapping
* the last partial page. So in total we can map MAX_WRITEPAGES_EXTENT_LEN + * the last partial page. So in total we can map MAX_WRITEPAGES_EXTENT_LEN +
* bpp - 1 blocks in bpp different extents. * bpp - 1 blocks in bpp different extents.
...@@ -2349,8 +2349,17 @@ static int mpage_prepare_extent_to_map(struct mpage_da_data *mpd) ...@@ -2349,8 +2349,17 @@ static int mpage_prepare_extent_to_map(struct mpage_da_data *mpd)
return err; return err;
} }
static int ext4_da_writepages(struct address_space *mapping, static int __writepage(struct page *page, struct writeback_control *wbc,
struct writeback_control *wbc) void *data)
{
struct address_space *mapping = data;
int ret = ext4_writepage(page, wbc);
mapping_set_error(mapping, ret);
return ret;
}
static int ext4_writepages(struct address_space *mapping,
struct writeback_control *wbc)
{ {
pgoff_t writeback_index = 0; pgoff_t writeback_index = 0;
long nr_to_write = wbc->nr_to_write; long nr_to_write = wbc->nr_to_write;
...@@ -2364,7 +2373,7 @@ static int ext4_da_writepages(struct address_space *mapping, ...@@ -2364,7 +2373,7 @@ static int ext4_da_writepages(struct address_space *mapping,
bool done; bool done;
struct blk_plug plug; struct blk_plug plug;
trace_ext4_da_writepages(inode, wbc); trace_ext4_writepages(inode, wbc);
/* /*
* No pages to write? This is mainly a kludge to avoid starting * No pages to write? This is mainly a kludge to avoid starting
...@@ -2374,13 +2383,23 @@ static int ext4_da_writepages(struct address_space *mapping, ...@@ -2374,13 +2383,23 @@ static int ext4_da_writepages(struct address_space *mapping,
if (!mapping->nrpages || !mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) if (!mapping->nrpages || !mapping_tagged(mapping, PAGECACHE_TAG_DIRTY))
return 0; return 0;
if (ext4_should_journal_data(inode)) {
struct blk_plug plug;
int ret;
blk_start_plug(&plug);
ret = write_cache_pages(mapping, wbc, __writepage, mapping);
blk_finish_plug(&plug);
return ret;
}
/* /*
* If the filesystem has aborted, it is read-only, so return * If the filesystem has aborted, it is read-only, so return
* right away instead of dumping stack traces later on that * right away instead of dumping stack traces later on that
* will obscure the real source of the problem. We test * will obscure the real source of the problem. We test
* EXT4_MF_FS_ABORTED instead of sb->s_flag's MS_RDONLY because * EXT4_MF_FS_ABORTED instead of sb->s_flag's MS_RDONLY because
* the latter could be true if the filesystem is mounted * the latter could be true if the filesystem is mounted
* read-only, and in that case, ext4_da_writepages should * read-only, and in that case, ext4_writepages should
* *never* be called, so if that ever happens, we would want * *never* be called, so if that ever happens, we would want
* the stack trace. * the stack trace.
*/ */
...@@ -2520,8 +2539,8 @@ static int ext4_da_writepages(struct address_space *mapping, ...@@ -2520,8 +2539,8 @@ static int ext4_da_writepages(struct address_space *mapping,
mapping->writeback_index = mpd.first_page; mapping->writeback_index = mpd.first_page;
out_writepages: out_writepages:
trace_ext4_da_writepages_result(inode, wbc, ret, trace_ext4_writepages_result(inode, wbc, ret,
nr_to_write - wbc->nr_to_write); nr_to_write - wbc->nr_to_write);
return ret; return ret;
} }
...@@ -2769,7 +2788,7 @@ int ext4_alloc_da_blocks(struct inode *inode) ...@@ -2769,7 +2788,7 @@ int ext4_alloc_da_blocks(struct inode *inode)
* laptop_mode, not even desirable). However, to do otherwise * laptop_mode, not even desirable). However, to do otherwise
* would require replicating code paths in: * would require replicating code paths in:
* *
* ext4_da_writepages() -> * ext4_writepages() ->
* write_cache_pages() ---> (via passed in callback function) * write_cache_pages() ---> (via passed in callback function)
* __mpage_da_writepage() --> * __mpage_da_writepage() -->
* mpage_add_bh_to_extent() * mpage_add_bh_to_extent()
...@@ -3213,6 +3232,7 @@ static const struct address_space_operations ext4_aops = { ...@@ -3213,6 +3232,7 @@ static const struct address_space_operations ext4_aops = {
.readpage = ext4_readpage, .readpage = ext4_readpage,
.readpages = ext4_readpages, .readpages = ext4_readpages,
.writepage = ext4_writepage, .writepage = ext4_writepage,
.writepages = ext4_writepages,
.write_begin = ext4_write_begin, .write_begin = ext4_write_begin,
.write_end = ext4_write_end, .write_end = ext4_write_end,
.bmap = ext4_bmap, .bmap = ext4_bmap,
...@@ -3228,6 +3248,7 @@ static const struct address_space_operations ext4_journalled_aops = { ...@@ -3228,6 +3248,7 @@ static const struct address_space_operations ext4_journalled_aops = {
.readpage = ext4_readpage, .readpage = ext4_readpage,
.readpages = ext4_readpages, .readpages = ext4_readpages,
.writepage = ext4_writepage, .writepage = ext4_writepage,
.writepages = ext4_writepages,
.write_begin = ext4_write_begin, .write_begin = ext4_write_begin,
.write_end = ext4_journalled_write_end, .write_end = ext4_journalled_write_end,
.set_page_dirty = ext4_journalled_set_page_dirty, .set_page_dirty = ext4_journalled_set_page_dirty,
...@@ -3243,7 +3264,7 @@ static const struct address_space_operations ext4_da_aops = { ...@@ -3243,7 +3264,7 @@ static const struct address_space_operations ext4_da_aops = {
.readpage = ext4_readpage, .readpage = ext4_readpage,
.readpages = ext4_readpages, .readpages = ext4_readpages,
.writepage = ext4_writepage, .writepage = ext4_writepage,
.writepages = ext4_da_writepages, .writepages = ext4_writepages,
.write_begin = ext4_da_write_begin, .write_begin = ext4_da_write_begin,
.write_end = ext4_da_write_end, .write_end = ext4_da_write_end,
.bmap = ext4_bmap, .bmap = ext4_bmap,
......
...@@ -281,7 +281,7 @@ DEFINE_EVENT(ext4__write_end, ext4_da_write_end, ...@@ -281,7 +281,7 @@ DEFINE_EVENT(ext4__write_end, ext4_da_write_end,
TP_ARGS(inode, pos, len, copied) TP_ARGS(inode, pos, len, copied)
); );
TRACE_EVENT(ext4_da_writepages, TRACE_EVENT(ext4_writepages,
TP_PROTO(struct inode *inode, struct writeback_control *wbc), TP_PROTO(struct inode *inode, struct writeback_control *wbc),
TP_ARGS(inode, wbc), TP_ARGS(inode, wbc),
...@@ -379,7 +379,7 @@ TRACE_EVENT(ext4_da_write_pages_extent, ...@@ -379,7 +379,7 @@ TRACE_EVENT(ext4_da_write_pages_extent,
__entry->flags) __entry->flags)
); );
TRACE_EVENT(ext4_da_writepages_result, TRACE_EVENT(ext4_writepages_result,
TP_PROTO(struct inode *inode, struct writeback_control *wbc, TP_PROTO(struct inode *inode, struct writeback_control *wbc,
int ret, int pages_written), int ret, int pages_written),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment