gc.c (5b0e95398e2bcc18e871758221cc712be4a0a39a) gc.c (2ef79ecb5e906d87475d3e0c49b22425499a89f3)
1/*
2 * fs/f2fs/gc.c
3 *
4 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 * http://www.samsung.com/
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as

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

587 return true;
588}
589
590/*
591 * Move data block via META_MAPPING while keeping locked data page.
592 * This can be used to move blocks, aka LBAs, directly on disk.
593 */
594static void move_data_block(struct inode *inode, block_t bidx,
1/*
2 * fs/f2fs/gc.c
3 *
4 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 * http://www.samsung.com/
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as

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

587 return true;
588}
589
590/*
591 * Move data block via META_MAPPING while keeping locked data page.
592 * This can be used to move blocks, aka LBAs, directly on disk.
593 */
594static void move_data_block(struct inode *inode, block_t bidx,
595 unsigned int segno, int off)
595 int gc_type, unsigned int segno, int off)
596{
597 struct f2fs_io_info fio = {
598 .sbi = F2FS_I_SB(inode),
599 .ino = inode->i_ino,
600 .type = DATA,
601 .temp = COLD,
602 .op = REQ_OP_READ,
603 .op_flags = 0,

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

615 /* do not read out */
616 page = f2fs_grab_cache_page(inode->i_mapping, bidx, false);
617 if (!page)
618 return;
619
620 if (!check_valid_map(F2FS_I_SB(inode), segno, off))
621 goto out;
622
596{
597 struct f2fs_io_info fio = {
598 .sbi = F2FS_I_SB(inode),
599 .ino = inode->i_ino,
600 .type = DATA,
601 .temp = COLD,
602 .op = REQ_OP_READ,
603 .op_flags = 0,

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

615 /* do not read out */
616 page = f2fs_grab_cache_page(inode->i_mapping, bidx, false);
617 if (!page)
618 return;
619
620 if (!check_valid_map(F2FS_I_SB(inode), segno, off))
621 goto out;
622
623 if (f2fs_is_atomic_file(inode))
623 if (f2fs_is_atomic_file(inode)) {
624 F2FS_I(inode)->i_gc_failures[GC_FAILURE_ATOMIC]++;
625 F2FS_I_SB(inode)->skipped_atomic_files[gc_type]++;
624 goto out;
626 goto out;
627 }
625
626 if (f2fs_is_pinned_file(inode)) {
627 f2fs_pin_file_control(inode, true);
628 goto out;
629 }
630
631 set_new_dnode(&dn, inode, NULL, NULL, 0);
632 err = get_dnode_of_data(&dn, bidx, LOOKUP_NODE);

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

728
729 page = get_lock_data_page(inode, bidx, true);
730 if (IS_ERR(page))
731 return;
732
733 if (!check_valid_map(F2FS_I_SB(inode), segno, off))
734 goto out;
735
628
629 if (f2fs_is_pinned_file(inode)) {
630 f2fs_pin_file_control(inode, true);
631 goto out;
632 }
633
634 set_new_dnode(&dn, inode, NULL, NULL, 0);
635 err = get_dnode_of_data(&dn, bidx, LOOKUP_NODE);

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

731
732 page = get_lock_data_page(inode, bidx, true);
733 if (IS_ERR(page))
734 return;
735
736 if (!check_valid_map(F2FS_I_SB(inode), segno, off))
737 goto out;
738
736 if (f2fs_is_atomic_file(inode))
739 if (f2fs_is_atomic_file(inode)) {
740 F2FS_I(inode)->i_gc_failures[GC_FAILURE_ATOMIC]++;
741 F2FS_I_SB(inode)->skipped_atomic_files[gc_type]++;
737 goto out;
742 goto out;
743 }
738 if (f2fs_is_pinned_file(inode)) {
739 if (gc_type == FG_GC)
740 f2fs_pin_file_control(inode, true);
741 goto out;
742 }
743
744 if (gc_type == BG_GC) {
745 if (PageWriteback(page))

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

891
892 /* wait for all inflight aio data */
893 inode_dio_wait(inode);
894 }
895
896 start_bidx = start_bidx_of_node(nofs, inode)
897 + ofs_in_node;
898 if (f2fs_post_read_required(inode))
744 if (f2fs_is_pinned_file(inode)) {
745 if (gc_type == FG_GC)
746 f2fs_pin_file_control(inode, true);
747 goto out;
748 }
749
750 if (gc_type == BG_GC) {
751 if (PageWriteback(page))

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

897
898 /* wait for all inflight aio data */
899 inode_dio_wait(inode);
900 }
901
902 start_bidx = start_bidx_of_node(nofs, inode)
903 + ofs_in_node;
904 if (f2fs_post_read_required(inode))
899 move_data_block(inode, start_bidx, segno, off);
905 move_data_block(inode, start_bidx, gc_type,
906 segno, off);
900 else
901 move_data_page(inode, start_bidx, gc_type,
902 segno, off);
903
904 if (locked) {
905 up_write(&fi->i_gc_rwsem[WRITE]);
906 up_write(&fi->i_gc_rwsem[READ]);
907 }

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

1008 int sec_freed = 0, seg_freed = 0, total_freed = 0;
1009 int ret = 0;
1010 struct cp_control cpc;
1011 unsigned int init_segno = segno;
1012 struct gc_inode_list gc_list = {
1013 .ilist = LIST_HEAD_INIT(gc_list.ilist),
1014 .iroot = RADIX_TREE_INIT(gc_list.iroot, GFP_NOFS),
1015 };
907 else
908 move_data_page(inode, start_bidx, gc_type,
909 segno, off);
910
911 if (locked) {
912 up_write(&fi->i_gc_rwsem[WRITE]);
913 up_write(&fi->i_gc_rwsem[READ]);
914 }

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

1015 int sec_freed = 0, seg_freed = 0, total_freed = 0;
1016 int ret = 0;
1017 struct cp_control cpc;
1018 unsigned int init_segno = segno;
1019 struct gc_inode_list gc_list = {
1020 .ilist = LIST_HEAD_INIT(gc_list.ilist),
1021 .iroot = RADIX_TREE_INIT(gc_list.iroot, GFP_NOFS),
1022 };
1023 unsigned long long last_skipped = sbi->skipped_atomic_files[FG_GC];
1024 unsigned int skipped_round = 0, round = 0;
1016
1017 trace_f2fs_gc_begin(sbi->sb, sync, background,
1018 get_pages(sbi, F2FS_DIRTY_NODES),
1019 get_pages(sbi, F2FS_DIRTY_DENTS),
1020 get_pages(sbi, F2FS_DIRTY_IMETA),
1021 free_sections(sbi),
1022 free_segments(sbi),
1023 reserved_segments(sbi),

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

1059 goto stop;
1060 }
1061
1062 seg_freed = do_garbage_collect(sbi, segno, &gc_list, gc_type);
1063 if (gc_type == FG_GC && seg_freed == sbi->segs_per_sec)
1064 sec_freed++;
1065 total_freed += seg_freed;
1066
1025
1026 trace_f2fs_gc_begin(sbi->sb, sync, background,
1027 get_pages(sbi, F2FS_DIRTY_NODES),
1028 get_pages(sbi, F2FS_DIRTY_DENTS),
1029 get_pages(sbi, F2FS_DIRTY_IMETA),
1030 free_sections(sbi),
1031 free_segments(sbi),
1032 reserved_segments(sbi),

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

1068 goto stop;
1069 }
1070
1071 seg_freed = do_garbage_collect(sbi, segno, &gc_list, gc_type);
1072 if (gc_type == FG_GC && seg_freed == sbi->segs_per_sec)
1073 sec_freed++;
1074 total_freed += seg_freed;
1075
1076 if (gc_type == FG_GC) {
1077 if (sbi->skipped_atomic_files[FG_GC] > last_skipped)
1078 skipped_round++;
1079 last_skipped = sbi->skipped_atomic_files[FG_GC];
1080 round++;
1081 }
1082
1067 if (gc_type == FG_GC)
1068 sbi->cur_victim_sec = NULL_SEGNO;
1069
1070 if (!sync) {
1071 if (has_not_enough_free_secs(sbi, sec_freed, 0)) {
1083 if (gc_type == FG_GC)
1084 sbi->cur_victim_sec = NULL_SEGNO;
1085
1086 if (!sync) {
1087 if (has_not_enough_free_secs(sbi, sec_freed, 0)) {
1088 if (skipped_round > MAX_SKIP_ATOMIC_COUNT &&
1089 skipped_round * 2 >= round)
1090 drop_inmem_pages_all(sbi, true);
1072 segno = NULL_SEGNO;
1073 goto gc_more;
1074 }
1075
1076 if (gc_type == FG_GC)
1077 ret = write_checkpoint(sbi, &cpc);
1078 }
1079stop:

--- 32 unchanged lines hidden ---
1091 segno = NULL_SEGNO;
1092 goto gc_more;
1093 }
1094
1095 if (gc_type == FG_GC)
1096 ret = write_checkpoint(sbi, &cpc);
1097 }
1098stop:

--- 32 unchanged lines hidden ---