On Fri, Dec 13, 2024 at 12:22 AM Jaegeuk Kim <jaeg...@kernel.org> wrote: > > On 12/11, yi sun wrote: > > Kindly ping. > > I think there are no problems with the first few patches, but the > > current patch may still have room for improvement. Do you have any > > good suggestions? > > Hi, may I ask for some basic tests? Have you run xfstests? >
Yes, I used phones with Android15+kernel6.6 for basic testing, including 48 hours of "monkey + file read, write and delete" testing and xfstests. No errors found. > > > > On Mon, Nov 4, 2024 at 11:46 AM Yi Sun <yi....@unisoc.com> wrote: > > > > > > Function f2fs_invalidate_blocks() can process continuous > > > blocks at a time, so f2fs_truncate_data_blocks_range() is > > > optimized to use the new functionality of > > > f2fs_invalidate_blocks(). > > > > > > Signed-off-by: Yi Sun <yi....@unisoc.com> > > > --- > > > fs/f2fs/file.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++--- > > > 1 file changed, 68 insertions(+), 4 deletions(-) > > > > > > diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c > > > index 9366e7fc7c39..d20cc5f36d4c 100644 > > > --- a/fs/f2fs/file.c > > > +++ b/fs/f2fs/file.c > > > @@ -612,6 +612,15 @@ static int f2fs_file_open(struct inode *inode, > > > struct file *filp) > > > return finish_preallocate_blocks(inode); > > > } > > > > > > +static bool check_curr_block_is_consecutive(struct f2fs_sb_info *sbi, > > > + block_t curr, block_t end) > > > +{ > > > + if (curr - end == 1 || curr == end) > > > + return true; > > > + else > > > + return false; > > > +} > > > + > > > void f2fs_truncate_data_blocks_range(struct dnode_of_data *dn, int count) > > > { > > > struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode); > > > @@ -621,8 +630,27 @@ void f2fs_truncate_data_blocks_range(struct > > > dnode_of_data *dn, int count) > > > int cluster_index = 0, valid_blocks = 0; > > > int cluster_size = F2FS_I(dn->inode)->i_cluster_size; > > > bool released = !atomic_read(&F2FS_I(dn->inode)->i_compr_blocks); > > > + /* > > > + * Temporary record location. > > > + * When the current @blkaddr and @blkaddr_end can be processed > > > + * together, update the value of @blkaddr_end. > > > + * When it is detected that current @blkaddr is not continues with > > > + * @blkaddr_end, it is necessary to process continues blocks > > > + * range [blkaddr_start, blkaddr_end]. > > > + */ > > > + block_t blkaddr_start, blkaddr_end; > > > + /*. > > > + * To avoid processing various invalid data blocks. > > > + * Because @blkaddr_start and @blkaddr_end may be assigned > > > + * NULL_ADDR or invalid data blocks, @last_valid is used to > > > + * record this situation. > > > + */ > > > + bool last_valid = false; > > > + /* Process the last @blkaddr separately? */ > > > + bool last_one = true; > > > > > > addr = get_dnode_addr(dn->inode, dn->node_page) + ofs; > > > + blkaddr_start = blkaddr_end = le32_to_cpu(*addr); > > > > > > /* Assumption: truncation starts with cluster */ > > > for (; count > 0; count--, addr++, dn->ofs_in_node++, > > > cluster_index++) { > > > @@ -638,24 +666,60 @@ void f2fs_truncate_data_blocks_range(struct > > > dnode_of_data *dn, int count) > > > } > > > > > > if (blkaddr == NULL_ADDR) > > > - continue; > > > + goto next; > > > > > > f2fs_set_data_blkaddr(dn, NULL_ADDR); > > > > > > if (__is_valid_data_blkaddr(blkaddr)) { > > > if (time_to_inject(sbi, > > > FAULT_BLKADDR_CONSISTENCE)) > > > - continue; > > > + goto next; > > > if (!f2fs_is_valid_blkaddr_raw(sbi, blkaddr, > > > DATA_GENERIC_ENHANCE)) > > > - continue; > > > + goto next; > > > if (compressed_cluster) > > > valid_blocks++; > > > } > > > > > > - f2fs_invalidate_blocks(sbi, blkaddr, 1); > > > + > > > + if (check_curr_block_is_consecutive(sbi, blkaddr, > > > blkaddr_end)) { > > > + /* > > > + * The current block @blkaddr is continuous with > > > + * @blkaddr_end, so @blkaddr_end is updated. > > > + * And the f2fs_invalidate_blocks() is skipped > > > + * until @blkaddr that cannot be processed > > > + * together is encountered. > > > + */ > > > + blkaddr_end = blkaddr; > > > + if (count == 1) > > > + last_one = false; > > > + else > > > + goto skip_invalid; > > > + } > > > + > > > + f2fs_invalidate_blocks(sbi, blkaddr_start, > > > + blkaddr_end - blkaddr_start + 1); > > > + blkaddr_start = blkaddr_end = blkaddr; > > > + > > > + if (count == 1 && last_one) > > > + f2fs_invalidate_blocks(sbi, blkaddr, 1); > > > + > > > +skip_invalid: > > > + last_valid = true; > > > > > > if (!released || blkaddr != COMPRESS_ADDR) > > > nr_free++; > > > + > > > + continue; > > > + > > > +next: > > > + /* If consecutive blocks have been recorded, we need to > > > process them. */ > > > + if (last_valid == true) > > > + f2fs_invalidate_blocks(sbi, blkaddr_start, > > > + blkaddr_end - blkaddr_start + 1); > > > + > > > + blkaddr_start = blkaddr_end = le32_to_cpu(*(addr + 1)); > > > + last_valid = false; > > > + > > > } > > > > > > if (compressed_cluster) > > > -- > > > 2.25.1 > > > _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel