[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <F5157873-C7F5-43C6-BABE-2B495F976493@dilger.ca>
Date: Mon, 14 Aug 2023 23:08:42 -0600
From: Andreas Dilger <adilger@...ger.ca>
To: Li Dongyang <dongyangli@....com>
Cc: Ext4 Developers List <linux-ext4@...r.kernel.org>,
Shuichi Ihara <sihara@....com>, wangshilong1991@...il.com
Subject: Re: [PATCH 2/2] e2fsprogs: support EXT2_FLAG_BG_TRIMMED and
EXT2_FLAGS_TRACK_TRIM
On Aug 11, 2023, at 12:19 AM, Li Dongyang <dongyangli@....com> wrote:
>
> This adds EXT2_FLAG_BG_TRIMMED, which is used on block group
> descriptors during mke2fs after discard is done.
> The EXT2_FLAG_BG_TRIMMED flag is cleared on the block group when
> we free blocks.
>
> Introduce EXT2_FLAGS_TRACK_TRIM, which is a new super block flag,
> to indicate whether we should honour the EXT2_FLAG_BG_TRIMMED
> set on each block group.
> EXT2_FLAGS_TRACK_TRIM itself can be turned on/off via tune2fs.
>
> Make dumpe2fs aware of the new flags.
Ted, I think this patch is uncontroversial, and could be landed as-is.
Reviewed-by: Andreas Dilger <adilger@...ger.ca>
>
> Cc: Shuichi Ihara <sihara@....com>
> Cc: Andreas Dilger <adilger@...ger.ca>
> Cc: Wang Shilong <wangshilong1991@...il.com>
> Signed-off-by: Wang Shilong <wshilong@....com>
> Signed-off-by: Li Dongyang <dongyangli@....com>
> ---
> lib/e2p/ls.c | 4 ++++
> lib/ext2fs/alloc_stats.c | 8 ++++++--
> lib/ext2fs/ext2_fs.h | 2 ++
> misc/dumpe2fs.c | 2 ++
> misc/mke2fs.c | 9 +++++++++
> misc/tune2fs.8.in | 8 ++++++++
> misc/tune2fs.c | 10 ++++++++++
> 7 files changed, 41 insertions(+), 2 deletions(-)
>
> diff --git a/lib/e2p/ls.c b/lib/e2p/ls.c
> index 0b74aea2b..4b356eca6 100644
> --- a/lib/e2p/ls.c
> +++ b/lib/e2p/ls.c
> @@ -162,6 +162,10 @@ static void print_super_flags(struct ext2_super_block * s, FILE *f)
> fputs("test_filesystem ", f);
> flags_found++;
> }
> + if (s->s_flags & EXT2_FLAGS_TRACK_TRIM) {
> + fputs("track_trim ", f);
> + flags_found++;
> + }
> if (flags_found)
> fputs("\n", f);
> else
> diff --git a/lib/ext2fs/alloc_stats.c b/lib/ext2fs/alloc_stats.c
> index 6f98bcc7c..4e03f92a4 100644
> --- a/lib/ext2fs/alloc_stats.c
> +++ b/lib/ext2fs/alloc_stats.c
> @@ -70,10 +70,12 @@ void ext2fs_block_alloc_stats2(ext2_filsys fs, blk64_t blk, int inuse)
> #endif
> return;
> }
> - if (inuse > 0)
> + if (inuse > 0) {
> ext2fs_mark_block_bitmap2(fs->block_map, blk);
> - else
> + } else {
> ext2fs_unmark_block_bitmap2(fs->block_map, blk);
> + ext2fs_bg_flags_clear(fs, group, EXT2_BG_TRIMMED);
> + }
> ext2fs_bg_free_blocks_count_set(fs, group, ext2fs_bg_free_blocks_count(fs, group) - inuse);
> ext2fs_bg_flags_clear(fs, group, EXT2_BG_BLOCK_UNINIT);
> ext2fs_group_desc_csum_set(fs, group);
> @@ -139,6 +141,8 @@ void ext2fs_block_alloc_stats_range(ext2_filsys fs, blk64_t blk,
> ext2fs_bg_free_blocks_count(fs, group) -
> inuse*n/EXT2FS_CLUSTER_RATIO(fs));
> ext2fs_bg_flags_clear(fs, group, EXT2_BG_BLOCK_UNINIT);
> + if (inuse < 0)
> + ext2fs_bg_flags_clear(fs, group, EXT2_BG_TRIMMED);
> ext2fs_group_desc_csum_set(fs, group);
> ext2fs_free_blocks_count_add(fs->super, -inuse * (blk64_t) n);
> blk += n;
> diff --git a/lib/ext2fs/ext2_fs.h b/lib/ext2fs/ext2_fs.h
> index 0fc9c09a5..88e1114c9 100644
> --- a/lib/ext2fs/ext2_fs.h
> +++ b/lib/ext2fs/ext2_fs.h
> @@ -223,6 +223,7 @@ struct ext4_group_desc
> #define EXT2_BG_INODE_UNINIT 0x0001 /* Inode table/bitmap not initialized */
> #define EXT2_BG_BLOCK_UNINIT 0x0002 /* Block bitmap not initialized */
> #define EXT2_BG_INODE_ZEROED 0x0004 /* On-disk itable initialized to zero */
> +#define EXT2_BG_TRIMMED 0x0008 /* Block group was trimmed */
>
> /*
> * Data structures used by the directory indexing feature
> @@ -563,6 +564,7 @@ struct ext2_inode *EXT2_INODE(struct ext2_inode_large *large_inode)
> #define EXT2_FLAGS_SIGNED_HASH 0x0001 /* Signed dirhash in use */
> #define EXT2_FLAGS_UNSIGNED_HASH 0x0002 /* Unsigned dirhash in use */
> #define EXT2_FLAGS_TEST_FILESYS 0x0004 /* OK for use on development code */
> +#define EXT2_FLAGS_TRACK_TRIM 0x0008 /* Track trim status in each bg */
> #define EXT2_FLAGS_IS_SNAPSHOT 0x0010 /* This is a snapshot image */
> #define EXT2_FLAGS_FIX_SNAPSHOT 0x0020 /* Snapshot inodes corrupted */
> #define EXT2_FLAGS_FIX_EXCLUDE 0x0040 /* Exclude bitmaps corrupted */
> diff --git a/misc/dumpe2fs.c b/misc/dumpe2fs.c
> index 7c080ed9f..afe569dff 100644
> --- a/misc/dumpe2fs.c
> +++ b/misc/dumpe2fs.c
> @@ -131,6 +131,8 @@ static void print_bg_opts(ext2_filsys fs, dgrp_t i)
> &first);
> print_bg_opt(bg_flags, EXT2_BG_INODE_ZEROED, "ITABLE_ZEROED",
> &first);
> + print_bg_opt(bg_flags, EXT2_BG_TRIMMED, "TRIMMED",
> + &first);
> if (!first)
> fputc(']', stdout);
> fputc('\n', stdout);
> diff --git a/misc/mke2fs.c b/misc/mke2fs.c
> index 4a9c1b092..bbfcde478 100644
> --- a/misc/mke2fs.c
> +++ b/misc/mke2fs.c
> @@ -3154,6 +3154,15 @@ int main (int argc, char *argv[])
> /* Can't undo discard ... */
> if (!noaction && discard && dev_size && (io_ptr != undo_io_manager)) {
> retval = mke2fs_discard_device(fs);
> + if (!retval) {
> + dgrp_t i;
> +
> + fs->super->s_flags |= EXT2_FLAGS_TRACK_TRIM;
> + for (i = 0; i < fs->group_desc_count; i++) {
> + ext2fs_bg_flags_set(fs, i, EXT2_BG_TRIMMED);
> + ext2fs_group_desc_csum_set(fs, i);
> + }
> + }
> if (!retval && io_channel_discard_zeroes_data(fs->io)) {
> if (verbose)
> printf("%s",
> diff --git a/misc/tune2fs.8.in b/misc/tune2fs.8.in
> index dcf108c1f..2eb7e88ed 100644
> --- a/misc/tune2fs.8.in
> +++ b/misc/tune2fs.8.in
> @@ -273,6 +273,14 @@ mounted using experimental kernel code, such as the ext4dev file system.
> .B ^test_fs
> Clear the test_fs flag, indicating the file system should only be mounted
> using production-level file system code.
> +.TP
> +.B track_trim
> +Set a flag in the file system superblock to make fstrim save the trim status
> +in each block group and skip the block groups already been trimmed.
> +.TP
> +.B ^track_trim
> +Clear the track_trim flag to make fstrim ignore the trim status saved in
> +each block group, and trim every block group.
> .RE
> .TP
> .B \-f
> diff --git a/misc/tune2fs.c b/misc/tune2fs.c
> index 458f7cf6a..dd9e8eab0 100644
> --- a/misc/tune2fs.c
> +++ b/misc/tune2fs.c
> @@ -2312,6 +2312,14 @@ static int parse_extended_opts(ext2_filsys fs, const char *opts)
> sb->s_flags &= ~EXT2_FLAGS_TEST_FILESYS;
> printf("Clearing test filesystem flag\n");
> ext2fs_mark_super_dirty(fs);
> + } else if (!strcmp(token, "track_trim")) {
> + sb->s_flags |= EXT2_FLAGS_TRACK_TRIM;
> + printf("Setting track_trim flag\n");
> + ext2fs_mark_super_dirty(fs);
> + } else if (!strcmp(token, "^track_trim")) {
> + sb->s_flags &= ~EXT2_FLAGS_TRACK_TRIM;
> + printf("Clearing track_trim flag\n");
> + ext2fs_mark_super_dirty(fs);
> } else if (strcmp(token, "stride") == 0) {
> if (!arg) {
> r_usage++;
> @@ -2458,6 +2466,8 @@ static int parse_extended_opts(ext2_filsys fs, const char *opts)
> "\tforce_fsck\n"
> "\ttest_fs\n"
> "\t^test_fs\n"
> + "\ttrack_trim\n"
> + "\t^track_trim\n"
> "\tencoding=<encoding>\n"
> "\tencoding_flags=<flags>\n"));
> free(buf);
> --
> 2.41.0
>
Cheers, Andreas
Download attachment "signature.asc" of type "application/pgp-signature" (874 bytes)
Powered by blists - more mailing lists