Commit b964638f authored by Dave Kleikamp's avatar Dave Kleikamp

JFS: Fix multiple errors in metapage_releasepage

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: default avatarDave Kleikamp <shaggy@austin.ibm.com>
parent 387e2b04
...@@ -542,7 +542,7 @@ static int metapage_readpage(struct file *fp, struct page *page) ...@@ -542,7 +542,7 @@ static int metapage_readpage(struct file *fp, struct page *page)
static int metapage_releasepage(struct page *page, gfp_t gfp_mask) static int metapage_releasepage(struct page *page, gfp_t gfp_mask)
{ {
struct metapage *mp; struct metapage *mp;
int busy = 0; int ret = 1;
unsigned int offset; unsigned int offset;
for (offset = 0; offset < PAGE_CACHE_SIZE; offset += PSIZE) { for (offset = 0; offset < PAGE_CACHE_SIZE; offset += PSIZE) {
...@@ -552,30 +552,20 @@ static int metapage_releasepage(struct page *page, gfp_t gfp_mask) ...@@ -552,30 +552,20 @@ static int metapage_releasepage(struct page *page, gfp_t gfp_mask)
continue; continue;
jfs_info("metapage_releasepage: mp = 0x%p", mp); 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, jfs_info("count = %ld, nohomeok = %d", mp->count,
mp->nohomeok); mp->nohomeok);
busy = 1; ret = 0;
continue; 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) if (mp->lsn)
remove_from_logsync(mp); remove_from_logsync(mp);
remove_metapage(page, mp); remove_metapage(page, mp);
INCREMENT(mpStat.pagefree); INCREMENT(mpStat.pagefree);
free_metapage(mp); free_metapage(mp);
} }
if (busy) return ret;
return -1;
return 0;
} }
static void metapage_invalidatepage(struct page *page, unsigned long offset) static void metapage_invalidatepage(struct page *page, unsigned long offset)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment