All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] f2fs: skip new checkpoint when doing fstrim without fs change
@ 2016-08-18  7:55 Yunlei He
  2016-08-18  9:12 ` Chao Yu
  0 siblings, 1 reply; 2+ messages in thread
From: Yunlei He @ 2016-08-18  7:55 UTC (permalink / raw)
  To: linux-f2fs-devel, jaegeuk, yuchao0; +Cc: heyunlei

This patch enables to do fstrim without checkpoint, if there is no fs
change.

Signed-off-by: Yunlei He <heyunlei@huawei.com>
---
 fs/f2fs/checkpoint.c | 11 +++++++++++
 fs/f2fs/debug.c      | 10 ++++++++--
 fs/f2fs/f2fs.h       |  7 ++++++-
 3 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c
index be1c54b..1207b91 100644
--- a/fs/f2fs/checkpoint.c
+++ b/fs/f2fs/checkpoint.c
@@ -1188,6 +1188,17 @@ int write_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc)
 
 	f2fs_flush_merged_bios(sbi);
 
+	/* this is the case of multiple fstrims without any changes */
+	if (cpc->reason == CP_DISCARD && !is_sbi_flag_set(sbi, SBI_IS_DIRTY)) {
+		f2fs_bug_on(sbi, NM_I(sbi)->dirty_nat_cnt);
+		f2fs_bug_on(sbi, SIT_I(sbi)->dirty_sentries);
+		f2fs_bug_on(sbi, prefree_segments(sbi));
+		flush_sit_entries(sbi, cpc);
+		clear_prefree_segments(sbi, cpc);
+		unblock_operations(sbi);
+		goto out;
+	}
+
 	/*
 	 * update checkpoint pack index
 	 * Increase the version number so that
diff --git a/fs/f2fs/debug.c b/fs/f2fs/debug.c
index badd407..07bee48 100644
--- a/fs/f2fs/debug.c
+++ b/fs/f2fs/debug.c
@@ -54,6 +54,7 @@ static void update_general_status(struct f2fs_sb_info *sbi)
 	si->rsvd_segs = reserved_segments(sbi);
 	si->overp_segs = overprovision_segments(sbi);
 	si->valid_count = valid_user_blocks(sbi);
+	si->discard_blks = discard_blocks(sbi);
 	si->valid_node_count = valid_node_count(sbi);
 	si->valid_inode_count = valid_inode_count(sbi);
 	si->inline_xattr = atomic_read(&sbi->inline_xattr);
@@ -228,8 +229,13 @@ static int stat_show(struct seq_file *s, void *v)
 			   si->ssa_area_segs, si->main_area_segs);
 		seq_printf(s, "(OverProv:%d Resv:%d)]\n\n",
 			   si->overp_segs, si->rsvd_segs);
-		seq_printf(s, "Utilization: %d%% (%d valid blocks)\n",
-			   si->utilization, si->valid_count);
+		if (test_opt(si->sbi, DISCARD))
+			seq_printf(s, "Utilization: %u%% (%u valid blocks, %u discard blocks)\n",
+				si->utilization, si->valid_count, si->discard_blks);
+		else
+			seq_printf(s, "Utilization: %u%% (%u valid blocks)\n",
+				si->utilization, si->valid_count);
+
 		seq_printf(s, "  - Node: %u (Inode: %u, ",
 			   si->valid_node_count, si->valid_inode_count);
 		seq_printf(s, "Other: %u)\n  - Data: %u\n",
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 3098109..e691ff0 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -1242,6 +1242,11 @@ static inline block_t valid_user_blocks(struct f2fs_sb_info *sbi)
 	return sbi->total_valid_block_count;
 }
 
+static inline block_t discard_blocks(struct f2fs_sb_info *sbi)
+{
+	return sbi->discard_blks;
+}
+
 static inline unsigned long __bitmap_size(struct f2fs_sb_info *sbi, int flag)
 {
 	struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
@@ -2128,7 +2133,7 @@ struct f2fs_stat_info {
 	int total_count, utilization;
 	int bg_gc, wb_bios;
 	int inline_xattr, inline_inode, inline_dir, orphans;
-	unsigned int valid_count, valid_node_count, valid_inode_count;
+	unsigned int valid_count, valid_node_count, valid_inode_count, discard_blks;
 	unsigned int bimodal, avg_vblocks;
 	int util_free, util_valid, util_invalid;
 	int rsvd_segs, overp_segs;
-- 
1.9.1


------------------------------------------------------------------------------

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] f2fs: skip new checkpoint when doing fstrim without fs change
  2016-08-18  7:55 [PATCH] f2fs: skip new checkpoint when doing fstrim without fs change Yunlei He
@ 2016-08-18  9:12 ` Chao Yu
  0 siblings, 0 replies; 2+ messages in thread
From: Chao Yu @ 2016-08-18  9:12 UTC (permalink / raw)
  To: Yunlei He, linux-f2fs-devel, jaegeuk; +Cc: heyunlei

