f2fs-tools: rebase struct f2fs_summary_block with upstream
authorChao Yu <chao2.yu@samsung.com>
Fri, 11 Mar 2016 08:43:54 +0000 (16:43 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Mon, 14 Mar 2016 16:26:53 +0000 (09:26 -0700)
Struct f2fs_summary_block has been changed in upstream commits:
 - commit 8f1dbbbbdfe9 ("f2fs: introduce lifetime write IO statistics")
 - commit dfc08a12e49a ("f2fs: introduce f2fs_journal struct to wrap journal info")

This patch does the sync work for f2fs_summary_block structure between
f2fs-utils and f2fs kernel module.

Signed-off-by: Chao Yu <chao2.yu@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fsck/f2fs.h
fsck/mount.c
include/f2fs_fs.h
mkfs/f2fs_format.c

index f990527..a618b47 100644 (file)
@@ -314,13 +314,13 @@ static inline block_t sum_blk_addr(struct f2fs_sb_info *sbi, int base, int type)
 }
 
 
-#define nats_in_cursum(sum)             (le16_to_cpu(sum->n_nats))
-#define sits_in_cursum(sum)             (le16_to_cpu(sum->n_sits))
+#define nats_in_cursum(jnl)             (le16_to_cpu(jnl->n_nats))
+#define sits_in_cursum(jnl)             (le16_to_cpu(jnl->n_sits))
 
-#define nat_in_journal(sum, i)          (sum->nat_j.entries[i].ne)
-#define nid_in_journal(sum, i)          (sum->nat_j.entries[i].nid)
-#define sit_in_journal(sum, i)          (sum->sit_j.entries[i].se)
-#define segno_in_journal(sum, i)        (sum->sit_j.entries[i].segno)
+#define nat_in_journal(jnl, i)          (jnl->nat_j.entries[i].ne)
+#define nid_in_journal(jnl, i)          (jnl->nat_j.entries[i].nid)
+#define sit_in_journal(jnl, i)          (jnl->sit_j.entries[i].se)
+#define segno_in_journal(jnl, i)        (jnl->sit_j.entries[i].segno)
 
 #define SIT_ENTRY_OFFSET(sit_i, segno)                                  \
        (segno % sit_i->sents_per_block)
index f7fbbd9..153055e 100644 (file)
@@ -647,10 +647,10 @@ static void read_compacted_summaries(struct f2fs_sb_info *sbi)
        ASSERT(ret >= 0);
 
        curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
-       memcpy(&curseg->sum_blk->n_nats, kaddr, SUM_JOURNAL_SIZE);
+       memcpy(&curseg->sum_blk->journal.n_nats, kaddr, SUM_JOURNAL_SIZE);
 
        curseg = CURSEG_I(sbi, CURSEG_COLD_DATA);
