segment.c (e7547daccd6a37522f0af74ec4b5a3036f3dd328) | segment.c (71644dff481180ba024ac4f5cb1f068756357adf) |
---|---|
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> --- 439 unchanged lines hidden (view full) --- 448 if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING))) 449 return; 450 451 /* try to shrink extent cache when there is no enough memory */ 452 if (!f2fs_available_free_memory(sbi, READ_EXTENT_CACHE)) 453 f2fs_shrink_read_extent_tree(sbi, 454 READ_EXTENT_CACHE_SHRINK_NUMBER); 455 | 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> --- 439 unchanged lines hidden (view full) --- 448 if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING))) 449 return; 450 451 /* try to shrink extent cache when there is no enough memory */ 452 if (!f2fs_available_free_memory(sbi, READ_EXTENT_CACHE)) 453 f2fs_shrink_read_extent_tree(sbi, 454 READ_EXTENT_CACHE_SHRINK_NUMBER); 455 |
456 /* try to shrink age extent cache when there is no enough memory */ 457 if (!f2fs_available_free_memory(sbi, AGE_EXTENT_CACHE)) 458 f2fs_shrink_age_extent_tree(sbi, 459 AGE_EXTENT_CACHE_SHRINK_NUMBER); 460 |
|
456 /* check the # of cached NAT entries */ 457 if (!f2fs_available_free_memory(sbi, NAT_ENTRIES)) 458 f2fs_try_to_free_nats(sbi, NAT_ENTRY_PER_BLOCK); 459 460 if (!f2fs_available_free_memory(sbi, FREE_NIDS)) 461 f2fs_try_to_free_nids(sbi, MAX_FREE_NIDS); 462 else 463 f2fs_build_free_nids(sbi, false, false); --- 2682 unchanged lines hidden (view full) --- 3146 } else { 3147 if (IS_DNODE(fio->page) && is_cold_node(fio->page)) 3148 return CURSEG_WARM_NODE; 3149 else 3150 return CURSEG_COLD_NODE; 3151 } 3152} 3153 | 461 /* check the # of cached NAT entries */ 462 if (!f2fs_available_free_memory(sbi, NAT_ENTRIES)) 463 f2fs_try_to_free_nats(sbi, NAT_ENTRY_PER_BLOCK); 464 465 if (!f2fs_available_free_memory(sbi, FREE_NIDS)) 466 f2fs_try_to_free_nids(sbi, MAX_FREE_NIDS); 467 else 468 f2fs_build_free_nids(sbi, false, false); --- 2682 unchanged lines hidden (view full) --- 3151 } else { 3152 if (IS_DNODE(fio->page) && is_cold_node(fio->page)) 3153 return CURSEG_WARM_NODE; 3154 else 3155 return CURSEG_COLD_NODE; 3156 } 3157} 3158 |
3159static int __get_age_segment_type(struct inode *inode, pgoff_t pgofs) 3160{ 3161 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); 3162 struct extent_info ei; 3163 3164 if (f2fs_lookup_age_extent_cache(inode, pgofs, &ei)) { 3165 if (!ei.age) 3166 return NO_CHECK_TYPE; 3167 if (ei.age <= sbi->hot_data_age_threshold) 3168 return CURSEG_HOT_DATA; 3169 if (ei.age <= sbi->warm_data_age_threshold) 3170 return CURSEG_WARM_DATA; 3171 return CURSEG_COLD_DATA; 3172 } 3173 return NO_CHECK_TYPE; 3174} 3175 |
|
3154static int __get_segment_type_6(struct f2fs_io_info *fio) 3155{ 3156 if (fio->type == DATA) { 3157 struct inode *inode = fio->page->mapping->host; | 3176static int __get_segment_type_6(struct f2fs_io_info *fio) 3177{ 3178 if (fio->type == DATA) { 3179 struct inode *inode = fio->page->mapping->host; |
3180 int type; |
|
3158 3159 if (is_inode_flag_set(inode, FI_ALIGNED_WRITE)) 3160 return CURSEG_COLD_DATA_PINNED; 3161 3162 if (page_private_gcing(fio->page)) { 3163 if (fio->sbi->am.atgc_enabled && 3164 (fio->io_type == FS_DATA_IO) && 3165 (fio->sbi->gc_mode != GC_URGENT_HIGH)) 3166 return CURSEG_ALL_DATA_ATGC; 3167 else 3168 return CURSEG_COLD_DATA; 3169 } 3170 if (file_is_cold(inode) || f2fs_need_compress_data(inode)) 3171 return CURSEG_COLD_DATA; | 3181 3182 if (is_inode_flag_set(inode, FI_ALIGNED_WRITE)) 3183 return CURSEG_COLD_DATA_PINNED; 3184 3185 if (page_private_gcing(fio->page)) { 3186 if (fio->sbi->am.atgc_enabled && 3187 (fio->io_type == FS_DATA_IO) && 3188 (fio->sbi->gc_mode != GC_URGENT_HIGH)) 3189 return CURSEG_ALL_DATA_ATGC; 3190 else 3191 return CURSEG_COLD_DATA; 3192 } 3193 if (file_is_cold(inode) || f2fs_need_compress_data(inode)) 3194 return CURSEG_COLD_DATA; |
3195 3196 type = __get_age_segment_type(inode, fio->page->index); 3197 if (type != NO_CHECK_TYPE) 3198 return type; 3199 |
|
3172 if (file_is_hot(inode) || 3173 is_inode_flag_set(inode, FI_HOT_DATA) || 3174 f2fs_is_cow_file(inode)) 3175 return CURSEG_HOT_DATA; 3176 return f2fs_rw_hint_to_seg_type(inode->i_write_hint); 3177 } else { 3178 if (IS_DNODE(fio->page)) 3179 return is_cold_node(fio->page) ? CURSEG_WARM_NODE : --- 102 unchanged lines hidden (view full) --- 3282 /* 3283 * segment dirty status should be updated after segment allocation, 3284 * so we just need to update status only one time after previous 3285 * segment being closed. 3286 */ 3287 locate_dirty_segment(sbi, GET_SEGNO(sbi, old_blkaddr)); 3288 locate_dirty_segment(sbi, GET_SEGNO(sbi, *new_blkaddr)); 3289 | 3200 if (file_is_hot(inode) || 3201 is_inode_flag_set(inode, FI_HOT_DATA) || 3202 f2fs_is_cow_file(inode)) 3203 return CURSEG_HOT_DATA; 3204 return f2fs_rw_hint_to_seg_type(inode->i_write_hint); 3205 } else { 3206 if (IS_DNODE(fio->page)) 3207 return is_cold_node(fio->page) ? CURSEG_WARM_NODE : --- 102 unchanged lines hidden (view full) --- 3310 /* 3311 * segment dirty status should be updated after segment allocation, 3312 * so we just need to update status only one time after previous 3313 * segment being closed. 3314 */ 3315 locate_dirty_segment(sbi, GET_SEGNO(sbi, old_blkaddr)); 3316 locate_dirty_segment(sbi, GET_SEGNO(sbi, *new_blkaddr)); 3317 |
3318 if (IS_DATASEG(type)) 3319 atomic64_inc(&sbi->allocated_data_blocks); 3320 |
|
3290 up_write(&sit_i->sentry_lock); 3291 3292 if (page && IS_NODESEG(type)) { 3293 fill_node_footer_blkaddr(page, NEXT_FREE_BLKADDR(sbi, curseg)); 3294 3295 f2fs_inode_chksum_set(sbi, page); 3296 } 3297 --- 111 unchanged lines hidden (view full) --- 3409 3410void f2fs_outplace_write_data(struct dnode_of_data *dn, 3411 struct f2fs_io_info *fio) 3412{ 3413 struct f2fs_sb_info *sbi = fio->sbi; 3414 struct f2fs_summary sum; 3415 3416 f2fs_bug_on(sbi, dn->data_blkaddr == NULL_ADDR); | 3321 up_write(&sit_i->sentry_lock); 3322 3323 if (page && IS_NODESEG(type)) { 3324 fill_node_footer_blkaddr(page, NEXT_FREE_BLKADDR(sbi, curseg)); 3325 3326 f2fs_inode_chksum_set(sbi, page); 3327 } 3328 --- 111 unchanged lines hidden (view full) --- 3440 3441void f2fs_outplace_write_data(struct dnode_of_data *dn, 3442 struct f2fs_io_info *fio) 3443{ 3444 struct f2fs_sb_info *sbi = fio->sbi; 3445 struct f2fs_summary sum; 3446 3447 f2fs_bug_on(sbi, dn->data_blkaddr == NULL_ADDR); |
3448 if (fio->io_type == FS_DATA_IO || fio->io_type == FS_CP_DATA_IO) 3449 f2fs_update_age_extent_cache(dn); |
|
3417 set_summary(&sum, dn->nid, dn->ofs_in_node, fio->version); 3418 do_write_page(&sum, fio); 3419 f2fs_update_data_blkaddr(dn, fio->new_blkaddr); 3420 3421 f2fs_update_iostat(sbi, dn->inode, fio->io_type, F2FS_BLKSIZE); 3422} 3423 3424int f2fs_inplace_write_data(struct f2fs_io_info *fio) --- 1868 unchanged lines hidden --- | 3450 set_summary(&sum, dn->nid, dn->ofs_in_node, fio->version); 3451 do_write_page(&sum, fio); 3452 f2fs_update_data_blkaddr(dn, fio->new_blkaddr); 3453 3454 f2fs_update_iostat(sbi, dn->inode, fio->io_type, F2FS_BLKSIZE); 3455} 3456 3457int f2fs_inplace_write_data(struct f2fs_io_info *fio) --- 1868 unchanged lines hidden --- |