diff options
Diffstat (limited to 'patches.tizen/0505-f2fs-fix-to-recover-i_size-from-roll-forward.patch')
-rw-r--r-- | patches.tizen/0505-f2fs-fix-to-recover-i_size-from-roll-forward.patch | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/patches.tizen/0505-f2fs-fix-to-recover-i_size-from-roll-forward.patch b/patches.tizen/0505-f2fs-fix-to-recover-i_size-from-roll-forward.patch new file mode 100644 index 00000000000..653e75b041e --- /dev/null +++ b/patches.tizen/0505-f2fs-fix-to-recover-i_size-from-roll-forward.patch @@ -0,0 +1,66 @@ +From 95343ae0fa57314b14d5386af6e561b63e942753 Mon Sep 17 00:00:00 2001 +From: Jaegeuk Kim <jaegeuk.kim@samsung.com> +Date: Thu, 27 Jun 2013 13:04:08 +0900 +Subject: [PATCH 0505/1302] 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> +Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com> +--- + fs/f2fs/data.c | 23 ++++++++++++++++++++++- + 1 file changed, 22 insertions(+), 1 deletion(-) + +diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c +index 6d4a743..e88f46f 100644 +--- a/fs/f2fs/data.c ++++ b/fs/f2fs/data.c +@@ -701,6 +701,27 @@ err: + return err; + } + ++static int f2fs_write_end(struct file *file, ++ struct address_space *mapping, ++ loff_t pos, unsigned len, unsigned copied, ++ struct page *page, void *fsdata) ++{ ++ struct inode *inode = page->mapping->host; ++ ++ SetPageUptodate(page); ++ set_page_dirty(page); ++ ++ if (pos + copied > i_size_read(inode)) { ++ i_size_write(inode, pos + copied); ++ mark_inode_dirty(inode); ++ update_inode_page(inode); ++ } ++ ++ unlock_page(page); ++ page_cache_release(page); ++ return copied; ++} ++ + static ssize_t f2fs_direct_IO(int rw, struct kiocb *iocb, + const struct iovec *iov, loff_t offset, unsigned long nr_segs) + { +@@ -757,7 +778,7 @@ const struct address_space_operations f2fs_dblock_aops = { + .writepage = f2fs_write_data_page, + .writepages = f2fs_write_data_pages, + .write_begin = f2fs_write_begin, +- .write_end = nobh_write_end, ++ .write_end = f2fs_write_end, + .set_page_dirty = f2fs_set_data_page_dirty, + .invalidatepage = f2fs_invalidate_data_page, + .releasepage = f2fs_release_data_page, +-- +1.8.3.2 + |