All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sahitya Tummala <stummala@codeaurora.org>
To: Chao Yu <yuchao0@huawei.com>
Cc: Jaegeuk Kim <jaegeuk@kernel.org>, linux-f2fs-devel@lists.sourceforge.net
Subject: Re: [f2fs-dev] [PATCH V2] fsck.f2fs: allow fsck to fix issues with online resize due to SPO
Date: Thu, 19 Mar 2020 20:46:53 +0530	[thread overview]
Message-ID: <20200319151652.GO20234@codeaurora.org> (raw)
In-Reply-To: <12c0ac9f-54ab-d012-0796-24b6e08d31c7@huawei.com>

On Thu, Mar 19, 2020 at 06:47:07PM +0800, Chao Yu wrote:
> Hi Sahitya,
> 
> On 2020/3/19 17:15, Sahitya Tummala wrote:
> > Hi Chao,
> > 
> > On Mon, Mar 16, 2020 at 11:19:11AM +0800, Chao Yu wrote:
> >> On 2020/3/6 11:52, Sahitya Tummala wrote:
> >>> Add support for new CP flag CP_RESIZEFS_FLAG set during online
> >>> resize FS. If SPO happens after SB is updated but CP isn't, then
> >>> allow fsck to fix it.
> >>>
> >>> fsck errors without this fix -
> >>>     Info: CKPT version = 6ed7bccb
> >>>             Wrong user_block_count(2233856)
> >>>     [f2fs_do_mount:3365] Checkpoint is polluted
> >>>
> >>> the subsequent mount failure without this fix -
> >>> [   11.294650] F2FS-fs (sda8): Wrong user_block_count: 2233856
> >>> [   11.300272] F2FS-fs (sda8): Failed to get valid F2FS checkpoint
> >>>
> >>> Signed-off-by: Sahitya Tummala <stummala@codeaurora.org>
> >>> ---
> >>> v2:
> >>> - fix even if CP_FSCK_FLAG is set for backward compatibility
> >>> - update print_cp_state()
> >>>
> >>>  fsck/mount.c      | 34 +++++++++++++++++++++++++++++++---
> >>>  include/f2fs_fs.h |  1 +
> >>>  2 files changed, 32 insertions(+), 3 deletions(-)
> >>>
> >>> diff --git a/fsck/mount.c b/fsck/mount.c
> >>> index e4ba048..8d32e41 100644
> >>> --- a/fsck/mount.c
> >>> +++ b/fsck/mount.c
> >>> @@ -429,6 +429,8 @@ void print_cp_state(u32 flag)
> >>>  		MSG(0, "%s", " orphan_inodes");
> >>>  	if (flag & CP_DISABLED_FLAG)
> >>>  		MSG(0, "%s", " disabled");
> >>> +	if (flag & CP_RESIZEFS_FLAG)
> >>> +		MSG(0, "%s", " resizefs");
> >>>  	if (flag & CP_UMOUNT_FLAG)
> >>>  		MSG(0, "%s", " unmount");
> >>>  	else
> >>> @@ -1128,6 +1130,7 @@ int sanity_check_ckpt(struct f2fs_sb_info *sbi)
> >>>  	unsigned int total, fsmeta;
> >>>  	struct f2fs_super_block *sb = F2FS_RAW_SUPER(sbi);
> >>>  	struct f2fs_checkpoint *cp = F2FS_CKPT(sbi);
> >>> +	unsigned int flag = get_cp(ckpt_flags);
> >>>  	unsigned int ovp_segments, reserved_segments;
> >>>  	unsigned int main_segs, blocks_per_seg;
> >>>  	unsigned int sit_segs, nat_segs;
> >>> @@ -1164,7 +1167,32 @@ int sanity_check_ckpt(struct f2fs_sb_info *sbi)
> >>>  	log_blocks_per_seg = get_sb(log_blocks_per_seg);
> >>>  	if (!user_block_count || user_block_count >=
> >>>  			segment_count_main << log_blocks_per_seg) {
> >>> -		MSG(0, "\tWrong user_block_count(%u)\n", user_block_count);
> >>> +		if (flag & (CP_FSCK_FLAG | CP_RESIZEFS_FLAG)) {
> >>> +			u32 valid_user_block_cnt;
> >>> +			u32 seg_cnt_main = get_sb(segment_count) -
> >>> +					(get_sb(segment_count_ckpt) +
> >>> +					 get_sb(segment_count_sit) +
> >>> +					 get_sb(segment_count_nat) +
> >>> +					 get_sb(segment_count_ssa));
> >>> +
> >>> +			/* validate segment_count_main in sb first */
> >>> +			if (seg_cnt_main != get_sb(segment_count_main)) {
> >>> +				MSG(0, "\tWrong user_block_count(%u) and inconsistent segment_cnt_main %u\n",
> >>> +						user_block_count,
> >>> +						segment_count_main << log_blocks_per_seg);
> >>> +				return 1;
> >>> +			}
> >>> +			valid_user_block_cnt = ((get_sb(segment_count_main) -
> >>> +						get_cp(overprov_segment_count)) * c.blks_per_seg);
> >>> +			MSG(0, "\tInfo: Fix wrong user_block_count in CP: (%u) -> (%u)\n",
> >>> +					user_block_count, valid_user_block_cnt);
> >>
> >> By default, we should only fix such bug if c.fix_on is true, something
> >> like this:
> >>
> >> ASSERT_MSG("\tWrong user_block_count(%u)\n", user_block_count);
> >>
> >> if (!c.fix_on)
> >> 	return 1;
> >>
> >> valid_user_block_cnt = ((get_sb(segment_count_main) -
> >> 	get_cp(overprov_segment_count)) * c.blks_per_seg);
> >>
> >> MSG(0, "\tInfo: Fix wrong user_block_count in CP: (%u) -> (%u)\n",
> >> 	user_block_count, valid_user_block_cnt);
> >>
> > Since this is a fatal error which fails the basic mount itself, I thought it
> > must be fixed by default with fsck independent of -f option. Can we do so for
> > such critical bugs?
> 
> I suggest to follow the options' meaning, e.g. if user specified --dry-run,
> however we change any bits on that image, it looks that break that option's
> semantics, and it may violate user's will.... so IMO, if user don't want to
> repair the image, it will be better to keep the image as it is.
> 
> Thoughts?

Sure Chao. I will update the patch to fix it as per your suggestion.

Thanks,
> 
> To Jaegeuk, thoughts?
> 
> Thanks,
> 
> > 
> > Thanks,
> > 
> >> Thanks,
> >>
> >>
> >>> +			set_cp(user_block_count, valid_user_block_cnt);
> >>> +			c.fix_on = 1;
> >>> +			c.bug_on = 1;
> >>> +		} else {
> >>> +			MSG(0, "\tWrong user_block_count(%u)\n", user_block_count);
> >>> +			return 1;
> >>> +		}
> >>>  		return 1;
> >>>  	}
> >>>  
> >>> @@ -3361,6 +3389,8 @@ int f2fs_do_mount(struct f2fs_sb_info *sbi)
> >>>  		return -1;
> >>>  	}
> >>>  
> >>> +	c.bug_on = 0;
> >>> +
> >>>  	if (sanity_check_ckpt(sbi)) {
> >>>  		ERR_MSG("Checkpoint is polluted\n");
> >>>  		return -1;
> >>> @@ -3380,8 +3410,6 @@ int f2fs_do_mount(struct f2fs_sb_info *sbi)
> >>>  			c.fix_on = 1;
> >>>  	}
> >>>  
> >>> -	c.bug_on = 0;
> >>> -
> >>>  	if (tune_sb_features(sbi))
> >>>  		return -1;
> >>>  
> >>> diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
> >>> index af31bc5..265f50c 100644
> >>> --- a/include/f2fs_fs.h
> >>> +++ b/include/f2fs_fs.h
> >>> @@ -678,6 +678,7 @@ struct f2fs_super_block {
> >>>  /*
> >>>   * For checkpoint
> >>>   */
> >>> +#define CP_RESIZEFS_FLAG                0x00004000
> >>>  #define CP_DISABLED_FLAG		0x00001000
> >>>  #define CP_QUOTA_NEED_FSCK_FLAG		0x00000800
> >>>  #define CP_LARGE_NAT_BITMAP_FLAG	0x00000400
> >>>
> > 

-- 
--
Sent by a consultant of the Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.


_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

      reply	other threads:[~2020-03-19 15:17 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1583466746-17445-1-git-send-email-stummala@codeaurora.org>
2020-03-16  3:19 ` [f2fs-dev] [PATCH V2] fsck.f2fs: allow fsck to fix issues with online resize due to SPO Chao Yu
2020-03-19  9:15   ` Sahitya Tummala
2020-03-19 10:47     ` Chao Yu
2020-03-19 15:16       ` Sahitya Tummala [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200319151652.GO20234@codeaurora.org \
    --to=stummala@codeaurora.org \
    --cc=jaegeuk@kernel.org \
    --cc=linux-f2fs-devel@lists.sourceforge.net \
    --cc=yuchao0@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.