segment.c (71af75b6929458d85f63c0649dc26d6f4c19729e) | segment.c (4d67490498acb4ffcef5ba7bc44990d46e66a44c) |
---|---|
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> --- 6 unchanged lines hidden (view full) --- 15#include <linux/timer.h> 16#include <linux/freezer.h> 17#include <linux/sched/signal.h> 18 19#include "f2fs.h" 20#include "segment.h" 21#include "node.h" 22#include "gc.h" | 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> --- 6 unchanged lines hidden (view full) --- 15#include <linux/timer.h> 16#include <linux/freezer.h> 17#include <linux/sched/signal.h> 18 19#include "f2fs.h" 20#include "segment.h" 21#include "node.h" 22#include "gc.h" |
23#include "iostat.h" |
|
23#include <trace/events/f2fs.h> 24 25#define __reverse_ffz(x) __reverse_ffs(~(x)) 26 27static struct kmem_cache *discard_entry_slab; 28static struct kmem_cache *discard_cmd_slab; 29static struct kmem_cache *sit_entry_set_slab; 30static struct kmem_cache *inmem_entry_slab; --- 152 unchanged lines hidden (view full) --- 183} 184 185void f2fs_register_inmem_page(struct inode *inode, struct page *page) 186{ 187 struct inmem_pages *new; 188 189 set_page_private_atomic(page); 190 | 24#include <trace/events/f2fs.h> 25 26#define __reverse_ffz(x) __reverse_ffs(~(x)) 27 28static struct kmem_cache *discard_entry_slab; 29static struct kmem_cache *discard_cmd_slab; 30static struct kmem_cache *sit_entry_set_slab; 31static struct kmem_cache *inmem_entry_slab; --- 152 unchanged lines hidden (view full) --- 184} 185 186void f2fs_register_inmem_page(struct inode *inode, struct page *page) 187{ 188 struct inmem_pages *new; 189 190 set_page_private_atomic(page); 191 |
191 new = f2fs_kmem_cache_alloc(inmem_entry_slab, GFP_NOFS); | 192 new = f2fs_kmem_cache_alloc(inmem_entry_slab, 193 GFP_NOFS, true, NULL); |
192 193 /* add atomic page indices to the list */ 194 new->page = page; 195 INIT_LIST_HEAD(&new->list); 196 197 /* increase reference count with clean state */ 198 get_page(page); 199 mutex_lock(&F2FS_I(inode)->inmem_lock); --- 571 unchanged lines hidden (view full) --- 771 772 if (!f2fs_is_multi_device(sbi)) 773 return 0; 774 775 if (test_opt(sbi, NOBARRIER)) 776 return 0; 777 778 for (i = 1; i < sbi->s_ndevs; i++) { | 194 195 /* add atomic page indices to the list */ 196 new->page = page; 197 INIT_LIST_HEAD(&new->list); 198 199 /* increase reference count with clean state */ 200 get_page(page); 201 mutex_lock(&F2FS_I(inode)->inmem_lock); --- 571 unchanged lines hidden (view full) --- 773 774 if (!f2fs_is_multi_device(sbi)) 775 return 0; 776 777 if (test_opt(sbi, NOBARRIER)) 778 return 0; 779 780 for (i = 1; i < sbi->s_ndevs; i++) { |
781 int count = DEFAULT_RETRY_IO_COUNT; 782 |
|
779 if (!f2fs_test_bit(i, (char *)&sbi->dirty_device)) 780 continue; | 783 if (!f2fs_test_bit(i, (char *)&sbi->dirty_device)) 784 continue; |
781 ret = __submit_flush_wait(sbi, FDEV(i).bdev); 782 if (ret) | 785 786 do { 787 ret = __submit_flush_wait(sbi, FDEV(i).bdev); 788 if (ret) 789 congestion_wait(BLK_RW_ASYNC, 790 DEFAULT_IO_TIMEOUT); 791 } while (ret && --count); 792 793 if (ret) { 794 f2fs_stop_checkpoint(sbi, false); |
783 break; | 795 break; |
796 } |
|
784 785 spin_lock(&sbi->dev_lock); 786 f2fs_clear_bit(i, (char *)&sbi->dirty_device); 787 spin_unlock(&sbi->dev_lock); 788 } 789 790 return ret; 791} --- 193 unchanged lines hidden (view full) --- 985 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; 986 struct list_head *pend_list; 987 struct discard_cmd *dc; 988 989 f2fs_bug_on(sbi, !len); 990 991 pend_list = &dcc->pend_list[plist_idx(len)]; 992 | 797 798 spin_lock(&sbi->dev_lock); 799 f2fs_clear_bit(i, (char *)&sbi->dirty_device); 800 spin_unlock(&sbi->dev_lock); 801 } 802 803 return ret; 804} --- 193 unchanged lines hidden (view full) --- 998 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; 999 struct list_head *pend_list; 1000 struct discard_cmd *dc; 1001 1002 f2fs_bug_on(sbi, !len); 1003 1004 pend_list = &dcc->pend_list[plist_idx(len)]; 1005 |
993 dc = f2fs_kmem_cache_alloc(discard_cmd_slab, GFP_NOFS); | 1006 dc = f2fs_kmem_cache_alloc(discard_cmd_slab, GFP_NOFS, true, NULL); |
994 INIT_LIST_HEAD(&dc->list); 995 dc->bdev = bdev; 996 dc->lstart = lstart; 997 dc->start = start; 998 dc->len = len; 999 dc->ref = 0; 1000 dc->state = D_PREP; 1001 dc->queued = 0; --- 886 unchanged lines hidden (view full) --- 1888 start = i; 1889 len = 0; 1890 } 1891 } 1892 1893 se = get_seg_entry(sbi, GET_SEGNO(sbi, i)); 1894 offset = GET_BLKOFF_FROM_SEG0(sbi, i); 1895 | 1007 INIT_LIST_HEAD(&dc->list); 1008 dc->bdev = bdev; 1009 dc->lstart = lstart; 1010 dc->start = start; 1011 dc->len = len; 1012 dc->ref = 0; 1013 dc->state = D_PREP; 1014 dc->queued = 0; --- 886 unchanged lines hidden (view full) --- 1901 start = i; 1902 len = 0; 1903 } 1904 } 1905 1906 se = get_seg_entry(sbi, GET_SEGNO(sbi, i)); 1907 offset = GET_BLKOFF_FROM_SEG0(sbi, i); 1908 |
1896 if (!f2fs_test_and_set_bit(offset, se->discard_map)) | 1909 if (f2fs_block_unit_discard(sbi) && 1910 !f2fs_test_and_set_bit(offset, se->discard_map)) |
1897 sbi->discard_blks--; 1898 } 1899 1900 if (len) 1901 err = __issue_discard_async(sbi, bdev, start, len); 1902 return err; 1903} 1904 --- 8 unchanged lines hidden (view full) --- 1913 unsigned long *discard_map = (unsigned long *)se->discard_map; 1914 unsigned long *dmap = SIT_I(sbi)->tmp_map; 1915 unsigned int start = 0, end = -1; 1916 bool force = (cpc->reason & CP_DISCARD); 1917 struct discard_entry *de = NULL; 1918 struct list_head *head = &SM_I(sbi)->dcc_info->entry_list; 1919 int i; 1920 | 1911 sbi->discard_blks--; 1912 } 1913 1914 if (len) 1915 err = __issue_discard_async(sbi, bdev, start, len); 1916 return err; 1917} 1918 --- 8 unchanged lines hidden (view full) --- 1927 unsigned long *discard_map = (unsigned long *)se->discard_map; 1928 unsigned long *dmap = SIT_I(sbi)->tmp_map; 1929 unsigned int start = 0, end = -1; 1930 bool force = (cpc->reason & CP_DISCARD); 1931 struct discard_entry *de = NULL; 1932 struct list_head *head = &SM_I(sbi)->dcc_info->entry_list; 1933 int i; 1934 |
1921 if (se->valid_blocks == max_blocks || !f2fs_hw_support_discard(sbi)) | 1935 if (se->valid_blocks == max_blocks || !f2fs_hw_support_discard(sbi) || 1936 !f2fs_block_unit_discard(sbi)) |
1922 return false; 1923 1924 if (!force) { 1925 if (!f2fs_realtime_discard_enable(sbi) || !se->valid_blocks || 1926 SM_I(sbi)->dcc_info->nr_discards >= 1927 SM_I(sbi)->dcc_info->max_discards) 1928 return false; 1929 } --- 14 unchanged lines hidden (view full) --- 1944 && (end - start) < cpc->trim_minlen) 1945 continue; 1946 1947 if (check_only) 1948 return true; 1949 1950 if (!de) { 1951 de = f2fs_kmem_cache_alloc(discard_entry_slab, | 1937 return false; 1938 1939 if (!force) { 1940 if (!f2fs_realtime_discard_enable(sbi) || !se->valid_blocks || 1941 SM_I(sbi)->dcc_info->nr_discards >= 1942 SM_I(sbi)->dcc_info->max_discards) 1943 return false; 1944 } --- 14 unchanged lines hidden (view full) --- 1959 && (end - start) < cpc->trim_minlen) 1960 continue; 1961 1962 if (check_only) 1963 return true; 1964 1965 if (!de) { 1966 de = f2fs_kmem_cache_alloc(discard_entry_slab, |
1952 GFP_F2FS_ZERO); | 1967 GFP_F2FS_ZERO, true, NULL); |
1953 de->start_blkaddr = START_BLOCK(sbi, cpc->trim_start); 1954 list_add_tail(&de->list, head); 1955 } 1956 1957 for (i = start; i < end; i++) 1958 __set_bit_le(i, (void *)de->discard_map); 1959 1960 SM_I(sbi)->dcc_info->nr_discards += end - start; --- 37 unchanged lines hidden (view full) --- 1998 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; 1999 struct list_head *head = &dcc->entry_list; 2000 struct discard_entry *entry, *this; 2001 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi); 2002 unsigned long *prefree_map = dirty_i->dirty_segmap[PRE]; 2003 unsigned int start = 0, end = -1; 2004 unsigned int secno, start_segno; 2005 bool force = (cpc->reason & CP_DISCARD); | 1968 de->start_blkaddr = START_BLOCK(sbi, cpc->trim_start); 1969 list_add_tail(&de->list, head); 1970 } 1971 1972 for (i = start; i < end; i++) 1973 __set_bit_le(i, (void *)de->discard_map); 1974 1975 SM_I(sbi)->dcc_info->nr_discards += end - start; --- 37 unchanged lines hidden (view full) --- 2013 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; 2014 struct list_head *head = &dcc->entry_list; 2015 struct discard_entry *entry, *this; 2016 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi); 2017 unsigned long *prefree_map = dirty_i->dirty_segmap[PRE]; 2018 unsigned int start = 0, end = -1; 2019 unsigned int secno, start_segno; 2020 bool force = (cpc->reason & CP_DISCARD); |
2006 bool need_align = f2fs_lfs_mode(sbi) && __is_large_section(sbi); | 2021 bool section_alignment = F2FS_OPTION(sbi).discard_unit == 2022 DISCARD_UNIT_SECTION; |
2007 | 2023 |
2024 if (f2fs_lfs_mode(sbi) && __is_large_section(sbi)) 2025 section_alignment = true; 2026 |
|
2008 mutex_lock(&dirty_i->seglist_lock); 2009 2010 while (1) { 2011 int i; 2012 | 2027 mutex_lock(&dirty_i->seglist_lock); 2028 2029 while (1) { 2030 int i; 2031 |
2013 if (need_align && end != -1) | 2032 if (section_alignment && end != -1) |
2014 end--; 2015 start = find_next_bit(prefree_map, MAIN_SEGS(sbi), end + 1); 2016 if (start >= MAIN_SEGS(sbi)) 2017 break; 2018 end = find_next_zero_bit(prefree_map, MAIN_SEGS(sbi), 2019 start + 1); 2020 | 2033 end--; 2034 start = find_next_bit(prefree_map, MAIN_SEGS(sbi), end + 1); 2035 if (start >= MAIN_SEGS(sbi)) 2036 break; 2037 end = find_next_zero_bit(prefree_map, MAIN_SEGS(sbi), 2038 start + 1); 2039 |
2021 if (need_align) { | 2040 if (section_alignment) { |
2022 start = rounddown(start, sbi->segs_per_sec); 2023 end = roundup(end, sbi->segs_per_sec); 2024 } 2025 2026 for (i = start; i < end; i++) { 2027 if (test_and_clear_bit(i, prefree_map)) 2028 dirty_i->nr_dirty[PRE]--; 2029 } --- 21 unchanged lines hidden (view full) --- 2051 start = start_segno + sbi->segs_per_sec; 2052 if (start < end) 2053 goto next; 2054 else 2055 end = start - 1; 2056 } 2057 mutex_unlock(&dirty_i->seglist_lock); 2058 | 2041 start = rounddown(start, sbi->segs_per_sec); 2042 end = roundup(end, sbi->segs_per_sec); 2043 } 2044 2045 for (i = start; i < end; i++) { 2046 if (test_and_clear_bit(i, prefree_map)) 2047 dirty_i->nr_dirty[PRE]--; 2048 } --- 21 unchanged lines hidden (view full) --- 2070 start = start_segno + sbi->segs_per_sec; 2071 if (start < end) 2072 goto next; 2073 else 2074 end = start - 1; 2075 } 2076 mutex_unlock(&dirty_i->seglist_lock); 2077 |
2078 if (!f2fs_block_unit_discard(sbi)) 2079 goto wakeup; 2080 |
|
2059 /* send small discards */ 2060 list_for_each_entry_safe(entry, this, head, list) { 2061 unsigned int cur_pos = 0, next_pos, len, total_len = 0; 2062 bool is_valid = test_bit_le(0, entry->discard_map); 2063 2064find_next: 2065 if (is_valid) { 2066 next_pos = find_next_zero_bit_le(entry->discard_map, --- 17 unchanged lines hidden (view full) --- 2084 2085 if (cur_pos < sbi->blocks_per_seg) 2086 goto find_next; 2087 2088 release_discard_addr(entry); 2089 dcc->nr_discards -= total_len; 2090 } 2091 | 2081 /* send small discards */ 2082 list_for_each_entry_safe(entry, this, head, list) { 2083 unsigned int cur_pos = 0, next_pos, len, total_len = 0; 2084 bool is_valid = test_bit_le(0, entry->discard_map); 2085 2086find_next: 2087 if (is_valid) { 2088 next_pos = find_next_zero_bit_le(entry->discard_map, --- 17 unchanged lines hidden (view full) --- 2106 2107 if (cur_pos < sbi->blocks_per_seg) 2108 goto find_next; 2109 2110 release_discard_addr(entry); 2111 dcc->nr_discards -= total_len; 2112 } 2113 |
2114wakeup: |
|
2092 wake_up_discard_thread(sbi, false); 2093} 2094 | 2115 wake_up_discard_thread(sbi, false); 2116} 2117 |
2095static int create_discard_cmd_control(struct f2fs_sb_info *sbi) | 2118int f2fs_start_discard_thread(struct f2fs_sb_info *sbi) |
2096{ 2097 dev_t dev = sbi->sb->s_bdev->bd_dev; | 2119{ 2120 dev_t dev = sbi->sb->s_bdev->bd_dev; |
2121 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; 2122 int err = 0; 2123 2124 if (!f2fs_realtime_discard_enable(sbi)) 2125 return 0; 2126 2127 dcc->f2fs_issue_discard = kthread_run(issue_discard_thread, sbi, 2128 "f2fs_discard-%u:%u", MAJOR(dev), MINOR(dev)); 2129 if (IS_ERR(dcc->f2fs_issue_discard)) 2130 err = PTR_ERR(dcc->f2fs_issue_discard); 2131 2132 return err; 2133} 2134 2135static int create_discard_cmd_control(struct f2fs_sb_info *sbi) 2136{ |
|
2098 struct discard_cmd_control *dcc; 2099 int err = 0, i; 2100 2101 if (SM_I(sbi)->dcc_info) { 2102 dcc = SM_I(sbi)->dcc_info; 2103 goto init_thread; 2104 } 2105 2106 dcc = f2fs_kzalloc(sbi, sizeof(struct discard_cmd_control), GFP_KERNEL); 2107 if (!dcc) 2108 return -ENOMEM; 2109 2110 dcc->discard_granularity = DEFAULT_DISCARD_GRANULARITY; | 2137 struct discard_cmd_control *dcc; 2138 int err = 0, i; 2139 2140 if (SM_I(sbi)->dcc_info) { 2141 dcc = SM_I(sbi)->dcc_info; 2142 goto init_thread; 2143 } 2144 2145 dcc = f2fs_kzalloc(sbi, sizeof(struct discard_cmd_control), GFP_KERNEL); 2146 if (!dcc) 2147 return -ENOMEM; 2148 2149 dcc->discard_granularity = DEFAULT_DISCARD_GRANULARITY; |
2150 if (F2FS_OPTION(sbi).discard_unit == DISCARD_UNIT_SEGMENT) 2151 dcc->discard_granularity = sbi->blocks_per_seg; 2152 else if (F2FS_OPTION(sbi).discard_unit == DISCARD_UNIT_SECTION) 2153 dcc->discard_granularity = BLKS_PER_SEC(sbi); 2154 |
|
2111 INIT_LIST_HEAD(&dcc->entry_list); 2112 for (i = 0; i < MAX_PLIST_NUM; i++) 2113 INIT_LIST_HEAD(&dcc->pend_list[i]); 2114 INIT_LIST_HEAD(&dcc->wait_list); 2115 INIT_LIST_HEAD(&dcc->fstrim_list); 2116 mutex_init(&dcc->cmd_lock); 2117 atomic_set(&dcc->issued_discard, 0); 2118 atomic_set(&dcc->queued_discard, 0); 2119 atomic_set(&dcc->discard_cmd_cnt, 0); 2120 dcc->nr_discards = 0; 2121 dcc->max_discards = MAIN_SEGS(sbi) << sbi->log_blocks_per_seg; 2122 dcc->undiscard_blks = 0; 2123 dcc->next_pos = 0; 2124 dcc->root = RB_ROOT_CACHED; 2125 dcc->rbtree_check = false; 2126 2127 init_waitqueue_head(&dcc->discard_wait_queue); 2128 SM_I(sbi)->dcc_info = dcc; 2129init_thread: | 2155 INIT_LIST_HEAD(&dcc->entry_list); 2156 for (i = 0; i < MAX_PLIST_NUM; i++) 2157 INIT_LIST_HEAD(&dcc->pend_list[i]); 2158 INIT_LIST_HEAD(&dcc->wait_list); 2159 INIT_LIST_HEAD(&dcc->fstrim_list); 2160 mutex_init(&dcc->cmd_lock); 2161 atomic_set(&dcc->issued_discard, 0); 2162 atomic_set(&dcc->queued_discard, 0); 2163 atomic_set(&dcc->discard_cmd_cnt, 0); 2164 dcc->nr_discards = 0; 2165 dcc->max_discards = MAIN_SEGS(sbi) << sbi->log_blocks_per_seg; 2166 dcc->undiscard_blks = 0; 2167 dcc->next_pos = 0; 2168 dcc->root = RB_ROOT_CACHED; 2169 dcc->rbtree_check = false; 2170 2171 init_waitqueue_head(&dcc->discard_wait_queue); 2172 SM_I(sbi)->dcc_info = dcc; 2173init_thread: |
2130 dcc->f2fs_issue_discard = kthread_run(issue_discard_thread, sbi, 2131 "f2fs_discard-%u:%u", MAJOR(dev), MINOR(dev)); 2132 if (IS_ERR(dcc->f2fs_issue_discard)) { 2133 err = PTR_ERR(dcc->f2fs_issue_discard); | 2174 err = f2fs_start_discard_thread(sbi); 2175 if (err) { |
2134 kfree(dcc); 2135 SM_I(sbi)->dcc_info = NULL; | 2176 kfree(dcc); 2177 SM_I(sbi)->dcc_info = NULL; |
2136 return err; | |
2137 } 2138 2139 return err; 2140} 2141 2142static void destroy_discard_cmd_control(struct f2fs_sb_info *sbi) 2143{ 2144 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; --- 105 unchanged lines hidden (view full) --- 2250 if (unlikely(exist)) { 2251 f2fs_err(sbi, "Bitmap was wrongly set, blk:%u", 2252 blkaddr); 2253 f2fs_bug_on(sbi, 1); 2254 se->valid_blocks--; 2255 del = 0; 2256 } 2257 | 2178 } 2179 2180 return err; 2181} 2182 2183static void destroy_discard_cmd_control(struct f2fs_sb_info *sbi) 2184{ 2185 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; --- 105 unchanged lines hidden (view full) --- 2291 if (unlikely(exist)) { 2292 f2fs_err(sbi, "Bitmap was wrongly set, blk:%u", 2293 blkaddr); 2294 f2fs_bug_on(sbi, 1); 2295 se->valid_blocks--; 2296 del = 0; 2297 } 2298 |
2258 if (!f2fs_test_and_set_bit(offset, se->discard_map)) | 2299 if (f2fs_block_unit_discard(sbi) && 2300 !f2fs_test_and_set_bit(offset, se->discard_map)) |
2259 sbi->discard_blks--; 2260 2261 /* 2262 * SSR should never reuse block which is checkpointed 2263 * or newly invalidated. 2264 */ 2265 if (!is_sbi_flag_set(sbi, SBI_CP_DISABLED)) { 2266 if (!f2fs_test_and_set_bit(offset, se->ckpt_valid_map)) --- 25 unchanged lines hidden (view full) --- 2292 */ 2293 if (f2fs_test_bit(offset, se->ckpt_valid_map)) { 2294 spin_lock(&sbi->stat_lock); 2295 sbi->unusable_block_count++; 2296 spin_unlock(&sbi->stat_lock); 2297 } 2298 } 2299 | 2301 sbi->discard_blks--; 2302 2303 /* 2304 * SSR should never reuse block which is checkpointed 2305 * or newly invalidated. 2306 */ 2307 if (!is_sbi_flag_set(sbi, SBI_CP_DISABLED)) { 2308 if (!f2fs_test_and_set_bit(offset, se->ckpt_valid_map)) --- 25 unchanged lines hidden (view full) --- 2334 */ 2335 if (f2fs_test_bit(offset, se->ckpt_valid_map)) { 2336 spin_lock(&sbi->stat_lock); 2337 sbi->unusable_block_count++; 2338 spin_unlock(&sbi->stat_lock); 2339 } 2340 } 2341 |
2300 if (f2fs_test_and_clear_bit(offset, se->discard_map)) | 2342 if (f2fs_block_unit_discard(sbi) && 2343 f2fs_test_and_clear_bit(offset, se->discard_map)) |
2301 sbi->discard_blks++; 2302 } 2303 if (!f2fs_test_bit(offset, se->ckpt_valid_map)) 2304 se->ckpt_valid_blocks += del; 2305 2306 __mark_sit_entry_dirty(sbi, segno); 2307 2308 /* update total number of valid blocks to be written in ckpt area */ --- 1249 unchanged lines hidden (view full) --- 3558 if (!IS_DATASEG(get_seg_entry(sbi, segno)->type)) { 3559 set_sbi_flag(sbi, SBI_NEED_FSCK); 3560 f2fs_warn(sbi, "%s: incorrect segment(%u) type, run fsck to fix.", 3561 __func__, segno); 3562 err = -EFSCORRUPTED; 3563 goto drop_bio; 3564 } 3565 | 2344 sbi->discard_blks++; 2345 } 2346 if (!f2fs_test_bit(offset, se->ckpt_valid_map)) 2347 se->ckpt_valid_blocks += del; 2348 2349 __mark_sit_entry_dirty(sbi, segno); 2350 2351 /* update total number of valid blocks to be written in ckpt area */ --- 1249 unchanged lines hidden (view full) --- 3601 if (!IS_DATASEG(get_seg_entry(sbi, segno)->type)) { 3602 set_sbi_flag(sbi, SBI_NEED_FSCK); 3603 f2fs_warn(sbi, "%s: incorrect segment(%u) type, run fsck to fix.", 3604 __func__, segno); 3605 err = -EFSCORRUPTED; 3606 goto drop_bio; 3607 } 3608 |
3566 if (is_sbi_flag_set(sbi, SBI_NEED_FSCK) || f2fs_cp_error(sbi)) { | 3609 if (f2fs_cp_error(sbi)) { |
3567 err = -EIO; 3568 goto drop_bio; 3569 } 3570 3571 stat_inc_inplace_blocks(fio->sbi); 3572 3573 if (fio->bio && !(SM_I(sbi)->ipu_policy & (1 << F2FS_IPU_NOCACHE))) 3574 err = f2fs_merge_page_bio(fio); --- 491 unchanged lines hidden (view full) --- 4066 set_to_next_sit(sit_i, start); 4067 4068 return page; 4069} 4070 4071static struct sit_entry_set *grab_sit_entry_set(void) 4072{ 4073 struct sit_entry_set *ses = | 3610 err = -EIO; 3611 goto drop_bio; 3612 } 3613 3614 stat_inc_inplace_blocks(fio->sbi); 3615 3616 if (fio->bio && !(SM_I(sbi)->ipu_policy & (1 << F2FS_IPU_NOCACHE))) 3617 err = f2fs_merge_page_bio(fio); --- 491 unchanged lines hidden (view full) --- 4109 set_to_next_sit(sit_i, start); 4110 4111 return page; 4112} 4113 4114static struct sit_entry_set *grab_sit_entry_set(void) 4115{ 4116 struct sit_entry_set *ses = |
4074 f2fs_kmem_cache_alloc(sit_entry_set_slab, GFP_NOFS); | 4117 f2fs_kmem_cache_alloc(sit_entry_set_slab, 4118 GFP_NOFS, true, NULL); |
4075 4076 ses->entry_cnt = 0; 4077 INIT_LIST_HEAD(&ses->set_list); 4078 return ses; 4079} 4080 4081static void release_sit_entry_set(struct sit_entry_set *ses) 4082{ --- 194 unchanged lines hidden (view full) --- 4277 4278static int build_sit_info(struct f2fs_sb_info *sbi) 4279{ 4280 struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi); 4281 struct sit_info *sit_i; 4282 unsigned int sit_segs, start; 4283 char *src_bitmap, *bitmap; 4284 unsigned int bitmap_size, main_bitmap_size, sit_bitmap_size; | 4119 4120 ses->entry_cnt = 0; 4121 INIT_LIST_HEAD(&ses->set_list); 4122 return ses; 4123} 4124 4125static void release_sit_entry_set(struct sit_entry_set *ses) 4126{ --- 194 unchanged lines hidden (view full) --- 4321 4322static int build_sit_info(struct f2fs_sb_info *sbi) 4323{ 4324 struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi); 4325 struct sit_info *sit_i; 4326 unsigned int sit_segs, start; 4327 char *src_bitmap, *bitmap; 4328 unsigned int bitmap_size, main_bitmap_size, sit_bitmap_size; |
4329 unsigned int discard_map = f2fs_block_unit_discard(sbi) ? 1 : 0; |
|
4285 4286 /* allocate memory for SIT information */ 4287 sit_i = f2fs_kzalloc(sbi, sizeof(struct sit_info), GFP_KERNEL); 4288 if (!sit_i) 4289 return -ENOMEM; 4290 4291 SM_I(sbi)->sit_info = sit_i; 4292 --- 6 unchanged lines hidden (view full) --- 4299 4300 main_bitmap_size = f2fs_bitmap_size(MAIN_SEGS(sbi)); 4301 sit_i->dirty_sentries_bitmap = f2fs_kvzalloc(sbi, main_bitmap_size, 4302 GFP_KERNEL); 4303 if (!sit_i->dirty_sentries_bitmap) 4304 return -ENOMEM; 4305 4306#ifdef CONFIG_F2FS_CHECK_FS | 4330 4331 /* allocate memory for SIT information */ 4332 sit_i = f2fs_kzalloc(sbi, sizeof(struct sit_info), GFP_KERNEL); 4333 if (!sit_i) 4334 return -ENOMEM; 4335 4336 SM_I(sbi)->sit_info = sit_i; 4337 --- 6 unchanged lines hidden (view full) --- 4344 4345 main_bitmap_size = f2fs_bitmap_size(MAIN_SEGS(sbi)); 4346 sit_i->dirty_sentries_bitmap = f2fs_kvzalloc(sbi, main_bitmap_size, 4347 GFP_KERNEL); 4348 if (!sit_i->dirty_sentries_bitmap) 4349 return -ENOMEM; 4350 4351#ifdef CONFIG_F2FS_CHECK_FS |
4307 bitmap_size = MAIN_SEGS(sbi) * SIT_VBLOCK_MAP_SIZE * 4; | 4352 bitmap_size = MAIN_SEGS(sbi) * SIT_VBLOCK_MAP_SIZE * (3 + discard_map); |
4308#else | 4353#else |
4309 bitmap_size = MAIN_SEGS(sbi) * SIT_VBLOCK_MAP_SIZE * 3; | 4354 bitmap_size = MAIN_SEGS(sbi) * SIT_VBLOCK_MAP_SIZE * (2 + discard_map); |
4310#endif 4311 sit_i->bitmap = f2fs_kvzalloc(sbi, bitmap_size, GFP_KERNEL); 4312 if (!sit_i->bitmap) 4313 return -ENOMEM; 4314 4315 bitmap = sit_i->bitmap; 4316 4317 for (start = 0; start < MAIN_SEGS(sbi); start++) { 4318 sit_i->sentries[start].cur_valid_map = bitmap; 4319 bitmap += SIT_VBLOCK_MAP_SIZE; 4320 4321 sit_i->sentries[start].ckpt_valid_map = bitmap; 4322 bitmap += SIT_VBLOCK_MAP_SIZE; 4323 4324#ifdef CONFIG_F2FS_CHECK_FS 4325 sit_i->sentries[start].cur_valid_map_mir = bitmap; 4326 bitmap += SIT_VBLOCK_MAP_SIZE; 4327#endif 4328 | 4355#endif 4356 sit_i->bitmap = f2fs_kvzalloc(sbi, bitmap_size, GFP_KERNEL); 4357 if (!sit_i->bitmap) 4358 return -ENOMEM; 4359 4360 bitmap = sit_i->bitmap; 4361 4362 for (start = 0; start < MAIN_SEGS(sbi); start++) { 4363 sit_i->sentries[start].cur_valid_map = bitmap; 4364 bitmap += SIT_VBLOCK_MAP_SIZE; 4365 4366 sit_i->sentries[start].ckpt_valid_map = bitmap; 4367 bitmap += SIT_VBLOCK_MAP_SIZE; 4368 4369#ifdef CONFIG_F2FS_CHECK_FS 4370 sit_i->sentries[start].cur_valid_map_mir = bitmap; 4371 bitmap += SIT_VBLOCK_MAP_SIZE; 4372#endif 4373 |
4329 sit_i->sentries[start].discard_map = bitmap; 4330 bitmap += SIT_VBLOCK_MAP_SIZE; | 4374 if (discard_map) { 4375 sit_i->sentries[start].discard_map = bitmap; 4376 bitmap += SIT_VBLOCK_MAP_SIZE; 4377 } |
4331 } 4332 4333 sit_i->tmp_map = f2fs_kzalloc(sbi, SIT_VBLOCK_MAP_SIZE, GFP_KERNEL); 4334 if (!sit_i->tmp_map) 4335 return -ENOMEM; 4336 4337 if (__is_large_section(sbi)) { 4338 sit_i->sec_entries = --- 145 unchanged lines hidden (view full) --- 4484 4485 err = check_block_count(sbi, start, &sit); 4486 if (err) 4487 return err; 4488 seg_info_from_raw_sit(se, &sit); 4489 if (IS_NODESEG(se->type)) 4490 total_node_blocks += se->valid_blocks; 4491 | 4378 } 4379 4380 sit_i->tmp_map = f2fs_kzalloc(sbi, SIT_VBLOCK_MAP_SIZE, GFP_KERNEL); 4381 if (!sit_i->tmp_map) 4382 return -ENOMEM; 4383 4384 if (__is_large_section(sbi)) { 4385 sit_i->sec_entries = --- 145 unchanged lines hidden (view full) --- 4531 4532 err = check_block_count(sbi, start, &sit); 4533 if (err) 4534 return err; 4535 seg_info_from_raw_sit(se, &sit); 4536 if (IS_NODESEG(se->type)) 4537 total_node_blocks += se->valid_blocks; 4538 |
4492 /* build discard map only one time */ 4493 if (is_set_ckpt_flags(sbi, CP_TRIMMED_FLAG)) { 4494 memset(se->discard_map, 0xff, 4495 SIT_VBLOCK_MAP_SIZE); 4496 } else { 4497 memcpy(se->discard_map, 4498 se->cur_valid_map, 4499 SIT_VBLOCK_MAP_SIZE); 4500 sbi->discard_blks += 4501 sbi->blocks_per_seg - 4502 se->valid_blocks; | 4539 if (f2fs_block_unit_discard(sbi)) { 4540 /* build discard map only one time */ 4541 if (is_set_ckpt_flags(sbi, CP_TRIMMED_FLAG)) { 4542 memset(se->discard_map, 0xff, 4543 SIT_VBLOCK_MAP_SIZE); 4544 } else { 4545 memcpy(se->discard_map, 4546 se->cur_valid_map, 4547 SIT_VBLOCK_MAP_SIZE); 4548 sbi->discard_blks += 4549 sbi->blocks_per_seg - 4550 se->valid_blocks; 4551 } |
4503 } 4504 4505 if (__is_large_section(sbi)) 4506 get_sec_entry(sbi, start)->valid_blocks += 4507 se->valid_blocks; 4508 } 4509 start_blk += readed; 4510 } while (start_blk < sit_blk_cnt); --- 19 unchanged lines hidden (view full) --- 4530 4531 err = check_block_count(sbi, start, &sit); 4532 if (err) 4533 break; 4534 seg_info_from_raw_sit(se, &sit); 4535 if (IS_NODESEG(se->type)) 4536 total_node_blocks += se->valid_blocks; 4537 | 4552 } 4553 4554 if (__is_large_section(sbi)) 4555 get_sec_entry(sbi, start)->valid_blocks += 4556 se->valid_blocks; 4557 } 4558 start_blk += readed; 4559 } while (start_blk < sit_blk_cnt); --- 19 unchanged lines hidden (view full) --- 4579 4580 err = check_block_count(sbi, start, &sit); 4581 if (err) 4582 break; 4583 seg_info_from_raw_sit(se, &sit); 4584 if (IS_NODESEG(se->type)) 4585 total_node_blocks += se->valid_blocks; 4586 |
4538 if (is_set_ckpt_flags(sbi, CP_TRIMMED_FLAG)) { 4539 memset(se->discard_map, 0xff, SIT_VBLOCK_MAP_SIZE); 4540 } else { 4541 memcpy(se->discard_map, se->cur_valid_map, 4542 SIT_VBLOCK_MAP_SIZE); 4543 sbi->discard_blks += old_valid_blocks; 4544 sbi->discard_blks -= se->valid_blocks; | 4587 if (f2fs_block_unit_discard(sbi)) { 4588 if (is_set_ckpt_flags(sbi, CP_TRIMMED_FLAG)) { 4589 memset(se->discard_map, 0xff, SIT_VBLOCK_MAP_SIZE); 4590 } else { 4591 memcpy(se->discard_map, se->cur_valid_map, 4592 SIT_VBLOCK_MAP_SIZE); 4593 sbi->discard_blks += old_valid_blocks; 4594 sbi->discard_blks -= se->valid_blocks; 4595 } |
4545 } 4546 4547 if (__is_large_section(sbi)) { 4548 get_sec_entry(sbi, start)->valid_blocks += 4549 se->valid_blocks; 4550 get_sec_entry(sbi, start)->valid_blocks -= 4551 old_valid_blocks; 4552 } --- 601 unchanged lines hidden (view full) --- 5154 DEF_RECLAIM_PREFREE_SEGMENTS / 100; 5155 if (sm_info->rec_prefree_segments > DEF_MAX_RECLAIM_PREFREE_SEGMENTS) 5156 sm_info->rec_prefree_segments = DEF_MAX_RECLAIM_PREFREE_SEGMENTS; 5157 5158 if (!f2fs_lfs_mode(sbi)) 5159 sm_info->ipu_policy = 1 << F2FS_IPU_FSYNC; 5160 sm_info->min_ipu_util = DEF_MIN_IPU_UTIL; 5161 sm_info->min_fsync_blocks = DEF_MIN_FSYNC_BLOCKS; | 4596 } 4597 4598 if (__is_large_section(sbi)) { 4599 get_sec_entry(sbi, start)->valid_blocks += 4600 se->valid_blocks; 4601 get_sec_entry(sbi, start)->valid_blocks -= 4602 old_valid_blocks; 4603 } --- 601 unchanged lines hidden (view full) --- 5205 DEF_RECLAIM_PREFREE_SEGMENTS / 100; 5206 if (sm_info->rec_prefree_segments > DEF_MAX_RECLAIM_PREFREE_SEGMENTS) 5207 sm_info->rec_prefree_segments = DEF_MAX_RECLAIM_PREFREE_SEGMENTS; 5208 5209 if (!f2fs_lfs_mode(sbi)) 5210 sm_info->ipu_policy = 1 << F2FS_IPU_FSYNC; 5211 sm_info->min_ipu_util = DEF_MIN_IPU_UTIL; 5212 sm_info->min_fsync_blocks = DEF_MIN_FSYNC_BLOCKS; |
5162 sm_info->min_seq_blocks = sbi->blocks_per_seg * sbi->segs_per_sec; | 5213 sm_info->min_seq_blocks = sbi->blocks_per_seg; |
5163 sm_info->min_hot_blocks = DEF_MIN_HOT_BLOCKS; 5164 sm_info->min_ssr_sections = reserved_sections(sbi); 5165 5166 INIT_LIST_HEAD(&sm_info->sit_entry_set); 5167 5168 init_rwsem(&sm_info->curseg_lock); 5169 5170 if (!f2fs_readonly(sbi->sb)) { --- 185 unchanged lines hidden --- | 5214 sm_info->min_hot_blocks = DEF_MIN_HOT_BLOCKS; 5215 sm_info->min_ssr_sections = reserved_sections(sbi); 5216 5217 INIT_LIST_HEAD(&sm_info->sit_entry_set); 5218 5219 init_rwsem(&sm_info->curseg_lock); 5220 5221 if (!f2fs_readonly(sbi->sb)) { --- 185 unchanged lines hidden --- |