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 ---