在 2024/10/23 10:59, Qi Han 写道: > When the free segment is used up during CP disable, many write or > ioctl operations will get ENOSPC error codes, even if there are > still many blocks available. We can reproduce it in the following > steps: > > dd if=/dev/zero of=f2fs.img bs=1M count=65 > mkfs.f2fs -f f2fs.img > mount f2fs.img f2fs_dir -o checkpoint=disable:10% > cd f2fs_dir > i=1 ; while [[ $i -lt 50 ]] ; do (file_name=./2M_file$i ; dd \ > if=/dev/random of=$file_name bs=1M count=2); i=$((i+1)); done > sync > i=1 ; while [[ $i -lt 50 ]] ; do (file_name=./2M_file$i ; truncate \ > -s 1K $file_name); i=$((i+1)); done > sync > dd if=/dev/zero of=./file bs=1M count=20 > > In f2fs_need_SSR() function, it is allowed to use SSR to allocate > blocks when CP is disabled, so in f2fs_is_checkpoint_ready function, > can we judge the number of invalid blocks when free segment is not > enough, and return ENOSPC only if the number of invalid blocks is > also not enough? > > Signed-off-by: Qi Han <ha...@vivo.com> > --- > fs/f2fs/segment.h | 17 +++++++++++++++++ > 1 file changed, 17 insertions(+) > > diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h > index 71adb4a43bec..20b568eaa95e 100644 > --- a/fs/f2fs/segment.h > +++ b/fs/f2fs/segment.h > @@ -637,12 +637,29 @@ static inline bool has_enough_free_secs(struct > f2fs_sb_info *sbi, > return !has_not_enough_free_secs(sbi, freed, needed); > } > > +static inline bool has_enough_free_blks(struct f2fs_sb_info *sbi) > +{ > + unsigned int total_free_blocks = 0; > + unsigned int avail_user_block_count; > + > + spin_lock(&sbi->stat_lock); > + > + avail_user_block_count = get_available_block_count(sbi, NULL, true); > + total_free_blocks = avail_user_block_count - (unsigned > int)valid_user_blocks(sbi); > + > + spin_unlock(&sbi->stat_lock); > + > + return total_free_blocks > 0; > +} > + > static inline bool f2fs_is_checkpoint_ready(struct f2fs_sb_info *sbi) > { > if (likely(!is_sbi_flag_set(sbi, SBI_CP_DISABLED))) > return true; > if (likely(has_enough_free_secs(sbi, 0, 0))) > return true;
Hi, Chao, After Zhiguo's reminder, I just saw your previous patch: f2fs: fix to account dirty data in __get_secs_required(), the current modification may still return true if the segment is found to be insufficient when LFS and CP is closed, should I add the LFS mode restriction here? Thanks. > + if (likely(has_enough_free_blks(sbi))) > + return true; > return false; > } > _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel