Sorry for annoying, please ignore this patch. I looked up f2fs kernel source code yesterday and I found max nid is depended on nat segment count rather than nat version bitmap size or others.
However I think for the large storage without using payload, use align up will waste version bitmap at most 409*511 = 208999 nids in some case. Thanks, On 2018/1/9 16:55, Gaoxiang (OS) wrote: > 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); > > ------------------------------------------------------------------------------ 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
