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