max_nat_bitmap_size should be aligned up in segment, rather than
aligned down

Signed-off-by: Gao Xiang <[email protected]>
---
Change log from v1:
 - fix sit/nat_ver_bitmap_bytesize calculation

 fsck/resize.c      | 16 +++++++++-------
 mkfs/f2fs_format.c | 15 ++++++++++-----
 2 files changed, 19 insertions(+), 12 deletions(-)

diff --git a/fsck/resize.c b/fsck/resize.c
index 143ad5d..6dc4e3f 100644
--- a/fsck/resize.c
+++ b/fsck/resize.c
@@ -69,8 +69,7 @@ static int get_new_sb(struct f2fs_super_block *sb)
                set_sb(cp_payload, 0);
        }
 
-       max_nat_segments = (max_nat_bitmap_size * 8) >>
-                                       get_sb(log_blocks_per_seg);
+       max_nat_segments = SEG_ALIGN(max_nat_bitmap_size * 8);
 
        if (get_sb(segment_count_nat) > max_nat_segments)
                set_sb(segment_count_nat, max_nat_segments);
@@ -422,6 +421,7 @@ static void rebuild_checkpoint(struct f2fs_sb_info *sbi,
        block_t new_cp_blks = 1 + get_newsb(cp_payload);
        block_t orphan_blks = 0;
        block_t new_cp_blk_no, old_cp_blk_no;
+       u_int32_t sit_bitmap_size;
        u_int32_t crc = 0;
        u32 flags;
        void *buf;
@@ -469,13 +469,15 @@ static void rebuild_checkpoint(struct f2fs_sb_info *sbi,
        }
 
        /* sit / nat ver bitmap bytesize */
-       set_cp(sit_ver_bitmap_bytesize,
-                       ((get_newsb(segment_count_sit) / 2) <<
-                       get_newsb(log_blocks_per_seg)) / 8);
-       set_cp(nat_ver_bitmap_bytesize,
-                       ((get_newsb(segment_count_nat) / 2) <<
+       sit_bitmap_size = min((u_int32_t)MAX_SIT_BITMAP_SIZE,
+               ((get_newsb(segment_count_sit) / 2) <<
                        get_newsb(log_blocks_per_seg)) / 8);
 
+       set_cp(sit_ver_bitmap_bytesize, sit_bitmap_size);
+       set_cp(nat_ver_bitmap_bytesize, CHECKSUM_OFFSET -
+               sizeof(struct f2fs_checkpoint) + 1 -
+               (get_sb(cp_payload) ? 0 : sit_bitmap_size));
+
        /* update nat_bits flag */
        flags = update_nat_bits_flags(new_sb, cp, get_cp(ckpt_flags));
        set_cp(ckpt_flags, flags);
diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c
index a130001..9da7eac 100644
--- a/mkfs/f2fs_format.c
+++ b/mkfs/f2fs_format.c
@@ -302,7 +302,7 @@ static int f2fs_prepare_super_block(void)
                set_sb(cp_payload, 0);
        }
 
-       max_nat_segments = (max_nat_bitmap_size * 8) >> log_blks_per_seg;
+       max_nat_segments = SEG_ALIGN(max_nat_bitmap_size * 8);
 
        if (get_sb(segment_count_nat) > max_nat_segments)
                set_sb(segment_count_nat, max_nat_segments);
@@ -528,6 +528,7 @@ static int f2fs_write_check_point_pack(void)
        u_int32_t blk_size_bytes;
        u_int32_t nat_bits_bytes, nat_bits_blocks;
        unsigned char *nat_bits = NULL, *empty_nat_bits;
+       u_int32_t sit_bitmap_size;
        u_int64_t cp_seg_blk = 0;
        u_int32_t crc = 0, flags;
        unsigned int i;
@@ -627,11 +628,15 @@ static int f2fs_write_check_point_pack(void)
        set_cp(valid_node_count, 1 + quota_inum);
        set_cp(valid_inode_count, 1 + quota_inum);
        set_cp(next_free_nid, get_sb(root_ino) + 1 + quota_inum);
-       set_cp(sit_ver_bitmap_bytesize, ((get_sb(segment_count_sit) / 2) <<
-                       get_sb(log_blocks_per_seg)) / 8);
 
-       set_cp(nat_ver_bitmap_bytesize, ((get_sb(segment_count_nat) / 2) <<
-                        get_sb(log_blocks_per_seg)) / 8);
+       sit_bitmap_size = min((u_int32_t)MAX_SIT_BITMAP_SIZE,
+               ((get_sb(segment_count_sit) / 2) <<
+               get_sb(log_blocks_per_seg)) / 8);
+
+       set_cp(sit_ver_bitmap_bytesize, sit_bitmap_size);
+       set_cp(nat_ver_bitmap_bytesize, CHECKSUM_OFFSET -
+               sizeof(struct f2fs_checkpoint) + 1 -
+               (get_sb(cp_payload) ? 0 : sit_bitmap_size));
 
        set_cp(checksum_offset, CHECKSUM_OFFSET);
 
-- 
2.1.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
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to