From mboxrd@z Thu Jan 1 00:00:00 1970 From: Badari Pulavarty Subject: [RFC] ext3 writepages for writeback mode Date: 10 Feb 2005 17:31:33 -0800 Message-ID: <1108085493.20053.1191.camel@dyn318077bld.beaverton.ibm.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-wfXsrT00Mnv2Z82yB51b" Cc: sct@redhat.com, Andrew Morton To: ext2-devel , linux-fsdevel@vger.kernel.org Sender: ext2-devel-admin@lists.sourceforge.net Errors-To: ext2-devel-admin@lists.sourceforge.net List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , List-Archive: List-Id: linux-fsdevel.vger.kernel.org --=-wfXsrT00Mnv2Z82yB51b Content-Type: text/plain Content-Transfer-Encoding: 7bit Hi, Here is my first cut at adding writepages() support for ext3 writeback mode. I have not done any performance analysis on the patch, so try it at your own risk. Please let me know, if I am completely off or its a stupid idea. Thanks, Badari --=-wfXsrT00Mnv2Z82yB51b Content-Disposition: attachment; filename=ext3-writeback-writepages.patch Content-Type: text/plain; name=ext3-writeback-writepages.patch; charset=UTF-8 Content-Transfer-Encoding: 7bit --- linux-2.6.10.org/fs/ext3/inode.c 2004-12-06 11:45:49.000000000 -0800 +++ linux-2.6.10/fs/ext3/inode.c 2005-02-10 18:14:17.987263744 -0800 @@ -856,6 +856,12 @@ 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 */ @@ -1321,6 +1327,37 @@ return ret; } +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); + + /* + * 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) { @@ -1552,6 +1589,7 @@ .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, --=-wfXsrT00Mnv2Z82yB51b-- ------------------------------------------------------- SF email is sponsored by - The IT Product Guide Read honest & candid reviews on hundreds of IT Products from real users. Discover which products truly live up to the hype. Start reading now. http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click