diff options
author | Jaegeuk Kim <jaegeuk.kim@samsung.com> | 2013-06-07 22:08:23 +0900 |
---|---|---|
committer | Ziyan <jaraidaniel@gmail.com> | 2015-05-02 14:34:42 +0200 |
commit | 7d32fe6b0986dbc584c91a9a72af44dc7fed34e6 (patch) | |
tree | 99db2f9f91098ddbb2edc404f5553045bf6b2d8d /fs/f2fs/data.c | |
parent | 5519c838963d67ef1dfc2bbbe14336638e2bbbb9 (diff) | |
download | kernel_samsung_tuna-7d32fe6b0986dbc584c91a9a72af44dc7fed34e6.zip kernel_samsung_tuna-7d32fe6b0986dbc584c91a9a72af44dc7fed34e6.tar.gz kernel_samsung_tuna-7d32fe6b0986dbc584c91a9a72af44dc7fed34e6.tar.bz2 |
f2fs: sync dir->i_size with its block allocation
If new dentry block is allocated and its i_size is updated, we should update
its inode block together in order to sync i_size and its block allocation.
Otherwise, we can loose additional dentry block due to the unconsistent i_size.
Errorneous Scenario
-------------------
In the recovery routine,
- recovery_dentry
| - __f2fs_add_link
| | - get_new_data_page
| | | - i_size_write(new_i_size)
| | | - mark_inode_dirty_sync(dir)
| | - update_parent_metadata
| | | - mark_inode_dirty(dir)
|
- write_checkpoint
- sync_dirty_dir_inodes
- filemap_flush(dentry_blocks)
- f2fs_write_data_page
- skip to write the last dentry block due to index < i_size
In the above flow, new_i_size is not updated to its inode block so that the
last dentry block will be lost accordingly.
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
Diffstat (limited to 'fs/f2fs/data.c')
-rw-r--r-- | fs/f2fs/data.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 859d508..8e45e70 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -338,6 +338,8 @@ repeat: if (new_i_size && i_size_read(inode) < ((index + 1) << PAGE_CACHE_SHIFT)) { i_size_write(inode, ((index + 1) << PAGE_CACHE_SHIFT)); + /* Only the directory inode sets new_i_size */ + set_inode_flag(F2FS_I(inode), FI_UPDATE_DIR); mark_inode_dirty_sync(inode); } return page; |