Lines Matching defs:sbi

101 void print_raw_sb_info(struct f2fs_sb_info *sbi)
103 struct f2fs_super_block *sb = F2FS_RAW_SUPER(sbi);
150 void print_ckpt_info(struct f2fs_sb_info *sbi)
152 struct f2fs_checkpoint *cp = F2FS_CKPT(sbi);
239 int validate_super_block(struct f2fs_sb_info *sbi, int block)
243 sbi->raw_super = malloc(sizeof(struct f2fs_super_block));
250 if (dev_read(sbi->raw_super, offset, sizeof(struct f2fs_super_block)))
253 if (!sanity_check_raw_super(sbi->raw_super)) {
263 memcpy(config.sb_version, sbi->raw_super->version, VERSION_LEN);
265 memcpy(config.init_version, sbi->raw_super->init_version, VERSION_LEN);
274 memcpy(sbi->raw_super->version,
276 ret = dev_write(sbi->raw_super, offset,
286 free(sbi->raw_super);
292 int init_sb_info(struct f2fs_sb_info *sbi)
294 struct f2fs_super_block *raw_super = sbi->raw_super;
296 sbi->log_sectors_per_block =
298 sbi->log_blocksize = le32_to_cpu(raw_super->log_blocksize);
299 sbi->blocksize = 1 << sbi->log_blocksize;
300 sbi->log_blocks_per_seg = le32_to_cpu(raw_super->log_blocks_per_seg);
301 sbi->blocks_per_seg = 1 << sbi->log_blocks_per_seg;
302 sbi->segs_per_sec = le32_to_cpu(raw_super->segs_per_sec);
303 sbi->secs_per_zone = le32_to_cpu(raw_super->secs_per_zone);
304 sbi->total_sections = le32_to_cpu(raw_super->section_count);
305 sbi->total_node_count =
307 * sbi->blocks_per_seg * NAT_ENTRY_PER_BLOCK;
308 sbi->root_ino_num = le32_to_cpu(raw_super->root_ino);
309 sbi->node_ino_num = le32_to_cpu(raw_super->node_ino);
310 sbi->meta_ino_num = le32_to_cpu(raw_super->meta_ino);
311 sbi->cur_victim_sec = NULL_SEGNO;
315 void *validate_checkpoint(struct f2fs_sb_info *sbi, block_t cp_addr,
320 unsigned long blk_size = sbi->blocksize;
372 int get_valid_checkpoint(struct f2fs_sb_info *sbi)
374 struct f2fs_super_block *raw_sb = sbi->raw_super;
376 unsigned long blk_size = sbi->blocksize;
379 unsigned int cp_blks = 1 + le32_to_cpu(F2FS_RAW_SUPER(sbi)->cp_payload);
382 sbi->ckpt = malloc(cp_blks * blk_size);
383 if (!sbi->ckpt)
390 cp1 = validate_checkpoint(sbi, cp_start_blk_no, &cp1_version);
394 cp2 = validate_checkpoint(sbi, cp_start_blk_no, &cp2_version);
399 sbi->cur_cp = 2;
402 sbi->cur_cp = 1;
406 sbi->cur_cp = 1;
409 sbi->cur_cp = 2;
416 memcpy(sbi->ckpt, cur_page, blk_size);
428 unsigned char *ckpt = (unsigned char *)sbi->ckpt;
439 free(sbi->ckpt);
443 int sanity_check_ckpt(struct f2fs_sb_info *sbi)
446 struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi);
447 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
462 int init_node_manager(struct f2fs_sb_info *sbi)
464 struct f2fs_super_block *sb_raw = F2FS_RAW_SUPER(sbi);
465 struct f2fs_nm_info *nm_i = NM_I(sbi);
477 nm_i->init_scan_nid = le32_to_cpu(sbi->ckpt->next_free_nid);
478 nm_i->next_scan_nid = le32_to_cpu(sbi->ckpt->next_free_nid);
480 nm_i->bitmap_size = __bitmap_size(sbi, NAT_BITMAP);
485 version_bitmap = __bitmap_ptr(sbi, NAT_BITMAP);
494 int build_node_manager(struct f2fs_sb_info *sbi)
497 sbi->nm_info = malloc(sizeof(struct f2fs_nm_info));
498 if (!sbi->nm_info)
501 err = init_node_manager(sbi);
508 int build_sit_info(struct f2fs_sb_info *sbi)
510 struct f2fs_super_block *raw_sb = F2FS_RAW_SUPER(sbi);
511 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
521 SM_I(sbi)->sit_info = sit_i;
523 sit_i->sentries = calloc(TOTAL_SEGS(sbi) * sizeof(struct seg_entry), 1);
525 for (start = 0; start < TOTAL_SEGS(sbi); start++) {
536 bitmap_size = __bitmap_size(sbi, SIT_BITMAP);
537 src_bitmap = __bitmap_ptr(sbi, SIT_BITMAP);
543 sit_i->sit_blocks = sit_segs << sbi->log_blocks_per_seg;
553 void reset_curseg(struct f2fs_sb_info *sbi, int type)
555 struct curseg_info *curseg = CURSEG_I(sbi, type);
565 se = get_seg_entry(sbi, curseg->segno);
569 static void read_compacted_summaries(struct f2fs_sb_info *sbi)
577 start = start_sum_block(sbi);
583 curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
586 curseg = CURSEG_I(sbi, CURSEG_COLD_DATA);
593 struct curseg_info *curseg = CURSEG_I(sbi, i);
595 reset_curseg(sbi, i);
598 blk_off = sbi->blocks_per_seg;
619 static void restore_node_summary(struct f2fs_sb_info *sbi,
632 addr = START_BLOCK(sbi, segno);
635 for (i = 0; i < sbi->blocks_per_seg; i++, sum_entry++) {
644 static void read_normal_summaries(struct f2fs_sb_info *sbi, int type)
646 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
656 blk_addr = sum_blk_addr(sbi, NR_CURSEG_TYPE, type);
658 blk_addr = sum_blk_addr(sbi, NR_CURSEG_DATA_TYPE, type);
663 blk_addr = sum_blk_addr(sbi, NR_CURSEG_NODE_TYPE,
666 blk_addr = GET_SUM_BLKADDR(sbi, segno);
674 restore_node_summary(sbi, segno, sum_blk);
676 curseg = CURSEG_I(sbi, type);
678 reset_curseg(sbi, type);
682 static void restore_curseg_summaries(struct f2fs_sb_info *sbi)
686 if (is_set_ckpt_flags(F2FS_CKPT(sbi), CP_COMPACT_SUM_FLAG)) {
687 read_compacted_summaries(sbi);
692 read_normal_summaries(sbi, type);
695 static void build_curseg(struct f2fs_sb_info *sbi)
697 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
706 SM_I(sbi)->curseg_array = array;
722 array[i].zone = GET_ZONENO_FROM_SEGNO(sbi, segno);
727 restore_curseg_summaries(sbi);
730 inline void check_seg_range(struct f2fs_sb_info *sbi, unsigned int segno)
732 unsigned int end_segno = SM_I(sbi)->segment_count - 1;
736 static struct f2fs_sit_block *get_current_sit_page(struct f2fs_sb_info *sbi,
739 struct sit_info *sit_i = SIT_I(sbi);
745 check_seg_range(sbi, segno);
757 void rewrite_current_sit_page(struct f2fs_sb_info *sbi,
760 struct sit_info *sit_i = SIT_I(sbi);
773 void check_block_count(struct f2fs_sb_info *sbi,
776 struct f2fs_sm_info *sm_info = SM_I(sbi);
782 if (GET_SIT_VBLOCKS(raw_sit) > sbi->blocks_per_seg)
815 struct seg_entry *get_seg_entry(struct f2fs_sb_info *sbi,
818 struct sit_info *sit_i = SIT_I(sbi);
822 int get_sum_block(struct f2fs_sb_info *sbi, unsigned int segno,
825 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
830 ssa_blk = GET_SUM_BLKADDR(sbi, segno);
833 curseg = CURSEG_I(sbi, CURSEG_HOT_NODE + type);
847 curseg = CURSEG_I(sbi, type);
871 int get_sum_entry(struct f2fs_sb_info *sbi, u32 blk_addr,
878 segno = GET_SEGNO(sbi, blk_addr);
879 offset = OFFSET_IN_SEG(sbi, blk_addr);
883 ret = get_sum_block(sbi, segno, sum_blk);
890 static void get_nat_entry(struct f2fs_sb_info *sbi, nid_t nid,
893 struct f2fs_nm_info *nm_i = NM_I(sbi);
900 if (lookup_nat_in_journal(sbi, nid, raw_nat) >= 0)
908 seg_off = block_off >> sbi->log_blocks_per_seg;
910 (seg_off << sbi->log_blocks_per_seg << 1) +
911 (block_off & ((1 << sbi->log_blocks_per_seg) - 1)));
914 block_addr += sbi->blocks_per_seg;
924 void get_node_info(struct f2fs_sb_info *sbi, nid_t nid, struct node_info *ni)
927 get_nat_entry(sbi, nid, &raw_nat);
932 void build_sit_entries(struct f2fs_sb_info *sbi)
934 struct sit_info *sit_i = SIT_I(sbi);
935 struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_COLD_DATA);
939 for (segno = 0; segno < TOTAL_SEGS(sbi); segno++) {
951 sit_blk = get_current_sit_page(sbi, segno);
955 check_block_count(sbi, segno, &sit);
961 int build_segment_manager(struct f2fs_sb_info *sbi)
963 struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi);
964 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
972 sbi->sm_info = sm_info;
981 build_sit_info(sbi);
983 build_curseg(sbi);
985 build_sit_entries(sbi);
990 void build_sit_area_bitmap(struct f2fs_sb_info *sbi)
992 struct f2fs_fsck *fsck = F2FS_FSCK(sbi);
993 struct f2fs_sm_info *sm_i = SM_I(sbi);
1006 for (segno = 0; segno < TOTAL_SEGS(sbi); segno++) {
1007 se = get_seg_entry(sbi, segno);
1013 if (sbi->ckpt->cur_node_segno[0] == segno ||
1014 sbi->ckpt->cur_data_segno[0] == segno ||
1015 sbi->ckpt->cur_node_segno[1] == segno ||
1016 sbi->ckpt->cur_data_segno[1] == segno ||
1017 sbi->ckpt->cur_node_segno[2] == segno ||
1018 sbi->ckpt->cur_data_segno[2] == segno) {
1035 void rewrite_sit_area_bitmap(struct f2fs_sb_info *sbi)
1037 struct f2fs_fsck *fsck = F2FS_FSCK(sbi);
1038 struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_COLD_DATA);
1039 struct sit_info *sit_i = SIT_I(sbi);
1051 for (segno = 0; segno < TOTAL_SEGS(sbi); segno++) {
1059 sit_blk = get_current_sit_page(sbi, segno);
1067 se = get_seg_entry(sbi, segno);
1076 rewrite_current_sit_page(sbi, segno, sit_blk);
1080 sbi->ckpt->cur_node_segno[0] != segno &&
1081 sbi->ckpt->cur_data_segno[0] != segno &&
1082 sbi->ckpt->cur_node_segno[1] != segno &&
1083 sbi->ckpt->cur_data_segno[1] != segno &&
1084 sbi->ckpt->cur_node_segno[2] != segno &&
1085 sbi->ckpt->cur_data_segno[2] != segno)
1092 int lookup_nat_in_journal(struct f2fs_sb_info *sbi, u32 nid,
1095 struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
1110 void nullify_nat_entry(struct f2fs_sb_info *sbi, u32 nid)
1112 struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
1114 struct f2fs_nm_info *nm_i = NM_I(sbi);
1136 seg_off = block_off >> sbi->log_blocks_per_seg;
1138 (seg_off << sbi->log_blocks_per_seg << 1) +
1139 (block_off & ((1 << sbi->log_blocks_per_seg) - 1)));
1142 block_addr += sbi->blocks_per_seg;
1155 void build_nat_area_bitmap(struct f2fs_sb_info *sbi)
1157 struct f2fs_fsck *fsck = F2FS_FSCK(sbi);
1158 struct f2fs_super_block *raw_sb = F2FS_RAW_SUPER(sbi);
1159 struct f2fs_nm_info *nm_i = NM_I(sbi);
1173 sbi->log_blocks_per_seg;
1182 seg_off = block_off >> sbi->log_blocks_per_seg;
1184 (seg_off << sbi->log_blocks_per_seg << 1) +
1185 (block_off & ((1 << sbi->log_blocks_per_seg) - 1)));
1188 block_addr += sbi->blocks_per_seg;
1199 if ((nid + i) == F2FS_NODE_INO(sbi) ||
1200 (nid + i) == F2FS_META_INO(sbi)) {
1205 if (lookup_nat_in_journal(sbi, nid + i,
1236 int f2fs_do_mount(struct f2fs_sb_info *sbi)
1240 sbi->active_logs = NR_CURSEG_TYPE;
1241 ret = validate_super_block(sbi, 0);
1243 ret = validate_super_block(sbi, 1);
1248 print_raw_sb_info(sbi);
1250 init_sb_info(sbi);
1252 ret = get_valid_checkpoint(sbi);
1258 if (sanity_check_ckpt(sbi)) {
1263 print_ckpt_info(sbi);
1266 u32 flag = le32_to_cpu(sbi->ckpt->ckpt_flags);
1276 sbi->total_valid_node_count = le32_to_cpu(sbi->ckpt->valid_node_count);
1277 sbi->total_valid_inode_count =
1278 le32_to_cpu(sbi->ckpt->valid_inode_count);
1279 sbi->user_block_count = le64_to_cpu(sbi->ckpt->user_block_count);
1280 sbi->total_valid_block_count =
1281 le64_to_cpu(sbi->ckpt->valid_block_count);
1282 sbi->last_valid_block_count = sbi->total_valid_block_count;
1283 sbi->alloc_valid_block_count = 0;
1285 if (build_segment_manager(sbi)) {
1290 if (build_node_manager(sbi)) {
1298 void f2fs_do_umount(struct f2fs_sb_info *sbi)
1300 struct sit_info *sit_i = SIT_I(sbi);
1301 struct f2fs_sm_info *sm_i = SM_I(sbi);
1302 struct f2fs_nm_info *nm_i = NM_I(sbi);
1307 free(sbi->nm_info);
1310 for (i = 0; i < TOTAL_SEGS(sbi); i++) {
1322 free(sbi->sm_info);
1324 free(sbi->ckpt);
1325 free(sbi->raw_super);