+static int gfs2_writepage(struct page *page, struct writeback_control *wbc)Will above "|| !offset" unconditionally drop the page if the file size happens to be multiples of PAGE_CACHE_SIZE ? Maybe this truncate handling should be removed to let block_write_full_page() handle all the cases ?
+{
+ struct inode *inode = page->mapping->host;
+ struct gfs2_inode *ip = page->mapping->host->u.generic_ip;
+ struct gfs2_sbd *sdp = ip->i_sbd;
+ loff_t i_size = i_size_read(inode);
+ pgoff_t end_index = i_size >> PAGE_CACHE_SHIFT;
+ unsigned offset;
+ int error;
+ int done_trans = 0;
+
+ if (gfs2_assert_withdraw(sdp, gfs2_glock_is_held_excl(ip->i_gl))) {
+ unlock_page(page);
+ return -EIO;
+ }
+ if (current->journal_info)
+ goto out_ignore;
+
+ /* Is the page fully outside i_size? (truncate in progress) */
+ offset = i_size & (PAGE_CACHE_SIZE-1);
+ if (page->index >= end_index+1 || !offset) {
+ page->mapping->a_ops->invalidatepage(page, 0);
+ unlock_page(page);
+ return 0; /* don't care */
+ }
+ error = block_write_full_page(page, get_block_noalloc, wbc);-- Wendy
+ if (done_trans)
+ gfs2_trans_end(sdp);
+ gfs2_meta_cache_flush(ip);
+ return error;
+
+out_ignore:
+ redirty_page_for_writepage(wbc, page);
+ unlock_page(page);
+ return 0;
+}
+