1. Use the same buffer in the same call cycle of f2fs_defragment; 2. Pass se and offset as arguments to the migrate_block;
Signed-off-by: LongPing Wei <weilongp...@oppo.com> --- fsck/defrag.c | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/fsck/defrag.c b/fsck/defrag.c index 9889b70..7336f8f 100644 --- a/fsck/defrag.c +++ b/fsck/defrag.c @@ -9,28 +9,21 @@ */ #include "fsck.h" -static int migrate_block(struct f2fs_sb_info *sbi, u64 from, u64 to) +static int migrate_block(struct f2fs_sb_info *sbi, u64 from, u64 to, + void *raw, struct seg_entry *se, u64 offset) { - void *raw = calloc(F2FS_BLKSIZE, 1); - struct seg_entry *se; struct f2fs_summary sum; - u64 offset; int ret, type; - ASSERT(raw != NULL); - /* read from */ ret = dev_read_block(raw, from); ASSERT(ret >= 0); - /* get segment type */ - se = get_seg_entry(sbi, GET_SEGNO(sbi, from)); /* write to */ ret = dev_write_block(raw, to, f2fs_io_type_to_rw_hint(se->type)); ASSERT(ret >= 0); /* update sit bitmap & valid_blocks && se->type */ - offset = OFFSET_IN_SEG(sbi, from); type = se->type; se->valid_blocks--; f2fs_clear_bit(offset, (char *)se->cur_valid_map); @@ -57,7 +50,6 @@ static int migrate_block(struct f2fs_sb_info *sbi, u64 from, u64 to) DBG(1, "Migrate %s block %"PRIx64" -> %"PRIx64"\n", IS_DATASEG(type) ? "data" : "node", from, to); - free(raw); return 0; } @@ -65,6 +57,9 @@ int f2fs_defragment(struct f2fs_sb_info *sbi, u64 from, u64 len, u64 to, int lef { struct seg_entry *se; u64 idx, offset; + void *raw = calloc(F2FS_BLKSIZE, 1); + + ASSERT(raw != NULL); /* flush NAT/SIT journal entries */ flush_journal_entries(sbi); @@ -83,7 +78,7 @@ int f2fs_defragment(struct f2fs_sb_info *sbi, u64 from, u64 len, u64 to, int lef return -1; } - if (migrate_block(sbi, idx, target)) { + if (migrate_block(sbi, idx, target, raw, se, offset)) { ASSERT_MSG("Found inconsistency: please run FSCK"); return -1; } @@ -99,5 +94,6 @@ int f2fs_defragment(struct f2fs_sb_info *sbi, u64 from, u64 len, u64 to, int lef write_checkpoint(sbi); + free(raw); return 0; } -- 2.34.1 _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel