segment.c (279d6df20c94079d35e012f1602d40c42632e8f3) | segment.c (c473f1a9658b6c23d576136d5a49b1c731ef1767) |
---|---|
1/* 2 * fs/f2fs/segment.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 --- 1169 unchanged lines hidden (view full) --- 1178 int entries = SIT_VBLOCK_MAP_SIZE / sizeof(unsigned long); 1179 int max_blocks = sbi->blocks_per_seg; 1180 struct seg_entry *se = get_seg_entry(sbi, cpc->trim_start); 1181 unsigned long *cur_map = (unsigned long *)se->cur_valid_map; 1182 unsigned long *ckpt_map = (unsigned long *)se->ckpt_valid_map; 1183 unsigned long *discard_map = (unsigned long *)se->discard_map; 1184 unsigned long *dmap = SIT_I(sbi)->tmp_map; 1185 unsigned int start = 0, end = -1; | 1/* 2 * fs/f2fs/segment.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 --- 1169 unchanged lines hidden (view full) --- 1178 int entries = SIT_VBLOCK_MAP_SIZE / sizeof(unsigned long); 1179 int max_blocks = sbi->blocks_per_seg; 1180 struct seg_entry *se = get_seg_entry(sbi, cpc->trim_start); 1181 unsigned long *cur_map = (unsigned long *)se->cur_valid_map; 1182 unsigned long *ckpt_map = (unsigned long *)se->ckpt_valid_map; 1183 unsigned long *discard_map = (unsigned long *)se->discard_map; 1184 unsigned long *dmap = SIT_I(sbi)->tmp_map; 1185 unsigned int start = 0, end = -1; |
1186 bool force = (cpc->reason == CP_DISCARD); | 1186 bool force = (cpc->reason & CP_DISCARD); |
1187 struct discard_entry *de = NULL; 1188 struct list_head *head = &SM_I(sbi)->dcc_info->entry_list; 1189 int i; 1190 1191 if (se->valid_blocks == max_blocks || !f2fs_discard_en(sbi)) 1192 return false; 1193 1194 if (!force) { --- 66 unchanged lines hidden (view full) --- 1261void clear_prefree_segments(struct f2fs_sb_info *sbi, struct cp_control *cpc) 1262{ 1263 struct list_head *head = &(SM_I(sbi)->dcc_info->entry_list); 1264 struct discard_entry *entry, *this; 1265 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi); 1266 unsigned long *prefree_map = dirty_i->dirty_segmap[PRE]; 1267 unsigned int start = 0, end = -1; 1268 unsigned int secno, start_segno; | 1187 struct discard_entry *de = NULL; 1188 struct list_head *head = &SM_I(sbi)->dcc_info->entry_list; 1189 int i; 1190 1191 if (se->valid_blocks == max_blocks || !f2fs_discard_en(sbi)) 1192 return false; 1193 1194 if (!force) { --- 66 unchanged lines hidden (view full) --- 1261void clear_prefree_segments(struct f2fs_sb_info *sbi, struct cp_control *cpc) 1262{ 1263 struct list_head *head = &(SM_I(sbi)->dcc_info->entry_list); 1264 struct discard_entry *entry, *this; 1265 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi); 1266 unsigned long *prefree_map = dirty_i->dirty_segmap[PRE]; 1267 unsigned int start = 0, end = -1; 1268 unsigned int secno, start_segno; |
1269 bool force = (cpc->reason == CP_DISCARD); | 1269 bool force = (cpc->reason & CP_DISCARD); |
1270 1271 mutex_lock(&dirty_i->seglist_lock); 1272 1273 while (1) { 1274 int i; 1275 start = find_next_bit(prefree_map, MAIN_SEGS(sbi), end + 1); 1276 if (start >= MAIN_SEGS(sbi)) 1277 break; --- 1487 unchanged lines hidden (view full) --- 2765 2766 /* flush dirty sit entries in region of current sit set */ 2767 for_each_set_bit_from(segno, bitmap, end) { 2768 int offset, sit_offset; 2769 2770 se = get_seg_entry(sbi, segno); 2771 2772 /* add discard candidates */ | 1270 1271 mutex_lock(&dirty_i->seglist_lock); 1272 1273 while (1) { 1274 int i; 1275 start = find_next_bit(prefree_map, MAIN_SEGS(sbi), end + 1); 1276 if (start >= MAIN_SEGS(sbi)) 1277 break; --- 1487 unchanged lines hidden (view full) --- 2765 2766 /* flush dirty sit entries in region of current sit set */ 2767 for_each_set_bit_from(segno, bitmap, end) { 2768 int offset, sit_offset; 2769 2770 se = get_seg_entry(sbi, segno); 2771 2772 /* add discard candidates */ |
2773 if (cpc->reason != CP_DISCARD) { | 2773 if (!(cpc->reason & CP_DISCARD)) { |
2774 cpc->trim_start = segno; 2775 add_discard_addrs(sbi, cpc, false); 2776 } 2777 2778 if (to_journal) { 2779 offset = lookup_journal_in_cursum(journal, 2780 SIT_JOURNAL, segno, 1); 2781 f2fs_bug_on(sbi, offset < 0); --- 19 unchanged lines hidden (view full) --- 2801 2802 f2fs_bug_on(sbi, ses->entry_cnt); 2803 release_sit_entry_set(ses); 2804 } 2805 2806 f2fs_bug_on(sbi, !list_empty(head)); 2807 f2fs_bug_on(sbi, sit_i->dirty_sentries); 2808out: | 2774 cpc->trim_start = segno; 2775 add_discard_addrs(sbi, cpc, false); 2776 } 2777 2778 if (to_journal) { 2779 offset = lookup_journal_in_cursum(journal, 2780 SIT_JOURNAL, segno, 1); 2781 f2fs_bug_on(sbi, offset < 0); --- 19 unchanged lines hidden (view full) --- 2801 2802 f2fs_bug_on(sbi, ses->entry_cnt); 2803 release_sit_entry_set(ses); 2804 } 2805 2806 f2fs_bug_on(sbi, !list_empty(head)); 2807 f2fs_bug_on(sbi, sit_i->dirty_sentries); 2808out: |
2809 if (cpc->reason == CP_DISCARD) { | 2809 if (cpc->reason & CP_DISCARD) { |
2810 __u64 trim_start = cpc->trim_start; 2811 2812 for (; cpc->trim_start <= cpc->trim_end; cpc->trim_start++) 2813 add_discard_addrs(sbi, cpc, false); 2814 2815 cpc->trim_start = trim_start; 2816 } 2817 mutex_unlock(&sit_i->sentry_lock); --- 556 unchanged lines hidden --- | 2810 __u64 trim_start = cpc->trim_start; 2811 2812 for (; cpc->trim_start <= cpc->trim_end; cpc->trim_start++) 2813 add_discard_addrs(sbi, cpc, false); 2814 2815 cpc->trim_start = trim_start; 2816 } 2817 mutex_unlock(&sit_i->sentry_lock); --- 556 unchanged lines hidden --- |