summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Morton <akpm@osdl.org>2005-05-05 16:16:02 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-05-05 16:36:44 -0700
commitd17d7fa44dbe1f12031773e27eda9e939024a037 (patch)
tree4b2a8ebb60907a5cde4dd02b737851525a24a588
parentecffdde68ebefa1aa24411a91b12ae649f71f71c (diff)
downloadop-kernel-dev-d17d7fa44dbe1f12031773e27eda9e939024a037.zip
op-kernel-dev-d17d7fa44dbe1f12031773e27eda9e939024a037.tar.gz
[PATCH] revert ext3-writepages-support-for-writeback-mode
This had a fatal lock ranking bug: we do journal_start outside mpage_writepages()'s lock_page(). Revert the whole thing, think again. Credit-to: Jan Kara <jack@suse.cz> For identifying the bug. Cc: Badari Pulavarty <pbadari@us.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--fs/ext3/inode.c46
-rw-r--r--fs/mpage.c12
-rw-r--r--include/linux/mpage.h3
3 files changed, 1 insertions, 60 deletions
diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c
index ea58886..0d5fa73 100644
--- a/fs/ext3/inode.c
+++ b/fs/ext3/inode.c
@@ -844,12 +844,6 @@ 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,45 +1317,6 @@ 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)
{
@@ -1599,7 +1554,6 @@ static struct address_space_operations ext3_writeback_aops = {
.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 --git a/fs/mpage.c b/fs/mpage.c
index 32c7c8f..68db525 100644
--- a/fs/mpage.c
+++ b/fs/mpage.c
@@ -627,15 +627,6 @@ 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;
@@ -725,7 +716,7 @@ retry:
} else {
bio = __mpage_writepage(bio, page, get_block,
&last_block_in_bio, &ret, wbc,
- writepage_fn);
+ page->mapping->a_ops->writepage);
}
if (unlikely(ret == WRITEPAGE_ACTIVATE))
unlock_page(page);
@@ -755,7 +746,6 @@ 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 --git a/include/linux/mpage.h b/include/linux/mpage.h
index dea1b00..3ca8804 100644
--- a/include/linux/mpage.h
+++ b/include/linux/mpage.h
@@ -20,9 +20,6 @@ int mpage_writepages(struct address_space *mapping,
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)
OpenPOWER on IntegriCloud