
From: Badari Pulavarty <pbadari@us.ibm.com>

Add writepages support for ext3 writeback mode.

Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 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)
_
