From: Badari Pulavarty Add writepages support for ext3 writeback mode. Signed-off-by: Andrew Morton --- 25-akpm/fs/ext3/inode.c | 46 ++++++++++++++++++++++++++++++++++++++++++ 25-akpm/fs/mpage.c | 12 ++++++++++ 25-akpm/include/linux/mpage.h | 3 ++ 3 files changed, 60 insertions(+), 1 deletion(-) diff -puN fs/ext3/inode.c~ext3-writepages-support-for-writeback-mode fs/ext3/inode.c --- 25/fs/ext3/inode.c~ext3-writepages-support-for-writeback-mode Fri Mar 4 16:57:43 2005 +++ 25-akpm/fs/ext3/inode.c Fri Mar 4 16:57:43 2005 @@ -858,6 +858,12 @@ get_block: return ret; } +static int ext3_writepages_get_block(struct inode *inode, sector_t iblock, + struct buffer_head *bh, int create) +{ + return ext3_direct_io_get_blocks(inode, iblock, 1, bh, create); +} + /* * `handle' can be NULL if create is zero */ @@ -1323,6 +1329,45 @@ out_fail: return ret; } +static int +ext3_writeback_writepage_helper(struct page *page, + struct writeback_control *wbc) +{ + return block_write_full_page(page, ext3_get_block, wbc); +} + +static int +ext3_writeback_writepages(struct address_space *mapping, + struct writeback_control *wbc) +{ + struct inode *inode = mapping->host; + handle_t *handle = NULL; + int err, ret = 0; + + if (!mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) + return ret; + + handle = ext3_journal_start(inode, ext3_writepage_trans_blocks(inode)); + if (IS_ERR(handle)) { + ret = PTR_ERR(handle); + return ret; + } + + ret = __mpage_writepages(mapping, wbc, ext3_writepages_get_block, + ext3_writeback_writepage_helper); + + /* + * Need to reaquire the handle since ext3_writepages_get_block() + * can restart the handle + */ + handle = journal_current_handle(); + + err = ext3_journal_stop(handle); + if (!ret) + ret = err; + return ret; +} + static int ext3_writeback_writepage(struct page *page, struct writeback_control *wbc) { @@ -1554,6 +1599,7 @@ static struct address_space_operations e .readpage = ext3_readpage, .readpages = ext3_readpages, .writepage = ext3_writeback_writepage, + .writepages = ext3_writeback_writepages, .sync_page = block_sync_page, .prepare_write = ext3_prepare_write, .commit_write = ext3_writeback_commit_write, diff -puN fs/mpage.c~ext3-writepages-support-for-writeback-mode fs/mpage.c --- 25/fs/mpage.c~ext3-writepages-support-for-writeback-mode Fri Mar 4 16:57:43 2005 +++ 25-akpm/fs/mpage.c Fri Mar 4 16:57:43 2005 @@ -626,6 +626,15 @@ int mpage_writepages(struct address_space *mapping, struct writeback_control *wbc, get_block_t get_block) { + return __mpage_writepages(mapping, wbc, get_block, + mapping->a_ops->writepage); +} + +int +__mpage_writepages(struct address_space *mapping, + struct writeback_control *wbc, get_block_t get_block, + writepage_t writepage_fn) +{ struct backing_dev_info *bdi = mapping->backing_dev_info; struct bio *bio = NULL; sector_t last_block_in_bio = 0; @@ -715,7 +724,7 @@ retry: } else { bio = __mpage_writepage(bio, page, get_block, &last_block_in_bio, &ret, wbc, - page->mapping->a_ops->writepage); + writepage_fn); } if (ret || (--(wbc->nr_to_write) <= 0)) done = 1; @@ -743,6 +752,7 @@ retry: return ret; } EXPORT_SYMBOL(mpage_writepages); +EXPORT_SYMBOL(__mpage_writepages); int mpage_writepage(struct page *page, get_block_t get_block, struct writeback_control *wbc) diff -puN include/linux/mpage.h~ext3-writepages-support-for-writeback-mode include/linux/mpage.h --- 25/include/linux/mpage.h~ext3-writepages-support-for-writeback-mode Fri Mar 4 16:57:43 2005 +++ 25-akpm/include/linux/mpage.h Fri Mar 4 16:57:43 2005 @@ -20,6 +20,9 @@ int mpage_writepages(struct address_spac struct writeback_control *wbc, get_block_t get_block); int mpage_writepage(struct page *page, get_block_t *get_block, struct writeback_control *wbc); +int __mpage_writepages(struct address_space *mapping, + struct writeback_control *wbc, get_block_t get_block, + writepage_t writepage); static inline int generic_writepages(struct address_space *mapping, struct writeback_control *wbc) _