Lines Matching refs:sbi
172 bool f2fs_need_SSR(struct f2fs_sb_info *sbi) in f2fs_need_SSR() argument
174 int node_secs = get_blocktype_secs(sbi, F2FS_DIRTY_NODES); in f2fs_need_SSR()
175 int dent_secs = get_blocktype_secs(sbi, F2FS_DIRTY_DENTS); in f2fs_need_SSR()
176 int imeta_secs = get_blocktype_secs(sbi, F2FS_DIRTY_IMETA); in f2fs_need_SSR()
178 if (test_opt(sbi, LFS)) in f2fs_need_SSR()
180 if (sbi->gc_mode == GC_URGENT) in f2fs_need_SSR()
183 return free_sections(sbi) <= (node_secs + 2 * dent_secs + imeta_secs + in f2fs_need_SSR()
184 SM_I(sbi)->min_ssr_sections + reserved_sections(sbi)); in f2fs_need_SSR()
189 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); in f2fs_register_inmem_page() local
208 spin_lock(&sbi->inode_lock[ATOMIC_FILE]); in f2fs_register_inmem_page()
210 list_add_tail(&fi->inmem_ilist, &sbi->inode_list[ATOMIC_FILE]); in f2fs_register_inmem_page()
211 spin_unlock(&sbi->inode_lock[ATOMIC_FILE]); in f2fs_register_inmem_page()
221 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); in __revoke_inmem_pages() local
254 err = f2fs_get_node_info(sbi, dn.nid, &ni); in __revoke_inmem_pages()
261 f2fs_invalidate_blocks(sbi, dn.data_blkaddr); in __revoke_inmem_pages()
264 f2fs_replace_block(sbi, &dn, dn.data_blkaddr, in __revoke_inmem_pages()
283 void f2fs_drop_inmem_pages_all(struct f2fs_sb_info *sbi, bool gc_failure) in f2fs_drop_inmem_pages_all() argument
285 struct list_head *head = &sbi->inode_list[ATOMIC_FILE]; in f2fs_drop_inmem_pages_all()
289 spin_lock(&sbi->inode_lock[ATOMIC_FILE]); in f2fs_drop_inmem_pages_all()
291 spin_unlock(&sbi->inode_lock[ATOMIC_FILE]); in f2fs_drop_inmem_pages_all()
296 spin_unlock(&sbi->inode_lock[ATOMIC_FILE]); in f2fs_drop_inmem_pages_all()
317 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); in f2fs_drop_inmem_pages() local
322 spin_lock(&sbi->inode_lock[ATOMIC_FILE]); in f2fs_drop_inmem_pages()
325 spin_unlock(&sbi->inode_lock[ATOMIC_FILE]); in f2fs_drop_inmem_pages()
336 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); in f2fs_drop_inmem_page() local
340 f2fs_bug_on(sbi, !IS_ATOMIC_WRITTEN_PAGE(page)); in f2fs_drop_inmem_page()
348 f2fs_bug_on(sbi, list_empty(head) || cur->page != page); in f2fs_drop_inmem_page()
352 dec_page_count(sbi, F2FS_INMEM_PAGES); in f2fs_drop_inmem_page()
365 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); in __f2fs_commit_inmem_pages() local
369 .sbi = sbi, in __f2fs_commit_inmem_pages()
419 f2fs_submit_merged_write_cond(sbi, inode, 0, last_idx, DATA); in __f2fs_commit_inmem_pages()
443 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); in f2fs_commit_inmem_pages() local
447 f2fs_balance_fs(sbi, true); in f2fs_commit_inmem_pages()
451 f2fs_lock_op(sbi); in f2fs_commit_inmem_pages()
457 spin_lock(&sbi->inode_lock[ATOMIC_FILE]); in f2fs_commit_inmem_pages()
460 spin_unlock(&sbi->inode_lock[ATOMIC_FILE]); in f2fs_commit_inmem_pages()
465 f2fs_unlock_op(sbi); in f2fs_commit_inmem_pages()
475 void f2fs_balance_fs(struct f2fs_sb_info *sbi, bool need) in f2fs_balance_fs() argument
477 if (time_to_inject(sbi, FAULT_CHECKPOINT)) { in f2fs_balance_fs()
479 f2fs_stop_checkpoint(sbi, false); in f2fs_balance_fs()
483 if (need && excess_cached_nats(sbi)) in f2fs_balance_fs()
484 f2fs_balance_fs_bg(sbi); in f2fs_balance_fs()
490 if (has_not_enough_free_secs(sbi, 0, 0)) { in f2fs_balance_fs()
491 mutex_lock(&sbi->gc_mutex); in f2fs_balance_fs()
492 f2fs_gc(sbi, false, false, NULL_SEGNO); in f2fs_balance_fs()
496 void f2fs_balance_fs_bg(struct f2fs_sb_info *sbi) in f2fs_balance_fs_bg() argument
498 if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING))) in f2fs_balance_fs_bg()
502 if (!f2fs_available_free_memory(sbi, EXTENT_CACHE)) in f2fs_balance_fs_bg()
503 f2fs_shrink_extent_tree(sbi, EXTENT_CACHE_SHRINK_NUMBER); in f2fs_balance_fs_bg()
506 if (!f2fs_available_free_memory(sbi, NAT_ENTRIES)) in f2fs_balance_fs_bg()
507 f2fs_try_to_free_nats(sbi, NAT_ENTRY_PER_BLOCK); in f2fs_balance_fs_bg()
509 if (!f2fs_available_free_memory(sbi, FREE_NIDS)) in f2fs_balance_fs_bg()
510 f2fs_try_to_free_nids(sbi, MAX_FREE_NIDS); in f2fs_balance_fs_bg()
512 f2fs_build_free_nids(sbi, false, false); in f2fs_balance_fs_bg()
514 if (!is_idle(sbi) && in f2fs_balance_fs_bg()
515 (!excess_dirty_nats(sbi) && !excess_dirty_nodes(sbi))) in f2fs_balance_fs_bg()
519 if (!f2fs_available_free_memory(sbi, NAT_ENTRIES) || in f2fs_balance_fs_bg()
520 !f2fs_available_free_memory(sbi, INO_ENTRIES) || in f2fs_balance_fs_bg()
521 excess_prefree_segs(sbi) || in f2fs_balance_fs_bg()
522 excess_dirty_nats(sbi) || in f2fs_balance_fs_bg()
523 excess_dirty_nodes(sbi) || in f2fs_balance_fs_bg()
524 f2fs_time_over(sbi, CP_TIME)) { in f2fs_balance_fs_bg()
525 if (test_opt(sbi, DATA_FLUSH)) { in f2fs_balance_fs_bg()
529 f2fs_sync_dirty_inodes(sbi, FILE_INODE); in f2fs_balance_fs_bg()
532 f2fs_sync_fs(sbi->sb, true); in f2fs_balance_fs_bg()
533 stat_inc_bg_cp_count(sbi->stat_info); in f2fs_balance_fs_bg()
537 static int __submit_flush_wait(struct f2fs_sb_info *sbi, in __submit_flush_wait() argument
540 struct bio *bio = f2fs_bio_alloc(sbi, 0, true); in __submit_flush_wait()
548 trace_f2fs_issue_flush(bdev, test_opt(sbi, NOBARRIER), in __submit_flush_wait()
549 test_opt(sbi, FLUSH_MERGE), ret); in __submit_flush_wait()
553 static int submit_flush_wait(struct f2fs_sb_info *sbi, nid_t ino) in submit_flush_wait() argument
558 if (!sbi->s_ndevs) in submit_flush_wait()
559 return __submit_flush_wait(sbi, sbi->sb->s_bdev); in submit_flush_wait()
561 for (i = 0; i < sbi->s_ndevs; i++) { in submit_flush_wait()
562 if (!f2fs_is_dirty_device(sbi, ino, i, FLUSH_INO)) in submit_flush_wait()
564 ret = __submit_flush_wait(sbi, FDEV(i).bdev); in submit_flush_wait()
573 struct f2fs_sb_info *sbi = data; in issue_flush_thread() local
574 struct flush_cmd_control *fcc = SM_I(sbi)->fcc_info; in issue_flush_thread()
580 sb_start_intwrite(sbi->sb); in issue_flush_thread()
591 ret = submit_flush_wait(sbi, cmd->ino); in issue_flush_thread()
602 sb_end_intwrite(sbi->sb); in issue_flush_thread()
609 int f2fs_issue_flush(struct f2fs_sb_info *sbi, nid_t ino) in f2fs_issue_flush() argument
611 struct flush_cmd_control *fcc = SM_I(sbi)->fcc_info; in f2fs_issue_flush()
615 if (test_opt(sbi, NOBARRIER)) in f2fs_issue_flush()
618 if (!test_opt(sbi, FLUSH_MERGE)) { in f2fs_issue_flush()
619 ret = submit_flush_wait(sbi, ino); in f2fs_issue_flush()
624 if (atomic_inc_return(&fcc->issing_flush) == 1 || sbi->s_ndevs > 1) { in f2fs_issue_flush()
625 ret = submit_flush_wait(sbi, ino); in f2fs_issue_flush()
656 ret = submit_flush_wait(sbi, ino); in f2fs_issue_flush()
673 int f2fs_create_flush_cmd_control(struct f2fs_sb_info *sbi) in f2fs_create_flush_cmd_control() argument
675 dev_t dev = sbi->sb->s_bdev->bd_dev; in f2fs_create_flush_cmd_control()
679 if (SM_I(sbi)->fcc_info) { in f2fs_create_flush_cmd_control()
680 fcc = SM_I(sbi)->fcc_info; in f2fs_create_flush_cmd_control()
686 fcc = f2fs_kzalloc(sbi, sizeof(struct flush_cmd_control), GFP_KERNEL); in f2fs_create_flush_cmd_control()
693 SM_I(sbi)->fcc_info = fcc; in f2fs_create_flush_cmd_control()
694 if (!test_opt(sbi, FLUSH_MERGE)) in f2fs_create_flush_cmd_control()
698 fcc->f2fs_issue_flush = kthread_run(issue_flush_thread, sbi, in f2fs_create_flush_cmd_control()
703 SM_I(sbi)->fcc_info = NULL; in f2fs_create_flush_cmd_control()
710 void f2fs_destroy_flush_cmd_control(struct f2fs_sb_info *sbi, bool free) in f2fs_destroy_flush_cmd_control() argument
712 struct flush_cmd_control *fcc = SM_I(sbi)->fcc_info; in f2fs_destroy_flush_cmd_control()
722 SM_I(sbi)->fcc_info = NULL; in f2fs_destroy_flush_cmd_control()
726 int f2fs_flush_device_cache(struct f2fs_sb_info *sbi) in f2fs_flush_device_cache() argument
730 if (!sbi->s_ndevs) in f2fs_flush_device_cache()
733 for (i = 1; i < sbi->s_ndevs; i++) { in f2fs_flush_device_cache()
734 if (!f2fs_test_bit(i, (char *)&sbi->dirty_device)) in f2fs_flush_device_cache()
736 ret = __submit_flush_wait(sbi, FDEV(i).bdev); in f2fs_flush_device_cache()
740 spin_lock(&sbi->dev_lock); in f2fs_flush_device_cache()
741 f2fs_clear_bit(i, (char *)&sbi->dirty_device); in f2fs_flush_device_cache()
742 spin_unlock(&sbi->dev_lock); in f2fs_flush_device_cache()
748 static void __locate_dirty_segment(struct f2fs_sb_info *sbi, unsigned int segno, in __locate_dirty_segment() argument
751 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi); in __locate_dirty_segment()
754 if (IS_CURSEG(sbi, segno)) in __locate_dirty_segment()
761 struct seg_entry *sentry = get_seg_entry(sbi, segno); in __locate_dirty_segment()
765 f2fs_bug_on(sbi, 1); in __locate_dirty_segment()
773 static void __remove_dirty_segment(struct f2fs_sb_info *sbi, unsigned int segno, in __remove_dirty_segment() argument
776 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi); in __remove_dirty_segment()
782 struct seg_entry *sentry = get_seg_entry(sbi, segno); in __remove_dirty_segment()
788 if (get_valid_blocks(sbi, segno, true) == 0) in __remove_dirty_segment()
789 clear_bit(GET_SEC_FROM_SEG(sbi, segno), in __remove_dirty_segment()
799 static void locate_dirty_segment(struct f2fs_sb_info *sbi, unsigned int segno) in locate_dirty_segment() argument
801 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi); in locate_dirty_segment()
804 if (segno == NULL_SEGNO || IS_CURSEG(sbi, segno)) in locate_dirty_segment()
809 valid_blocks = get_valid_blocks(sbi, segno, false); in locate_dirty_segment()
812 __locate_dirty_segment(sbi, segno, PRE); in locate_dirty_segment()
813 __remove_dirty_segment(sbi, segno, DIRTY); in locate_dirty_segment()
814 } else if (valid_blocks < sbi->blocks_per_seg) { in locate_dirty_segment()
815 __locate_dirty_segment(sbi, segno, DIRTY); in locate_dirty_segment()
818 __remove_dirty_segment(sbi, segno, DIRTY); in locate_dirty_segment()
824 static struct discard_cmd *__create_discard_cmd(struct f2fs_sb_info *sbi, in __create_discard_cmd() argument
828 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; in __create_discard_cmd()
832 f2fs_bug_on(sbi, !len); in __create_discard_cmd()
856 static struct discard_cmd *__attach_discard_cmd(struct f2fs_sb_info *sbi, in __attach_discard_cmd() argument
861 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; in __attach_discard_cmd()
864 dc = __create_discard_cmd(sbi, bdev, lstart, start, len); in __attach_discard_cmd()
887 static void __remove_discard_cmd(struct f2fs_sb_info *sbi, in __remove_discard_cmd() argument
890 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; in __remove_discard_cmd()
902 f2fs_bug_on(sbi, dc->ref); in __remove_discard_cmd()
908 f2fs_msg(sbi->sb, KERN_INFO, in __remove_discard_cmd()
931 static void __check_sit_bitmap(struct f2fs_sb_info *sbi, in __check_sit_bitmap() argument
938 unsigned long offset, size, max_blocks = sbi->blocks_per_seg; in __check_sit_bitmap()
942 segno = GET_SEGNO(sbi, blk); in __check_sit_bitmap()
943 sentry = get_seg_entry(sbi, segno); in __check_sit_bitmap()
944 offset = GET_BLKOFF_FROM_SEG0(sbi, blk); in __check_sit_bitmap()
946 if (end < START_BLOCK(sbi, segno + 1)) in __check_sit_bitmap()
947 size = GET_BLKOFF_FROM_SEG0(sbi, end); in __check_sit_bitmap()
952 f2fs_bug_on(sbi, offset != size); in __check_sit_bitmap()
953 blk = START_BLOCK(sbi, segno + 1); in __check_sit_bitmap()
958 static void __init_discard_policy(struct f2fs_sb_info *sbi, in __init_discard_policy() argument
978 if (utilization(sbi) > DEF_DISCARD_URGENT_UTIL) { in __init_discard_policy()
995 static void __update_discard_tree_range(struct f2fs_sb_info *sbi,
999 static int __submit_discard_cmd(struct f2fs_sb_info *sbi, in __submit_discard_cmd() argument
1008 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; in __submit_discard_cmd()
1018 if (is_sbi_flag_set(sbi, SBI_NEED_FSCK)) in __submit_discard_cmd()
1046 if (time_to_inject(sbi, FAULT_DISCARD)) { in __submit_discard_cmd()
1065 f2fs_bug_on(sbi, !bio); in __submit_discard_cmd()
1084 __check_sit_bitmap(sbi, start, start + len); in __submit_discard_cmd()
1093 f2fs_update_iostat(sbi, FS_DISCARD, 1); in __submit_discard_cmd()
1102 __update_discard_tree_range(sbi, bdev, lstart, start, len); in __submit_discard_cmd()
1106 static struct discard_cmd *__insert_discard_tree(struct f2fs_sb_info *sbi, in __insert_discard_tree() argument
1112 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; in __insert_discard_tree()
1123 p = f2fs_lookup_rb_tree_for_insert(sbi, &dcc->root, &parent, lstart); in __insert_discard_tree()
1125 dc = __attach_discard_cmd(sbi, bdev, lstart, start, len, parent, p); in __insert_discard_tree()
1138 static void __punch_discard_cmd(struct f2fs_sb_info *sbi, in __punch_discard_cmd() argument
1141 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; in __punch_discard_cmd()
1146 __remove_discard_cmd(sbi, dc); in __punch_discard_cmd()
1161 __insert_discard_tree(sbi, dc->bdev, blkaddr + 1, in __punch_discard_cmd()
1175 static void __update_discard_tree_range(struct f2fs_sb_info *sbi, in __update_discard_tree_range() argument
1179 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; in __update_discard_tree_range()
1248 __remove_discard_cmd(sbi, tdc); in __update_discard_tree_range()
1253 __insert_discard_tree(sbi, bdev, di.lstart, di.start, in __update_discard_tree_range()
1266 static int __queue_discard_cmd(struct f2fs_sb_info *sbi, in __queue_discard_cmd() argument
1273 if (sbi->s_ndevs) { in __queue_discard_cmd()
1274 int devi = f2fs_target_device_index(sbi, blkstart); in __queue_discard_cmd()
1278 mutex_lock(&SM_I(sbi)->dcc_info->cmd_lock); in __queue_discard_cmd()
1279 __update_discard_tree_range(sbi, bdev, lblkstart, blkstart, blklen); in __queue_discard_cmd()
1280 mutex_unlock(&SM_I(sbi)->dcc_info->cmd_lock); in __queue_discard_cmd()
1284 static unsigned int __issue_discard_cmd_orderly(struct f2fs_sb_info *sbi, in __issue_discard_cmd_orderly() argument
1287 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; in __issue_discard_cmd_orderly()
1314 if (dpolicy->io_aware && !is_idle(sbi)) { in __issue_discard_cmd_orderly()
1320 err = __submit_discard_cmd(sbi, dpolicy, dc, &issued); in __issue_discard_cmd_orderly()
1327 __remove_discard_cmd(sbi, dc); in __issue_discard_cmd_orderly()
1344 static int __issue_discard_cmd(struct f2fs_sb_info *sbi, in __issue_discard_cmd() argument
1347 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; in __issue_discard_cmd()
1359 return __issue_discard_cmd_orderly(sbi, dpolicy); in __issue_discard_cmd()
1367 f2fs_bug_on(sbi, !f2fs_check_rb_tree_consistence(sbi, in __issue_discard_cmd()
1371 f2fs_bug_on(sbi, dc->state != D_PREP); in __issue_discard_cmd()
1374 !is_idle(sbi)) { in __issue_discard_cmd()
1379 __submit_discard_cmd(sbi, dpolicy, dc, &issued); in __issue_discard_cmd()
1398 static bool __drop_discard_cmd(struct f2fs_sb_info *sbi) in __drop_discard_cmd() argument
1400 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; in __drop_discard_cmd()
1410 f2fs_bug_on(sbi, dc->state != D_PREP); in __drop_discard_cmd()
1411 __remove_discard_cmd(sbi, dc); in __drop_discard_cmd()
1420 void f2fs_drop_discard_cmd(struct f2fs_sb_info *sbi) in f2fs_drop_discard_cmd() argument
1422 __drop_discard_cmd(sbi); in f2fs_drop_discard_cmd()
1425 static unsigned int __wait_one_discard_bio(struct f2fs_sb_info *sbi, in __wait_one_discard_bio() argument
1428 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; in __wait_one_discard_bio()
1433 f2fs_bug_on(sbi, dc->state != D_DONE); in __wait_one_discard_bio()
1438 __remove_discard_cmd(sbi, dc); in __wait_one_discard_bio()
1445 static unsigned int __wait_discard_cmd_range(struct f2fs_sb_info *sbi, in __wait_discard_cmd_range() argument
1449 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; in __wait_discard_cmd_range()
1469 __remove_discard_cmd(sbi, dc); in __wait_discard_cmd_range()
1479 trimmed += __wait_one_discard_bio(sbi, dc); in __wait_discard_cmd_range()
1486 static unsigned int __wait_all_discard_cmd(struct f2fs_sb_info *sbi, in __wait_all_discard_cmd() argument
1493 return __wait_discard_cmd_range(sbi, dpolicy, 0, UINT_MAX); in __wait_all_discard_cmd()
1496 __init_discard_policy(sbi, &dp, DPOLICY_FSTRIM, 1); in __wait_all_discard_cmd()
1497 discard_blks = __wait_discard_cmd_range(sbi, &dp, 0, UINT_MAX); in __wait_all_discard_cmd()
1498 __init_discard_policy(sbi, &dp, DPOLICY_UMOUNT, 1); in __wait_all_discard_cmd()
1499 discard_blks += __wait_discard_cmd_range(sbi, &dp, 0, UINT_MAX); in __wait_all_discard_cmd()
1505 static void f2fs_wait_discard_bio(struct f2fs_sb_info *sbi, block_t blkaddr) in f2fs_wait_discard_bio() argument
1507 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; in f2fs_wait_discard_bio()
1516 __punch_discard_cmd(sbi, dc, blkaddr); in f2fs_wait_discard_bio()
1525 __wait_one_discard_bio(sbi, dc); in f2fs_wait_discard_bio()
1528 void f2fs_stop_discard_thread(struct f2fs_sb_info *sbi) in f2fs_stop_discard_thread() argument
1530 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; in f2fs_stop_discard_thread()
1541 bool f2fs_wait_discard_bios(struct f2fs_sb_info *sbi) in f2fs_wait_discard_bios() argument
1543 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; in f2fs_wait_discard_bios()
1547 __init_discard_policy(sbi, &dpolicy, DPOLICY_UMOUNT, in f2fs_wait_discard_bios()
1549 __issue_discard_cmd(sbi, &dpolicy); in f2fs_wait_discard_bios()
1550 dropped = __drop_discard_cmd(sbi); in f2fs_wait_discard_bios()
1553 __wait_all_discard_cmd(sbi, NULL); in f2fs_wait_discard_bios()
1555 f2fs_bug_on(sbi, atomic_read(&dcc->discard_cmd_cnt)); in f2fs_wait_discard_bios()
1561 struct f2fs_sb_info *sbi = data; in issue_discard_thread() local
1562 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; in issue_discard_thread()
1571 __init_discard_policy(sbi, &dpolicy, DPOLICY_BG, in issue_discard_thread()
1584 if (f2fs_readonly(sbi->sb)) in issue_discard_thread()
1588 if (is_sbi_flag_set(sbi, SBI_NEED_FSCK)) { in issue_discard_thread()
1593 if (sbi->gc_mode == GC_URGENT) in issue_discard_thread()
1594 __init_discard_policy(sbi, &dpolicy, DPOLICY_FORCE, 1); in issue_discard_thread()
1596 sb_start_intwrite(sbi->sb); in issue_discard_thread()
1598 issued = __issue_discard_cmd(sbi, &dpolicy); in issue_discard_thread()
1600 __wait_all_discard_cmd(sbi, &dpolicy); in issue_discard_thread()
1608 sb_end_intwrite(sbi->sb); in issue_discard_thread()
1615 static int __f2fs_issue_discard_zone(struct f2fs_sb_info *sbi, in __f2fs_issue_discard_zone() argument
1622 if (sbi->s_ndevs) { in __f2fs_issue_discard_zone()
1623 devi = f2fs_target_device_index(sbi, blkstart); in __f2fs_issue_discard_zone()
1632 switch (get_blkz_type(sbi, bdev, blkstart)) { in __f2fs_issue_discard_zone()
1637 return __queue_discard_cmd(sbi, bdev, lblkstart, blklen); in __f2fs_issue_discard_zone()
1645 f2fs_msg(sbi->sb, KERN_INFO, in __f2fs_issue_discard_zone()
1647 devi, sbi->s_ndevs ? FDEV(devi).path: "", in __f2fs_issue_discard_zone()
1661 static int __issue_discard_async(struct f2fs_sb_info *sbi, in __issue_discard_async() argument
1665 if (f2fs_sb_has_blkzoned(sbi->sb) && in __issue_discard_async()
1667 return __f2fs_issue_discard_zone(sbi, bdev, blkstart, blklen); in __issue_discard_async()
1669 return __queue_discard_cmd(sbi, bdev, blkstart, blklen); in __issue_discard_async()
1672 static int f2fs_issue_discard(struct f2fs_sb_info *sbi, in f2fs_issue_discard() argument
1682 bdev = f2fs_target_device(sbi, blkstart, NULL); in f2fs_issue_discard()
1687 f2fs_target_device(sbi, i, NULL); in f2fs_issue_discard()
1690 err = __issue_discard_async(sbi, bdev, in f2fs_issue_discard()
1700 se = get_seg_entry(sbi, GET_SEGNO(sbi, i)); in f2fs_issue_discard()
1701 offset = GET_BLKOFF_FROM_SEG0(sbi, i); in f2fs_issue_discard()
1704 sbi->discard_blks--; in f2fs_issue_discard()
1708 err = __issue_discard_async(sbi, bdev, start, len); in f2fs_issue_discard()
1712 static bool add_discard_addrs(struct f2fs_sb_info *sbi, struct cp_control *cpc, in add_discard_addrs() argument
1716 int max_blocks = sbi->blocks_per_seg; in add_discard_addrs()
1717 struct seg_entry *se = get_seg_entry(sbi, cpc->trim_start); in add_discard_addrs()
1721 unsigned long *dmap = SIT_I(sbi)->tmp_map; in add_discard_addrs()
1725 struct list_head *head = &SM_I(sbi)->dcc_info->entry_list; in add_discard_addrs()
1728 if (se->valid_blocks == max_blocks || !f2fs_discard_en(sbi)) in add_discard_addrs()
1732 if (!test_opt(sbi, DISCARD) || !se->valid_blocks || in add_discard_addrs()
1733 SM_I(sbi)->dcc_info->nr_discards >= in add_discard_addrs()
1734 SM_I(sbi)->dcc_info->max_discards) in add_discard_addrs()
1743 while (force || SM_I(sbi)->dcc_info->nr_discards <= in add_discard_addrs()
1744 SM_I(sbi)->dcc_info->max_discards) { in add_discard_addrs()
1760 de->start_blkaddr = START_BLOCK(sbi, cpc->trim_start); in add_discard_addrs()
1767 SM_I(sbi)->dcc_info->nr_discards += end - start; in add_discard_addrs()
1778 void f2fs_release_discard_addrs(struct f2fs_sb_info *sbi) in f2fs_release_discard_addrs() argument
1780 struct list_head *head = &(SM_I(sbi)->dcc_info->entry_list); in f2fs_release_discard_addrs()
1791 static void set_prefree_as_free_segments(struct f2fs_sb_info *sbi) in set_prefree_as_free_segments() argument
1793 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi); in set_prefree_as_free_segments()
1797 for_each_set_bit(segno, dirty_i->dirty_segmap[PRE], MAIN_SEGS(sbi)) in set_prefree_as_free_segments()
1798 __set_test_and_free(sbi, segno); in set_prefree_as_free_segments()
1802 void f2fs_clear_prefree_segments(struct f2fs_sb_info *sbi, in f2fs_clear_prefree_segments() argument
1805 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; in f2fs_clear_prefree_segments()
1808 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi); in f2fs_clear_prefree_segments()
1813 bool need_align = test_opt(sbi, LFS) && sbi->segs_per_sec > 1; in f2fs_clear_prefree_segments()
1822 start = find_next_bit(prefree_map, MAIN_SEGS(sbi), end + 1); in f2fs_clear_prefree_segments()
1823 if (start >= MAIN_SEGS(sbi)) in f2fs_clear_prefree_segments()
1825 end = find_next_zero_bit(prefree_map, MAIN_SEGS(sbi), in f2fs_clear_prefree_segments()
1829 start = rounddown(start, sbi->segs_per_sec); in f2fs_clear_prefree_segments()
1830 end = roundup(end, sbi->segs_per_sec); in f2fs_clear_prefree_segments()
1838 if (!test_opt(sbi, DISCARD)) in f2fs_clear_prefree_segments()
1845 if (!test_opt(sbi, LFS) || sbi->segs_per_sec == 1) { in f2fs_clear_prefree_segments()
1846 f2fs_issue_discard(sbi, START_BLOCK(sbi, start), in f2fs_clear_prefree_segments()
1847 (end - start) << sbi->log_blocks_per_seg); in f2fs_clear_prefree_segments()
1851 secno = GET_SEC_FROM_SEG(sbi, start); in f2fs_clear_prefree_segments()
1852 start_segno = GET_SEG_FROM_SEC(sbi, secno); in f2fs_clear_prefree_segments()
1853 if (!IS_CURSEC(sbi, secno) && in f2fs_clear_prefree_segments()
1854 !get_valid_blocks(sbi, start, true)) in f2fs_clear_prefree_segments()
1855 f2fs_issue_discard(sbi, START_BLOCK(sbi, start_segno), in f2fs_clear_prefree_segments()
1856 sbi->segs_per_sec << sbi->log_blocks_per_seg); in f2fs_clear_prefree_segments()
1858 start = start_segno + sbi->segs_per_sec; in f2fs_clear_prefree_segments()
1874 sbi->blocks_per_seg, cur_pos); in f2fs_clear_prefree_segments()
1877 if (f2fs_sb_has_blkzoned(sbi->sb) || in f2fs_clear_prefree_segments()
1881 f2fs_issue_discard(sbi, entry->start_blkaddr + cur_pos, in f2fs_clear_prefree_segments()
1886 sbi->blocks_per_seg, cur_pos); in f2fs_clear_prefree_segments()
1892 if (cur_pos < sbi->blocks_per_seg) in f2fs_clear_prefree_segments()
1899 wake_up_discard_thread(sbi, false); in f2fs_clear_prefree_segments()
1902 static int create_discard_cmd_control(struct f2fs_sb_info *sbi) in create_discard_cmd_control() argument
1904 dev_t dev = sbi->sb->s_bdev->bd_dev; in create_discard_cmd_control()
1908 if (SM_I(sbi)->dcc_info) { in create_discard_cmd_control()
1909 dcc = SM_I(sbi)->dcc_info; in create_discard_cmd_control()
1913 dcc = f2fs_kzalloc(sbi, sizeof(struct discard_cmd_control), GFP_KERNEL); in create_discard_cmd_control()
1928 dcc->max_discards = MAIN_SEGS(sbi) << sbi->log_blocks_per_seg; in create_discard_cmd_control()
1935 SM_I(sbi)->dcc_info = dcc; in create_discard_cmd_control()
1937 dcc->f2fs_issue_discard = kthread_run(issue_discard_thread, sbi, in create_discard_cmd_control()
1942 SM_I(sbi)->dcc_info = NULL; in create_discard_cmd_control()
1949 static void destroy_discard_cmd_control(struct f2fs_sb_info *sbi) in destroy_discard_cmd_control() argument
1951 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; in destroy_discard_cmd_control()
1956 f2fs_stop_discard_thread(sbi); in destroy_discard_cmd_control()
1959 SM_I(sbi)->dcc_info = NULL; in destroy_discard_cmd_control()
1962 static bool __mark_sit_entry_dirty(struct f2fs_sb_info *sbi, unsigned int segno) in __mark_sit_entry_dirty() argument
1964 struct sit_info *sit_i = SIT_I(sbi); in __mark_sit_entry_dirty()
1974 static void __set_sit_entry_type(struct f2fs_sb_info *sbi, int type, in __set_sit_entry_type() argument
1977 struct seg_entry *se = get_seg_entry(sbi, segno); in __set_sit_entry_type()
1980 __mark_sit_entry_dirty(sbi, segno); in __set_sit_entry_type()
1983 static void update_sit_entry(struct f2fs_sb_info *sbi, block_t blkaddr, int del) in update_sit_entry() argument
1993 segno = GET_SEGNO(sbi, blkaddr); in update_sit_entry()
1995 se = get_seg_entry(sbi, segno); in update_sit_entry()
1997 offset = GET_BLKOFF_FROM_SEG0(sbi, blkaddr); in update_sit_entry()
1999 f2fs_bug_on(sbi, (new_vblocks >> (sizeof(unsigned short) << 3) || in update_sit_entry()
2000 (new_vblocks > sbi->blocks_per_seg))); in update_sit_entry()
2003 se->mtime = get_mtime(sbi, false); in update_sit_entry()
2004 if (se->mtime > SIT_I(sbi)->max_mtime) in update_sit_entry()
2005 SIT_I(sbi)->max_mtime = se->mtime; in update_sit_entry()
2014 f2fs_msg(sbi->sb, KERN_ERR, "Inconsistent error " in update_sit_entry()
2017 f2fs_bug_on(sbi, 1); in update_sit_entry()
2021 f2fs_msg(sbi->sb, KERN_ERR, in update_sit_entry()
2023 f2fs_bug_on(sbi, 1); in update_sit_entry()
2028 if (f2fs_discard_en(sbi) && in update_sit_entry()
2030 sbi->discard_blks--; in update_sit_entry()
2043 f2fs_msg(sbi->sb, KERN_ERR, "Inconsistent error " in update_sit_entry()
2046 f2fs_bug_on(sbi, 1); in update_sit_entry()
2050 f2fs_msg(sbi->sb, KERN_ERR, in update_sit_entry()
2052 f2fs_bug_on(sbi, 1); in update_sit_entry()
2057 if (f2fs_discard_en(sbi) && in update_sit_entry()
2059 sbi->discard_blks++; in update_sit_entry()
2064 __mark_sit_entry_dirty(sbi, segno); in update_sit_entry()
2067 SIT_I(sbi)->written_valid_blocks += del; in update_sit_entry()
2069 if (sbi->segs_per_sec > 1) in update_sit_entry()
2070 get_sec_entry(sbi, segno)->valid_blocks += del; in update_sit_entry()
2073 void f2fs_invalidate_blocks(struct f2fs_sb_info *sbi, block_t addr) in f2fs_invalidate_blocks() argument
2075 unsigned int segno = GET_SEGNO(sbi, addr); in f2fs_invalidate_blocks()
2076 struct sit_info *sit_i = SIT_I(sbi); in f2fs_invalidate_blocks()
2078 f2fs_bug_on(sbi, addr == NULL_ADDR); in f2fs_invalidate_blocks()
2082 invalidate_mapping_pages(META_MAPPING(sbi), addr, addr); in f2fs_invalidate_blocks()
2087 update_sit_entry(sbi, addr, -1); in f2fs_invalidate_blocks()
2090 locate_dirty_segment(sbi, segno); in f2fs_invalidate_blocks()
2095 bool f2fs_is_checkpointed_data(struct f2fs_sb_info *sbi, block_t blkaddr) in f2fs_is_checkpointed_data() argument
2097 struct sit_info *sit_i = SIT_I(sbi); in f2fs_is_checkpointed_data()
2102 if (!is_valid_data_blkaddr(sbi, blkaddr)) in f2fs_is_checkpointed_data()
2107 segno = GET_SEGNO(sbi, blkaddr); in f2fs_is_checkpointed_data()
2108 se = get_seg_entry(sbi, segno); in f2fs_is_checkpointed_data()
2109 offset = GET_BLKOFF_FROM_SEG0(sbi, blkaddr); in f2fs_is_checkpointed_data()
2122 static void __add_sum_entry(struct f2fs_sb_info *sbi, int type, in __add_sum_entry() argument
2125 struct curseg_info *curseg = CURSEG_I(sbi, type); in __add_sum_entry()
2134 int f2fs_npages_for_summary_flush(struct f2fs_sb_info *sbi, bool for_ra) in f2fs_npages_for_summary_flush() argument
2140 if (sbi->ckpt->alloc_type[i] == SSR) in f2fs_npages_for_summary_flush()
2141 valid_sum_count += sbi->blocks_per_seg; in f2fs_npages_for_summary_flush()
2145 F2FS_CKPT(sbi)->cur_data_blkoff[i]); in f2fs_npages_for_summary_flush()
2147 valid_sum_count += curseg_blkoff(sbi, i); in f2fs_npages_for_summary_flush()
2164 struct page *f2fs_get_sum_page(struct f2fs_sb_info *sbi, unsigned int segno) in f2fs_get_sum_page() argument
2166 return f2fs_get_meta_page_nofail(sbi, GET_SUM_BLOCK(sbi, segno)); in f2fs_get_sum_page()
2169 void f2fs_update_meta_page(struct f2fs_sb_info *sbi, in f2fs_update_meta_page() argument
2172 struct page *page = f2fs_grab_meta_page(sbi, blk_addr); in f2fs_update_meta_page()
2179 static void write_sum_page(struct f2fs_sb_info *sbi, in write_sum_page() argument
2182 f2fs_update_meta_page(sbi, (void *)sum_blk, blk_addr); in write_sum_page()
2185 static void write_current_sum_page(struct f2fs_sb_info *sbi, in write_current_sum_page() argument
2188 struct curseg_info *curseg = CURSEG_I(sbi, type); in write_current_sum_page()
2189 struct page *page = f2fs_grab_meta_page(sbi, blk_addr); in write_current_sum_page()
2211 static int is_next_segment_free(struct f2fs_sb_info *sbi, int type) in is_next_segment_free() argument
2213 struct curseg_info *curseg = CURSEG_I(sbi, type); in is_next_segment_free()
2215 struct free_segmap_info *free_i = FREE_I(sbi); in is_next_segment_free()
2217 if (segno < MAIN_SEGS(sbi) && segno % sbi->segs_per_sec) in is_next_segment_free()
2226 static void get_new_segment(struct f2fs_sb_info *sbi, in get_new_segment() argument
2229 struct free_segmap_info *free_i = FREE_I(sbi); in get_new_segment()
2231 unsigned int total_zones = MAIN_SECS(sbi) / sbi->secs_per_zone; in get_new_segment()
2232 unsigned int hint = GET_SEC_FROM_SEG(sbi, *newseg); in get_new_segment()
2233 unsigned int old_zoneno = GET_ZONE_FROM_SEG(sbi, *newseg); in get_new_segment()
2241 if (!new_sec && ((*newseg + 1) % sbi->segs_per_sec)) { in get_new_segment()
2243 GET_SEG_FROM_SEC(sbi, hint + 1), *newseg + 1); in get_new_segment()
2244 if (segno < GET_SEG_FROM_SEC(sbi, hint + 1)) in get_new_segment()
2248 secno = find_next_zero_bit(free_i->free_secmap, MAIN_SECS(sbi), hint); in get_new_segment()
2249 if (secno >= MAIN_SECS(sbi)) { in get_new_segment()
2252 MAIN_SECS(sbi), 0); in get_new_segment()
2253 f2fs_bug_on(sbi, secno >= MAIN_SECS(sbi)); in get_new_segment()
2268 MAIN_SECS(sbi), 0); in get_new_segment()
2269 f2fs_bug_on(sbi, left_start >= MAIN_SECS(sbi)); in get_new_segment()
2274 segno = GET_SEG_FROM_SEC(sbi, secno); in get_new_segment()
2275 zoneno = GET_ZONE_FROM_SEC(sbi, secno); in get_new_segment()
2280 if (sbi->secs_per_zone == 1) in get_new_segment()
2291 if (CURSEG_I(sbi, i)->zone == zoneno) in get_new_segment()
2297 hint = zoneno * sbi->secs_per_zone - 1; in get_new_segment()
2301 hint = (zoneno + 1) * sbi->secs_per_zone; in get_new_segment()
2307 f2fs_bug_on(sbi, test_bit(segno, free_i->free_segmap)); in get_new_segment()
2308 __set_inuse(sbi, segno); in get_new_segment()
2313 static void reset_curseg(struct f2fs_sb_info *sbi, int type, int modified) in reset_curseg() argument
2315 struct curseg_info *curseg = CURSEG_I(sbi, type); in reset_curseg()
2319 curseg->zone = GET_ZONE_FROM_SEG(sbi, curseg->segno); in reset_curseg()
2329 __set_sit_entry_type(sbi, type, curseg->segno, modified); in reset_curseg()
2332 static unsigned int __get_next_segno(struct f2fs_sb_info *sbi, int type) in __get_next_segno() argument
2335 if (sbi->segs_per_sec != 1) in __get_next_segno()
2336 return CURSEG_I(sbi, type)->segno; in __get_next_segno()
2338 if (test_opt(sbi, NOHEAP) && in __get_next_segno()
2342 if (SIT_I(sbi)->last_victim[ALLOC_NEXT]) in __get_next_segno()
2343 return SIT_I(sbi)->last_victim[ALLOC_NEXT]; in __get_next_segno()
2346 if (F2FS_OPTION(sbi).alloc_mode == ALLOC_MODE_REUSE) in __get_next_segno()
2349 return CURSEG_I(sbi, type)->segno; in __get_next_segno()
2356 static void new_curseg(struct f2fs_sb_info *sbi, int type, bool new_sec) in new_curseg() argument
2358 struct curseg_info *curseg = CURSEG_I(sbi, type); in new_curseg()
2362 write_sum_page(sbi, curseg->sum_blk, in new_curseg()
2363 GET_SUM_BLOCK(sbi, segno)); in new_curseg()
2367 if (test_opt(sbi, NOHEAP)) in new_curseg()
2370 segno = __get_next_segno(sbi, type); in new_curseg()
2371 get_new_segment(sbi, &segno, new_sec, dir); in new_curseg()
2373 reset_curseg(sbi, type, 1); in new_curseg()
2377 static void __next_free_blkoff(struct f2fs_sb_info *sbi, in __next_free_blkoff() argument
2380 struct seg_entry *se = get_seg_entry(sbi, seg->segno); in __next_free_blkoff()
2382 unsigned long *target_map = SIT_I(sbi)->tmp_map; in __next_free_blkoff()
2390 pos = __find_rev_next_zero_bit(target_map, sbi->blocks_per_seg, start); in __next_free_blkoff()
2400 static void __refresh_next_blkoff(struct f2fs_sb_info *sbi, in __refresh_next_blkoff() argument
2404 __next_free_blkoff(sbi, seg, seg->next_blkoff + 1); in __refresh_next_blkoff()
2413 static void change_curseg(struct f2fs_sb_info *sbi, int type) in change_curseg() argument
2415 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi); in change_curseg()
2416 struct curseg_info *curseg = CURSEG_I(sbi, type); in change_curseg()
2421 write_sum_page(sbi, curseg->sum_blk, in change_curseg()
2422 GET_SUM_BLOCK(sbi, curseg->segno)); in change_curseg()
2423 __set_test_and_inuse(sbi, new_segno); in change_curseg()
2426 __remove_dirty_segment(sbi, new_segno, PRE); in change_curseg()
2427 __remove_dirty_segment(sbi, new_segno, DIRTY); in change_curseg()
2430 reset_curseg(sbi, type, 1); in change_curseg()
2432 __next_free_blkoff(sbi, curseg, 0); in change_curseg()
2434 sum_page = f2fs_get_sum_page(sbi, new_segno); in change_curseg()
2440 static int get_ssr_segment(struct f2fs_sb_info *sbi, int type) in get_ssr_segment() argument
2442 struct curseg_info *curseg = CURSEG_I(sbi, type); in get_ssr_segment()
2443 const struct victim_selection *v_ops = DIRTY_I(sbi)->v_ops; in get_ssr_segment()
2449 if (v_ops->get_victim(sbi, &segno, BG_GC, type, SSR)) { in get_ssr_segment()
2476 if (v_ops->get_victim(sbi, &segno, BG_GC, i, SSR)) { in get_ssr_segment()
2488 static void allocate_segment_by_default(struct f2fs_sb_info *sbi, in allocate_segment_by_default() argument
2491 struct curseg_info *curseg = CURSEG_I(sbi, type); in allocate_segment_by_default()
2494 new_curseg(sbi, type, true); in allocate_segment_by_default()
2495 else if (!is_set_ckpt_flags(sbi, CP_CRC_RECOVERY_FLAG) && in allocate_segment_by_default()
2497 new_curseg(sbi, type, false); in allocate_segment_by_default()
2498 else if (curseg->alloc_type == LFS && is_next_segment_free(sbi, type)) in allocate_segment_by_default()
2499 new_curseg(sbi, type, false); in allocate_segment_by_default()
2500 else if (f2fs_need_SSR(sbi) && get_ssr_segment(sbi, type)) in allocate_segment_by_default()
2501 change_curseg(sbi, type); in allocate_segment_by_default()
2503 new_curseg(sbi, type, false); in allocate_segment_by_default()
2505 stat_inc_seg_type(sbi, curseg); in allocate_segment_by_default()
2508 void f2fs_allocate_new_segments(struct f2fs_sb_info *sbi) in f2fs_allocate_new_segments() argument
2514 down_write(&SIT_I(sbi)->sentry_lock); in f2fs_allocate_new_segments()
2517 curseg = CURSEG_I(sbi, i); in f2fs_allocate_new_segments()
2519 SIT_I(sbi)->s_ops->allocate_segment(sbi, i, true); in f2fs_allocate_new_segments()
2520 locate_dirty_segment(sbi, old_segno); in f2fs_allocate_new_segments()
2523 up_write(&SIT_I(sbi)->sentry_lock); in f2fs_allocate_new_segments()
2530 bool f2fs_exist_trim_candidates(struct f2fs_sb_info *sbi, in f2fs_exist_trim_candidates() argument
2536 down_write(&SIT_I(sbi)->sentry_lock); in f2fs_exist_trim_candidates()
2538 if (add_discard_addrs(sbi, cpc, true)) { in f2fs_exist_trim_candidates()
2543 up_write(&SIT_I(sbi)->sentry_lock); in f2fs_exist_trim_candidates()
2549 static unsigned int __issue_discard_cmd_range(struct f2fs_sb_info *sbi, in __issue_discard_cmd_range() argument
2553 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; in __issue_discard_cmd_range()
2566 f2fs_bug_on(sbi, !f2fs_check_rb_tree_consistence(sbi, in __issue_discard_cmd_range()
2591 err = __submit_discard_cmd(sbi, dpolicy, dc, &issued); in __issue_discard_cmd_range()
2597 __remove_discard_cmd(sbi, dc); in __issue_discard_cmd_range()
2601 trimmed += __wait_all_discard_cmd(sbi, NULL); in __issue_discard_cmd_range()
2608 __remove_discard_cmd(sbi, dc); in __issue_discard_cmd_range()
2621 int f2fs_trim_fs(struct f2fs_sb_info *sbi, struct fstrim_range *range) in f2fs_trim_fs() argument
2631 bool need_align = test_opt(sbi, LFS) && sbi->segs_per_sec > 1; in f2fs_trim_fs()
2633 if (start >= MAX_BLKADDR(sbi) || range->len < sbi->blocksize) in f2fs_trim_fs()
2636 if (end < MAIN_BLKADDR(sbi)) in f2fs_trim_fs()
2639 if (is_sbi_flag_set(sbi, SBI_NEED_FSCK)) { in f2fs_trim_fs()
2640 f2fs_msg(sbi->sb, KERN_WARNING, in f2fs_trim_fs()
2646 start_segno = (start <= MAIN_BLKADDR(sbi)) ? 0 : GET_SEGNO(sbi, start); in f2fs_trim_fs()
2647 end_segno = (end >= MAX_BLKADDR(sbi)) ? MAIN_SEGS(sbi) - 1 : in f2fs_trim_fs()
2648 GET_SEGNO(sbi, end); in f2fs_trim_fs()
2650 start_segno = rounddown(start_segno, sbi->segs_per_sec); in f2fs_trim_fs()
2651 end_segno = roundup(end_segno + 1, sbi->segs_per_sec) - 1; in f2fs_trim_fs()
2659 if (sbi->discard_blks == 0) in f2fs_trim_fs()
2662 mutex_lock(&sbi->gc_mutex); in f2fs_trim_fs()
2663 err = f2fs_write_checkpoint(sbi, &cpc); in f2fs_trim_fs()
2664 mutex_unlock(&sbi->gc_mutex); in f2fs_trim_fs()
2674 if (test_opt(sbi, DISCARD)) in f2fs_trim_fs()
2677 start_block = START_BLOCK(sbi, start_segno); in f2fs_trim_fs()
2678 end_block = START_BLOCK(sbi, end_segno + 1); in f2fs_trim_fs()
2680 __init_discard_policy(sbi, &dpolicy, DPOLICY_FSTRIM, cpc.trim_minlen); in f2fs_trim_fs()
2681 trimmed = __issue_discard_cmd_range(sbi, &dpolicy, in f2fs_trim_fs()
2684 trimmed += __wait_discard_cmd_range(sbi, &dpolicy, in f2fs_trim_fs()
2692 static bool __has_curseg_space(struct f2fs_sb_info *sbi, int type) in __has_curseg_space() argument
2694 struct curseg_info *curseg = CURSEG_I(sbi, type); in __has_curseg_space()
2695 if (curseg->next_blkoff < sbi->blocks_per_seg) in __has_curseg_space()
2773 enum rw_hint f2fs_io_type_to_rw_hint(struct f2fs_sb_info *sbi, in f2fs_io_type_to_rw_hint() argument
2776 if (F2FS_OPTION(sbi).whint_mode == WHINT_MODE_USER) { in f2fs_io_type_to_rw_hint()
2787 } else if (F2FS_OPTION(sbi).whint_mode == WHINT_MODE_FS) { in f2fs_io_type_to_rw_hint()
2857 switch (F2FS_OPTION(fio->sbi).active_logs) { in __get_segment_type()
2868 f2fs_bug_on(fio->sbi, true); in __get_segment_type()
2880 void f2fs_allocate_data_block(struct f2fs_sb_info *sbi, struct page *page, in f2fs_allocate_data_block() argument
2885 struct sit_info *sit_i = SIT_I(sbi); in f2fs_allocate_data_block()
2886 struct curseg_info *curseg = CURSEG_I(sbi, type); in f2fs_allocate_data_block()
2888 down_read(&SM_I(sbi)->curseg_lock); in f2fs_allocate_data_block()
2893 *new_blkaddr = NEXT_FREE_BLKADDR(sbi, curseg); in f2fs_allocate_data_block()
2895 f2fs_wait_discard_bio(sbi, *new_blkaddr); in f2fs_allocate_data_block()
2902 __add_sum_entry(sbi, type, sum); in f2fs_allocate_data_block()
2904 __refresh_next_blkoff(sbi, curseg); in f2fs_allocate_data_block()
2906 stat_inc_block_count(sbi, curseg); in f2fs_allocate_data_block()
2912 update_sit_entry(sbi, *new_blkaddr, 1); in f2fs_allocate_data_block()
2913 if (GET_SEGNO(sbi, old_blkaddr) != NULL_SEGNO) in f2fs_allocate_data_block()
2914 update_sit_entry(sbi, old_blkaddr, -1); in f2fs_allocate_data_block()
2916 if (!__has_curseg_space(sbi, type)) in f2fs_allocate_data_block()
2917 sit_i->s_ops->allocate_segment(sbi, type, false); in f2fs_allocate_data_block()
2924 locate_dirty_segment(sbi, GET_SEGNO(sbi, old_blkaddr)); in f2fs_allocate_data_block()
2925 locate_dirty_segment(sbi, GET_SEGNO(sbi, *new_blkaddr)); in f2fs_allocate_data_block()
2930 fill_node_footer_blkaddr(page, NEXT_FREE_BLKADDR(sbi, curseg)); in f2fs_allocate_data_block()
2932 f2fs_inode_chksum_set(sbi, page); in f2fs_allocate_data_block()
2941 io = sbi->write_io[fio->type] + fio->temp; in f2fs_allocate_data_block()
2949 up_read(&SM_I(sbi)->curseg_lock); in f2fs_allocate_data_block()
2954 struct f2fs_sb_info *sbi = fio->sbi; in update_device_state() local
2957 if (!sbi->s_ndevs) in update_device_state()
2960 devidx = f2fs_target_device_index(sbi, fio->new_blkaddr); in update_device_state()
2963 f2fs_set_dirty_device(sbi, fio->ino, devidx, FLUSH_INO); in update_device_state()
2966 if (!f2fs_test_bit(devidx, (char *)&sbi->dirty_device)) { in update_device_state()
2967 spin_lock(&sbi->dev_lock); in update_device_state()
2968 f2fs_set_bit(devidx, (char *)&sbi->dirty_device); in update_device_state()
2969 spin_unlock(&sbi->dev_lock); in update_device_state()
2976 bool keep_order = (test_opt(fio->sbi, LFS) && type == CURSEG_COLD_DATA); in do_write_page()
2979 down_read(&fio->sbi->io_order_lock); in do_write_page()
2981 f2fs_allocate_data_block(fio->sbi, fio->page, fio->old_blkaddr, in do_write_page()
2983 if (GET_SEGNO(fio->sbi, fio->old_blkaddr) != NULL_SEGNO) in do_write_page()
2984 invalidate_mapping_pages(META_MAPPING(fio->sbi), in do_write_page()
2997 up_read(&fio->sbi->io_order_lock); in do_write_page()
3000 void f2fs_do_write_meta_page(struct f2fs_sb_info *sbi, struct page *page, in f2fs_do_write_meta_page() argument
3004 .sbi = sbi, in f2fs_do_write_meta_page()
3016 if (unlikely(page->index >= MAIN_BLKADDR(sbi))) in f2fs_do_write_meta_page()
3023 f2fs_update_iostat(sbi, io_type, F2FS_BLKSIZE); in f2fs_do_write_meta_page()
3033 f2fs_update_iostat(fio->sbi, fio->io_type, F2FS_BLKSIZE); in f2fs_do_write_node_page()
3039 struct f2fs_sb_info *sbi = fio->sbi; in f2fs_outplace_write_data() local
3042 f2fs_bug_on(sbi, dn->data_blkaddr == NULL_ADDR); in f2fs_outplace_write_data()
3047 f2fs_update_iostat(sbi, fio->io_type, F2FS_BLKSIZE); in f2fs_outplace_write_data()
3053 struct f2fs_sb_info *sbi = fio->sbi; in f2fs_inplace_write_data() local
3059 f2fs_bug_on(sbi, !IS_DATASEG(get_seg_entry(sbi, in f2fs_inplace_write_data()
3060 GET_SEGNO(sbi, fio->new_blkaddr))->type)); in f2fs_inplace_write_data()
3062 stat_inc_inplace_blocks(fio->sbi); in f2fs_inplace_write_data()
3068 f2fs_update_iostat(fio->sbi, fio->io_type, F2FS_BLKSIZE); in f2fs_inplace_write_data()
3073 static inline int __f2fs_get_curseg(struct f2fs_sb_info *sbi, in __f2fs_get_curseg() argument
3079 if (CURSEG_I(sbi, i)->segno == segno) in __f2fs_get_curseg()
3085 void f2fs_do_replace_block(struct f2fs_sb_info *sbi, struct f2fs_summary *sum, in f2fs_do_replace_block() argument
3089 struct sit_info *sit_i = SIT_I(sbi); in f2fs_do_replace_block()
3096 segno = GET_SEGNO(sbi, new_blkaddr); in f2fs_do_replace_block()
3097 se = get_seg_entry(sbi, segno); in f2fs_do_replace_block()
3100 down_write(&SM_I(sbi)->curseg_lock); in f2fs_do_replace_block()
3104 if (se->valid_blocks == 0 && !IS_CURSEG(sbi, segno)) { in f2fs_do_replace_block()
3111 if (IS_CURSEG(sbi, segno)) { in f2fs_do_replace_block()
3113 type = __f2fs_get_curseg(sbi, segno); in f2fs_do_replace_block()
3114 f2fs_bug_on(sbi, type == NO_CHECK_TYPE); in f2fs_do_replace_block()
3120 f2fs_bug_on(sbi, !IS_DATASEG(type)); in f2fs_do_replace_block()
3121 curseg = CURSEG_I(sbi, type); in f2fs_do_replace_block()
3132 change_curseg(sbi, type); in f2fs_do_replace_block()
3135 curseg->next_blkoff = GET_BLKOFF_FROM_SEG0(sbi, new_blkaddr); in f2fs_do_replace_block()
3136 __add_sum_entry(sbi, type, sum); in f2fs_do_replace_block()
3139 update_sit_entry(sbi, new_blkaddr, 1); in f2fs_do_replace_block()
3140 if (GET_SEGNO(sbi, old_blkaddr) != NULL_SEGNO) { in f2fs_do_replace_block()
3141 invalidate_mapping_pages(META_MAPPING(sbi), in f2fs_do_replace_block()
3143 update_sit_entry(sbi, old_blkaddr, -1); in f2fs_do_replace_block()
3146 locate_dirty_segment(sbi, GET_SEGNO(sbi, old_blkaddr)); in f2fs_do_replace_block()
3147 locate_dirty_segment(sbi, GET_SEGNO(sbi, new_blkaddr)); in f2fs_do_replace_block()
3149 locate_dirty_segment(sbi, old_cursegno); in f2fs_do_replace_block()
3154 change_curseg(sbi, type); in f2fs_do_replace_block()
3161 up_write(&SM_I(sbi)->curseg_lock); in f2fs_do_replace_block()
3164 void f2fs_replace_block(struct f2fs_sb_info *sbi, struct dnode_of_data *dn, in f2fs_replace_block() argument
3173 f2fs_do_replace_block(sbi, &sum, old_addr, new_addr, in f2fs_replace_block()
3183 struct f2fs_sb_info *sbi = F2FS_P_SB(page); in f2fs_wait_on_page_writeback() local
3185 f2fs_submit_merged_write_cond(sbi, page->mapping->host, in f2fs_wait_on_page_writeback()
3194 void f2fs_wait_on_block_writeback(struct f2fs_sb_info *sbi, block_t blkaddr) in f2fs_wait_on_block_writeback() argument
3198 if (!is_valid_data_blkaddr(sbi, blkaddr)) in f2fs_wait_on_block_writeback()
3201 cpage = find_lock_page(META_MAPPING(sbi), blkaddr); in f2fs_wait_on_block_writeback()
3208 static int read_compacted_summaries(struct f2fs_sb_info *sbi) in read_compacted_summaries() argument
3210 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi); in read_compacted_summaries()
3217 start = start_sum_block(sbi); in read_compacted_summaries()
3219 page = f2fs_get_meta_page(sbi, start++); in read_compacted_summaries()
3225 seg_i = CURSEG_I(sbi, CURSEG_HOT_DATA); in read_compacted_summaries()
3229 seg_i = CURSEG_I(sbi, CURSEG_COLD_DATA); in read_compacted_summaries()
3238 seg_i = CURSEG_I(sbi, i); in read_compacted_summaries()
3242 reset_curseg(sbi, i, 0); in read_compacted_summaries()
3247 blk_off = sbi->blocks_per_seg; in read_compacted_summaries()
3261 page = f2fs_get_meta_page(sbi, start++); in read_compacted_summaries()
3272 static int read_normal_summaries(struct f2fs_sb_info *sbi, int type) in read_normal_summaries() argument
3274 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi); in read_normal_summaries()
3288 if (__exist_node_summaries(sbi)) in read_normal_summaries()
3289 blk_addr = sum_blk_addr(sbi, NR_CURSEG_TYPE, type); in read_normal_summaries()
3291 blk_addr = sum_blk_addr(sbi, NR_CURSEG_DATA_TYPE, type); in read_normal_summaries()
3297 if (__exist_node_summaries(sbi)) in read_normal_summaries()
3298 blk_addr = sum_blk_addr(sbi, NR_CURSEG_NODE_TYPE, in read_normal_summaries()
3301 blk_addr = GET_SUM_BLOCK(sbi, segno); in read_normal_summaries()
3304 new = f2fs_get_meta_page(sbi, blk_addr); in read_normal_summaries()
3310 if (__exist_node_summaries(sbi)) { in read_normal_summaries()
3313 for (i = 0; i < sbi->blocks_per_seg; i++, ns++) { in read_normal_summaries()
3318 err = f2fs_restore_node_summary(sbi, segno, sum); in read_normal_summaries()
3325 curseg = CURSEG_I(sbi, type); in read_normal_summaries()
3336 reset_curseg(sbi, type, 0); in read_normal_summaries()
3345 static int restore_curseg_summaries(struct f2fs_sb_info *sbi) in restore_curseg_summaries() argument
3347 struct f2fs_journal *sit_j = CURSEG_I(sbi, CURSEG_COLD_DATA)->journal; in restore_curseg_summaries()
3348 struct f2fs_journal *nat_j = CURSEG_I(sbi, CURSEG_HOT_DATA)->journal; in restore_curseg_summaries()
3352 if (is_set_ckpt_flags(sbi, CP_COMPACT_SUM_FLAG)) { in restore_curseg_summaries()
3353 int npages = f2fs_npages_for_summary_flush(sbi, true); in restore_curseg_summaries()
3356 f2fs_ra_meta_pages(sbi, start_sum_block(sbi), npages, in restore_curseg_summaries()
3360 err = read_compacted_summaries(sbi); in restore_curseg_summaries()
3366 if (__exist_node_summaries(sbi)) in restore_curseg_summaries()
3367 f2fs_ra_meta_pages(sbi, sum_blk_addr(sbi, NR_CURSEG_TYPE, type), in restore_curseg_summaries()
3371 err = read_normal_summaries(sbi, type); in restore_curseg_summaries()
3384 static void write_compacted_summaries(struct f2fs_sb_info *sbi, block_t blkaddr) in write_compacted_summaries() argument
3393 page = f2fs_grab_meta_page(sbi, blkaddr++); in write_compacted_summaries()
3398 seg_i = CURSEG_I(sbi, CURSEG_HOT_DATA); in write_compacted_summaries()
3403 seg_i = CURSEG_I(sbi, CURSEG_COLD_DATA); in write_compacted_summaries()
3410 seg_i = CURSEG_I(sbi, i); in write_compacted_summaries()
3411 if (sbi->ckpt->alloc_type[i] == SSR) in write_compacted_summaries()
3412 blkoff = sbi->blocks_per_seg; in write_compacted_summaries()
3414 blkoff = curseg_blkoff(sbi, i); in write_compacted_summaries()
3418 page = f2fs_grab_meta_page(sbi, blkaddr++); in write_compacted_summaries()
3442 static void write_normal_summaries(struct f2fs_sb_info *sbi, in write_normal_summaries() argument
3452 write_current_sum_page(sbi, i, blkaddr + (i - type)); in write_normal_summaries()
3455 void f2fs_write_data_summaries(struct f2fs_sb_info *sbi, block_t start_blk) in f2fs_write_data_summaries() argument
3457 if (is_set_ckpt_flags(sbi, CP_COMPACT_SUM_FLAG)) in f2fs_write_data_summaries()
3458 write_compacted_summaries(sbi, start_blk); in f2fs_write_data_summaries()
3460 write_normal_summaries(sbi, start_blk, CURSEG_HOT_DATA); in f2fs_write_data_summaries()
3463 void f2fs_write_node_summaries(struct f2fs_sb_info *sbi, block_t start_blk) in f2fs_write_node_summaries() argument
3465 write_normal_summaries(sbi, start_blk, CURSEG_HOT_NODE); in f2fs_write_node_summaries()
3490 static struct page *get_current_sit_page(struct f2fs_sb_info *sbi, in get_current_sit_page() argument
3493 return f2fs_get_meta_page_nofail(sbi, current_sit_addr(sbi, segno)); in get_current_sit_page()
3496 static struct page *get_next_sit_page(struct f2fs_sb_info *sbi, in get_next_sit_page() argument
3499 struct sit_info *sit_i = SIT_I(sbi); in get_next_sit_page()
3503 src_off = current_sit_addr(sbi, start); in get_next_sit_page()
3504 dst_off = next_sit_addr(sbi, src_off); in get_next_sit_page()
3506 page = f2fs_grab_meta_page(sbi, dst_off); in get_next_sit_page()
3507 seg_info_to_sit_page(sbi, page, start); in get_next_sit_page()
3566 static void add_sits_in_set(struct f2fs_sb_info *sbi) in add_sits_in_set() argument
3568 struct f2fs_sm_info *sm_info = SM_I(sbi); in add_sits_in_set()
3570 unsigned long *bitmap = SIT_I(sbi)->dirty_sentries_bitmap; in add_sits_in_set()
3573 for_each_set_bit(segno, bitmap, MAIN_SEGS(sbi)) in add_sits_in_set()
3577 static void remove_sits_in_journal(struct f2fs_sb_info *sbi) in remove_sits_in_journal() argument
3579 struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_COLD_DATA); in remove_sits_in_journal()
3589 dirtied = __mark_sit_entry_dirty(sbi, segno); in remove_sits_in_journal()
3592 add_sit_entry(segno, &SM_I(sbi)->sit_entry_set); in remove_sits_in_journal()
3602 void f2fs_flush_sit_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc) in f2fs_flush_sit_entries() argument
3604 struct sit_info *sit_i = SIT_I(sbi); in f2fs_flush_sit_entries()
3606 struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_COLD_DATA); in f2fs_flush_sit_entries()
3609 struct list_head *head = &SM_I(sbi)->sit_entry_set; in f2fs_flush_sit_entries()
3622 add_sits_in_set(sbi); in f2fs_flush_sit_entries()
3630 remove_sits_in_journal(sbi); in f2fs_flush_sit_entries()
3642 (unsigned long)MAIN_SEGS(sbi)); in f2fs_flush_sit_entries()
3652 page = get_next_sit_page(sbi, start_segno); in f2fs_flush_sit_entries()
3660 se = get_seg_entry(sbi, segno); in f2fs_flush_sit_entries()
3664 f2fs_bug_on(sbi, 1); in f2fs_flush_sit_entries()
3670 add_discard_addrs(sbi, cpc, false); in f2fs_flush_sit_entries()
3676 f2fs_bug_on(sbi, offset < 0); in f2fs_flush_sit_entries()
3681 check_block_count(sbi, segno, in f2fs_flush_sit_entries()
3687 check_block_count(sbi, segno, in f2fs_flush_sit_entries()
3701 f2fs_bug_on(sbi, ses->entry_cnt); in f2fs_flush_sit_entries()
3705 f2fs_bug_on(sbi, !list_empty(head)); in f2fs_flush_sit_entries()
3706 f2fs_bug_on(sbi, sit_i->dirty_sentries); in f2fs_flush_sit_entries()
3712 add_discard_addrs(sbi, cpc, false); in f2fs_flush_sit_entries()
3718 set_prefree_as_free_segments(sbi); in f2fs_flush_sit_entries()
3721 static int build_sit_info(struct f2fs_sb_info *sbi) in build_sit_info() argument
3723 struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi); in build_sit_info()
3730 sit_i = f2fs_kzalloc(sbi, sizeof(struct sit_info), GFP_KERNEL); in build_sit_info()
3734 SM_I(sbi)->sit_info = sit_i; in build_sit_info()
3737 f2fs_kvzalloc(sbi, array_size(sizeof(struct seg_entry), in build_sit_info()
3738 MAIN_SEGS(sbi)), in build_sit_info()
3743 bitmap_size = f2fs_bitmap_size(MAIN_SEGS(sbi)); in build_sit_info()
3744 sit_i->dirty_sentries_bitmap = f2fs_kvzalloc(sbi, bitmap_size, in build_sit_info()
3749 for (start = 0; start < MAIN_SEGS(sbi); start++) { in build_sit_info()
3751 = f2fs_kzalloc(sbi, SIT_VBLOCK_MAP_SIZE, GFP_KERNEL); in build_sit_info()
3753 = f2fs_kzalloc(sbi, SIT_VBLOCK_MAP_SIZE, GFP_KERNEL); in build_sit_info()
3760 = f2fs_kzalloc(sbi, SIT_VBLOCK_MAP_SIZE, GFP_KERNEL); in build_sit_info()
3765 if (f2fs_discard_en(sbi)) { in build_sit_info()
3767 = f2fs_kzalloc(sbi, SIT_VBLOCK_MAP_SIZE, in build_sit_info()
3774 sit_i->tmp_map = f2fs_kzalloc(sbi, SIT_VBLOCK_MAP_SIZE, GFP_KERNEL); in build_sit_info()
3778 if (sbi->segs_per_sec > 1) { in build_sit_info()
3780 f2fs_kvzalloc(sbi, array_size(sizeof(struct sec_entry), in build_sit_info()
3781 MAIN_SECS(sbi)), in build_sit_info()
3791 bitmap_size = __bitmap_size(sbi, SIT_BITMAP); in build_sit_info()
3792 src_bitmap = __bitmap_ptr(sbi, SIT_BITMAP); in build_sit_info()
3808 sit_i->sit_blocks = sit_segs << sbi->log_blocks_per_seg; in build_sit_info()
3813 sit_i->elapsed_time = le64_to_cpu(sbi->ckpt->elapsed_time); in build_sit_info()
3819 static int build_free_segmap(struct f2fs_sb_info *sbi) in build_free_segmap() argument
3825 free_i = f2fs_kzalloc(sbi, sizeof(struct free_segmap_info), GFP_KERNEL); in build_free_segmap()
3829 SM_I(sbi)->free_info = free_i; in build_free_segmap()
3831 bitmap_size = f2fs_bitmap_size(MAIN_SEGS(sbi)); in build_free_segmap()
3832 free_i->free_segmap = f2fs_kvmalloc(sbi, bitmap_size, GFP_KERNEL); in build_free_segmap()
3836 sec_bitmap_size = f2fs_bitmap_size(MAIN_SECS(sbi)); in build_free_segmap()
3837 free_i->free_secmap = f2fs_kvmalloc(sbi, sec_bitmap_size, GFP_KERNEL); in build_free_segmap()
3846 free_i->start_segno = GET_SEGNO_FROM_SEG0(sbi, MAIN_BLKADDR(sbi)); in build_free_segmap()
3853 static int build_curseg(struct f2fs_sb_info *sbi) in build_curseg() argument
3858 array = f2fs_kzalloc(sbi, array_size(NR_CURSEG_TYPE, sizeof(*array)), in build_curseg()
3863 SM_I(sbi)->curseg_array = array; in build_curseg()
3867 array[i].sum_blk = f2fs_kzalloc(sbi, PAGE_SIZE, GFP_KERNEL); in build_curseg()
3871 array[i].journal = f2fs_kzalloc(sbi, in build_curseg()
3878 return restore_curseg_summaries(sbi); in build_curseg()
3881 static int build_sit_entries(struct f2fs_sb_info *sbi) in build_sit_entries() argument
3883 struct sit_info *sit_i = SIT_I(sbi); in build_sit_entries()
3884 struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_COLD_DATA); in build_sit_entries()
3888 int sit_blk_cnt = SIT_BLK_CNT(sbi); in build_sit_entries()
3895 readed = f2fs_ra_meta_pages(sbi, start_blk, BIO_MAX_PAGES, in build_sit_entries()
3901 for (; start < end && start < MAIN_SEGS(sbi); start++) { in build_sit_entries()
3906 page = get_current_sit_page(sbi, start); in build_sit_entries()
3911 err = check_block_count(sbi, start, &sit); in build_sit_entries()
3919 if (f2fs_discard_en(sbi)) { in build_sit_entries()
3920 if (is_set_ckpt_flags(sbi, CP_TRIMMED_FLAG)) { in build_sit_entries()
3927 sbi->discard_blks += in build_sit_entries()
3928 sbi->blocks_per_seg - in build_sit_entries()
3933 if (sbi->segs_per_sec > 1) in build_sit_entries()
3934 get_sec_entry(sbi, start)->valid_blocks += in build_sit_entries()
3945 if (start >= MAIN_SEGS(sbi)) { in build_sit_entries()
3946 f2fs_msg(sbi->sb, KERN_ERR, in build_sit_entries()
3949 set_sbi_flag(sbi, SBI_NEED_FSCK); in build_sit_entries()
3961 err = check_block_count(sbi, start, &sit); in build_sit_entries()
3968 if (f2fs_discard_en(sbi)) { in build_sit_entries()
3969 if (is_set_ckpt_flags(sbi, CP_TRIMMED_FLAG)) { in build_sit_entries()
3975 sbi->discard_blks += old_valid_blocks; in build_sit_entries()
3976 sbi->discard_blks -= se->valid_blocks; in build_sit_entries()
3980 if (sbi->segs_per_sec > 1) { in build_sit_entries()
3981 get_sec_entry(sbi, start)->valid_blocks += in build_sit_entries()
3983 get_sec_entry(sbi, start)->valid_blocks -= in build_sit_entries()
3989 if (!err && total_node_blocks != valid_node_count(sbi)) { in build_sit_entries()
3990 f2fs_msg(sbi->sb, KERN_ERR, in build_sit_entries()
3992 total_node_blocks, valid_node_count(sbi)); in build_sit_entries()
3993 set_sbi_flag(sbi, SBI_NEED_FSCK); in build_sit_entries()
4000 static void init_free_segmap(struct f2fs_sb_info *sbi) in init_free_segmap() argument
4005 for (start = 0; start < MAIN_SEGS(sbi); start++) { in init_free_segmap()
4006 struct seg_entry *sentry = get_seg_entry(sbi, start); in init_free_segmap()
4008 __set_free(sbi, start); in init_free_segmap()
4010 SIT_I(sbi)->written_valid_blocks += in init_free_segmap()
4016 struct curseg_info *curseg_t = CURSEG_I(sbi, type); in init_free_segmap()
4017 __set_test_and_inuse(sbi, curseg_t->segno); in init_free_segmap()
4021 static void init_dirty_segmap(struct f2fs_sb_info *sbi) in init_dirty_segmap() argument
4023 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi); in init_dirty_segmap()
4024 struct free_segmap_info *free_i = FREE_I(sbi); in init_dirty_segmap()
4030 segno = find_next_inuse(free_i, MAIN_SEGS(sbi), offset); in init_dirty_segmap()
4031 if (segno >= MAIN_SEGS(sbi)) in init_dirty_segmap()
4034 valid_blocks = get_valid_blocks(sbi, segno, false); in init_dirty_segmap()
4035 if (valid_blocks == sbi->blocks_per_seg || !valid_blocks) in init_dirty_segmap()
4037 if (valid_blocks > sbi->blocks_per_seg) { in init_dirty_segmap()
4038 f2fs_bug_on(sbi, 1); in init_dirty_segmap()
4042 __locate_dirty_segment(sbi, segno, DIRTY); in init_dirty_segmap()
4047 static int init_victim_secmap(struct f2fs_sb_info *sbi) in init_victim_secmap() argument
4049 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi); in init_victim_secmap()
4050 unsigned int bitmap_size = f2fs_bitmap_size(MAIN_SECS(sbi)); in init_victim_secmap()
4052 dirty_i->victim_secmap = f2fs_kvzalloc(sbi, bitmap_size, GFP_KERNEL); in init_victim_secmap()
4058 static int build_dirty_segmap(struct f2fs_sb_info *sbi) in build_dirty_segmap() argument
4064 dirty_i = f2fs_kzalloc(sbi, sizeof(struct dirty_seglist_info), in build_dirty_segmap()
4069 SM_I(sbi)->dirty_info = dirty_i; in build_dirty_segmap()
4072 bitmap_size = f2fs_bitmap_size(MAIN_SEGS(sbi)); in build_dirty_segmap()
4075 dirty_i->dirty_segmap[i] = f2fs_kvzalloc(sbi, bitmap_size, in build_dirty_segmap()
4081 init_dirty_segmap(sbi); in build_dirty_segmap()
4082 return init_victim_secmap(sbi); in build_dirty_segmap()
4088 static void init_min_max_mtime(struct f2fs_sb_info *sbi) in init_min_max_mtime() argument
4090 struct sit_info *sit_i = SIT_I(sbi); in init_min_max_mtime()
4097 for (segno = 0; segno < MAIN_SEGS(sbi); segno += sbi->segs_per_sec) { in init_min_max_mtime()
4101 for (i = 0; i < sbi->segs_per_sec; i++) in init_min_max_mtime()
4102 mtime += get_seg_entry(sbi, segno + i)->mtime; in init_min_max_mtime()
4104 mtime = div_u64(mtime, sbi->segs_per_sec); in init_min_max_mtime()
4109 sit_i->max_mtime = get_mtime(sbi, false); in init_min_max_mtime()
4113 int f2fs_build_segment_manager(struct f2fs_sb_info *sbi) in f2fs_build_segment_manager() argument
4115 struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi); in f2fs_build_segment_manager()
4116 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi); in f2fs_build_segment_manager()
4120 sm_info = f2fs_kzalloc(sbi, sizeof(struct f2fs_sm_info), GFP_KERNEL); in f2fs_build_segment_manager()
4125 sbi->sm_info = sm_info; in f2fs_build_segment_manager()
4138 if (!test_opt(sbi, LFS)) in f2fs_build_segment_manager()
4142 sm_info->min_seq_blocks = sbi->blocks_per_seg * sbi->segs_per_sec; in f2fs_build_segment_manager()
4144 sm_info->min_ssr_sections = reserved_sections(sbi); in f2fs_build_segment_manager()
4150 if (!f2fs_readonly(sbi->sb)) { in f2fs_build_segment_manager()
4151 err = f2fs_create_flush_cmd_control(sbi); in f2fs_build_segment_manager()
4156 err = create_discard_cmd_control(sbi); in f2fs_build_segment_manager()
4160 err = build_sit_info(sbi); in f2fs_build_segment_manager()
4163 err = build_free_segmap(sbi); in f2fs_build_segment_manager()
4166 err = build_curseg(sbi); in f2fs_build_segment_manager()
4171 err = build_sit_entries(sbi); in f2fs_build_segment_manager()
4175 init_free_segmap(sbi); in f2fs_build_segment_manager()
4176 err = build_dirty_segmap(sbi); in f2fs_build_segment_manager()
4180 init_min_max_mtime(sbi); in f2fs_build_segment_manager()
4184 static void discard_dirty_segmap(struct f2fs_sb_info *sbi, in discard_dirty_segmap() argument
4187 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi); in discard_dirty_segmap()
4195 static void destroy_victim_secmap(struct f2fs_sb_info *sbi) in destroy_victim_secmap() argument
4197 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi); in destroy_victim_secmap()
4201 static void destroy_dirty_segmap(struct f2fs_sb_info *sbi) in destroy_dirty_segmap() argument
4203 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi); in destroy_dirty_segmap()
4211 discard_dirty_segmap(sbi, i); in destroy_dirty_segmap()
4213 destroy_victim_secmap(sbi); in destroy_dirty_segmap()
4214 SM_I(sbi)->dirty_info = NULL; in destroy_dirty_segmap()
4218 static void destroy_curseg(struct f2fs_sb_info *sbi) in destroy_curseg() argument
4220 struct curseg_info *array = SM_I(sbi)->curseg_array; in destroy_curseg()
4225 SM_I(sbi)->curseg_array = NULL; in destroy_curseg()
4233 static void destroy_free_segmap(struct f2fs_sb_info *sbi) in destroy_free_segmap() argument
4235 struct free_segmap_info *free_i = SM_I(sbi)->free_info; in destroy_free_segmap()
4238 SM_I(sbi)->free_info = NULL; in destroy_free_segmap()
4244 static void destroy_sit_info(struct f2fs_sb_info *sbi) in destroy_sit_info() argument
4246 struct sit_info *sit_i = SIT_I(sbi); in destroy_sit_info()
4253 for (start = 0; start < MAIN_SEGS(sbi); start++) { in destroy_sit_info()
4268 SM_I(sbi)->sit_info = NULL; in destroy_sit_info()
4276 void f2fs_destroy_segment_manager(struct f2fs_sb_info *sbi) in f2fs_destroy_segment_manager() argument
4278 struct f2fs_sm_info *sm_info = SM_I(sbi); in f2fs_destroy_segment_manager()
4282 f2fs_destroy_flush_cmd_control(sbi, true); in f2fs_destroy_segment_manager()
4283 destroy_discard_cmd_control(sbi); in f2fs_destroy_segment_manager()
4284 destroy_dirty_segmap(sbi); in f2fs_destroy_segment_manager()
4285 destroy_curseg(sbi); in f2fs_destroy_segment_manager()
4286 destroy_free_segmap(sbi); in f2fs_destroy_segment_manager()
4287 destroy_sit_info(sbi); in f2fs_destroy_segment_manager()
4288 sbi->sm_info = NULL; in f2fs_destroy_segment_manager()