segment.c (31d1b7710262fba12282b24083f20dc76e0efc93) | segment.c (5222595d093ebe80329d38d255d14316257afb3e) |
---|---|
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * fs/f2fs/segment.c 4 * 5 * Copyright (c) 2012 Samsung Electronics Co., Ltd. 6 * http://www.samsung.com/ 7 */ 8#include <linux/fs.h> --- 373 unchanged lines hidden (view full) --- 382 383 list_for_each_entry_safe(cur, tmp, &fi->inmem_pages, list) { 384 struct page *page = cur->page; 385 386 lock_page(page); 387 if (page->mapping == inode->i_mapping) { 388 trace_f2fs_commit_inmem_page(page, INMEM); 389 | 1// SPDX-License-Identifier: GPL-2.0 2/* 3 * fs/f2fs/segment.c 4 * 5 * Copyright (c) 2012 Samsung Electronics Co., Ltd. 6 * http://www.samsung.com/ 7 */ 8#include <linux/fs.h> --- 373 unchanged lines hidden (view full) --- 382 383 list_for_each_entry_safe(cur, tmp, &fi->inmem_pages, list) { 384 struct page *page = cur->page; 385 386 lock_page(page); 387 if (page->mapping == inode->i_mapping) { 388 trace_f2fs_commit_inmem_page(page, INMEM); 389 |
390 set_page_dirty(page); | |
391 f2fs_wait_on_page_writeback(page, DATA, true); | 390 f2fs_wait_on_page_writeback(page, DATA, true); |
391 392 set_page_dirty(page); |
|
392 if (clear_page_dirty_for_io(page)) { 393 inode_dec_dirty_pages(inode); 394 f2fs_remove_dirty_inode(inode); 395 } 396retry: 397 fio.page = page; 398 fio.old_blkaddr = NULL_ADDR; 399 fio.encrypted_page = NULL; --- 215 unchanged lines hidden (view full) --- 615 struct flush_cmd_control *fcc = SM_I(sbi)->fcc_info; 616 struct flush_cmd cmd; 617 int ret; 618 619 if (test_opt(sbi, NOBARRIER)) 620 return 0; 621 622 if (!test_opt(sbi, FLUSH_MERGE)) { | 393 if (clear_page_dirty_for_io(page)) { 394 inode_dec_dirty_pages(inode); 395 f2fs_remove_dirty_inode(inode); 396 } 397retry: 398 fio.page = page; 399 fio.old_blkaddr = NULL_ADDR; 400 fio.encrypted_page = NULL; --- 215 unchanged lines hidden (view full) --- 616 struct flush_cmd_control *fcc = SM_I(sbi)->fcc_info; 617 struct flush_cmd cmd; 618 int ret; 619 620 if (test_opt(sbi, NOBARRIER)) 621 return 0; 622 623 if (!test_opt(sbi, FLUSH_MERGE)) { |
624 atomic_inc(&fcc->issing_flush); |
|
623 ret = submit_flush_wait(sbi, ino); | 625 ret = submit_flush_wait(sbi, ino); |
626 atomic_dec(&fcc->issing_flush); |
|
624 atomic_inc(&fcc->issued_flush); 625 return ret; 626 } 627 628 if (atomic_inc_return(&fcc->issing_flush) == 1 || sbi->s_ndevs > 1) { 629 ret = submit_flush_wait(sbi, ino); 630 atomic_dec(&fcc->issing_flush); 631 --- 66 unchanged lines hidden (view full) --- 698 if (!test_opt(sbi, FLUSH_MERGE)) 699 return err; 700 701init_thread: 702 fcc->f2fs_issue_flush = kthread_run(issue_flush_thread, sbi, 703 "f2fs_flush-%u:%u", MAJOR(dev), MINOR(dev)); 704 if (IS_ERR(fcc->f2fs_issue_flush)) { 705 err = PTR_ERR(fcc->f2fs_issue_flush); | 627 atomic_inc(&fcc->issued_flush); 628 return ret; 629 } 630 631 if (atomic_inc_return(&fcc->issing_flush) == 1 || sbi->s_ndevs > 1) { 632 ret = submit_flush_wait(sbi, ino); 633 atomic_dec(&fcc->issing_flush); 634 --- 66 unchanged lines hidden (view full) --- 701 if (!test_opt(sbi, FLUSH_MERGE)) 702 return err; 703 704init_thread: 705 fcc->f2fs_issue_flush = kthread_run(issue_flush_thread, sbi, 706 "f2fs_flush-%u:%u", MAJOR(dev), MINOR(dev)); 707 if (IS_ERR(fcc->f2fs_issue_flush)) { 708 err = PTR_ERR(fcc->f2fs_issue_flush); |
706 kfree(fcc); | 709 kvfree(fcc); |
707 SM_I(sbi)->fcc_info = NULL; 708 return err; 709 } 710 711 return err; 712} 713 714void f2fs_destroy_flush_cmd_control(struct f2fs_sb_info *sbi, bool free) 715{ 716 struct flush_cmd_control *fcc = SM_I(sbi)->fcc_info; 717 718 if (fcc && fcc->f2fs_issue_flush) { 719 struct task_struct *flush_thread = fcc->f2fs_issue_flush; 720 721 fcc->f2fs_issue_flush = NULL; 722 kthread_stop(flush_thread); 723 } 724 if (free) { | 710 SM_I(sbi)->fcc_info = NULL; 711 return err; 712 } 713 714 return err; 715} 716 717void f2fs_destroy_flush_cmd_control(struct f2fs_sb_info *sbi, bool free) 718{ 719 struct flush_cmd_control *fcc = SM_I(sbi)->fcc_info; 720 721 if (fcc && fcc->f2fs_issue_flush) { 722 struct task_struct *flush_thread = fcc->f2fs_issue_flush; 723 724 fcc->f2fs_issue_flush = NULL; 725 kthread_stop(flush_thread); 726 } 727 if (free) { |
725 kfree(fcc); | 728 kvfree(fcc); |
726 SM_I(sbi)->fcc_info = NULL; 727 } 728} 729 730int f2fs_flush_device_cache(struct f2fs_sb_info *sbi) 731{ 732 int ret = 0, i; 733 --- 995 unchanged lines hidden (view full) --- 1729 } 1730} 1731#endif 1732 1733static int __issue_discard_async(struct f2fs_sb_info *sbi, 1734 struct block_device *bdev, block_t blkstart, block_t blklen) 1735{ 1736#ifdef CONFIG_BLK_DEV_ZONED | 729 SM_I(sbi)->fcc_info = NULL; 730 } 731} 732 733int f2fs_flush_device_cache(struct f2fs_sb_info *sbi) 734{ 735 int ret = 0, i; 736 --- 995 unchanged lines hidden (view full) --- 1732 } 1733} 1734#endif 1735 1736static int __issue_discard_async(struct f2fs_sb_info *sbi, 1737 struct block_device *bdev, block_t blkstart, block_t blklen) 1738{ 1739#ifdef CONFIG_BLK_DEV_ZONED |
1737 if (f2fs_sb_has_blkzoned(sbi->sb) && | 1740 if (f2fs_sb_has_blkzoned(sbi) && |
1738 bdev_zoned_model(bdev) != BLK_ZONED_NONE) 1739 return __f2fs_issue_discard_zone(sbi, bdev, blkstart, blklen); 1740#endif 1741 return __queue_discard_cmd(sbi, bdev, blkstart, blklen); 1742} 1743 1744static int f2fs_issue_discard(struct f2fs_sb_info *sbi, 1745 block_t blkstart, block_t blklen) --- 131 unchanged lines hidden (view full) --- 1877 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; 1878 struct list_head *head = &dcc->entry_list; 1879 struct discard_entry *entry, *this; 1880 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi); 1881 unsigned long *prefree_map = dirty_i->dirty_segmap[PRE]; 1882 unsigned int start = 0, end = -1; 1883 unsigned int secno, start_segno; 1884 bool force = (cpc->reason & CP_DISCARD); | 1741 bdev_zoned_model(bdev) != BLK_ZONED_NONE) 1742 return __f2fs_issue_discard_zone(sbi, bdev, blkstart, blklen); 1743#endif 1744 return __queue_discard_cmd(sbi, bdev, blkstart, blklen); 1745} 1746 1747static int f2fs_issue_discard(struct f2fs_sb_info *sbi, 1748 block_t blkstart, block_t blklen) --- 131 unchanged lines hidden (view full) --- 1880 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; 1881 struct list_head *head = &dcc->entry_list; 1882 struct discard_entry *entry, *this; 1883 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi); 1884 unsigned long *prefree_map = dirty_i->dirty_segmap[PRE]; 1885 unsigned int start = 0, end = -1; 1886 unsigned int secno, start_segno; 1887 bool force = (cpc->reason & CP_DISCARD); |
1885 bool need_align = test_opt(sbi, LFS) && sbi->segs_per_sec > 1; | 1888 bool need_align = test_opt(sbi, LFS) && __is_large_section(sbi); |
1886 1887 mutex_lock(&dirty_i->seglist_lock); 1888 1889 while (1) { 1890 int i; 1891 1892 if (need_align && end != -1) 1893 end--; --- 15 unchanged lines hidden (view full) --- 1909 1910 if (!f2fs_realtime_discard_enable(sbi)) 1911 continue; 1912 1913 if (force && start >= cpc->trim_start && 1914 (end - 1) <= cpc->trim_end) 1915 continue; 1916 | 1889 1890 mutex_lock(&dirty_i->seglist_lock); 1891 1892 while (1) { 1893 int i; 1894 1895 if (need_align && end != -1) 1896 end--; --- 15 unchanged lines hidden (view full) --- 1912 1913 if (!f2fs_realtime_discard_enable(sbi)) 1914 continue; 1915 1916 if (force && start >= cpc->trim_start && 1917 (end - 1) <= cpc->trim_end) 1918 continue; 1919 |
1917 if (!test_opt(sbi, LFS) || sbi->segs_per_sec == 1) { | 1920 if (!test_opt(sbi, LFS) || !__is_large_section(sbi)) { |
1918 f2fs_issue_discard(sbi, START_BLOCK(sbi, start), 1919 (end - start) << sbi->log_blocks_per_seg); 1920 continue; 1921 } 1922next: 1923 secno = GET_SEC_FROM_SEG(sbi, start); 1924 start_segno = GET_SEG_FROM_SEC(sbi, secno); 1925 if (!IS_CURSEC(sbi, secno) && --- 15 unchanged lines hidden (view full) --- 1941 bool is_valid = test_bit_le(0, entry->discard_map); 1942 1943find_next: 1944 if (is_valid) { 1945 next_pos = find_next_zero_bit_le(entry->discard_map, 1946 sbi->blocks_per_seg, cur_pos); 1947 len = next_pos - cur_pos; 1948 | 1921 f2fs_issue_discard(sbi, START_BLOCK(sbi, start), 1922 (end - start) << sbi->log_blocks_per_seg); 1923 continue; 1924 } 1925next: 1926 secno = GET_SEC_FROM_SEG(sbi, start); 1927 start_segno = GET_SEG_FROM_SEC(sbi, secno); 1928 if (!IS_CURSEC(sbi, secno) && --- 15 unchanged lines hidden (view full) --- 1944 bool is_valid = test_bit_le(0, entry->discard_map); 1945 1946find_next: 1947 if (is_valid) { 1948 next_pos = find_next_zero_bit_le(entry->discard_map, 1949 sbi->blocks_per_seg, cur_pos); 1950 len = next_pos - cur_pos; 1951 |
1949 if (f2fs_sb_has_blkzoned(sbi->sb) || | 1952 if (f2fs_sb_has_blkzoned(sbi) || |
1950 (force && len < cpc->trim_minlen)) 1951 goto skip; 1952 1953 f2fs_issue_discard(sbi, entry->start_blkaddr + cur_pos, 1954 len); 1955 total_len += len; 1956 } else { 1957 next_pos = find_next_bit_le(entry->discard_map, --- 47 unchanged lines hidden (view full) --- 2005 2006 init_waitqueue_head(&dcc->discard_wait_queue); 2007 SM_I(sbi)->dcc_info = dcc; 2008init_thread: 2009 dcc->f2fs_issue_discard = kthread_run(issue_discard_thread, sbi, 2010 "f2fs_discard-%u:%u", MAJOR(dev), MINOR(dev)); 2011 if (IS_ERR(dcc->f2fs_issue_discard)) { 2012 err = PTR_ERR(dcc->f2fs_issue_discard); | 1953 (force && len < cpc->trim_minlen)) 1954 goto skip; 1955 1956 f2fs_issue_discard(sbi, entry->start_blkaddr + cur_pos, 1957 len); 1958 total_len += len; 1959 } else { 1960 next_pos = find_next_bit_le(entry->discard_map, --- 47 unchanged lines hidden (view full) --- 2008 2009 init_waitqueue_head(&dcc->discard_wait_queue); 2010 SM_I(sbi)->dcc_info = dcc; 2011init_thread: 2012 dcc->f2fs_issue_discard = kthread_run(issue_discard_thread, sbi, 2013 "f2fs_discard-%u:%u", MAJOR(dev), MINOR(dev)); 2014 if (IS_ERR(dcc->f2fs_issue_discard)) { 2015 err = PTR_ERR(dcc->f2fs_issue_discard); |
2013 kfree(dcc); | 2016 kvfree(dcc); |
2014 SM_I(sbi)->dcc_info = NULL; 2015 return err; 2016 } 2017 2018 return err; 2019} 2020 2021static void destroy_discard_cmd_control(struct f2fs_sb_info *sbi) 2022{ 2023 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; 2024 2025 if (!dcc) 2026 return; 2027 2028 f2fs_stop_discard_thread(sbi); 2029 | 2017 SM_I(sbi)->dcc_info = NULL; 2018 return err; 2019 } 2020 2021 return err; 2022} 2023 2024static void destroy_discard_cmd_control(struct f2fs_sb_info *sbi) 2025{ 2026 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; 2027 2028 if (!dcc) 2029 return; 2030 2031 f2fs_stop_discard_thread(sbi); 2032 |
2030 kfree(dcc); | 2033 kvfree(dcc); |
2031 SM_I(sbi)->dcc_info = NULL; 2032} 2033 2034static bool __mark_sit_entry_dirty(struct f2fs_sb_info *sbi, unsigned int segno) 2035{ 2036 struct sit_info *sit_i = SIT_I(sbi); 2037 2038 if (!__test_and_set_bit(segno, sit_i->dirty_sentries_bitmap)) { --- 102 unchanged lines hidden (view full) --- 2141 if (!f2fs_test_bit(offset, se->ckpt_valid_map)) 2142 se->ckpt_valid_blocks += del; 2143 2144 __mark_sit_entry_dirty(sbi, segno); 2145 2146 /* update total number of valid blocks to be written in ckpt area */ 2147 SIT_I(sbi)->written_valid_blocks += del; 2148 | 2034 SM_I(sbi)->dcc_info = NULL; 2035} 2036 2037static bool __mark_sit_entry_dirty(struct f2fs_sb_info *sbi, unsigned int segno) 2038{ 2039 struct sit_info *sit_i = SIT_I(sbi); 2040 2041 if (!__test_and_set_bit(segno, sit_i->dirty_sentries_bitmap)) { --- 102 unchanged lines hidden (view full) --- 2144 if (!f2fs_test_bit(offset, se->ckpt_valid_map)) 2145 se->ckpt_valid_blocks += del; 2146 2147 __mark_sit_entry_dirty(sbi, segno); 2148 2149 /* update total number of valid blocks to be written in ckpt area */ 2150 SIT_I(sbi)->written_valid_blocks += del; 2151 |
2149 if (sbi->segs_per_sec > 1) | 2152 if (__is_large_section(sbi)) |
2150 get_sec_entry(sbi, segno)->valid_blocks += del; 2151} 2152 2153void f2fs_invalidate_blocks(struct f2fs_sb_info *sbi, block_t addr) 2154{ 2155 unsigned int segno = GET_SEGNO(sbi, addr); 2156 struct sit_info *sit_i = SIT_I(sbi); 2157 --- 249 unchanged lines hidden (view full) --- 2407 if (IS_NODESEG(type)) 2408 SET_SUM_TYPE(sum_footer, SUM_TYPE_NODE); 2409 __set_sit_entry_type(sbi, type, curseg->segno, modified); 2410} 2411 2412static unsigned int __get_next_segno(struct f2fs_sb_info *sbi, int type) 2413{ 2414 /* if segs_per_sec is large than 1, we need to keep original policy. */ | 2153 get_sec_entry(sbi, segno)->valid_blocks += del; 2154} 2155 2156void f2fs_invalidate_blocks(struct f2fs_sb_info *sbi, block_t addr) 2157{ 2158 unsigned int segno = GET_SEGNO(sbi, addr); 2159 struct sit_info *sit_i = SIT_I(sbi); 2160 --- 249 unchanged lines hidden (view full) --- 2410 if (IS_NODESEG(type)) 2411 SET_SUM_TYPE(sum_footer, SUM_TYPE_NODE); 2412 __set_sit_entry_type(sbi, type, curseg->segno, modified); 2413} 2414 2415static unsigned int __get_next_segno(struct f2fs_sb_info *sbi, int type) 2416{ 2417 /* if segs_per_sec is large than 1, we need to keep original policy. */ |
2415 if (sbi->segs_per_sec != 1) | 2418 if (__is_large_section(sbi)) |
2416 return CURSEG_I(sbi, type)->segno; 2417 2418 if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) 2419 return 0; 2420 2421 if (test_opt(sbi, NOHEAP) && 2422 (type == CURSEG_HOT_DATA || IS_NODESEG(type))) 2423 return 0; --- 293 unchanged lines hidden (view full) --- 2717 __u64 start = F2FS_BYTES_TO_BLK(range->start); 2718 __u64 end = start + F2FS_BYTES_TO_BLK(range->len) - 1; 2719 unsigned int start_segno, end_segno; 2720 block_t start_block, end_block; 2721 struct cp_control cpc; 2722 struct discard_policy dpolicy; 2723 unsigned long long trimmed = 0; 2724 int err = 0; | 2419 return CURSEG_I(sbi, type)->segno; 2420 2421 if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) 2422 return 0; 2423 2424 if (test_opt(sbi, NOHEAP) && 2425 (type == CURSEG_HOT_DATA || IS_NODESEG(type))) 2426 return 0; --- 293 unchanged lines hidden (view full) --- 2720 __u64 start = F2FS_BYTES_TO_BLK(range->start); 2721 __u64 end = start + F2FS_BYTES_TO_BLK(range->len) - 1; 2722 unsigned int start_segno, end_segno; 2723 block_t start_block, end_block; 2724 struct cp_control cpc; 2725 struct discard_policy dpolicy; 2726 unsigned long long trimmed = 0; 2727 int err = 0; |
2725 bool need_align = test_opt(sbi, LFS) && sbi->segs_per_sec > 1; | 2728 bool need_align = test_opt(sbi, LFS) && __is_large_section(sbi); |
2726 2727 if (start >= MAX_BLKADDR(sbi) || range->len < sbi->blocksize) 2728 return -EINVAL; 2729 2730 if (end < MAIN_BLKADDR(sbi)) 2731 goto out; 2732 2733 if (is_sbi_flag_set(sbi, SBI_NEED_FSCK)) { --- 1141 unchanged lines hidden (view full) --- 3875 if (!sit_i->sentries[start].discard_map) 3876 return -ENOMEM; 3877 } 3878 3879 sit_i->tmp_map = f2fs_kzalloc(sbi, SIT_VBLOCK_MAP_SIZE, GFP_KERNEL); 3880 if (!sit_i->tmp_map) 3881 return -ENOMEM; 3882 | 2729 2730 if (start >= MAX_BLKADDR(sbi) || range->len < sbi->blocksize) 2731 return -EINVAL; 2732 2733 if (end < MAIN_BLKADDR(sbi)) 2734 goto out; 2735 2736 if (is_sbi_flag_set(sbi, SBI_NEED_FSCK)) { --- 1141 unchanged lines hidden (view full) --- 3878 if (!sit_i->sentries[start].discard_map) 3879 return -ENOMEM; 3880 } 3881 3882 sit_i->tmp_map = f2fs_kzalloc(sbi, SIT_VBLOCK_MAP_SIZE, GFP_KERNEL); 3883 if (!sit_i->tmp_map) 3884 return -ENOMEM; 3885 |
3883 if (sbi->segs_per_sec > 1) { | 3886 if (__is_large_section(sbi)) { |
3884 sit_i->sec_entries = 3885 f2fs_kvzalloc(sbi, array_size(sizeof(struct sec_entry), 3886 MAIN_SECS(sbi)), 3887 GFP_KERNEL); 3888 if (!sit_i->sec_entries) 3889 return -ENOMEM; 3890 } 3891 --- 138 unchanged lines hidden (view full) --- 4030 memcpy(se->discard_map, 4031 se->cur_valid_map, 4032 SIT_VBLOCK_MAP_SIZE); 4033 sbi->discard_blks += 4034 sbi->blocks_per_seg - 4035 se->valid_blocks; 4036 } 4037 | 3887 sit_i->sec_entries = 3888 f2fs_kvzalloc(sbi, array_size(sizeof(struct sec_entry), 3889 MAIN_SECS(sbi)), 3890 GFP_KERNEL); 3891 if (!sit_i->sec_entries) 3892 return -ENOMEM; 3893 } 3894 --- 138 unchanged lines hidden (view full) --- 4033 memcpy(se->discard_map, 4034 se->cur_valid_map, 4035 SIT_VBLOCK_MAP_SIZE); 4036 sbi->discard_blks += 4037 sbi->blocks_per_seg - 4038 se->valid_blocks; 4039 } 4040 |
4038 if (sbi->segs_per_sec > 1) | 4041 if (__is_large_section(sbi)) |
4039 get_sec_entry(sbi, start)->valid_blocks += 4040 se->valid_blocks; 4041 } 4042 start_blk += readed; 4043 } while (start_blk < sit_blk_cnt); 4044 4045 down_read(&curseg->journal_rwsem); 4046 for (i = 0; i < sits_in_cursum(journal); i++) { --- 27 unchanged lines hidden (view full) --- 4074 memset(se->discard_map, 0xff, SIT_VBLOCK_MAP_SIZE); 4075 } else { 4076 memcpy(se->discard_map, se->cur_valid_map, 4077 SIT_VBLOCK_MAP_SIZE); 4078 sbi->discard_blks += old_valid_blocks; 4079 sbi->discard_blks -= se->valid_blocks; 4080 } 4081 | 4042 get_sec_entry(sbi, start)->valid_blocks += 4043 se->valid_blocks; 4044 } 4045 start_blk += readed; 4046 } while (start_blk < sit_blk_cnt); 4047 4048 down_read(&curseg->journal_rwsem); 4049 for (i = 0; i < sits_in_cursum(journal); i++) { --- 27 unchanged lines hidden (view full) --- 4077 memset(se->discard_map, 0xff, SIT_VBLOCK_MAP_SIZE); 4078 } else { 4079 memcpy(se->discard_map, se->cur_valid_map, 4080 SIT_VBLOCK_MAP_SIZE); 4081 sbi->discard_blks += old_valid_blocks; 4082 sbi->discard_blks -= se->valid_blocks; 4083 } 4084 |
4082 if (sbi->segs_per_sec > 1) { | 4085 if (__is_large_section(sbi)) { |
4083 get_sec_entry(sbi, start)->valid_blocks += 4084 se->valid_blocks; 4085 get_sec_entry(sbi, start)->valid_blocks -= 4086 old_valid_blocks; 4087 } 4088 } 4089 up_read(&curseg->journal_rwsem); 4090 --- 218 unchanged lines hidden (view full) --- 4309 return; 4310 4311 /* discard pre-free/dirty segments list */ 4312 for (i = 0; i < NR_DIRTY_TYPE; i++) 4313 discard_dirty_segmap(sbi, i); 4314 4315 destroy_victim_secmap(sbi); 4316 SM_I(sbi)->dirty_info = NULL; | 4086 get_sec_entry(sbi, start)->valid_blocks += 4087 se->valid_blocks; 4088 get_sec_entry(sbi, start)->valid_blocks -= 4089 old_valid_blocks; 4090 } 4091 } 4092 up_read(&curseg->journal_rwsem); 4093 --- 218 unchanged lines hidden (view full) --- 4312 return; 4313 4314 /* discard pre-free/dirty segments list */ 4315 for (i = 0; i < NR_DIRTY_TYPE; i++) 4316 discard_dirty_segmap(sbi, i); 4317 4318 destroy_victim_secmap(sbi); 4319 SM_I(sbi)->dirty_info = NULL; |
4317 kfree(dirty_i); | 4320 kvfree(dirty_i); |
4318} 4319 4320static void destroy_curseg(struct f2fs_sb_info *sbi) 4321{ 4322 struct curseg_info *array = SM_I(sbi)->curseg_array; 4323 int i; 4324 4325 if (!array) 4326 return; 4327 SM_I(sbi)->curseg_array = NULL; 4328 for (i = 0; i < NR_CURSEG_TYPE; i++) { | 4321} 4322 4323static void destroy_curseg(struct f2fs_sb_info *sbi) 4324{ 4325 struct curseg_info *array = SM_I(sbi)->curseg_array; 4326 int i; 4327 4328 if (!array) 4329 return; 4330 SM_I(sbi)->curseg_array = NULL; 4331 for (i = 0; i < NR_CURSEG_TYPE; i++) { |
4329 kfree(array[i].sum_blk); 4330 kfree(array[i].journal); | 4332 kvfree(array[i].sum_blk); 4333 kvfree(array[i].journal); |
4331 } | 4334 } |
4332 kfree(array); | 4335 kvfree(array); |
4333} 4334 4335static void destroy_free_segmap(struct f2fs_sb_info *sbi) 4336{ 4337 struct free_segmap_info *free_i = SM_I(sbi)->free_info; 4338 if (!free_i) 4339 return; 4340 SM_I(sbi)->free_info = NULL; 4341 kvfree(free_i->free_segmap); 4342 kvfree(free_i->free_secmap); | 4336} 4337 4338static void destroy_free_segmap(struct f2fs_sb_info *sbi) 4339{ 4340 struct free_segmap_info *free_i = SM_I(sbi)->free_info; 4341 if (!free_i) 4342 return; 4343 SM_I(sbi)->free_info = NULL; 4344 kvfree(free_i->free_segmap); 4345 kvfree(free_i->free_secmap); |
4343 kfree(free_i); | 4346 kvfree(free_i); |
4344} 4345 4346static void destroy_sit_info(struct f2fs_sb_info *sbi) 4347{ 4348 struct sit_info *sit_i = SIT_I(sbi); 4349 unsigned int start; 4350 4351 if (!sit_i) 4352 return; 4353 4354 if (sit_i->sentries) { 4355 for (start = 0; start < MAIN_SEGS(sbi); start++) { | 4347} 4348 4349static void destroy_sit_info(struct f2fs_sb_info *sbi) 4350{ 4351 struct sit_info *sit_i = SIT_I(sbi); 4352 unsigned int start; 4353 4354 if (!sit_i) 4355 return; 4356 4357 if (sit_i->sentries) { 4358 for (start = 0; start < MAIN_SEGS(sbi); start++) { |
4356 kfree(sit_i->sentries[start].cur_valid_map); | 4359 kvfree(sit_i->sentries[start].cur_valid_map); |
4357#ifdef CONFIG_F2FS_CHECK_FS | 4360#ifdef CONFIG_F2FS_CHECK_FS |
4358 kfree(sit_i->sentries[start].cur_valid_map_mir); | 4361 kvfree(sit_i->sentries[start].cur_valid_map_mir); |
4359#endif | 4362#endif |
4360 kfree(sit_i->sentries[start].ckpt_valid_map); 4361 kfree(sit_i->sentries[start].discard_map); | 4363 kvfree(sit_i->sentries[start].ckpt_valid_map); 4364 kvfree(sit_i->sentries[start].discard_map); |
4362 } 4363 } | 4365 } 4366 } |
4364 kfree(sit_i->tmp_map); | 4367 kvfree(sit_i->tmp_map); |
4365 4366 kvfree(sit_i->sentries); 4367 kvfree(sit_i->sec_entries); 4368 kvfree(sit_i->dirty_sentries_bitmap); 4369 4370 SM_I(sbi)->sit_info = NULL; | 4368 4369 kvfree(sit_i->sentries); 4370 kvfree(sit_i->sec_entries); 4371 kvfree(sit_i->dirty_sentries_bitmap); 4372 4373 SM_I(sbi)->sit_info = NULL; |
4371 kfree(sit_i->sit_bitmap); | 4374 kvfree(sit_i->sit_bitmap); |
4372#ifdef CONFIG_F2FS_CHECK_FS | 4375#ifdef CONFIG_F2FS_CHECK_FS |
4373 kfree(sit_i->sit_bitmap_mir); | 4376 kvfree(sit_i->sit_bitmap_mir); |
4374#endif | 4377#endif |
4375 kfree(sit_i); | 4378 kvfree(sit_i); |
4376} 4377 4378void f2fs_destroy_segment_manager(struct f2fs_sb_info *sbi) 4379{ 4380 struct f2fs_sm_info *sm_info = SM_I(sbi); 4381 4382 if (!sm_info) 4383 return; 4384 f2fs_destroy_flush_cmd_control(sbi, true); 4385 destroy_discard_cmd_control(sbi); 4386 destroy_dirty_segmap(sbi); 4387 destroy_curseg(sbi); 4388 destroy_free_segmap(sbi); 4389 destroy_sit_info(sbi); 4390 sbi->sm_info = NULL; | 4379} 4380 4381void f2fs_destroy_segment_manager(struct f2fs_sb_info *sbi) 4382{ 4383 struct f2fs_sm_info *sm_info = SM_I(sbi); 4384 4385 if (!sm_info) 4386 return; 4387 f2fs_destroy_flush_cmd_control(sbi, true); 4388 destroy_discard_cmd_control(sbi); 4389 destroy_dirty_segmap(sbi); 4390 destroy_curseg(sbi); 4391 destroy_free_segmap(sbi); 4392 destroy_sit_info(sbi); 4393 sbi->sm_info = NULL; |
4391 kfree(sm_info); | 4394 kvfree(sm_info); |
4392} 4393 4394int __init f2fs_create_segment_manager_caches(void) 4395{ 4396 discard_entry_slab = f2fs_kmem_cache_create("discard_entry", 4397 sizeof(struct discard_entry)); 4398 if (!discard_entry_slab) 4399 goto fail; --- 34 unchanged lines hidden --- | 4395} 4396 4397int __init f2fs_create_segment_manager_caches(void) 4398{ 4399 discard_entry_slab = f2fs_kmem_cache_create("discard_entry", 4400 sizeof(struct discard_entry)); 4401 if (!discard_entry_slab) 4402 goto fail; --- 34 unchanged lines hidden --- |