f2fs: fix wrong i_atime recovery
Chao Yu
maintainerPATCH 1/2 f2fs: fix wrong i_atime recovery
From: Chao Yu <[email protected]>
Shouldn't update in-memory i_atime with on-disk i_mtime of inode when recovering inode.
Shuoran found this bug which is hidden for a long time, honour is belong to him.
--- fs/f2fs/recovery.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/f2fs/recovery.c +2 -2
@@ -180,10 +180,10 @@ static void recover_inode(struct inode *inode, struct page *page) inode->i_mode =le16_to_cpu (raw->i_mode);f2fs_i_size_write (inode,le64_to_cpu (raw->i_size)); - inode->i_atime.tv_sec =le64_to_cpu (raw->i_mtime); + inode->i_atime.tv_sec =le64_to_cpu (raw->i_atime); inode->i_ctime.tv_sec =le64_to_cpu (raw->i_ctime); inode->i_mtime.tv_sec =le64_to_cpu (raw->i_mtime); - inode->i_atime.tv_nsec =le32_to_cpu (raw->i_mtime_nsec); + inode->i_atime.tv_nsec =le32_to_cpu (raw->i_atime_nsec); inode->i_ctime.tv_nsec =le32_to_cpu (raw->i_ctime_nsec); inode->i_mtime.tv_nsec =le32_to_cpu (raw->i_mtime_nsec);
Signature · 1 line
2.10.1
Chao Yu
maintainerPATCH 2/2 f2fs: don't skip recovering inode depend on i_times
From: Chao Yu <[email protected]>
i_times of inode will be set with current system time which can be configured through 'date', so it's not safe to judge dnode block as garbage data depend on i_times.
Now, we have used enhanced 'cp_ver + cp' crc method to verify valid dnode block, so I expect recoverying invalid dnode is almost not possible.
--- fs/f2fs/recovery.c | 31 +------------------------------ 1 file changed, 1 insertion(+), 30 deletions(-)
fs/f2fs/recovery.c +1 -30
@@ -196,32 +196,6 @@ static void recover_inode(struct inode *inode, struct page *page) ino_of_node(page), name); } -static bool is_same_inode (struct inode *inode,struct page *ipage) -{ -struct f2fs_inode *ri =F2FS_INODE (ipage); -struct timespec disk; - -if (!IS_INODE (ipage)) -return true; - - disk.tv_sec =le64_to_cpu (ri->i_ctime); - disk.tv_nsec =le32_to_cpu (ri->i_ctime_nsec); -if (timespec_compare (&inode->i_ctime, &disk) >0 ) -return false; - - disk.tv_sec =le64_to_cpu (ri->i_atime); - disk.tv_nsec =le32_to_cpu (ri->i_atime_nsec); -if (timespec_compare (&inode->i_atime, &disk) >0 ) -return false; - - disk.tv_sec =le64_to_cpu (ri->i_mtime); - disk.tv_nsec =le32_to_cpu (ri->i_mtime_nsec); -if (timespec_compare (&inode->i_mtime, &disk) >0 ) -return false; - -return true; -} -static int find_fsync_dnodes (struct f2fs_sb_info *sbi,struct list_head *head) {struct curseg_info *curseg;
@@ -248,10 +222,7 @@ static int find_fsync_dnodes(struct f2fs_sb_info *sbi, struct list_head *head) goto next; entry =get_fsync_inode (head,ino_of_node (page)); -if (entry) { -if (!is_same_inode (entry->inode, page)) - goto next; - }else { +if (!entry) {if (IS_INODE (page) &&is_dent_dnode (page)) { err =recover_inode_page (sbi, page);if (err)
Signature · 1 line
2.10.1
Jaegeuk Kim
maintainerRe: [PATCH 2/2] f2fs: don't skip recovering inode depend on i_times
Quoted 5 lines · Chao Yu
From: Chao Yu <[email protected]>
i_timesof inode will be set with current system time which can be configured through 'date', so it's not safe to judge dnode block as garbage data depend oni_times.
This is not to detect garbage data, but to skip redundant unchanged inode. Anyway, in the code part, looks good to me.
Thanks,
Quoted 61 lines
Now, we have used enhanced '
cp_ver+ cp' crc method to verify valid dnode block, so I expect recoverying invalid dnode is almost not possible.Signed-off-by Chao Yu <[email protected]>--- fs/f2fs/recovery.c | 31 +------------------------------ 1 file changed, 1 insertion(+), 30 deletions(-)fs/f2fs/recovery.c +1
-30@@ -196,32 +196,6 @@ static void recover_inode(struct inode *inode, struct page *page) ino_of_node(page), name); } -static bool is_same_inode (struct inode *inode,struct page *ipage) -{ -struct f2fs_inode *ri =F2FS_INODE (ipage); -struct timespec disk; - -if (!IS_INODE (ipage)) -return true; - - disk.tv_sec =le64_to_cpu (ri->i_ctime); - disk.tv_nsec =le32_to_cpu (ri->i_ctime_nsec); -if (timespec_compare (&inode->i_ctime, &disk) >0 ) -return false; - - disk.tv_sec =le64_to_cpu (ri->i_atime); - disk.tv_nsec =le32_to_cpu (ri->i_atime_nsec); -if (timespec_compare (&inode->i_atime, &disk) >0 ) -return false; - - disk.tv_sec =le64_to_cpu (ri->i_mtime); - disk.tv_nsec =le32_to_cpu (ri->i_mtime_nsec); -if (timespec_compare (&inode->i_mtime, &disk) >0 ) -return false; - -return true; -} -static int find_fsync_dnodes (struct f2fs_sb_info *sbi,struct list_head *head) {struct curseg_info *curseg;@@ -248,10 +222,7 @@ static int find_fsync_dnodes(struct f2fs_sb_info *sbi, struct list_head *head) goto next; entry =get_fsync_inode (head,ino_of_node (page)); -if (entry) { -if (!is_same_inode (entry->inode, page)) - goto next; - }else { +if (!entry) {if (IS_INODE (page) &&is_dent_dnode (page)) { err =recover_inode_page (sbi, page);if (err)Signature · 1 line
2.10.1
Re: [PATCH 2/2] f2fs: don't skip recovering inode depend on i_times
Quoted 8 lines · Jaegeuk Kim
Quoted 5 lines · Chao Yu
From: Chao Yu <[email protected]>
i_timesof inode will be set with current system time which can be configured through 'date', so it's not safe to judge dnode block as garbage data depend oni_times.This is not to detect garbage data, but to skip redundant unchanged inode.
Oops, seems 807b1e1c8e08 ("f2fs: do not recover from previous remained wrong dnodes") did't describe like that. But after reading the codes, it looks like the purpose of this change is to skip unchanged inode. So, commit log in original is incorrect, right?
Thanks,
Jaegeuk Kim
maintainerRe: [PATCH 2/2] f2fs: don't skip recovering inode depend on i_times
Quoted 8 lines · Chao Yu
Quoted 7 lines · Jaegeuk Kim
Quoted 5 lines · Chao Yu
From: Chao Yu <[email protected]>
i_timesof inode will be set with current system time which can be configured through 'date', so it's not safe to judge dnode block as garbage data depend oni_times.
Quoted 6 lines
Quoted 1 line
This is not to detect garbage data, but to skip redundant unchanged inode.
Oops, seems
807b1e1c8e08("f2fs: do not recover from previous remained wrong dnodes") did't describe like that. But after reading the codes, it looks like the purpose of this change is to skip unchanged inode. So, commit log in original is incorrect, right?
Oh, right. This indicats both of purposes: stale data and detecting same inodes. Let me just revert the original patch.
Thanks,
Quoted 2 lines
Thanks,
Chao Yu
maintainerRe: [PATCH 2/2] f2fs: don't skip recovering inode depend on i_times
Quoted 9 lines · Jaegeuk Kim
Quoted 8 lines · Chao Yu
Quoted 7 lines · Jaegeuk Kim
Quoted 5 lines · Chao Yu
From: Chao Yu <[email protected]>
i_timesof inode will be set with current system time which can be configured through 'date', so it's not safe to judge dnode block as garbage data depend oni_times.
Quoted 8 lines
Quoted 6 lines
Quoted 1 line
This is not to detect garbage data, but to skip redundant unchanged inode.
Oops, seems
807b1e1c8e08("f2fs: do not recover from previous remained wrong dnodes") did't describe like that. But after reading the codes, it looks like the purpose of this change is to skip unchanged inode. So, commit log in original is incorrect, right?Oh, right. This indicats both of purposes: stale data and detecting same inodes.
Alright.
Quoted 1 line
Let me just revert the original patch.
I can see that you have did reverting it in your git tree, but seems commit number is not right.
Could you please merge my updated v2 patch instead?
Thanks,
Quoted 5 lines
Thanks,
Quoted 2 lines
Thanks,
Jaegeuk Kim
maintainerRe: [PATCH 2/2] f2fs: don't skip recovering inode depend on i_times
Quoted 19 lines · Chao Yu
Quoted 9 lines · Jaegeuk Kim
Quoted 8 lines · Chao Yu
Quoted 7 lines · Jaegeuk Kim
Quoted 5 lines · Chao Yu
From: Chao Yu <[email protected]>
i_timesof inode will be set with current system time which can be configured through 'date', so it's not safe to judge dnode block as garbage data depend oni_times.Quoted 8 lines
Quoted 6 lines
Quoted 1 line
This is not to detect garbage data, but to skip redundant unchanged inode.
Oops, seems
807b1e1c8e08("f2fs: do not recover from previous remained wrong dnodes") did't describe like that. But after reading the codes, it looks like the purpose of this change is to skip unchanged inode. So, commit log in original is incorrect, right?Oh, right. This indicats both of purposes: stale data and detecting same inodes.
Quoted 8 lines
Alright.
Quoted 1 line
Let me just revert the original patch.
I can see that you have did reverting it in your git tree, but seems commit number is not right.
Could you please merge my updated v2 patch instead?
Oops, yeah. :)
Quoted 8 lines
Thanks,
Quoted 5 lines
Thanks,
Quoted 2 lines
Thanks,