Message ID | 20240313112620.1061463-1-s_min.jeong@samsung.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 4bf78322346f6320313683dc9464e5423423ad5c |
Headers | show |
Series | [f2fs-dev,1/2] f2fs: mark inode dirty for FI_ATOMIC_COMMITTED flag | expand |
Reviewed-by: Daeho Jeong <daehojeong@google.com> On Wed, Mar 13, 2024 at 4:37 AM Sunmin Jeong <s_min.jeong@samsung.com> wrote: > > In f2fs_update_inode, i_size of the atomic file isn't updated until > FI_ATOMIC_COMMITTED flag is set. When committing atomic write right > after the writeback of the inode, i_size of the raw inode will not be > updated. It can cause the atomicity corruption due to a mismatch between > old file size and new data. > > To prevent the problem, let's mark inode dirty for FI_ATOMIC_COMMITTED > > Atomic write thread Writeback thread > __writeback_single_inode > write_inode > f2fs_update_inode > - skip i_size update > f2fs_ioc_commit_atomic_write > f2fs_commit_atomic_write > set_inode_flag(inode, FI_ATOMIC_COMMITTED) > f2fs_do_sync_file > f2fs_fsync_node_pages > - skip f2fs_update_inode since the inode is clean > > Fixes: 3db1de0e582c ("f2fs: change the current atomic write way") > Cc: stable@vger.kernel.org #v5.19+ > Reviewed-by: Sungjong Seo <sj1557.seo@samsung.com> > Reviewed-by: Yeongjin Gil <youngjin.gil@samsung.com> > Signed-off-by: Sunmin Jeong <s_min.jeong@samsung.com> > --- > fs/f2fs/f2fs.h | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h > index 543898482f8b..a000cb024dbe 100644 > --- a/fs/f2fs/f2fs.h > +++ b/fs/f2fs/f2fs.h > @@ -3039,6 +3039,7 @@ static inline void __mark_inode_dirty_flag(struct inode *inode, > case FI_INLINE_DOTS: > case FI_PIN_FILE: > case FI_COMPRESS_RELEASED: > + case FI_ATOMIC_COMMITTED: > f2fs_mark_inode_dirty_sync(inode, true); > } > } > -- > 2.25.1 > > > > _______________________________________________ > Linux-f2fs-devel mailing list > Linux-f2fs-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
On 2024/3/13 19:26, Sunmin Jeong wrote: > In f2fs_update_inode, i_size of the atomic file isn't updated until > FI_ATOMIC_COMMITTED flag is set. When committing atomic write right > after the writeback of the inode, i_size of the raw inode will not be > updated. It can cause the atomicity corruption due to a mismatch between > old file size and new data. > > To prevent the problem, let's mark inode dirty for FI_ATOMIC_COMMITTED > > Atomic write thread Writeback thread > __writeback_single_inode > write_inode > f2fs_update_inode > - skip i_size update > f2fs_ioc_commit_atomic_write > f2fs_commit_atomic_write > set_inode_flag(inode, FI_ATOMIC_COMMITTED) > f2fs_do_sync_file > f2fs_fsync_node_pages > - skip f2fs_update_inode since the inode is clean > > Fixes: 3db1de0e582c ("f2fs: change the current atomic write way") > Cc: stable@vger.kernel.org #v5.19+ > Reviewed-by: Sungjong Seo <sj1557.seo@samsung.com> > Reviewed-by: Yeongjin Gil <youngjin.gil@samsung.com> > Signed-off-by: Sunmin Jeong <s_min.jeong@samsung.com> Reviewed-by: Chao Yu <chao@kernel.org> Thanks,
Hello: This series was applied to jaegeuk/f2fs.git (dev) by Jaegeuk Kim <jaegeuk@kernel.org>: On Wed, 13 Mar 2024 20:26:19 +0900 you wrote: > In f2fs_update_inode, i_size of the atomic file isn't updated until > FI_ATOMIC_COMMITTED flag is set. When committing atomic write right > after the writeback of the inode, i_size of the raw inode will not be > updated. It can cause the atomicity corruption due to a mismatch between > old file size and new data. > > To prevent the problem, let's mark inode dirty for FI_ATOMIC_COMMITTED > > [...] Here is the summary with links: - [f2fs-dev,1/2] f2fs: mark inode dirty for FI_ATOMIC_COMMITTED flag https://git.kernel.org/jaegeuk/f2fs/c/4bf78322346f - [f2fs-dev,2/2] f2fs: truncate page cache before clearing flags when aborting atomic write https://git.kernel.org/jaegeuk/f2fs/c/74b0ebcbdde4 You are awesome, thank you!
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 543898482f8b..a000cb024dbe 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -3039,6 +3039,7 @@ static inline void __mark_inode_dirty_flag(struct inode *inode, case FI_INLINE_DOTS: case FI_PIN_FILE: case FI_COMPRESS_RELEASED: + case FI_ATOMIC_COMMITTED: f2fs_mark_inode_dirty_sync(inode, true); } }