Lines Matching defs:sbi

91 void print_raw_sb_info(struct f2fs_sb_info *sbi)
93 struct f2fs_super_block *sb = F2FS_RAW_SUPER(sbi);
139 void print_ckpt_info(struct f2fs_sb_info *sbi)
141 struct f2fs_checkpoint *cp = F2FS_CKPT(sbi);
225 int validate_super_block(struct f2fs_sb_info *sbi, int block)
228 sbi->raw_super = malloc(sizeof(struct f2fs_super_block));
235 if (dev_read(sbi->raw_super, offset, sizeof(struct f2fs_super_block)))
238 if (!sanity_check_raw_super(sbi->raw_super))
241 free(sbi->raw_super);
247 int init_sb_info(struct f2fs_sb_info *sbi)
249 struct f2fs_super_block *raw_super = sbi->raw_super;
251 sbi->log_sectors_per_block =
253 sbi->log_blocksize = le32_to_cpu(raw_super->log_blocksize);
254 sbi->blocksize = 1 << sbi->log_blocksize;
255 sbi->log_blocks_per_seg = le32_to_cpu(raw_super->log_blocks_per_seg);
256 sbi->blocks_per_seg = 1 << sbi->log_blocks_per_seg;
257 sbi->segs_per_sec = le32_to_cpu(raw_super->segs_per_sec);
258 sbi->secs_per_zone = le32_to_cpu(raw_super->secs_per_zone);
259 sbi->total_sections = le32_to_cpu(raw_super->section_count);
260 sbi->total_node_count =
262 * sbi->blocks_per_seg * NAT_ENTRY_PER_BLOCK;
263 sbi->root_ino_num = le32_to_cpu(raw_super->root_ino);
264 sbi->node_ino_num = le32_to_cpu(raw_super->node_ino);
265 sbi->meta_ino_num = le32_to_cpu(raw_super->meta_ino);
266 sbi->cur_victim_sec = NULL_SEGNO;
270 void *validate_checkpoint(struct f2fs_sb_info *sbi, block_t cp_addr,
275 unsigned long blk_size = sbi->blocksize;
327 int get_valid_checkpoint(struct f2fs_sb_info *sbi)
329 struct f2fs_super_block *raw_sb = sbi->raw_super;
331 unsigned long blk_size = sbi->blocksize;
334 unsigned int cp_blks = 1 + le32_to_cpu(F2FS_RAW_SUPER(sbi)->cp_payload);
337 sbi->ckpt = malloc(cp_blks * blk_size);
338 if (!sbi->ckpt)
345 cp1 = validate_checkpoint(sbi, cp_start_blk_no, &cp1_version);
349 cp2 = validate_checkpoint(sbi, cp_start_blk_no, &cp2_version);
354 sbi->cur_cp = 2;
357 sbi->cur_cp = 1;
361 sbi->cur_cp = 1;
364 sbi->cur_cp = 2;
371 memcpy(sbi->ckpt, cur_page, blk_size);
383 unsigned char *ckpt = (unsigned char *)sbi->ckpt;
394 free(sbi->ckpt);
398 int sanity_check_ckpt(struct f2fs_sb_info *sbi)
401 struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi);
402 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
417 int init_node_manager(struct f2fs_sb_info *sbi)
419 struct f2fs_super_block *sb_raw = F2FS_RAW_SUPER(sbi);
420 struct f2fs_nm_info *nm_i = NM_I(sbi);
432 nm_i->init_scan_nid = le32_to_cpu(sbi->ckpt->next_free_nid);
433 nm_i->next_scan_nid = le32_to_cpu(sbi->ckpt->next_free_nid);
435 nm_i->bitmap_size = __bitmap_size(sbi, NAT_BITMAP);
440 version_bitmap = __bitmap_ptr(sbi, NAT_BITMAP);
449 int build_node_manager(struct f2fs_sb_info *sbi)
452 sbi->nm_info = malloc(sizeof(struct f2fs_nm_info));
453 if (!sbi->nm_info)
456 err = init_node_manager(sbi);
463 int build_sit_info(struct f2fs_sb_info *sbi)
465 struct f2fs_super_block *raw_sb = F2FS_RAW_SUPER(sbi);
466 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
476 SM_I(sbi)->sit_info = sit_i;
478 sit_i->sentries = calloc(TOTAL_SEGS(sbi) * sizeof(struct seg_entry), 1);
480 for (start = 0; start < TOTAL_SEGS(sbi); start++) {
491 bitmap_size = __bitmap_size(sbi, SIT_BITMAP);
492 src_bitmap = __bitmap_ptr(sbi, SIT_BITMAP);
498 sit_i->sit_blocks = sit_segs << sbi->log_blocks_per_seg;
508 void reset_curseg(struct f2fs_sb_info *sbi, int type)
510 struct curseg_info *curseg = CURSEG_I(sbi, type);
520 se = get_seg_entry(sbi, curseg->segno);
524 static void read_compacted_summaries(struct f2fs_sb_info *sbi)
532 start = start_sum_block(sbi);
538 curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
541 curseg = CURSEG_I(sbi, CURSEG_COLD_DATA);
548 struct curseg_info *curseg = CURSEG_I(sbi, i);
550 reset_curseg(sbi, i);
553 blk_off = sbi->blocks_per_seg;
574 static void restore_node_summary(struct f2fs_sb_info *sbi,
587 addr = START_BLOCK(sbi, segno);
590 for (i = 0; i < sbi->blocks_per_seg; i++, sum_entry++) {
599 static void read_normal_summaries(struct f2fs_sb_info *sbi, int type)
601 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
611 blk_addr = sum_blk_addr(sbi, NR_CURSEG_TYPE, type);
613 blk_addr = sum_blk_addr(sbi, NR_CURSEG_DATA_TYPE, type);
618 blk_addr = sum_blk_addr(sbi, NR_CURSEG_NODE_TYPE,
621 blk_addr = GET_SUM_BLKADDR(sbi, segno);
629 restore_node_summary(sbi, segno, sum_blk);
631 curseg = CURSEG_I(sbi, type);
633 reset_curseg(sbi, type);
637 static void restore_curseg_summaries(struct f2fs_sb_info *sbi)
641 if (is_set_ckpt_flags(F2FS_CKPT(sbi), CP_COMPACT_SUM_FLAG)) {
642 read_compacted_summaries(sbi);
647 read_normal_summaries(sbi, type);
650 static void build_curseg(struct f2fs_sb_info *sbi)
652 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
661 SM_I(sbi)->curseg_array = array;
677 array[i].zone = GET_ZONENO_FROM_SEGNO(sbi, segno);
682 restore_curseg_summaries(sbi);
685 inline void check_seg_range(struct f2fs_sb_info *sbi, unsigned int segno)
687 unsigned int end_segno = SM_I(sbi)->segment_count - 1;
691 static struct f2fs_sit_block *get_current_sit_page(struct f2fs_sb_info *sbi,
694 struct sit_info *sit_i = SIT_I(sbi);
700 check_seg_range(sbi, segno);
712 void rewrite_current_sit_page(struct f2fs_sb_info *sbi,
715 struct sit_info *sit_i = SIT_I(sbi);
728 void check_block_count(struct f2fs_sb_info *sbi,
731 struct f2fs_sm_info *sm_info = SM_I(sbi);
737 if (GET_SIT_VBLOCKS(raw_sit) > sbi->blocks_per_seg)
769 struct seg_entry *get_seg_entry(struct f2fs_sb_info *sbi,
772 struct sit_info *sit_i = SIT_I(sbi);
776 int get_sum_block(struct f2fs_sb_info *sbi, unsigned int segno,
779 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
784 ssa_blk = GET_SUM_BLKADDR(sbi, segno);
787 curseg = CURSEG_I(sbi, CURSEG_HOT_NODE + type);
801 curseg = CURSEG_I(sbi, type);
825 int get_sum_entry(struct f2fs_sb_info *sbi, u32 blk_addr,
832 segno = GET_SEGNO(sbi, blk_addr);
833 offset = OFFSET_IN_SEG(sbi, blk_addr);
837 ret = get_sum_block(sbi, segno, sum_blk);
844 static void get_nat_entry(struct f2fs_sb_info *sbi, nid_t nid,
847 struct f2fs_nm_info *nm_i = NM_I(sbi);
854 if (lookup_nat_in_journal(sbi, nid, raw_nat) >= 0)
862 seg_off = block_off >> sbi->log_blocks_per_seg;
864 (seg_off << sbi->log_blocks_per_seg << 1) +
865 (block_off & ((1 << sbi->log_blocks_per_seg) - 1)));
868 block_addr += sbi->blocks_per_seg;
878 void get_node_info(struct f2fs_sb_info *sbi, nid_t nid, struct node_info *ni)
881 get_nat_entry(sbi, nid, &raw_nat);
886 void build_sit_entries(struct f2fs_sb_info *sbi)
888 struct sit_info *sit_i = SIT_I(sbi);
889 struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_COLD_DATA);
893 for (segno = 0; segno < TOTAL_SEGS(sbi); segno++) {
905 sit_blk = get_current_sit_page(sbi, segno);
909 check_block_count(sbi, segno, &sit);
915 int build_segment_manager(struct f2fs_sb_info *sbi)
917 struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi);
918 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
926 sbi->sm_info = sm_info;
935 build_sit_info(sbi);
937 build_curseg(sbi);
939 build_sit_entries(sbi);
944 void build_sit_area_bitmap(struct f2fs_sb_info *sbi)
946 struct f2fs_fsck *fsck = F2FS_FSCK(sbi);
947 struct f2fs_sm_info *sm_i = SM_I(sbi);
960 for (segno = 0; segno < TOTAL_SEGS(sbi); segno++) {
961 se = get_seg_entry(sbi, segno);
967 if (sbi->ckpt->cur_node_segno[0] == segno ||
968 sbi->ckpt->cur_data_segno[0] == segno ||
969 sbi->ckpt->cur_node_segno[1] == segno ||
970 sbi->ckpt->cur_data_segno[1] == segno ||
971 sbi->ckpt->cur_node_segno[2] == segno ||
972 sbi->ckpt->cur_data_segno[2] == segno) {
989 void rewrite_sit_area_bitmap(struct f2fs_sb_info *sbi)
991 struct f2fs_fsck *fsck = F2FS_FSCK(sbi);
992 struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_COLD_DATA);
993 struct sit_info *sit_i = SIT_I(sbi);
1005 for (segno = 0; segno < TOTAL_SEGS(sbi); segno++) {
1013 sit_blk = get_current_sit_page(sbi, segno);
1021 se = get_seg_entry(sbi, segno);
1029 rewrite_current_sit_page(sbi, segno, sit_blk);
1033 sbi->ckpt->cur_node_segno[0] != segno &&
1034 sbi->ckpt->cur_data_segno[0] != segno &&
1035 sbi->ckpt->cur_node_segno[1] != segno &&
1036 sbi->ckpt->cur_data_segno[1] != segno &&
1037 sbi->ckpt->cur_node_segno[2] != segno &&
1038 sbi->ckpt->cur_data_segno[2] != segno)
1045 int lookup_nat_in_journal(struct f2fs_sb_info *sbi, u32 nid,
1048 struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
1063 void nullify_nat_entry(struct f2fs_sb_info *sbi, u32 nid)
1065 struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
1067 struct f2fs_nm_info *nm_i = NM_I(sbi);
1089 seg_off = block_off >> sbi->log_blocks_per_seg;
1091 (seg_off << sbi->log_blocks_per_seg << 1) +
1092 (block_off & ((1 << sbi->log_blocks_per_seg) - 1)));
1095 block_addr += sbi->blocks_per_seg;
1108 void build_nat_area_bitmap(struct f2fs_sb_info *sbi)
1110 struct f2fs_fsck *fsck = F2FS_FSCK(sbi);
1111 struct f2fs_super_block *raw_sb = F2FS_RAW_SUPER(sbi);
1112 struct f2fs_nm_info *nm_i = NM_I(sbi);
1126 sbi->log_blocks_per_seg;
1135 seg_off = block_off >> sbi->log_blocks_per_seg;
1137 (seg_off << sbi->log_blocks_per_seg << 1) +
1138 (block_off & ((1 << sbi->log_blocks_per_seg) - 1)));
1141 block_addr += sbi->blocks_per_seg;
1152 if ((nid + i) == F2FS_NODE_INO(sbi) ||
1153 (nid + i) == F2FS_META_INO(sbi)) {
1158 if (lookup_nat_in_journal(sbi, nid + i,
1189 int f2fs_do_mount(struct f2fs_sb_info *sbi)
1193 sbi->active_logs = NR_CURSEG_TYPE;
1194 ret = validate_super_block(sbi, 0);
1196 ret = validate_super_block(sbi, 1);
1201 print_raw_sb_info(sbi);
1203 init_sb_info(sbi);
1205 ret = get_valid_checkpoint(sbi);
1211 if (sanity_check_ckpt(sbi)) {
1216 print_ckpt_info(sbi);
1219 u32 flag = le32_to_cpu(sbi->ckpt->ckpt_flags);
1229 sbi->total_valid_node_count = le32_to_cpu(sbi->ckpt->valid_node_count);
1230 sbi->total_valid_inode_count =
1231 le32_to_cpu(sbi->ckpt->valid_inode_count);
1232 sbi->user_block_count = le64_to_cpu(sbi->ckpt->user_block_count);
1233 sbi->total_valid_block_count =
1234 le64_to_cpu(sbi->ckpt->valid_block_count);
1235 sbi->last_valid_block_count = sbi->total_valid_block_count;
1236 sbi->alloc_valid_block_count = 0;
1238 if (build_segment_manager(sbi)) {
1243 if (build_node_manager(sbi)) {
1251 void f2fs_do_umount(struct f2fs_sb_info *sbi)
1253 struct sit_info *sit_i = SIT_I(sbi);
1254 struct f2fs_sm_info *sm_i = SM_I(sbi);
1255 struct f2fs_nm_info *nm_i = NM_I(sbi);
1260 free(sbi->nm_info);
1263 for (i = 0; i < TOTAL_SEGS(sbi); i++) {
1275 free(sbi->sm_info);
1277 free(sbi->ckpt);
1278 free(sbi->raw_super);