]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - fs/f2fs/segment.h
f2fs: update the comment of default nr_pages to skipping
[mirror_ubuntu-bionic-kernel.git] / fs / f2fs / segment.h
index 9d44ce83acb2663f79eb228e757040b323c54d83..5e8ad4280a5016d293817115a31a94daaf8d2d49 100644 (file)
@@ -164,6 +164,9 @@ struct seg_entry {
        unsigned int ckpt_valid_blocks:10;      /* # of valid blocks last cp */
        unsigned int padding:6;         /* padding */
        unsigned char *cur_valid_map;   /* validity bitmap of blocks */
+#ifdef CONFIG_F2FS_CHECK_FS
+       unsigned char *cur_valid_map_mir;       /* mirror of current valid bitmap */
+#endif
        /*
         * # of valid blocks and the validity bitmap stored in the the last
         * checkpoint pack. This information is used by the SSR mode.
@@ -186,9 +189,12 @@ struct segment_allocation {
  * the page is atomically written, and it is in inmem_pages list.
  */
 #define ATOMIC_WRITTEN_PAGE            ((unsigned long)-1)
+#define DUMMY_WRITTEN_PAGE             ((unsigned long)-2)
 
 #define IS_ATOMIC_WRITTEN_PAGE(page)                   \
                (page_private(page) == (unsigned long)ATOMIC_WRITTEN_PAGE)
+#define IS_DUMMY_WRITTEN_PAGE(page)                    \
+               (page_private(page) == (unsigned long)DUMMY_WRITTEN_PAGE)
 
 struct inmem_pages {
        struct list_head list;
@@ -203,6 +209,9 @@ struct sit_info {
        block_t sit_blocks;             /* # of blocks used by SIT area */
        block_t written_valid_blocks;   /* # of valid blocks in main area */
        char *sit_bitmap;               /* SIT bitmap pointer */
+#ifdef CONFIG_F2FS_CHECK_FS
+       char *sit_bitmap_mir;           /* SIT bitmap mirror */
+#endif
        unsigned int bitmap_size;       /* SIT bitmap size */
 
        unsigned long *tmp_map;                 /* bitmap for temporal use */
@@ -317,6 +326,9 @@ static inline void seg_info_from_raw_sit(struct seg_entry *se,
        se->ckpt_valid_blocks = GET_SIT_VBLOCKS(rs);
        memcpy(se->cur_valid_map, rs->valid_map, SIT_VBLOCK_MAP_SIZE);
        memcpy(se->ckpt_valid_map, rs->valid_map, SIT_VBLOCK_MAP_SIZE);
+#ifdef CONFIG_F2FS_CHECK_FS
+       memcpy(se->cur_valid_map_mir, rs->valid_map, SIT_VBLOCK_MAP_SIZE);
+#endif
        se->type = GET_SIT_TYPE(rs);
        se->mtime = le64_to_cpu(rs->mtime);
 }
@@ -414,6 +426,12 @@ static inline void get_sit_bitmap(struct f2fs_sb_info *sbi,
                void *dst_addr)
 {
        struct sit_info *sit_i = SIT_I(sbi);
+
+#ifdef CONFIG_F2FS_CHECK_FS
+       if (memcmp(sit_i->sit_bitmap, sit_i->sit_bitmap_mir,
+                                               sit_i->bitmap_size))
+               f2fs_bug_on(sbi, 1);
+#endif
        memcpy(dst_addr, sit_i->sit_bitmap, sit_i->bitmap_size);
 }
 
@@ -634,6 +652,12 @@ static inline pgoff_t current_sit_addr(struct f2fs_sb_info *sbi,
 
        check_seg_range(sbi, start);
 
+#ifdef CONFIG_F2FS_CHECK_FS
+       if (f2fs_test_bit(offset, sit_i->sit_bitmap) !=
+                       f2fs_test_bit(offset, sit_i->sit_bitmap_mir))
+               f2fs_bug_on(sbi, 1);
+#endif
+
        /* calculate sit block address */
        if (f2fs_test_bit(offset, sit_i->sit_bitmap))
                blk_addr += sit_i->sit_blocks;
@@ -659,6 +683,9 @@ static inline void set_to_next_sit(struct sit_info *sit_i, unsigned int start)
        unsigned int block_off = SIT_BLOCK_OFFSET(start);
 
        f2fs_change_bit(block_off, sit_i->sit_bitmap);
+#ifdef CONFIG_F2FS_CHECK_FS
+       f2fs_change_bit(block_off, sit_i->sit_bitmap_mir);
+#endif
 }
 
 static inline unsigned long long get_mtime(struct f2fs_sb_info *sbi)
@@ -689,6 +716,15 @@ static inline block_t sum_blk_addr(struct f2fs_sb_info *sbi, int base, int type)
                                - (base + 1) + type;
 }
 
+static inline bool no_fggc_candidate(struct f2fs_sb_info *sbi,
+                                               unsigned int secno)
+{
+       if (get_valid_blocks(sbi, secno, sbi->segs_per_sec) >=
+                                               sbi->fggc_threshold)
+               return true;
+       return false;
+}
+
 static inline bool sec_usage_check(struct f2fs_sb_info *sbi, unsigned int secno)
 {
        if (IS_CURSEC(sbi, secno) || (sbi->cur_victim_sec == secno))
@@ -700,8 +736,8 @@ static inline bool sec_usage_check(struct f2fs_sb_info *sbi, unsigned int secno)
  * It is very important to gather dirty pages and write at once, so that we can
  * submit a big bio without interfering other data writes.
  * By default, 512 pages for directory data,
- * 512 pages (2MB) * 3 for three types of nodes, and
- * max_bio_blocks for meta are set.
+ * 512 pages (2MB) * 8 for nodes, and
+ * 256 pages * 8 for meta are set.
  */
 static inline int nr_pages_to_skip(struct f2fs_sb_info *sbi, int type)
 {