From: Chris Wright Date: Mon, 19 Jun 2006 19:19:30 +0000 (-0700) Subject: jfs metapage_releasepage fixes, fwd from Chuck Ebbert X-Git-Tag: v2.6.16.21~13 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=45a88ca89568ad1f8147e62c6bc83e71cd7ecf3c;p=thirdparty%2Fkernel%2Fstable-queue.git jfs metapage_releasepage fixes, fwd from Chuck Ebbert --- diff --git a/queue-2.6.16/jfs-fix-multiple-errors-in-metapage_releasepage.patch b/queue-2.6.16/jfs-fix-multiple-errors-in-metapage_releasepage.patch new file mode 100644 index 00000000000..47cd5c70dc6 --- /dev/null +++ b/queue-2.6.16/jfs-fix-multiple-errors-in-metapage_releasepage.patch @@ -0,0 +1,74 @@ +From stable-bounces@linux.kernel.org Tue Jun 6 20:00:50 2006 +Date: Tue, 6 Jun 2006 22:54:44 -0400 +From: Chuck Ebbert <76306.1226@compuserve.com> +To: linux-stable +Cc: Dave Kleikamp +Subject: JFS: Fix multiple errors in metapage_releasepage + +From: Dave Kleikamp + +It looks like metapage_releasepage was making in invalid assumption that +the releasepage method would not be called on a dirty page. Instead of +issuing a warning and releasing the metapage, it should return 0, indicating +that the private data for the page cannot be released. + +I also realized that metapage_releasepage had the return code all wrong. If +it is successful in releasing the private data, it should return 1, otherwise +it needs to return 0. + +Lastly, there is no need to call wait_on_page_writeback, since +try_to_release_page will not call us with a page in writback state. + +Signed-off-by: Dave Kleikamp +Signed-off-by: Chris Wright +--- + + fs/jfs/jfs_metapage.c | 20 +++++--------------- + 1 file changed, 5 insertions(+), 15 deletions(-) + +--- linux-2.6.16.20.orig/fs/jfs/jfs_metapage.c ++++ linux-2.6.16.20/fs/jfs/jfs_metapage.c +@@ -543,7 +543,7 @@ add_failed: + static int metapage_releasepage(struct page *page, gfp_t gfp_mask) + { + struct metapage *mp; +- int busy = 0; ++ int ret = 1; + unsigned int offset; + + for (offset = 0; offset < PAGE_CACHE_SIZE; offset += PSIZE) { +@@ -553,30 +553,20 @@ static int metapage_releasepage(struct p + continue; + + jfs_info("metapage_releasepage: mp = 0x%p", mp); +- if (mp->count || mp->nohomeok) { ++ if (mp->count || mp->nohomeok || ++ test_bit(META_dirty, &mp->flag)) { + jfs_info("count = %ld, nohomeok = %d", mp->count, + mp->nohomeok); +- busy = 1; ++ ret = 0; + continue; + } +- wait_on_page_writeback(page); +- //WARN_ON(test_bit(META_dirty, &mp->flag)); +- if (test_bit(META_dirty, &mp->flag)) { +- dump_mem("dirty mp in metapage_releasepage", mp, +- sizeof(struct metapage)); +- dump_mem("page", page, sizeof(struct page)); +- dump_stack(); +- } + if (mp->lsn) + remove_from_logsync(mp); + remove_metapage(page, mp); + INCREMENT(mpStat.pagefree); + free_metapage(mp); + } +- if (busy) +- return -1; +- +- return 0; ++ return ret; + } + + static int metapage_invalidatepage(struct page *page, unsigned long offset) diff --git a/queue-2.6.16/series b/queue-2.6.16/series index ed2de98304c..4ab489b303b 100644 --- a/queue-2.6.16/series +++ b/queue-2.6.16/series @@ -6,3 +6,4 @@ missed-error-checking-for-intent-s-filp-in-open_namei.patch tmpfs-time-granularity-fix-for-time-going-backwards.patch serial-parport_serial-should-depend-on-serial_8250_pci.patch fs-namei.c-call-to-file_permission-under-a-spinlock-in-do_lookup_path.patch +jfs-fix-multiple-errors-in-metapage_releasepage.patch