ocfs2: add some missing address space callbacks

Under load, OCFS2 would crash in invalidate_inode_pages2_range() because
invalidate_complete_page2() was unable to invalidate a page. It would
appear that JBD is holding on to the page. ext3 has a specific
->releasepage() handler to cover this case.

Steal ext3's ->releasepage(), ->invalidatepage(), and ->migratepage(), as
they appear completely appropriate for OCFS2.

Signed-off-by: Joel Becker <joel.becker@oracle.com>
Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>

authored by Joel Becker and committed by Mark Fasheh 03f981cf e6c352db

+25 -1
+25 -1
fs/ocfs2/aops.c
··· 614 614 ocfs2_rw_unlock(inode, 0); 615 615 } 616 616 617 + /* 618 + * ocfs2_invalidatepage() and ocfs2_releasepage() are shamelessly stolen 619 + * from ext3. PageChecked() bits have been removed as OCFS2 does not 620 + * do journalled data. 621 + */ 622 + static void ocfs2_invalidatepage(struct page *page, unsigned long offset) 623 + { 624 + journal_t *journal = OCFS2_SB(page->mapping->host->i_sb)->journal->j_journal; 625 + 626 + journal_invalidatepage(journal, page, offset); 627 + } 628 + 629 + static int ocfs2_releasepage(struct page *page, gfp_t wait) 630 + { 631 + journal_t *journal = OCFS2_SB(page->mapping->host->i_sb)->journal->j_journal; 632 + 633 + if (!page_has_buffers(page)) 634 + return 0; 635 + return journal_try_to_free_buffers(journal, page, wait); 636 + } 637 + 617 638 static ssize_t ocfs2_direct_IO(int rw, 618 639 struct kiocb *iocb, 619 640 const struct iovec *iov, ··· 682 661 .commit_write = ocfs2_commit_write, 683 662 .bmap = ocfs2_bmap, 684 663 .sync_page = block_sync_page, 685 - .direct_IO = ocfs2_direct_IO 664 + .direct_IO = ocfs2_direct_IO, 665 + .invalidatepage = ocfs2_invalidatepage, 666 + .releasepage = ocfs2_releasepage, 667 + .migratepage = buffer_migrate_page, 686 668 };