aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext2/inode.c
diff options
context:
space:
mode:
authorNick Piggin <npiggin@suse.de>2007-10-16 04:25:25 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-10-16 12:42:58 -0400
commit03158cd7eb3374843de68421142ca5900df845d9 (patch)
tree5e1bfc1f981651e7f7d7cf30afd15d7bd96b2a57 /fs/ext2/inode.c
parentb6af1bcd8720cb3062c8c4d4c8ba02bee10ff03f (diff)
fs: restore nobh
Implement nobh in new aops. This is a bit tricky. FWIW, nobh_truncate is now implemented in a way that does not create blocks in sparse regions, which is a silly thing for it to have been doing (isn't it?) ext2 survives fsx and fsstress. jfs is converted as well... ext3 should be easy to do (but not done yet). [akpm@linux-foundation.org: coding-style fixes] Cc: Badari Pulavarty <pbadari@us.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/ext2/inode.c')
-rw-r--r--fs/ext2/inode.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c
index 63ab02aa4c52..1b102a1ccebb 100644
--- a/fs/ext2/inode.c
+++ b/fs/ext2/inode.c
@@ -659,6 +659,20 @@ ext2_write_begin(struct file *file, struct address_space *mapping,
659 return __ext2_write_begin(file, mapping, pos, len, flags, pagep,fsdata); 659 return __ext2_write_begin(file, mapping, pos, len, flags, pagep,fsdata);
660} 660}
661 661
662static int
663ext2_nobh_write_begin(struct file *file, struct address_space *mapping,
664 loff_t pos, unsigned len, unsigned flags,
665 struct page **pagep, void **fsdata)
666{
667 /*
668 * Dir-in-pagecache still uses ext2_write_begin. Would have to rework
669 * directory handling code to pass around offsets rather than struct
670 * pages in order to make this work easily.
671 */
672 return nobh_write_begin(file, mapping, pos, len, flags, pagep, fsdata,
673 ext2_get_block);
674}
675
662static int ext2_nobh_writepage(struct page *page, 676static int ext2_nobh_writepage(struct page *page,
663 struct writeback_control *wbc) 677 struct writeback_control *wbc)
664{ 678{
@@ -710,7 +724,8 @@ const struct address_space_operations ext2_nobh_aops = {
710 .readpages = ext2_readpages, 724 .readpages = ext2_readpages,
711 .writepage = ext2_nobh_writepage, 725 .writepage = ext2_nobh_writepage,
712 .sync_page = block_sync_page, 726 .sync_page = block_sync_page,
713 /* XXX: todo */ 727 .write_begin = ext2_nobh_write_begin,
728 .write_end = nobh_write_end,
714 .bmap = ext2_bmap, 729 .bmap = ext2_bmap,
715 .direct_IO = ext2_direct_IO, 730 .direct_IO = ext2_direct_IO,
716 .writepages = ext2_writepages, 731 .writepages = ext2_writepages,
@@ -927,7 +942,8 @@ void ext2_truncate (struct inode * inode)
927 if (mapping_is_xip(inode->i_mapping)) 942 if (mapping_is_xip(inode->i_mapping))
928 xip_truncate_page(inode->i_mapping, inode->i_size); 943 xip_truncate_page(inode->i_mapping, inode->i_size);
929 else if (test_opt(inode->i_sb, NOBH)) 944 else if (test_opt(inode->i_sb, NOBH))
930 nobh_truncate_page(inode->i_mapping, inode->i_size); 945 nobh_truncate_page(inode->i_mapping,
946 inode->i_size, ext2_get_block);
931 else 947 else
932 block_truncate_page(inode->i_mapping, 948 block_truncate_page(inode->i_mapping,
933 inode->i_size, ext2_get_block); 949 inode->i_size, ext2_get_block);