Copy summary entries in bulk in write_compacted_summaries(). And zero the blank part of page after writing the summaries to the page.
Signed-off-by: Fan li <fanofcode...@samsung.com> --- fs/f2fs/segment.c | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 3bc77c2..a08b2a8 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -3103,14 +3103,12 @@ static void write_compacted_summaries(struct f2fs_sb_info *sbi, block_t blkaddr) { struct page *page; unsigned char *kaddr; - struct f2fs_summary *summary; struct curseg_info *seg_i; int written_size = 0; - int i, j; + int i; page = grab_meta_page(sbi, blkaddr++); kaddr = (unsigned char *)page_address(page); - memset(kaddr, 0, PAGE_SIZE); /* Step 1: write nat cache */ seg_i = CURSEG_I(sbi, CURSEG_HOT_DATA); @@ -3124,34 +3122,42 @@ static void write_compacted_summaries(struct f2fs_sb_info *sbi, block_t blkaddr) /* Step 3: write summary entries */ for (i = CURSEG_HOT_DATA; i <= CURSEG_COLD_DATA; i++) { - unsigned short blkoff; + unsigned short blkoff, page_cap, summary_cnt; + seg_i = CURSEG_I(sbi, i); if (sbi->ckpt->alloc_type[i] == SSR) blkoff = sbi->blocks_per_seg; else blkoff = curseg_blkoff(sbi, i); - for (j = 0; j < blkoff; j++) { + while (blkoff) { if (!page) { page = grab_meta_page(sbi, blkaddr++); kaddr = (unsigned char *)page_address(page); - memset(kaddr, 0, PAGE_SIZE); written_size = 0; } - summary = (struct f2fs_summary *)(kaddr + written_size); - *summary = seg_i->sum_blk->entries[j]; - written_size += SUMMARY_SIZE; - if (written_size + SUMMARY_SIZE <= PAGE_SIZE - - SUM_FOOTER_SIZE) - continue; - - set_page_dirty(page); - f2fs_put_page(page, 1); - page = NULL; + page_cap = (PAGE_SIZE - SUM_FOOTER_SIZE - written_size) + / SUMMARY_SIZE; + summary_cnt = min(page_cap, blkoff); + memcpy(kaddr + written_size, seg_i->sum_blk->entries, + summary_cnt * SUMMARY_SIZE); + written_size += summary_cnt * SUMMARY_SIZE; + blkoff -= summary_cnt; + + if (page_cap == summary_cnt) { + memset(kaddr + written_size, 0, + PAGE_SIZE - written_size); + set_page_dirty(page); + f2fs_put_page(page, 1); + page = NULL; + } } } + if (page) { + memset(kaddr + written_size, 0, + PAGE_SIZE - written_size); set_page_dirty(page); f2fs_put_page(page, 1); } -- 2.7.4 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel