segment.c (3689f9f8b0c52dfd8f5995e4b58917f8f3ac3ee3) segment.c (e4544b63a7ee49e7fbebf35ece0a6acd3b9617ae)
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>

--- 457 unchanged lines hidden (view full) ---

466int f2fs_commit_inmem_pages(struct inode *inode)
467{
468 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
469 struct f2fs_inode_info *fi = F2FS_I(inode);
470 int err;
471
472 f2fs_balance_fs(sbi, true);
473
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>

--- 457 unchanged lines hidden (view full) ---

466int f2fs_commit_inmem_pages(struct inode *inode)
467{
468 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
469 struct f2fs_inode_info *fi = F2FS_I(inode);
470 int err;
471
472 f2fs_balance_fs(sbi, true);
473
474 down_write(&fi->i_gc_rwsem[WRITE]);
474 f2fs_down_write(&fi->i_gc_rwsem[WRITE]);
475
476 f2fs_lock_op(sbi);
477 set_inode_flag(inode, FI_ATOMIC_COMMIT);
478
479 mutex_lock(&fi->inmem_lock);
480 err = __f2fs_commit_inmem_pages(inode);
481 mutex_unlock(&fi->inmem_lock);
482
483 clear_inode_flag(inode, FI_ATOMIC_COMMIT);
484
485 f2fs_unlock_op(sbi);
475
476 f2fs_lock_op(sbi);
477 set_inode_flag(inode, FI_ATOMIC_COMMIT);
478
479 mutex_lock(&fi->inmem_lock);
480 err = __f2fs_commit_inmem_pages(inode);
481 mutex_unlock(&fi->inmem_lock);
482
483 clear_inode_flag(inode, FI_ATOMIC_COMMIT);
484
485 f2fs_unlock_op(sbi);
486 up_write(&fi->i_gc_rwsem[WRITE]);
486 f2fs_up_write(&fi->i_gc_rwsem[WRITE]);
487
488 return err;
489}
490
491/*
492 * This function balances dirty node and dentry pages.
493 * In addition, it controls garbage collection.
494 */

--- 21 unchanged lines hidden (view full) ---

516 DEFINE_WAIT(wait);
517
518 prepare_to_wait(&sbi->gc_thread->fggc_wq, &wait,
519 TASK_UNINTERRUPTIBLE);
520 wake_up(&sbi->gc_thread->gc_wait_queue_head);
521 io_schedule();
522 finish_wait(&sbi->gc_thread->fggc_wq, &wait);
523 } else {
487
488 return err;
489}
490
491/*
492 * This function balances dirty node and dentry pages.
493 * In addition, it controls garbage collection.
494 */

--- 21 unchanged lines hidden (view full) ---

516 DEFINE_WAIT(wait);
517
518 prepare_to_wait(&sbi->gc_thread->fggc_wq, &wait,
519 TASK_UNINTERRUPTIBLE);
520 wake_up(&sbi->gc_thread->gc_wait_queue_head);
521 io_schedule();
522 finish_wait(&sbi->gc_thread->fggc_wq, &wait);
523 } else {
524 down_write(&sbi->gc_lock);
524 f2fs_down_write(&sbi->gc_lock);
525 f2fs_gc(sbi, false, false, false, NULL_SEGNO);
526 }
527 }
528}
529
530static inline bool excess_dirty_threshold(struct f2fs_sb_info *sbi)
531{
525 f2fs_gc(sbi, false, false, false, NULL_SEGNO);
526 }
527 }
528}
529
530static inline bool excess_dirty_threshold(struct f2fs_sb_info *sbi)
531{
532 int factor = rwsem_is_locked(&sbi->cp_rwsem) ? 3 : 2;
532 int factor = f2fs_rwsem_is_locked(&sbi->cp_rwsem) ? 3 : 2;
533 unsigned int dents = get_pages(sbi, F2FS_DIRTY_DENTS);
534 unsigned int qdata = get_pages(sbi, F2FS_DIRTY_QDATA);
535 unsigned int nodes = get_pages(sbi, F2FS_DIRTY_NODES);
536 unsigned int meta = get_pages(sbi, F2FS_DIRTY_META);
537 unsigned int imeta = get_pages(sbi, F2FS_DIRTY_IMETA);
538 unsigned int threshold = sbi->blocks_per_seg * factor *
539 DEFAULT_DIRTY_THRESHOLD;
540 unsigned int global_threshold = threshold * 3 / 2;

--- 24 unchanged lines hidden (view full) ---

565 f2fs_build_free_nids(sbi, false, false);
566
567 if (excess_dirty_nats(sbi) || excess_dirty_threshold(sbi) ||
568 excess_prefree_segs(sbi) || !f2fs_space_for_roll_forward(sbi))
569 goto do_sync;
570
571 /* there is background inflight IO or foreground operation recently */
572 if (is_inflight_io(sbi, REQ_TIME) ||
533 unsigned int dents = get_pages(sbi, F2FS_DIRTY_DENTS);
534 unsigned int qdata = get_pages(sbi, F2FS_DIRTY_QDATA);
535 unsigned int nodes = get_pages(sbi, F2FS_DIRTY_NODES);
536 unsigned int meta = get_pages(sbi, F2FS_DIRTY_META);
537 unsigned int imeta = get_pages(sbi, F2FS_DIRTY_IMETA);
538 unsigned int threshold = sbi->blocks_per_seg * factor *
539 DEFAULT_DIRTY_THRESHOLD;
540 unsigned int global_threshold = threshold * 3 / 2;

--- 24 unchanged lines hidden (view full) ---

565 f2fs_build_free_nids(sbi, false, false);
566
567 if (excess_dirty_nats(sbi) || excess_dirty_threshold(sbi) ||
568 excess_prefree_segs(sbi) || !f2fs_space_for_roll_forward(sbi))
569 goto do_sync;
570
571 /* there is background inflight IO or foreground operation recently */
572 if (is_inflight_io(sbi, REQ_TIME) ||
573 (!f2fs_time_over(sbi, REQ_TIME) && rwsem_is_locked(&sbi->cp_rwsem)))
573 (!f2fs_time_over(sbi, REQ_TIME) && f2fs_rwsem_is_locked(&sbi->cp_rwsem)))
574 return;
575
576 /* exceed periodical checkpoint timeout threshold */
577 if (f2fs_time_over(sbi, CP_TIME))
578 goto do_sync;
579
580 /* checkpoint is the only way to shrink partial cached entries */
581 if (f2fs_available_free_memory(sbi, NAT_ENTRIES) &&

--- 2234 unchanged lines hidden (view full) ---

2816
2817static void __f2fs_init_atgc_curseg(struct f2fs_sb_info *sbi)
2818{
2819 struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_ALL_DATA_ATGC);
2820
2821 if (!sbi->am.atgc_enabled)
2822 return;
2823
574 return;
575
576 /* exceed periodical checkpoint timeout threshold */
577 if (f2fs_time_over(sbi, CP_TIME))
578 goto do_sync;
579
580 /* checkpoint is the only way to shrink partial cached entries */
581 if (f2fs_available_free_memory(sbi, NAT_ENTRIES) &&

--- 2234 unchanged lines hidden (view full) ---

2816
2817static void __f2fs_init_atgc_curseg(struct f2fs_sb_info *sbi)
2818{
2819 struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_ALL_DATA_ATGC);
2820
2821 if (!sbi->am.atgc_enabled)
2822 return;
2823
2824 down_read(&SM_I(sbi)->curseg_lock);
2824 f2fs_down_read(&SM_I(sbi)->curseg_lock);
2825
2826 mutex_lock(&curseg->curseg_mutex);
2827 down_write(&SIT_I(sbi)->sentry_lock);
2828
2829 get_atssr_segment(sbi, CURSEG_ALL_DATA_ATGC, CURSEG_COLD_DATA, SSR, 0);
2830
2831 up_write(&SIT_I(sbi)->sentry_lock);
2832 mutex_unlock(&curseg->curseg_mutex);
2833
2825
2826 mutex_lock(&curseg->curseg_mutex);
2827 down_write(&SIT_I(sbi)->sentry_lock);
2828
2829 get_atssr_segment(sbi, CURSEG_ALL_DATA_ATGC, CURSEG_COLD_DATA, SSR, 0);
2830
2831 up_write(&SIT_I(sbi)->sentry_lock);
2832 mutex_unlock(&curseg->curseg_mutex);
2833
2834 up_read(&SM_I(sbi)->curseg_lock);
2834 f2fs_up_read(&SM_I(sbi)->curseg_lock);
2835
2836}
2837void f2fs_init_inmem_curseg(struct f2fs_sb_info *sbi)
2838{
2839 __f2fs_init_atgc_curseg(sbi);
2840}
2841
2842static void __f2fs_save_inmem_curseg(struct f2fs_sb_info *sbi, int type)

--- 134 unchanged lines hidden (view full) ---

2977}
2978
2979void f2fs_allocate_segment_for_resize(struct f2fs_sb_info *sbi, int type,
2980 unsigned int start, unsigned int end)
2981{
2982 struct curseg_info *curseg = CURSEG_I(sbi, type);
2983 unsigned int segno;
2984
2835
2836}
2837void f2fs_init_inmem_curseg(struct f2fs_sb_info *sbi)
2838{
2839 __f2fs_init_atgc_curseg(sbi);
2840}
2841
2842static void __f2fs_save_inmem_curseg(struct f2fs_sb_info *sbi, int type)

--- 134 unchanged lines hidden (view full) ---

2977}
2978
2979void f2fs_allocate_segment_for_resize(struct f2fs_sb_info *sbi, int type,
2980 unsigned int start, unsigned int end)
2981{
2982 struct curseg_info *curseg = CURSEG_I(sbi, type);
2983 unsigned int segno;
2984
2985 down_read(&SM_I(sbi)->curseg_lock);
2985 f2fs_down_read(&SM_I(sbi)->curseg_lock);
2986 mutex_lock(&curseg->curseg_mutex);
2987 down_write(&SIT_I(sbi)->sentry_lock);
2988
2989 segno = CURSEG_I(sbi, type)->segno;
2990 if (segno < start || segno > end)
2991 goto unlock;
2992
2993 if (f2fs_need_SSR(sbi) && get_ssr_segment(sbi, type, SSR, 0))

--- 7 unchanged lines hidden (view full) ---

3001unlock:
3002 up_write(&SIT_I(sbi)->sentry_lock);
3003
3004 if (segno != curseg->segno)
3005 f2fs_notice(sbi, "For resize: curseg of type %d: %u ==> %u",
3006 type, segno, curseg->segno);
3007
3008 mutex_unlock(&curseg->curseg_mutex);
2986 mutex_lock(&curseg->curseg_mutex);
2987 down_write(&SIT_I(sbi)->sentry_lock);
2988
2989 segno = CURSEG_I(sbi, type)->segno;
2990 if (segno < start || segno > end)
2991 goto unlock;
2992
2993 if (f2fs_need_SSR(sbi) && get_ssr_segment(sbi, type, SSR, 0))

--- 7 unchanged lines hidden (view full) ---

3001unlock:
3002 up_write(&SIT_I(sbi)->sentry_lock);
3003
3004 if (segno != curseg->segno)
3005 f2fs_notice(sbi, "For resize: curseg of type %d: %u ==> %u",
3006 type, segno, curseg->segno);
3007
3008 mutex_unlock(&curseg->curseg_mutex);
3009 up_read(&SM_I(sbi)->curseg_lock);
3009 f2fs_up_read(&SM_I(sbi)->curseg_lock);
3010}
3011
3012static void __allocate_new_segment(struct f2fs_sb_info *sbi, int type,
3013 bool new_sec, bool force)
3014{
3015 struct curseg_info *curseg = CURSEG_I(sbi, type);
3016 unsigned int old_segno;
3017

--- 15 unchanged lines hidden (view full) ---

3033static void __allocate_new_section(struct f2fs_sb_info *sbi,
3034 int type, bool force)
3035{
3036 __allocate_new_segment(sbi, type, true, force);
3037}
3038
3039void f2fs_allocate_new_section(struct f2fs_sb_info *sbi, int type, bool force)
3040{
3010}
3011
3012static void __allocate_new_segment(struct f2fs_sb_info *sbi, int type,
3013 bool new_sec, bool force)
3014{
3015 struct curseg_info *curseg = CURSEG_I(sbi, type);
3016 unsigned int old_segno;
3017

--- 15 unchanged lines hidden (view full) ---

3033static void __allocate_new_section(struct f2fs_sb_info *sbi,
3034 int type, bool force)
3035{
3036 __allocate_new_segment(sbi, type, true, force);
3037}
3038
3039void f2fs_allocate_new_section(struct f2fs_sb_info *sbi, int type, bool force)
3040{
3041 down_read(&SM_I(sbi)->curseg_lock);
3041 f2fs_down_read(&SM_I(sbi)->curseg_lock);
3042 down_write(&SIT_I(sbi)->sentry_lock);
3043 __allocate_new_section(sbi, type, force);
3044 up_write(&SIT_I(sbi)->sentry_lock);
3042 down_write(&SIT_I(sbi)->sentry_lock);
3043 __allocate_new_section(sbi, type, force);
3044 up_write(&SIT_I(sbi)->sentry_lock);
3045 up_read(&SM_I(sbi)->curseg_lock);
3045 f2fs_up_read(&SM_I(sbi)->curseg_lock);
3046}
3047
3048void f2fs_allocate_new_segments(struct f2fs_sb_info *sbi)
3049{
3050 int i;
3051
3046}
3047
3048void f2fs_allocate_new_segments(struct f2fs_sb_info *sbi)
3049{
3050 int i;
3051
3052 down_read(&SM_I(sbi)->curseg_lock);
3052 f2fs_down_read(&SM_I(sbi)->curseg_lock);
3053 down_write(&SIT_I(sbi)->sentry_lock);
3054 for (i = CURSEG_HOT_DATA; i <= CURSEG_COLD_DATA; i++)
3055 __allocate_new_segment(sbi, i, false, false);
3056 up_write(&SIT_I(sbi)->sentry_lock);
3053 down_write(&SIT_I(sbi)->sentry_lock);
3054 for (i = CURSEG_HOT_DATA; i <= CURSEG_COLD_DATA; i++)
3055 __allocate_new_segment(sbi, i, false, false);
3056 up_write(&SIT_I(sbi)->sentry_lock);
3057 up_read(&SM_I(sbi)->curseg_lock);
3057 f2fs_up_read(&SM_I(sbi)->curseg_lock);
3058}
3059
3060static const struct segment_allocation default_salloc_ops = {
3061 .allocate_segment = allocate_segment_by_default,
3062};
3063
3064bool f2fs_exist_trim_candidates(struct f2fs_sb_info *sbi,
3065 struct cp_control *cpc)

--- 121 unchanged lines hidden (view full) ---

3187 cpc.reason = CP_DISCARD;
3188 cpc.trim_minlen = max_t(__u64, 1, F2FS_BYTES_TO_BLK(range->minlen));
3189 cpc.trim_start = start_segno;
3190 cpc.trim_end = end_segno;
3191
3192 if (sbi->discard_blks == 0)
3193 goto out;
3194
3058}
3059
3060static const struct segment_allocation default_salloc_ops = {
3061 .allocate_segment = allocate_segment_by_default,
3062};
3063
3064bool f2fs_exist_trim_candidates(struct f2fs_sb_info *sbi,
3065 struct cp_control *cpc)

--- 121 unchanged lines hidden (view full) ---

3187 cpc.reason = CP_DISCARD;
3188 cpc.trim_minlen = max_t(__u64, 1, F2FS_BYTES_TO_BLK(range->minlen));
3189 cpc.trim_start = start_segno;
3190 cpc.trim_end = end_segno;
3191
3192 if (sbi->discard_blks == 0)
3193 goto out;
3194
3195 down_write(&sbi->gc_lock);
3195 f2fs_down_write(&sbi->gc_lock);
3196 err = f2fs_write_checkpoint(sbi, &cpc);
3196 err = f2fs_write_checkpoint(sbi, &cpc);
3197 up_write(&sbi->gc_lock);
3197 f2fs_up_write(&sbi->gc_lock);
3198 if (err)
3199 goto out;
3200
3201 /*
3202 * We filed discard candidates, but actually we don't need to wait for
3203 * all of them, since they'll be issued in idle time along with runtime
3204 * discard option. User configuration looks like using runtime discard
3205 * or periodic fstrim instead of it.

--- 220 unchanged lines hidden (view full) ---

3426 struct f2fs_io_info *fio)
3427{
3428 struct sit_info *sit_i = SIT_I(sbi);
3429 struct curseg_info *curseg = CURSEG_I(sbi, type);
3430 unsigned long long old_mtime;
3431 bool from_gc = (type == CURSEG_ALL_DATA_ATGC);
3432 struct seg_entry *se = NULL;
3433
3198 if (err)
3199 goto out;
3200
3201 /*
3202 * We filed discard candidates, but actually we don't need to wait for
3203 * all of them, since they'll be issued in idle time along with runtime
3204 * discard option. User configuration looks like using runtime discard
3205 * or periodic fstrim instead of it.

--- 220 unchanged lines hidden (view full) ---

3426 struct f2fs_io_info *fio)
3427{
3428 struct sit_info *sit_i = SIT_I(sbi);
3429 struct curseg_info *curseg = CURSEG_I(sbi, type);
3430 unsigned long long old_mtime;
3431 bool from_gc = (type == CURSEG_ALL_DATA_ATGC);
3432 struct seg_entry *se = NULL;
3433
3434 down_read(&SM_I(sbi)->curseg_lock);
3434 f2fs_down_read(&SM_I(sbi)->curseg_lock);
3435
3436 mutex_lock(&curseg->curseg_mutex);
3437 down_write(&sit_i->sentry_lock);
3438
3439 if (from_gc) {
3440 f2fs_bug_on(sbi, GET_SEGNO(sbi, old_blkaddr) == NULL_SEGNO);
3441 se = get_seg_entry(sbi, GET_SEGNO(sbi, old_blkaddr));
3442 sanity_check_seg_type(sbi, se->type);

--- 66 unchanged lines hidden (view full) ---

3509 io = sbi->write_io[fio->type] + fio->temp;
3510 spin_lock(&io->io_lock);
3511 list_add_tail(&fio->list, &io->io_list);
3512 spin_unlock(&io->io_lock);
3513 }
3514
3515 mutex_unlock(&curseg->curseg_mutex);
3516
3435
3436 mutex_lock(&curseg->curseg_mutex);
3437 down_write(&sit_i->sentry_lock);
3438
3439 if (from_gc) {
3440 f2fs_bug_on(sbi, GET_SEGNO(sbi, old_blkaddr) == NULL_SEGNO);
3441 se = get_seg_entry(sbi, GET_SEGNO(sbi, old_blkaddr));
3442 sanity_check_seg_type(sbi, se->type);

--- 66 unchanged lines hidden (view full) ---

3509 io = sbi->write_io[fio->type] + fio->temp;
3510 spin_lock(&io->io_lock);
3511 list_add_tail(&fio->list, &io->io_list);
3512 spin_unlock(&io->io_lock);
3513 }
3514
3515 mutex_unlock(&curseg->curseg_mutex);
3516
3517 up_read(&SM_I(sbi)->curseg_lock);
3517 f2fs_up_read(&SM_I(sbi)->curseg_lock);
3518}
3519
3520void f2fs_update_device_state(struct f2fs_sb_info *sbi, nid_t ino,
3521 block_t blkaddr, unsigned int blkcnt)
3522{
3523 if (!f2fs_is_multi_device(sbi))
3524 return;
3525

--- 19 unchanged lines hidden (view full) ---

3545}
3546
3547static void do_write_page(struct f2fs_summary *sum, struct f2fs_io_info *fio)
3548{
3549 int type = __get_segment_type(fio);
3550 bool keep_order = (f2fs_lfs_mode(fio->sbi) && type == CURSEG_COLD_DATA);
3551
3552 if (keep_order)
3518}
3519
3520void f2fs_update_device_state(struct f2fs_sb_info *sbi, nid_t ino,
3521 block_t blkaddr, unsigned int blkcnt)
3522{
3523 if (!f2fs_is_multi_device(sbi))
3524 return;
3525

--- 19 unchanged lines hidden (view full) ---

3545}
3546
3547static void do_write_page(struct f2fs_summary *sum, struct f2fs_io_info *fio)
3548{
3549 int type = __get_segment_type(fio);
3550 bool keep_order = (f2fs_lfs_mode(fio->sbi) && type == CURSEG_COLD_DATA);
3551
3552 if (keep_order)
3553 down_read(&fio->sbi->io_order_lock);
3553 f2fs_down_read(&fio->sbi->io_order_lock);
3554reallocate:
3555 f2fs_allocate_data_block(fio->sbi, fio->page, fio->old_blkaddr,
3556 &fio->new_blkaddr, sum, type, fio);
3557 if (GET_SEGNO(fio->sbi, fio->old_blkaddr) != NULL_SEGNO) {
3558 invalidate_mapping_pages(META_MAPPING(fio->sbi),
3559 fio->old_blkaddr, fio->old_blkaddr);
3560 f2fs_invalidate_compress_page(fio->sbi, fio->old_blkaddr);
3561 }
3562
3563 /* writeout dirty page into bdev */
3564 f2fs_submit_page_write(fio);
3565 if (fio->retry) {
3566 fio->old_blkaddr = fio->new_blkaddr;
3567 goto reallocate;
3568 }
3569
3570 f2fs_update_device_state(fio->sbi, fio->ino, fio->new_blkaddr, 1);
3571
3572 if (keep_order)
3554reallocate:
3555 f2fs_allocate_data_block(fio->sbi, fio->page, fio->old_blkaddr,
3556 &fio->new_blkaddr, sum, type, fio);
3557 if (GET_SEGNO(fio->sbi, fio->old_blkaddr) != NULL_SEGNO) {
3558 invalidate_mapping_pages(META_MAPPING(fio->sbi),
3559 fio->old_blkaddr, fio->old_blkaddr);
3560 f2fs_invalidate_compress_page(fio->sbi, fio->old_blkaddr);
3561 }
3562
3563 /* writeout dirty page into bdev */
3564 f2fs_submit_page_write(fio);
3565 if (fio->retry) {
3566 fio->old_blkaddr = fio->new_blkaddr;
3567 goto reallocate;
3568 }
3569
3570 f2fs_update_device_state(fio->sbi, fio->ino, fio->new_blkaddr, 1);
3571
3572 if (keep_order)
3573 up_read(&fio->sbi->io_order_lock);
3573 f2fs_up_read(&fio->sbi->io_order_lock);
3574}
3575
3576void f2fs_do_write_meta_page(struct f2fs_sb_info *sbi, struct page *page,
3577 enum iostat_type io_type)
3578{
3579 struct f2fs_io_info fio = {
3580 .sbi = sbi,
3581 .type = META,

--- 118 unchanged lines hidden (view full) ---

3700 int type;
3701 unsigned short old_blkoff;
3702 unsigned char old_alloc_type;
3703
3704 segno = GET_SEGNO(sbi, new_blkaddr);
3705 se = get_seg_entry(sbi, segno);
3706 type = se->type;
3707
3574}
3575
3576void f2fs_do_write_meta_page(struct f2fs_sb_info *sbi, struct page *page,
3577 enum iostat_type io_type)
3578{
3579 struct f2fs_io_info fio = {
3580 .sbi = sbi,
3581 .type = META,

--- 118 unchanged lines hidden (view full) ---

3700 int type;
3701 unsigned short old_blkoff;
3702 unsigned char old_alloc_type;
3703
3704 segno = GET_SEGNO(sbi, new_blkaddr);
3705 se = get_seg_entry(sbi, segno);
3706 type = se->type;
3707
3708 down_write(&SM_I(sbi)->curseg_lock);
3708 f2fs_down_write(&SM_I(sbi)->curseg_lock);
3709
3710 if (!recover_curseg) {
3711 /* for recovery flow */
3712 if (se->valid_blocks == 0 && !IS_CURSEG(sbi, segno)) {
3713 if (old_blkaddr == NULL_ADDR)
3714 type = CURSEG_COLD_DATA;
3715 else
3716 type = CURSEG_WARM_DATA;

--- 52 unchanged lines hidden (view full) ---

3769 change_curseg(sbi, type, true);
3770 }
3771 curseg->next_blkoff = old_blkoff;
3772 curseg->alloc_type = old_alloc_type;
3773 }
3774
3775 up_write(&sit_i->sentry_lock);
3776 mutex_unlock(&curseg->curseg_mutex);
3709
3710 if (!recover_curseg) {
3711 /* for recovery flow */
3712 if (se->valid_blocks == 0 && !IS_CURSEG(sbi, segno)) {
3713 if (old_blkaddr == NULL_ADDR)
3714 type = CURSEG_COLD_DATA;
3715 else
3716 type = CURSEG_WARM_DATA;

--- 52 unchanged lines hidden (view full) ---

3769 change_curseg(sbi, type, true);
3770 }
3771 curseg->next_blkoff = old_blkoff;
3772 curseg->alloc_type = old_alloc_type;
3773 }
3774
3775 up_write(&sit_i->sentry_lock);
3776 mutex_unlock(&curseg->curseg_mutex);
3777 up_write(&SM_I(sbi)->curseg_lock);
3777 f2fs_up_write(&SM_I(sbi)->curseg_lock);
3778}
3779
3780void f2fs_replace_block(struct f2fs_sb_info *sbi, struct dnode_of_data *dn,
3781 block_t old_addr, block_t new_addr,
3782 unsigned char version, bool recover_curseg,
3783 bool recover_newaddr)
3784{
3785 struct f2fs_summary sum;

--- 1467 unchanged lines hidden (view full) ---

5253 sm_info->min_ipu_util = DEF_MIN_IPU_UTIL;
5254 sm_info->min_fsync_blocks = DEF_MIN_FSYNC_BLOCKS;
5255 sm_info->min_seq_blocks = sbi->blocks_per_seg;
5256 sm_info->min_hot_blocks = DEF_MIN_HOT_BLOCKS;
5257 sm_info->min_ssr_sections = reserved_sections(sbi);
5258
5259 INIT_LIST_HEAD(&sm_info->sit_entry_set);
5260
3778}
3779
3780void f2fs_replace_block(struct f2fs_sb_info *sbi, struct dnode_of_data *dn,
3781 block_t old_addr, block_t new_addr,
3782 unsigned char version, bool recover_curseg,
3783 bool recover_newaddr)
3784{
3785 struct f2fs_summary sum;

--- 1467 unchanged lines hidden (view full) ---

5253 sm_info->min_ipu_util = DEF_MIN_IPU_UTIL;
5254 sm_info->min_fsync_blocks = DEF_MIN_FSYNC_BLOCKS;
5255 sm_info->min_seq_blocks = sbi->blocks_per_seg;
5256 sm_info->min_hot_blocks = DEF_MIN_HOT_BLOCKS;
5257 sm_info->min_ssr_sections = reserved_sections(sbi);
5258
5259 INIT_LIST_HEAD(&sm_info->sit_entry_set);
5260
5261 init_rwsem(&sm_info->curseg_lock);
5261 init_f2fs_rwsem(&sm_info->curseg_lock);
5262
5263 if (!f2fs_readonly(sbi->sb)) {
5264 err = f2fs_create_flush_cmd_control(sbi);
5265 if (err)
5266 return err;
5267 }
5268
5269 err = create_discard_cmd_control(sbi);

--- 179 unchanged lines hidden ---
5262
5263 if (!f2fs_readonly(sbi->sb)) {
5264 err = f2fs_create_flush_cmd_control(sbi);
5265 if (err)
5266 return err;
5267 }
5268
5269 err = create_discard_cmd_control(sbi);

--- 179 unchanged lines hidden ---