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 v4] fsck.f2fs: allow fsck to fix issues with online resize due to SPO
Date: Tue, 24 Mar 2020 14:40:34 +0530	[thread overview]
Message-ID: <20200324091034.GQ20234@codeaurora.org> (raw)
In-Reply-To: <f53b151a-d339-bc9b-79bb-98fd7d986890@huawei.com>

On Tue, Mar 24, 2020 at 02:19:46PM +0800, Chao Yu wrote:
> On 2020/3/23 18:58, 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.
> > 
> > The 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>
> > ---
> > v4:
> > - add conditions to allow fix for -a or -p option as well
> > 
> >  fsck/mount.c      | 62 +++++++++++++++++++++++++++++++++++++++++--------------
> >  include/f2fs_fs.h |  1 +
> >  2 files changed, 47 insertions(+), 16 deletions(-)
> > 
> > diff --git a/fsck/mount.c b/fsck/mount.c
> > index e4ba048..387957f 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
> > @@ -1123,11 +1125,26 @@ fail_no_cp:
> >  	return -EINVAL;
> >  }
> >  
> > +static int f2fs_chk_fix_on_state(struct f2fs_super_block *sb, u32 flag)
> > +{
> > +	if (!c.fix_on && (c.auto_fix || c.preen_mode)) {
> > +		if (flag & CP_FSCK_FLAG ||
> > +			flag & CP_QUOTA_NEED_FSCK_FLAG ||
> > +			(exist_qf_ino(sb) && (flag & CP_ERROR_FLAG))) {
> > +			c.fix_on = 1;
> > +		} else if (!c.preen_mode) {
> > +			print_cp_state(flag);
> > +		}
> > +	}
> > +	return c.fix_on;
> > +}
> > +
> >  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,8 +1181,31 @@ 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);
> > -		return 1;
> > +		ASSERT_MSG("\tWrong user_block_count(%u)\n", user_block_count);
> > +		if (!f2fs_chk_fix_on_state(sb, flag))
> > +			return 1;
> > +
> > +		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, "Inconsistent segment_cnt_main %u in sb\n",
> > +						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, "Info: Fix wrong user_block_count in CP: (%u) -> (%u)\n",
> > +					user_block_count, valid_user_block_cnt);
> > +			set_cp(user_block_count, valid_user_block_cnt);
> > +			c.bug_on = 1;
> > +		}
> >  	}
> >  
> >  	main_segs = get_sb(segment_count_main);
> > @@ -3361,6 +3401,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 +3422,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;
> >  
> > @@ -3411,18 +3451,8 @@ int f2fs_do_mount(struct f2fs_sb_info *sbi)
> >  		return -1;
> >  	}
> >  
> > -	if (!c.fix_on && (c.auto_fix || c.preen_mode)) {
> > -		u32 flag = get_cp(ckpt_flags);
> > -
> > -		if (flag & CP_FSCK_FLAG ||
> > -			flag & CP_QUOTA_NEED_FSCK_FLAG ||
> > -			(exist_qf_ino(sb) && (flag & CP_ERROR_FLAG))) {
> > -			c.fix_on = 1;
> > -		} else if (!c.preen_mode) {
> > -			print_cp_state(flag);
> > -			return 1;
> > -		}
> > -	}
> > +	if (!f2fs_chk_fix_on_state(sb, get_cp(ckpt_flags)))
> > +		return 1;
> 
> That's incorrect to return 1 if fix.on is zero, in case of just checking
> the image w/o repairing.

Thanks for pointing it out. Let me fix it.

thanks,

> 
> Thanks,
> 
> >  
> >  	/* Check nat_bits */
> >  	if (c.func == FSCK && is_set_ckpt_flags(cp, CP_NAT_BITS_FLAG)) {
> > 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-24  9:11 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-23 10:58 [f2fs-dev] [PATCH v4] fsck.f2fs: allow fsck to fix issues with online resize due to SPO Sahitya Tummala
2020-03-24  6:19 ` Chao Yu
2020-03-24  9:10   ` 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=20200324091034.GQ20234@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.