aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorJaegeuk Kim <jaegeuk.kim@samsung.com>2013-06-27 00:04:08 -0400
committerJaegeuk Kim <jaegeuk.kim@samsung.com>2013-07-01 19:48:16 -0400
commita1dd3c13ce65b726fddfe72b9d2f1009db983ce6 (patch)
tree19bb400f51389da870b4f3bcbfa05e7dd2d97f23 /fs
parent5ebefc5b409a194a09da7ad1962b4bfce10a6859 (diff)
f2fs: fix to recover i_size from roll-forward
If user requests many data writes and fsync together, the last updated i_size should be stored to the inode block consistently. But, previous write_end just marks the inode as dirty and doesn't update its metadata into its inode block. After that, fsync just writes the inode block with newly updated data index excluding inode metadata updates. So, this patch introduces write_end in which updates inode block too when the i_size is changed. Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/f2fs/data.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index 6d4a743caf86..e88f46f122aa 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -701,6 +701,27 @@ err:
701 return err; 701 return err;
702} 702}
703 703
704static int f2fs_write_end(struct file *file,
705 struct address_space *mapping,
706 loff_t pos, unsigned len, unsigned copied,
707 struct page *page, void *fsdata)
708{
709 struct inode *inode = page->mapping->host;
710
711 SetPageUptodate(page);
712 set_page_dirty(page);
713
714 if (pos + copied > i_size_read(inode)) {
715 i_size_write(inode, pos + copied);
716 mark_inode_dirty(inode);
717 update_inode_page(inode);
718 }
719
720 unlock_page(page);
721 page_cache_release(page);
722 return copied;
723}
724
704static ssize_t f2fs_direct_IO(int rw, struct kiocb *iocb, 725static ssize_t f2fs_direct_IO(int rw, struct kiocb *iocb,
705 const struct iovec *iov, loff_t offset, unsigned long nr_segs) 726 const struct iovec *iov, loff_t offset, unsigned long nr_segs)
706{ 727{
@@ -757,7 +778,7 @@ const struct address_space_operations f2fs_dblock_aops = {
757 .writepage = f2fs_write_data_page, 778 .writepage = f2fs_write_data_page,
758 .writepages = f2fs_write_data_pages, 779 .writepages = f2fs_write_data_pages,
759 .write_begin = f2fs_write_begin, 780 .write_begin = f2fs_write_begin,
760 .write_end = nobh_write_end, 781 .write_end = f2fs_write_end,
761 .set_page_dirty = f2fs_set_data_page_dirty, 782 .set_page_dirty = f2fs_set_data_page_dirty,
762 .invalidatepage = f2fs_invalidate_data_page, 783 .invalidatepage = f2fs_invalidate_data_page,
763 .releasepage = f2fs_release_data_page, 784 .releasepage = f2fs_release_data_page,