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