Hi, Yunlei, Could you rework this patch as we discussed?
Thanks, On 2017/12/28 10:37, Jaegeuk Kim wrote: > On 12/25, Chao Yu wrote: >> On 2017/12/20 13:03, Yunlei He wrote: >>> v4 -> v5 return err instead destory inode list for two reasons: >>> i. avoid duplicated destroy inode list in function recover_fsync_data. >>> ii. report an error for recovery, and set need_fsck flag >> >> fsck can't fix this issue so far, it doesn't work even we set need_fsck flag, >> would it be better to just drop last dnode with corrupted next_blkaddr and >> try >> our best to recover fsynced data? > > Yup, agreed to this. There's no way to recover this, if we just return an > error. > >> >> Thanks, >> >>> >>> Came across a dead loop in recovery like this: >>> >>> ...... >>> [ 24.680480s][pid:320,cpu0,init]find_fsync_dnodes: blkaddr =13597696 >>> [ 24.698394s][pid:320,cpu0,init]find_fsync_dnodes: blkaddr =13597697 >>> [ 24.724334s][pid:320,cpu0,init]find_fsync_dnodes: blkaddr =13597698 >>> [ 24.724334s][pid:320,cpu0,init]find_fsync_dnodes: blkaddr =13597698 >>> [ 24.724365s][pid:320,cpu0,init]find_fsync_dnodes: blkaddr =13597698 >>> [ 24.724365s][pid:320,cpu0,init]find_fsync_dnodes: blkaddr =13597698 >>> [ 24.724365s][pid:320,cpu0,init]find_fsync_dnodes: blkaddr =13597698 >>> [ 24.724395s][pid:320,cpu0,init]find_fsync_dnodes: blkaddr =13597698 >>> [ 24.724395s][pid:320,cpu0,init]find_fsync_dnodes: blkaddr =13597698 >>> [ 24.724395s][pid:320,cpu0,init]find_fsync_dnodes: blkaddr =13597698 >>> [ 24.724395s][pid:320,cpu0,init]find_fsync_dnodes: blkaddr =13597698 >>> [ 24.724426s][pid:320,cpu0,init]find_fsync_dnodes: blkaddr =13597698 >>> ...... >>> >>> Mount process will block in dead loop and fsck can do nothing with this >>> error, This patch abandon recovery if node chain is cyclical. >>> >>> Signed-off-by: Yunlei He <[email protected]> >>> --- >>> fs/f2fs/recovery.c | 11 +++++++++++ >>> 1 file changed, 11 insertions(+) >>> >>> diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c >>> index d025aa8..a535ec2 100644 >>> --- a/fs/f2fs/recovery.c >>> +++ b/fs/f2fs/recovery.c >>> @@ -216,6 +216,17 @@ static int find_fsync_dnodes(struct f2fs_sb_info *sbi, >>> struct list_head *head) >>> return 0; >>> >>> page = get_tmp_page(sbi, blkaddr); >>> + if (PageChecked(page)) { >>> + f2fs_msg(sbi->sb, KERN_ERR, "Abandon looped node block >>> list"); >>> + err = -EINVAL; >>> + break; >>> + } >>> + >>> + /* >>> + * it's not needed to clear PG_checked flag in temp page since >>> we >>> + * will truncate all those pages in the end of recovery. >>> + */ >>> + SetPageChecked(page); >>> >>> if (!is_recoverable_dnode(page)) >>> break; >>> > > . > ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Linux-f2fs-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
