From: Chao Yu via Linux-f2fs-devel <linux-f2fs-devel@lists.sourceforge.net>
To: Chunhai Guo <guochunhai@vivo.com>, jaegeuk@kernel.org
Cc: linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net
Subject: Re: [f2fs-dev] [PATCH v3] f2fs: fix missing discard for active segments
Date: Tue, 18 Mar 2025 09:18:41 +0800 [thread overview]
Message-ID: <0cbe2a82-6e1c-425d-a967-85e4de44067d@kernel.org> (raw)
In-Reply-To: <20250317101624.3223575-1-guochunhai@vivo.com>
On 3/17/25 18:16, Chunhai Guo wrote:
> During a checkpoint, the current active segment X may not be handled
> properly. This occurs when segment X has 0 valid blocks and a non-zero
> number of discard blocks, for the following reasons:
>
> locate_dirty_segment() does not mark any active segment as a prefree
> segment. As a result, segment X is not included in dirty_segmap[PRE], and
> f2fs_clear_prefree_segments() skips it when handling prefree segments.
>
> add_discard_addrs() skips any segment with 0 valid blocks, so segment X is
> also skipped.
>
> Consequently, no `struct discard_cmd` is actually created for segment X.
> However, the ckpt_valid_map and cur_valid_map of segment X are synced by
> seg_info_to_raw_sit() during the current checkpoint process. As a result,
> it cannot find the missing discard bits even in subsequent checkpoints.
> Consequently, the value of sbi->discard_blks remains non-zero. Thus, when
> f2fs is umounted, CP_TRIMMED_FLAG will not be set due to the non-zero
> sbi->discard_blks.
>
> Relevant code process:
>
> f2fs_write_checkpoint()
> f2fs_flush_sit_entries()
> list_for_each_entry_safe(ses, tmp, head, set_list) {
> for_each_set_bit_from(segno, bitmap, end) {
> ...
> add_discard_addrs(sbi, cpc, false); // skip segment X due to its 0 valid blocks
> ...
> seg_info_to_raw_sit(); // sync ckpt_valid_map with cur_valid_map for segment X
> ...
> }
> }
> f2fs_clear_prefree_segments(); // segment X is not included in dirty_segmap[PRE] and is skipped
>
> This issue is easy to reproduce with the following operations:
>
> root # mkfs.f2fs -f /dev/f2fs_dev
> root # mount -t f2fs /dev/f2fs_dev /mnt_point
> root # dd if=/dev/blk_dev of=/mnt_point/1.bin bs=4k count=256
> root # sync
> root # rm /mnt_point/1.bin
> root # umount /mnt_point
> root # dump.f2fs /dev/f2fs_dev | grep "checkpoint state"
> Info: checkpoint state = 45 : crc compacted_summary unmount ---- 'trimmed' flag is missing
>
> Since add_discard_addrs() can handle active segments with non-zero valid
> blocks, it is reasonable to fix this issue by allowing it to also handle
> active segments with 0 valid blocks.
>
> Fixes: b29555505d81 ("f2fs: add key functions for small discards")
> Signed-off-by: Chunhai Guo <guochunhai@vivo.com>
Reviewed-by: Chao Yu <chao@kernel.org>
Thanks,
_______________________________________________
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: Chao Yu <chao@kernel.org>
To: Chunhai Guo <guochunhai@vivo.com>, jaegeuk@kernel.org
Cc: chao@kernel.org, linux-f2fs-devel@lists.sourceforge.net,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3] f2fs: fix missing discard for active segments
Date: Tue, 18 Mar 2025 09:18:41 +0800 [thread overview]
Message-ID: <0cbe2a82-6e1c-425d-a967-85e4de44067d@kernel.org> (raw)
In-Reply-To: <20250317101624.3223575-1-guochunhai@vivo.com>
On 3/17/25 18:16, Chunhai Guo wrote:
> During a checkpoint, the current active segment X may not be handled
> properly. This occurs when segment X has 0 valid blocks and a non-zero
> number of discard blocks, for the following reasons:
>
> locate_dirty_segment() does not mark any active segment as a prefree
> segment. As a result, segment X is not included in dirty_segmap[PRE], and
> f2fs_clear_prefree_segments() skips it when handling prefree segments.
>
> add_discard_addrs() skips any segment with 0 valid blocks, so segment X is
> also skipped.
>
> Consequently, no `struct discard_cmd` is actually created for segment X.
> However, the ckpt_valid_map and cur_valid_map of segment X are synced by
> seg_info_to_raw_sit() during the current checkpoint process. As a result,
> it cannot find the missing discard bits even in subsequent checkpoints.
> Consequently, the value of sbi->discard_blks remains non-zero. Thus, when
> f2fs is umounted, CP_TRIMMED_FLAG will not be set due to the non-zero
> sbi->discard_blks.
>
> Relevant code process:
>
> f2fs_write_checkpoint()
> f2fs_flush_sit_entries()
> list_for_each_entry_safe(ses, tmp, head, set_list) {
> for_each_set_bit_from(segno, bitmap, end) {
> ...
> add_discard_addrs(sbi, cpc, false); // skip segment X due to its 0 valid blocks
> ...
> seg_info_to_raw_sit(); // sync ckpt_valid_map with cur_valid_map for segment X
> ...
> }
> }
> f2fs_clear_prefree_segments(); // segment X is not included in dirty_segmap[PRE] and is skipped
>
> This issue is easy to reproduce with the following operations:
>
> root # mkfs.f2fs -f /dev/f2fs_dev
> root # mount -t f2fs /dev/f2fs_dev /mnt_point
> root # dd if=/dev/blk_dev of=/mnt_point/1.bin bs=4k count=256
> root # sync
> root # rm /mnt_point/1.bin
> root # umount /mnt_point
> root # dump.f2fs /dev/f2fs_dev | grep "checkpoint state"
> Info: checkpoint state = 45 : crc compacted_summary unmount ---- 'trimmed' flag is missing
>
> Since add_discard_addrs() can handle active segments with non-zero valid
> blocks, it is reasonable to fix this issue by allowing it to also handle
> active segments with 0 valid blocks.
>
> Fixes: b29555505d81 ("f2fs: add key functions for small discards")
> Signed-off-by: Chunhai Guo <guochunhai@vivo.com>
Reviewed-by: Chao Yu <chao@kernel.org>
Thanks,
next prev parent reply other threads:[~2025-03-18 1:18 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-17 10:16 [f2fs-dev] [PATCH v3] f2fs: fix missing discard for active segments Chunhai Guo via Linux-f2fs-devel
2025-03-17 10:16 ` Chunhai Guo
2025-03-18 1:18 ` Chao Yu via Linux-f2fs-devel [this message]
2025-03-18 1:18 ` Chao Yu
2025-03-18 1:30 ` [f2fs-dev] " patchwork-bot+f2fs--- via Linux-f2fs-devel
2025-03-18 1:30 ` patchwork-bot+f2fs
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=0cbe2a82-6e1c-425d-a967-85e4de44067d@kernel.org \
--to=linux-f2fs-devel@lists.sourceforge.net \
--cc=chao@kernel.org \
--cc=guochunhai@vivo.com \
--cc=jaegeuk@kernel.org \
--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.