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