Hi Yunlei,

Seems in this patch there are two parts, fstrim opitimization and sys entry of
f2fs status enhancement, it's better to do one thing in one patch, could you
split this patch into two?

Thanks,

On 2016/8/18 15:55, Yunlei He wrote:
> This patch enables to do fstrim without checkpoint, if there is no fs
> change.
> 
> Signed-off-by: Yunlei He <heyunlei@huawei.com>
> ---
>  fs/f2fs/checkpoint.c | 11 +++++++++++
>  fs/f2fs/debug.c      | 10 ++++++++--
>  fs/f2fs/f2fs.h       |  7 ++++++-
>  3 files changed, 25 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c
> index be1c54b..1207b91 100644
> --- a/fs/f2fs/checkpoint.c
> +++ b/fs/f2fs/checkpoint.c
> @@ -1188,6 +1188,17 @@ int write_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc)
>  
>  	f2fs_flush_merged_bios(sbi);
>  
> +	/* this is the case of multiple fstrims without any changes */
> +	if (cpc->reason == CP_DISCARD && !is_sbi_flag_set(sbi, SBI_IS_DIRTY)) {
> +		f2fs_bug_on(sbi, NM_I(sbi)->dirty_nat_cnt);
> +		f2fs_bug_on(sbi, SIT_I(sbi)->dirty_sentries);
> +		f2fs_bug_on(sbi, prefree_segments(sbi));
> +		flush_sit_entries(sbi, cpc);
> +		clear_prefree_segments(sbi, cpc);
> +		unblock_operations(sbi);
> +		goto out;
> +	}
> +
>  	/*
>  	 * update checkpoint pack index
>  	 * Increase the version number so that
> diff --git a/fs/f2fs/debug.c b/fs/f2fs/debug.c
> index badd407..07bee48 100644
> --- a/fs/f2fs/debug.c
> +++ b/fs/f2fs/debug.c
> @@ -54,6 +54,7 @@ static void update_general_status(struct f2fs_sb_info *sbi)
>  	si->rsvd_segs = reserved_segments(sbi);
>  	si->overp_segs = overprovision_segments(sbi);
>  	si->valid_count = valid_user_blocks(sbi);
> +	si->discard_blks = discard_blocks(sbi);
>  	si->valid_node_count = valid_node_count(sbi);
>  	si->valid_inode_count = valid_inode_count(sbi);
>  	si->inline_xattr = atomic_read(&sbi->inline_xattr);
> @@ -228,8 +229,13 @@ static int stat_show(struct seq_file *s, void *v)
>  			   si->ssa_area_segs, si->main_area_segs);
>  		seq_printf(s, "(OverProv:%d Resv:%d)]\n\n",
>  			   si->overp_segs, si->rsvd_segs);
> -		seq_printf(s, "Utilization: %d%% (%d valid blocks)\n",
> -			   si->utilization, si->valid_count);
> +		if (test_opt(si->sbi, DISCARD))
> +			seq_printf(s, "Utilization: %u%% (%u valid blocks, %u discard blocks)\n",
> +				si->utilization, si->valid_count, si->discard_blks);
> +		else
> +			seq_printf(s, "Utilization: %u%% (%u valid blocks)\n",
> +				si->utilization, si->valid_count);
> +
>  		seq_printf(s, "  - Node: %u (Inode: %u, ",
>  			   si->valid_node_count, si->valid_inode_count);
>  		seq_printf(s, "Other: %u)\n  - Data: %u\n",
> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
> index 3098109..e691ff0 100644
> --- a/fs/f2fs/f2fs.h
> +++ b/fs/f2fs/f2fs.h
> @@ -1242,6 +1242,11 @@ static inline block_t valid_user_blocks(struct f2fs_sb_info *sbi)
>  	return sbi->total_valid_block_count;
>  }
>  
> +static inline block_t discard_blocks(struct f2fs_sb_info *sbi)
> +{
> +	return sbi->discard_blks;
> +}
> +
>  static inline unsigned long __bitmap_size(struct f2fs_sb_info *sbi, int flag)
>  {
>  	struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
> @@ -2128,7 +2133,7 @@ struct f2fs_stat_info {
>  	int total_count, utilization;
>  	int bg_gc, wb_bios;
>  	int inline_xattr, inline_inode, inline_dir, orphans;
> -	unsigned int valid_count, valid_node_count, valid_inode_count;
> +	unsigned int valid_count, valid_node_count, valid_inode_count, discard_blks;
>  	unsigned int bimodal, avg_vblocks;
>  	int util_free, util_valid, util_invalid;
>  	int rsvd_segs, overp_segs;
> 


------------------------------------------------------------------------------

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2016-08-18  9:13 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-08-18  7:55 [PATCH] f2fs: skip new checkpoint when doing fstrim without fs change Yunlei He
2016-08-18  9:12 ` Chao Yu

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.