All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jaegeuk Kim <jaegeuk@kernel.org>
To: Chao Yu <chao@kernel.org>
Cc: linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net
Subject: Re: [f2fs-dev] [RFC PATCH v2] f2fs: record need_fsck in super_block
Date: Thu, 22 Sep 2022 11:08:33 -0700	[thread overview]
Message-ID: <YyykoT0BdBrXfcrQ@google.com> (raw)
In-Reply-To: <b22657e3-df59-46ff-81c5-be22e422a576@kernel.org>

On 09/20, Chao Yu wrote:
> On 2022/9/20 8:56, Jaegeuk Kim wrote:
> > On 09/13, Chao Yu wrote:
> > > Once CP_ERROR_FLAG is set, checkpoint is disallowed to be triggered to
> > > persist CP_FSCK_FLAG, fsck won't repair the image due to lack of
> > > CP_FSCK_FLAG.
> > > 
> > > This patch proposes to persist newly introduced SB_NEED_FSCK flag into
> > > super block if CP_ERROR_FLAG and SBI_NEED_FSCK is set, later, once fsck
> > > detect this flag, it can check and repair corrupted image in time.
> > > 
> > > Signed-off-by: Chao Yu <chao@kernel.org>
> > > ---
> > > v2:
> > > - remove unneeded codes.
> > >   fs/f2fs/checkpoint.c    |  6 +++++-
> > >   fs/f2fs/f2fs.h          |  1 +
> > >   fs/f2fs/super.c         | 26 ++++++++++++++++++++++++++
> > >   include/linux/f2fs_fs.h |  5 ++++-
> > >   4 files changed, 36 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c
> > > index c3119e4c890c..0836fce40394 100644
> > > --- a/fs/f2fs/checkpoint.c
> > > +++ b/fs/f2fs/checkpoint.c
> > > @@ -30,8 +30,12 @@ void f2fs_stop_checkpoint(struct f2fs_sb_info *sbi, bool end_io)
> > >   {
> > >   	f2fs_build_fault_attr(sbi, 0, 0);
> > >   	set_ckpt_flags(sbi, CP_ERROR_FLAG);
> > > -	if (!end_io)
> > > +	if (!end_io) {
> > >   		f2fs_flush_merged_writes(sbi);
> > > +
> > > +		if (is_sbi_flag_set(sbi, SBI_NEED_FSCK))
> > > +			f2fs_update_sb_flags(sbi, SB_NEED_FSCK);
> > 
> > Let's think of putting some more context in superblock, if we want to overwrite
> > it. E.g., a reason to stop checkpoint?
> 
> Good idea, maybe:
> Bit	Value				max number of type
> [0]	need fsck flag			1
> [1-5]	reason to stop checkpoint	32
> [6-13]	reason to fsck			256

How about just keeping the counters of the reasons? (e.g., EIO count which
stopped checkpoint)

#define MAX_CRASH_REASON 32
char array[MAX_CRASH_REASON];

> 
> Thanks
> 
> > 
> > > +	}
> > >   }
> > >   /*
> > > diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
> > > index dee7b67a17a6..1960a98c7555 100644
> > > --- a/fs/f2fs/f2fs.h
> > > +++ b/fs/f2fs/f2fs.h
> > > @@ -3556,6 +3556,7 @@ int f2fs_enable_quota_files(struct f2fs_sb_info *sbi, bool rdonly);
> > >   int f2fs_quota_sync(struct super_block *sb, int type);
> > >   loff_t max_file_blocks(struct inode *inode);
> > >   void f2fs_quota_off_umount(struct super_block *sb);
> > > +void f2fs_update_sb_flags(struct f2fs_sb_info *sbi, unsigned int flag);
> > >   int f2fs_commit_super(struct f2fs_sb_info *sbi, bool recover);
> > >   int f2fs_sync_fs(struct super_block *sb, int sync);
> > >   int f2fs_sanity_check_ckpt(struct f2fs_sb_info *sbi);
> > > diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
> > > index b8e5fe244596..c99ba840593d 100644
> > > --- a/fs/f2fs/super.c
> > > +++ b/fs/f2fs/super.c
> > > @@ -3846,6 +3846,32 @@ int f2fs_commit_super(struct f2fs_sb_info *sbi, bool recover)
> > >   	return err;
> > >   }
> > > +void f2fs_update_sb_flags(struct f2fs_sb_info *sbi, unsigned int flag)
> > > +{
> > > +	unsigned short s_flags;
> > > +	int err;
> > > +
> > > +	if (le16_to_cpu(F2FS_RAW_SUPER(sbi)->s_flags) & SB_NEED_FSCK)
> > > +		return;
> > > +
> > > +	f2fs_down_write(&sbi->sb_lock);
> > > +
> > > +	s_flags = le16_to_cpu(F2FS_RAW_SUPER(sbi)->s_flags);
> > > +
> > > +	if (s_flags & SB_NEED_FSCK)
> > > +		goto out_unlock;
> > > +
> > > +	F2FS_RAW_SUPER(sbi)->s_flags = cpu_to_le16(s_flags | SB_NEED_FSCK);
> > > +
> > > +	err = f2fs_commit_super(sbi, false);
> > > +	if (err) {
> > > +		f2fs_warn(sbi, "f2fs_commit_super fails to persist flag: %u, err:%d", flag, err);
> > > +		F2FS_RAW_SUPER(sbi)->s_flags = s_flags;
> > > +	}
> > > +out_unlock:
> > > +	f2fs_up_write(&sbi->sb_lock);
> > > +}
> > > +
> > >   static int f2fs_scan_devices(struct f2fs_sb_info *sbi)
> > >   {
> > >   	struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi);
> > > diff --git a/include/linux/f2fs_fs.h b/include/linux/f2fs_fs.h
> > > index d445150c5350..124176e2a42c 100644
> > > --- a/include/linux/f2fs_fs.h
> > > +++ b/include/linux/f2fs_fs.h
> > > @@ -73,6 +73,8 @@ struct f2fs_device {
> > >   	__le32 total_segments;
> > >   } __packed;
> > > +#define SB_NEED_FSCK			0x00000001	/* need fsck */
> > > +
> > >   struct f2fs_super_block {
> > >   	__le32 magic;			/* Magic Number */
> > >   	__le16 major_ver;		/* Major Version */
> > > @@ -116,7 +118,8 @@ struct f2fs_super_block {
> > >   	__u8 hot_ext_count;		/* # of hot file extension */
> > >   	__le16  s_encoding;		/* Filename charset encoding */
> > >   	__le16  s_encoding_flags;	/* Filename charset encoding flags */
> > > -	__u8 reserved[306];		/* valid reserved region */
> > > +	__le16 s_flags;			/* super block flags */
> > > +	__u8 reserved[304];		/* valid reserved region */
> > >   	__le32 crc;			/* checksum of superblock */
> > >   } __packed;
> > > -- 
> > > 2.25.1


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

WARNING: multiple messages have this Message-ID (diff)
From: Jaegeuk Kim <jaegeuk@kernel.org>
To: Chao Yu <chao@kernel.org>
Cc: linux-f2fs-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org
Subject: Re: [RFC PATCH v2] f2fs: record need_fsck in super_block
Date: Thu, 22 Sep 2022 11:08:33 -0700	[thread overview]
Message-ID: <YyykoT0BdBrXfcrQ@google.com> (raw)
In-Reply-To: <b22657e3-df59-46ff-81c5-be22e422a576@kernel.org>

On 09/20, Chao Yu wrote:
> On 2022/9/20 8:56, Jaegeuk Kim wrote:
> > On 09/13, Chao Yu wrote:
> > > Once CP_ERROR_FLAG is set, checkpoint is disallowed to be triggered to
> > > persist CP_FSCK_FLAG, fsck won't repair the image due to lack of
> > > CP_FSCK_FLAG.
> > > 
> > > This patch proposes to persist newly introduced SB_NEED_FSCK flag into
> > > super block if CP_ERROR_FLAG and SBI_NEED_FSCK is set, later, once fsck
> > > detect this flag, it can check and repair corrupted image in time.
> > > 
> > > Signed-off-by: Chao Yu <chao@kernel.org>
> > > ---
> > > v2:
> > > - remove unneeded codes.
> > >   fs/f2fs/checkpoint.c    |  6 +++++-
> > >   fs/f2fs/f2fs.h          |  1 +
> > >   fs/f2fs/super.c         | 26 ++++++++++++++++++++++++++
> > >   include/linux/f2fs_fs.h |  5 ++++-
> > >   4 files changed, 36 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c
> > > index c3119e4c890c..0836fce40394 100644
> > > --- a/fs/f2fs/checkpoint.c
> > > +++ b/fs/f2fs/checkpoint.c
> > > @@ -30,8 +30,12 @@ void f2fs_stop_checkpoint(struct f2fs_sb_info *sbi, bool end_io)
> > >   {
> > >   	f2fs_build_fault_attr(sbi, 0, 0);
> > >   	set_ckpt_flags(sbi, CP_ERROR_FLAG);
> > > -	if (!end_io)
> > > +	if (!end_io) {
> > >   		f2fs_flush_merged_writes(sbi);
> > > +
> > > +		if (is_sbi_flag_set(sbi, SBI_NEED_FSCK))
> > > +			f2fs_update_sb_flags(sbi, SB_NEED_FSCK);
> > 
> > Let's think of putting some more context in superblock, if we want to overwrite
> > it. E.g., a reason to stop checkpoint?
> 
> Good idea, maybe:
> Bit	Value				max number of type
> [0]	need fsck flag			1
> [1-5]	reason to stop checkpoint	32
> [6-13]	reason to fsck			256

How about just keeping the counters of the reasons? (e.g., EIO count which
stopped checkpoint)

#define MAX_CRASH_REASON 32
char array[MAX_CRASH_REASON];

> 
> Thanks
> 
> > 
> > > +	}
> > >   }
> > >   /*
> > > diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
> > > index dee7b67a17a6..1960a98c7555 100644
> > > --- a/fs/f2fs/f2fs.h
> > > +++ b/fs/f2fs/f2fs.h
> > > @@ -3556,6 +3556,7 @@ int f2fs_enable_quota_files(struct f2fs_sb_info *sbi, bool rdonly);
> > >   int f2fs_quota_sync(struct super_block *sb, int type);
> > >   loff_t max_file_blocks(struct inode *inode);
> > >   void f2fs_quota_off_umount(struct super_block *sb);
> > > +void f2fs_update_sb_flags(struct f2fs_sb_info *sbi, unsigned int flag);
> > >   int f2fs_commit_super(struct f2fs_sb_info *sbi, bool recover);
> > >   int f2fs_sync_fs(struct super_block *sb, int sync);
> > >   int f2fs_sanity_check_ckpt(struct f2fs_sb_info *sbi);
> > > diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
> > > index b8e5fe244596..c99ba840593d 100644
> > > --- a/fs/f2fs/super.c
> > > +++ b/fs/f2fs/super.c
> > > @@ -3846,6 +3846,32 @@ int f2fs_commit_super(struct f2fs_sb_info *sbi, bool recover)
> > >   	return err;
> > >   }
> > > +void f2fs_update_sb_flags(struct f2fs_sb_info *sbi, unsigned int flag)
> > > +{
> > > +	unsigned short s_flags;
> > > +	int err;
> > > +
> > > +	if (le16_to_cpu(F2FS_RAW_SUPER(sbi)->s_flags) & SB_NEED_FSCK)
> > > +		return;
> > > +
> > > +	f2fs_down_write(&sbi->sb_lock);
> > > +
> > > +	s_flags = le16_to_cpu(F2FS_RAW_SUPER(sbi)->s_flags);
> > > +
> > > +	if (s_flags & SB_NEED_FSCK)
> > > +		goto out_unlock;
> > > +
> > > +	F2FS_RAW_SUPER(sbi)->s_flags = cpu_to_le16(s_flags | SB_NEED_FSCK);
> > > +
> > > +	err = f2fs_commit_super(sbi, false);
> > > +	if (err) {
> > > +		f2fs_warn(sbi, "f2fs_commit_super fails to persist flag: %u, err:%d", flag, err);
> > > +		F2FS_RAW_SUPER(sbi)->s_flags = s_flags;
> > > +	}
> > > +out_unlock:
> > > +	f2fs_up_write(&sbi->sb_lock);
> > > +}
> > > +
> > >   static int f2fs_scan_devices(struct f2fs_sb_info *sbi)
> > >   {
> > >   	struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi);
> > > diff --git a/include/linux/f2fs_fs.h b/include/linux/f2fs_fs.h
> > > index d445150c5350..124176e2a42c 100644
> > > --- a/include/linux/f2fs_fs.h
> > > +++ b/include/linux/f2fs_fs.h
> > > @@ -73,6 +73,8 @@ struct f2fs_device {
> > >   	__le32 total_segments;
> > >   } __packed;
> > > +#define SB_NEED_FSCK			0x00000001	/* need fsck */
> > > +
> > >   struct f2fs_super_block {
> > >   	__le32 magic;			/* Magic Number */
> > >   	__le16 major_ver;		/* Major Version */
> > > @@ -116,7 +118,8 @@ struct f2fs_super_block {
> > >   	__u8 hot_ext_count;		/* # of hot file extension */
> > >   	__le16  s_encoding;		/* Filename charset encoding */
> > >   	__le16  s_encoding_flags;	/* Filename charset encoding flags */
> > > -	__u8 reserved[306];		/* valid reserved region */
> > > +	__le16 s_flags;			/* super block flags */
> > > +	__u8 reserved[304];		/* valid reserved region */
> > >   	__le32 crc;			/* checksum of superblock */
> > >   } __packed;
> > > -- 
> > > 2.25.1

  reply	other threads:[~2022-09-22 18:08 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-13 13:59 [f2fs-dev] [RFC PATCH v2] f2fs: record need_fsck in super_block Chao Yu
2022-09-13 13:59 ` Chao Yu
2022-09-20  0:56 ` [f2fs-dev] " Jaegeuk Kim
2022-09-20  0:56   ` Jaegeuk Kim
2022-09-20 15:43   ` [f2fs-dev] " Chao Yu
2022-09-20 15:43     ` Chao Yu
2022-09-22 18:08     ` Jaegeuk Kim [this message]
2022-09-22 18:08       ` Jaegeuk Kim
2022-09-25 13:57       ` [f2fs-dev] " Chao Yu
2022-09-25 13:57         ` Chao Yu

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=YyykoT0BdBrXfcrQ@google.com \
    --to=jaegeuk@kernel.org \
    --cc=chao@kernel.org \
    --cc=linux-f2fs-devel@lists.sourceforge.net \
    --cc=linux-kernel@vger.kernel.org \
    /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.