-       memcpy(&curseg->sum_blk->n_sits, kaddr + SUM_JOURNAL_SIZE,
+       memcpy(&curseg->sum_blk->journal.n_sits, kaddr + SUM_JOURNAL_SIZE,
                                                SUM_JOURNAL_SIZE);
 
        offset = 2 * SUM_JOURNAL_SIZE;
@@ -1115,7 +1115,7 @@ void build_sit_entries(struct f2fs_sb_info *sbi)
 {
        struct sit_info *sit_i = SIT_I(sbi);
        struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_COLD_DATA);
-       struct f2fs_summary_block *sum = curseg->sum_blk;
+       struct f2fs_journal *journal = &curseg->sum_blk->journal;
        unsigned int segno;
 
        for (segno = 0; segno < TOTAL_SEGS(sbi); segno++) {
@@ -1124,9 +1124,9 @@ void build_sit_entries(struct f2fs_sb_info *sbi)
                struct f2fs_sit_entry sit;
                int i;
 
-               for (i = 0; i < sits_in_cursum(sum); i++) {
-                       if (le32_to_cpu(segno_in_journal(sum, i)) == segno) {
-                               sit = sit_in_journal(sum, i);
+               for (i = 0; i < sits_in_cursum(journal); i++) {
+                       if (le32_to_cpu(segno_in_journal(journal, i)) == segno) {
+                               sit = sit_in_journal(journal, i);
                                goto got_it;
                        }
                }
@@ -1224,7 +1224,7 @@ void rewrite_sit_area_bitmap(struct f2fs_sb_info *sbi)
        char *ptr = NULL;
 
        /* remove sit journal */
-       sum->n_sits = 0;
+       sum->journal.n_sits = 0;
 
        fsck->chk.free_segs = 0;
 
@@ -1274,17 +1274,17 @@ void rewrite_sit_area_bitmap(struct f2fs_sb_info *sbi)
 static void flush_sit_journal_entries(struct f2fs_sb_info *sbi)
 {
        struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_COLD_DATA);
-       struct f2fs_summary_block *sum = curseg->sum_blk;
+       struct f2fs_journal *journal = &curseg->sum_blk->journal;
        struct sit_info *sit_i = SIT_I(sbi);
        unsigned int segno;
        int i;
 
-       for (i = 0; i < sits_in_cursum(sum); i++) {
+       for (i = 0; i < sits_in_cursum(journal); i++) {
                struct f2fs_sit_block *sit_blk;
                struct f2fs_sit_entry *sit;
                struct seg_entry *se;
 
-               segno = segno_in_journal(sum, i);
+               segno = segno_in_journal(journal, i);
                se = get_seg_entry(sbi, segno);
 
                sit_blk = get_current_sit_page(sbi, segno);
@@ -1298,13 +1298,13 @@ static void flush_sit_journal_entries(struct f2fs_sb_info *sbi)
                rewrite_current_sit_page(sbi, segno, sit_blk);
                free(sit_blk);
        }
-       sum->n_sits = 0;
+       journal->n_sits = 0;
 }
 
 static void flush_nat_journal_entries(struct f2fs_sb_info *sbi)
 {
        struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
-       struct f2fs_summary_block *sum = curseg->sum_blk;
+       struct f2fs_journal *journal = &curseg->sum_blk->journal;
        struct f2fs_nm_info *nm_i = NM_I(sbi);
        struct f2fs_nat_block *nat_block;
        pgoff_t block_off;
@@ -1315,12 +1315,12 @@ static void flush_nat_journal_entries(struct f2fs_sb_info *sbi)
        int i = 0;
 
 next:
-       if (i >= nats_in_cursum(sum)) {
-               sum->n_nats = 0;
+       if (i >= nats_in_cursum(journal)) {
+               journal->n_nats = 0;
                return;
        }
 
-       nid = le32_to_cpu(nid_in_journal(sum, i));
+       nid = le32_to_cpu(nid_in_journal(journal, i));
        nat_block = (struct f2fs_nat_block *)calloc(BLOCK_SZ, 1);
 
        block_off = nid / NAT_ENTRY_PER_BLOCK;
@@ -1337,7 +1337,7 @@ next:
        ret = dev_read_block(nat_block, block_addr);
        ASSERT(ret >= 0);
 
-       memcpy(&nat_block->entries[entry_off], &nat_in_journal(sum, i),
+       memcpy(&nat_block->entries[entry_off], &nat_in_journal(journal, i),
                                        sizeof(struct f2fs_nat_entry));
 
        ret = dev_write_block(nat_block, block_addr);
@@ -1477,7 +1477,7 @@ void zero_journal_entries(struct f2fs_sb_info *sbi)
        int i;
 
        for (i = 0; i < NO_CHECK_TYPE; i++)
-               CURSEG_I(sbi, i)->sum_blk->n_nats = 0;
+               CURSEG_I(sbi, i)->sum_blk->journal.n_nats = 0;
 }
 
 void write_curseg_info(struct f2fs_sb_info *sbi)
@@ -1505,12 +1505,12 @@ int lookup_nat_in_journal(struct f2fs_sb_info *sbi, u32 nid,
                                        struct f2fs_nat_entry *raw_nat)
 {
        struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
-       struct f2fs_summary_block *sum = curseg->sum_blk;
+       struct f2fs_journal *journal = &curseg->sum_blk->journal;
        int i = 0;
 
-       for (i = 0; i < nats_in_cursum(sum); i++) {
-               if (le32_to_cpu(nid_in_journal(sum, i)) == nid) {
-                       memcpy(raw_nat, &nat_in_journal(sum, i),
+       for (i = 0; i < nats_in_cursum(journal); i++) {
+               if (le32_to_cpu(nid_in_journal(journal, i)) == nid) {
+                       memcpy(raw_nat, &nat_in_journal(journal, i),
                                                sizeof(struct f2fs_nat_entry));
                        DBG(3, "==> Found nid [0x%x] in nat cache\n", nid);
                        return i;
@@ -1522,7 +1522,7 @@ int lookup_nat_in_journal(struct f2fs_sb_info *sbi, u32 nid,
 void nullify_nat_entry(struct f2fs_sb_info *sbi, u32 nid)
 {
        struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
-       struct f2fs_summary_block *sum = curseg->sum_blk;
+       struct f2fs_journal *journal = &curseg->sum_blk->journal;
        struct f2fs_nm_info *nm_i = NM_I(sbi);
        struct f2fs_nat_block *nat_block;
        pgoff_t block_off;
@@ -1532,9 +1532,9 @@ void nullify_nat_entry(struct f2fs_sb_info *sbi, u32 nid)
        int i = 0;
 
        /* check in journal */
-       for (i = 0; i < nats_in_cursum(sum); i++) {
-               if (le32_to_cpu(nid_in_journal(sum, i)) == nid) {
-                       memset(&nat_in_journal(sum, i), 0,
+       for (i = 0; i < nats_in_cursum(journal); i++) {
+               if (le32_to_cpu(nid_in_journal(journal, i)) == nid) {
+                       memset(&nat_in_journal(journal, i), 0,
                                        sizeof(struct f2fs_nat_entry));
                        FIX_MSG("Remove nid [0x%x] in nat journal\n", nid);
                        return;
index 3a1d2d1..e958aed 100644 (file)
@@ -720,6 +720,13 @@ struct summary_footer {
                                sizeof(struct sit_journal_entry))
 #define SIT_JOURNAL_RESERVED   ((SUM_JOURNAL_SIZE - 2) %\
                                sizeof(struct sit_journal_entry))
+
+/*
+ * Reserved area should make size of f2fs_extra_info equals to
+ * that of nat_journal and sit_journal.
+ */
+#define EXTRA_INFO_RESERVED    (SUM_JOURNAL_SIZE - 2 - 8)
+
 /*
  * frequently updated NAT/SIT entries can be stored in the spare area in
  * summary blocks
@@ -749,18 +756,28 @@ struct sit_journal {
        __u8 reserved[SIT_JOURNAL_RESERVED];
 } __attribute__((packed));
 
-/* 4KB-sized summary block structure */
-struct f2fs_summary_block {
-       struct f2fs_summary entries[ENTRIES_IN_SUM];
+struct f2fs_extra_info {
+       __le64 kbytes_written;
+       __u8 reserved[EXTRA_INFO_RESERVED];
+} __attribute__((packed));
+
+struct f2fs_journal {
        union {
                __le16 n_nats;
                __le16 n_sits;
        };
-       /* spare area is used by NAT or SIT journals */
+       /* spare area is used by NAT or SIT journals or extra info */
        union {
                struct nat_journal nat_j;
                struct sit_journal sit_j;
+               struct f2fs_extra_info info;
        };
+} __attribute__((packed));
+
+/* 4KB-sized summary block structure */
+struct f2fs_summary_block {
+       struct f2fs_summary entries[ENTRIES_IN_SUM];
+       struct f2fs_journal journal;
        struct summary_footer footer;
 } __attribute__((packed));
 
index 645c2aa..4f38f03 100644 (file)
@@ -410,6 +410,7 @@ static int f2fs_init_nat_area(void)
 static int f2fs_write_check_point_pack(void)
 {
        struct f2fs_summary_block *sum = NULL;
+       struct f2fs_journal *journal;
        u_int32_t blk_size_bytes;
        u_int64_t cp_seg_blk_offset = 0;
        u_int32_t crc = 0;
@@ -532,38 +533,39 @@ static int f2fs_write_check_point_pack(void)
        memset(sum, 0, sizeof(struct f2fs_summary_block));
        SET_SUM_TYPE((&sum->footer), SUM_TYPE_DATA);
 
-       sum->n_nats = cpu_to_le16(1);
-       sum->nat_j.entries[0].nid = sb->root_ino;
-       sum->nat_j.entries[0].ne.version = 0;
-       sum->nat_j.entries[0].ne.ino = sb->root_ino;
-       sum->nat_j.entries[0].ne.block_addr = cpu_to_le32(
+       journal = &sum->journal;
+       journal->n_nats = cpu_to_le16(1);
+       journal->nat_j.entries[0].nid = sb->root_ino;
+       journal->nat_j.entries[0].ne.version = 0;
+       journal->nat_j.entries[0].ne.ino = sb->root_ino;
+       journal->nat_j.entries[0].ne.block_addr = cpu_to_le32(
                        get_sb(main_blkaddr) +
                        get_cp(cur_node_segno[0]) * config.blks_per_seg);
 
-       memcpy(sum_compact_p, &sum->n_nats, SUM_JOURNAL_SIZE);
+       memcpy(sum_compact_p, &journal->n_nats, SUM_JOURNAL_SIZE);
        sum_compact_p += SUM_JOURNAL_SIZE;
 
        memset(sum, 0, sizeof(struct f2fs_summary_block));
        /* inode sit for root */
-       sum->n_sits = cpu_to_le16(6);
-       sum->sit_j.entries[0].segno = cp->cur_node_segno[0];
-       sum->sit_j.entries[0].se.vblocks = cpu_to_le16((CURSEG_HOT_NODE << 10) | 1);
-       f2fs_set_bit(0, (char *)sum->sit_j.entries[0].se.valid_map);
-       sum->sit_j.entries[1].segno = cp->cur_node_segno[1];
-       sum->sit_j.entries[1].se.vblocks = cpu_to_le16((CURSEG_WARM_NODE << 10));
-       sum->sit_j.entries[2].segno = cp->cur_node_segno[2];
-       sum->sit_j.entries[2].se.vblocks = cpu_to_le16((CURSEG_COLD_NODE << 10));
+       journal->n_sits = cpu_to_le16(6);
+       journal->sit_j.entries[0].segno = cp->cur_node_segno[0];
+       journal->sit_j.entries[0].se.vblocks = cpu_to_le16((CURSEG_HOT_NODE << 10) | 1);
+       f2fs_set_bit(0, (char *)journal->sit_j.entries[0].se.valid_map);
+       journal->sit_j.entries[1].segno = cp->cur_node_segno[1];
+       journal->sit_j.entries[1].se.vblocks = cpu_to_le16((CURSEG_WARM_NODE << 10));
+       journal->sit_j.entries[2].segno = cp->cur_node_segno[2];
+       journal->sit_j.entries[2].se.vblocks = cpu_to_le16((CURSEG_COLD_NODE << 10));
 
        /* data sit for root */
-       sum->sit_j.entries[3].segno = cp->cur_data_segno[0];
-       sum->sit_j.entries[3].se.vblocks = cpu_to_le16((CURSEG_HOT_DATA << 10) | 1);
-       f2fs_set_bit(0, (char *)sum->sit_j.entries[3].se.valid_map);
-       sum->sit_j.entries[4].segno = cp->cur_data_segno[1];
-       sum->sit_j.entries[4].se.vblocks = cpu_to_le16((CURSEG_WARM_DATA << 10));
-       sum->sit_j.entries[5].segno = cp->cur_data_segno[2];
-       sum->sit_j.entries[5].se.vblocks = cpu_to_le16((CURSEG_COLD_DATA << 10));
-
-       memcpy(sum_compact_p, &sum->n_sits, SUM_JOURNAL_SIZE);
+       journal->sit_j.entries[3].segno = cp->cur_data_segno[0];
+       journal->sit_j.entries[3].se.vblocks = cpu_to_le16((CURSEG_HOT_DATA << 10) | 1);
+       f2fs_set_bit(0, (char *)journal->sit_j.entries[3].se.valid_map);
+       journal->sit_j.entries[4].segno = cp->cur_data_segno[1];
+       journal->sit_j.entries[4].se.vblocks = cpu_to_le16((CURSEG_WARM_DATA << 10));
+       journal->sit_j.entries[5].segno = cp->cur_data_segno[2];
+       journal->sit_j.entries[5].se.vblocks = cpu_to_le16((CURSEG_COLD_DATA << 10));
+
+       memcpy(sum_compact_p, &journal->n_sits, SUM_JOURNAL_SIZE);
        sum_compact_p += SUM_JOURNAL_SIZE;
 
        /* hot data summary */