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

Reply via email to