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

Reply via email to