On 10/22, Chao Yu wrote: > On 2019/10/18 14:37, Shin'ichiro Kawasaki wrote: > > Fsck checks fsync data when UMOUNT flag is not set. When the f2fs was not > > cleanly unmouted, UMOUNT flag is not recorded in meta data and fsync data > > can be left in the f2fs. The first fsck run checks fsync data to reflect > > it on quota status recovery. After that, fsck writes UMOUNT flag in the > > f2fs meta data so that second fsck run can skip fsync data check. > > Oh, IMO, we need that flag to let fsck know there is still fsynced data in the > image, could we just leave it as it is? > > To Jaegeuk, thoughts?
I don't have objection to apply this patch. :P > > Thanks, > > > > > However, fsck for zoned block devices need to care fsync data for all > > fsck runs. The first fsck run checks fsync data, then fsck can check > > write pointer consistency with fsync data. However, since second fsck run > > does not check fsync data, fsck detects write pointer at fsync data end > > is not consistent with f2fs meta data. This results in meta data update > > by fsck and fsync data gets lost. > > > > To have fsck check fsync data always for zoned block devices, introduce > > need_fsync_data_record() helper function which returns boolean to tell > > if fsck needs fsync data check or not. For zoned block devices, always > > return true. Otherwise, return true if UMOUNT flag is not set in CP. > > Replace UMOUNT flag check codes for fsync data with the function call. > > > > Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawas...@wdc.com> > > --- > > fsck/fsck.h | 6 ++++++ > > fsck/mount.c | 14 +++++++------- > > fsck/segment.c | 2 +- > > 3 files changed, 14 insertions(+), 8 deletions(-) > > > > diff --git a/fsck/fsck.h b/fsck/fsck.h > > index 8da0ebb..75052d8 100644 > > --- a/fsck/fsck.h > > +++ b/fsck/fsck.h > > @@ -133,6 +133,12 @@ enum seg_type { > > > > struct selabel_handle; > > > > +static inline bool need_fsync_data_record(struct f2fs_sb_info *sbi) > > +{ > > + return !is_set_ckpt_flags(F2FS_CKPT(sbi), CP_UMOUNT_FLAG) || > > + c.zoned_model == F2FS_ZONED_HM; > > +} > > + > > extern int fsck_chk_orphan_node(struct f2fs_sb_info *); > > extern int fsck_chk_quota_node(struct f2fs_sb_info *); > > extern int fsck_chk_quota_files(struct f2fs_sb_info *); > > diff --git a/fsck/mount.c b/fsck/mount.c > > index 915f487..2979865 100644 > > --- a/fsck/mount.c > > +++ b/fsck/mount.c > > @@ -1525,7 +1525,7 @@ int build_sit_info(struct f2fs_sb_info *sbi) > > > > bitmap_size = TOTAL_SEGS(sbi) * SIT_VBLOCK_MAP_SIZE; > > > > - if (!is_set_ckpt_flags(cp, CP_UMOUNT_FLAG)) > > + if (need_fsync_data_record(sbi)) > > bitmap_size += bitmap_size; > > > > sit_i->bitmap = calloc(bitmap_size, 1); > > @@ -1540,7 +1540,7 @@ int build_sit_info(struct f2fs_sb_info *sbi) > > sit_i->sentries[start].cur_valid_map = bitmap; > > bitmap += SIT_VBLOCK_MAP_SIZE; > > > > - if (!is_set_ckpt_flags(cp, CP_UMOUNT_FLAG)) { > > + if (need_fsync_data_record(sbi)) { > > sit_i->sentries[start].ckpt_valid_map = bitmap; > > bitmap += SIT_VBLOCK_MAP_SIZE; > > } > > @@ -1887,7 +1887,7 @@ void seg_info_from_raw_sit(struct f2fs_sb_info *sbi, > > struct seg_entry *se, > > { > > __seg_info_from_raw_sit(se, raw_sit); > > > > - if (is_set_ckpt_flags(F2FS_CKPT(sbi), CP_UMOUNT_FLAG)) > > + if (!need_fsync_data_record(sbi)) > > return; > > se->ckpt_valid_blocks = se->valid_blocks; > > memcpy(se->ckpt_valid_map, se->cur_valid_map, SIT_VBLOCK_MAP_SIZE); > > @@ -1903,7 +1903,7 @@ struct seg_entry *get_seg_entry(struct f2fs_sb_info > > *sbi, > > > > unsigned short get_seg_vblocks(struct f2fs_sb_info *sbi, struct seg_entry > > *se) > > { > > - if (is_set_ckpt_flags(F2FS_CKPT(sbi), CP_UMOUNT_FLAG)) > > + if (!need_fsync_data_record(sbi)) > > return se->valid_blocks; > > else > > return se->ckpt_valid_blocks; > > @@ -1911,7 +1911,7 @@ unsigned short get_seg_vblocks(struct f2fs_sb_info > > *sbi, struct seg_entry *se) > > > > unsigned char *get_seg_bitmap(struct f2fs_sb_info *sbi, struct seg_entry > > *se) > > { > > - if (is_set_ckpt_flags(F2FS_CKPT(sbi), CP_UMOUNT_FLAG)) > > + if (!need_fsync_data_record(sbi)) > > return se->cur_valid_map; > > else > > return se->ckpt_valid_map; > > @@ -1919,7 +1919,7 @@ unsigned char *get_seg_bitmap(struct f2fs_sb_info > > *sbi, struct seg_entry *se) > > > > unsigned char get_seg_type(struct f2fs_sb_info *sbi, struct seg_entry *se) > > { > > - if (is_set_ckpt_flags(F2FS_CKPT(sbi), CP_UMOUNT_FLAG)) > > + if (!need_fsync_data_record(sbi)) > > return se->type; > > else > > return se->ckpt_type; > > @@ -3242,7 +3242,7 @@ static int record_fsync_data(struct f2fs_sb_info *sbi) > > struct list_head inode_list = LIST_HEAD_INIT(inode_list); > > int ret; > > > > - if (is_set_ckpt_flags(F2FS_CKPT(sbi), CP_UMOUNT_FLAG)) > > + if (!need_fsync_data_record(sbi)) > > return 0; > > > > ret = find_fsync_inode(sbi, &inode_list); > > diff --git a/fsck/segment.c b/fsck/segment.c > > index ccde05f..17c42b7 100644 > > --- a/fsck/segment.c > > +++ b/fsck/segment.c > > @@ -62,7 +62,7 @@ int reserve_new_block(struct f2fs_sb_info *sbi, block_t > > *to, > > se->type = type; > > se->valid_blocks++; > > f2fs_set_bit(offset, (char *)se->cur_valid_map); > > - if (!is_set_ckpt_flags(F2FS_CKPT(sbi), CP_UMOUNT_FLAG)) { > > + if (need_fsync_data_record(sbi)) { > > se->ckpt_type = type; > > se->ckpt_valid_blocks++; > > f2fs_set_bit(offset, (char *)se->ckpt_valid_map); > > _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel