diff options
author | Jaegeuk Kim <jaegeuk@kernel.org> | 2017-04-11 19:01:26 -0700 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2017-04-12 12:57:06 -0700 |
commit | 9bb02c3627f46e50246bf7ab957b56ffbef623cb (patch) | |
tree | 4f50189287a94421e93f93a3df35b7b5461be33f /fs/f2fs/inode.c | |
parent | a54455f5eeb8d65455a27b3ace99f9af295b2897 (diff) | |
download | linux-9bb02c3627f46e50246bf7ab957b56ffbef623cb.tar.gz linux-9bb02c3627f46e50246bf7ab957b56ffbef623cb.tar.bz2 linux-9bb02c3627f46e50246bf7ab957b56ffbef623cb.zip |
f2fs: fix fs corruption due to zero inode page
This patch fixes the following scenario.
- f2fs_create/f2fs_mkdir - write_checkpoint
- f2fs_mark_inode_dirty_sync - block_operations
- f2fs_lock_all
- f2fs_sync_inode_meta
- f2fs_unlock_all
- sync_inode_metadata
- f2fs_lock_op
- f2fs_write_inode
- update_inode_page
- get_node_page
return -ENOENT
- new_inode_page
- fill_node_footer
- f2fs_mark_inode_dirty_sync
- ...
- f2fs_unlock_op
- f2fs_inode_synced
- f2fs_lock_all
- do_checkpoint
In this checkpoint, we can get an inode page which contains zeros having valid
node footer only.
Cc: <stable@vger.kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Diffstat (limited to 'fs/f2fs/inode.c')
-rw-r--r-- | fs/f2fs/inode.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index 2520fa72b23f..0900814485c7 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c @@ -316,7 +316,6 @@ retry: } else if (err != -ENOENT) { f2fs_stop_checkpoint(sbi, false); } - f2fs_inode_synced(inode); return 0; } ret = update_inode(inode, node_page); @@ -450,6 +449,7 @@ void handle_failed_inode(struct inode *inode) * in a panic when flushing dirty inodes in gdirty_list. */ update_inode_page(inode); + f2fs_inode_synced(inode); /* don't make bad inode, since it becomes a regular file. */ unlock_new_inode(inode); |