blob: c6322ef9b5fc9de0a9a845e4d316ee9dab44cb0c [file] [log] [blame]
Jaegeuk Kim0a8165d2012-11-29 13:28:09 +09001/*
Jaegeuk Kim7bc09002012-11-02 17:13:01 +09002 * 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
9 * published by the Free Software Foundation.
10 */
11#include <linux/fs.h>
12#include <linux/module.h>
13#include <linux/backing-dev.h>
Jaegeuk Kim7bc09002012-11-02 17:13:01 +090014#include <linux/init.h>
15#include <linux/f2fs_fs.h>
16#include <linux/kthread.h>
17#include <linux/delay.h>
18#include <linux/freezer.h>
Jaegeuk Kim7bc09002012-11-02 17:13:01 +090019
20#include "f2fs.h"
21#include "node.h"
22#include "segment.h"
23#include "gc.h"
Namjae Jeon8e46b3e2013-04-23 16:42:53 +090024#include <trace/events/f2fs.h>
Jaegeuk Kim7bc09002012-11-02 17:13:01 +090025
Jaegeuk Kim7bc09002012-11-02 17:13:01 +090026static int gc_thread_func(void *data)
27{
28 struct f2fs_sb_info *sbi = data;
Namjae Jeonb59d0ba2013-08-04 23:09:40 +090029 struct f2fs_gc_kthread *gc_th = sbi->gc_thread;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +090030 wait_queue_head_t *wq = &sbi->gc_thread->gc_wait_queue_head;
Chao Yu80049562017-08-07 23:12:46 +080031 unsigned int wait_ms;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +090032
Namjae Jeonb59d0ba2013-08-04 23:09:40 +090033 wait_ms = gc_th->min_sleep_time;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +090034
Jaegeuk Kimd430af22017-05-17 10:36:58 -070035 set_freezable();
Jaegeuk Kim7bc09002012-11-02 17:13:01 +090036 do {
Jaegeuk Kimd430af22017-05-17 10:36:58 -070037 wait_event_interruptible_timeout(*wq,
Jaegeuk Kimbd2ffc22017-08-06 22:09:00 -070038 kthread_should_stop() || freezing(current) ||
39 gc_th->gc_wake,
Jaegeuk Kimd430af22017-05-17 10:36:58 -070040 msecs_to_jiffies(wait_ms));
41
Jaegeuk Kimbd2ffc22017-08-06 22:09:00 -070042 /* give it a try one time */
43 if (gc_th->gc_wake)
44 gc_th->gc_wake = 0;
45
Jaegeuk Kim7bc09002012-11-02 17:13:01 +090046 if (try_to_freeze())
47 continue;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +090048 if (kthread_should_stop())
49 break;
50
Changman Leed6212a52013-01-29 18:30:07 +090051 if (sbi->sb->s_writers.frozen >= SB_FREEZE_WRITE) {
Chao Yu88dd8932015-01-26 20:24:21 +080052 increase_sleep_time(gc_th, &wait_ms);
Changman Leed6212a52013-01-29 18:30:07 +090053 continue;
54 }
55
Jaegeuk Kime6b120d2017-07-10 12:55:09 -070056 if (time_to_inject(sbi, FAULT_CHECKPOINT)) {
57 f2fs_show_injection_info(FAULT_CHECKPOINT);
Chao Yu0f348022016-09-26 19:45:55 +080058 f2fs_stop_checkpoint(sbi, false);
Jaegeuk Kime6b120d2017-07-10 12:55:09 -070059 }
Chao Yu0f348022016-09-26 19:45:55 +080060
Chao Yuce8bd4b2017-07-22 08:52:23 +080061 if (!sb_start_write_trylock(sbi->sb))
62 continue;
63
Jaegeuk Kim7bc09002012-11-02 17:13:01 +090064 /*
65 * [GC triggering condition]
66 * 0. GC is not conducted currently.
67 * 1. There are enough dirty segments.
68 * 2. IO subsystem is idle by checking the # of writeback pages.
69 * 3. IO subsystem is idle by checking the # of requests in
70 * bdev's request list.
71 *
arter97e1c42042014-08-06 23:22:50 +090072 * Note) We have to avoid triggering GCs frequently.
Jaegeuk Kim7bc09002012-11-02 17:13:01 +090073 * Because it is possible that some segments can be
74 * invalidated soon after by user update or deletion.
75 * So, I'd like to wait some time to collect dirty segments.
76 */
Jaegeuk Kim0390d832018-05-07 14:22:40 -070077 if (sbi->gc_mode == GC_URGENT) {
Jaegeuk Kimbd2ffc22017-08-06 22:09:00 -070078 wait_ms = gc_th->urgent_sleep_time;
Jaegeuk Kimecd02f52018-02-26 09:19:47 -080079 mutex_lock(&sbi->gc_mutex);
Jaegeuk Kimbd2ffc22017-08-06 22:09:00 -070080 goto do_gc;
81 }
82
Jaegeuk Kimecd02f52018-02-26 09:19:47 -080083 if (!mutex_trylock(&sbi->gc_mutex))
84 goto next;
85
Jaegeuk Kim7bc09002012-11-02 17:13:01 +090086 if (!is_idle(sbi)) {
Chao Yu88dd8932015-01-26 20:24:21 +080087 increase_sleep_time(gc_th, &wait_ms);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +090088 mutex_unlock(&sbi->gc_mutex);
Chao Yuce8bd4b2017-07-22 08:52:23 +080089 goto next;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +090090 }
91
92 if (has_enough_invalid_blocks(sbi))
Chao Yu88dd8932015-01-26 20:24:21 +080093 decrease_sleep_time(gc_th, &wait_ms);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +090094 else
Chao Yu88dd8932015-01-26 20:24:21 +080095 increase_sleep_time(gc_th, &wait_ms);
Jaegeuk Kimbd2ffc22017-08-06 22:09:00 -070096do_gc:
Jaegeuk Kimdcdfff62013-10-22 20:56:10 +090097 stat_inc_bggc_count(sbi);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +090098
Jaegeuk Kim43727522013-02-04 15:11:17 +090099 /* if return value is not zero, no victim was selected */
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700100 if (f2fs_gc(sbi, test_opt(sbi, FORCE_FG_GC), true, NULL_SEGNO))
Namjae Jeonb59d0ba2013-08-04 23:09:40 +0900101 wait_ms = gc_th->no_gc_sleep_time;
Jaegeuk Kim81eb8d62013-10-24 13:31:34 +0900102
Jaegeuk Kim84e42142015-10-13 10:00:53 -0700103 trace_f2fs_background_gc(sbi->sb, wait_ms,
104 prefree_segments(sbi), free_segments(sbi));
105
Jaegeuk Kim4660f9c2013-10-24 14:19:18 +0900106 /* balancing f2fs's metadata periodically */
107 f2fs_balance_fs_bg(sbi);
Chao Yuce8bd4b2017-07-22 08:52:23 +0800108next:
109 sb_end_write(sbi->sb);
Jaegeuk Kim81eb8d62013-10-24 13:31:34 +0900110
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900111 } while (!kthread_should_stop());
112 return 0;
113}
114
Chao Yu6b4d6a82018-05-30 00:20:41 +0800115int f2fs_start_gc_thread(struct f2fs_sb_info *sbi)
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900116{
Namjae Jeon1042d602012-12-01 10:56:13 +0900117 struct f2fs_gc_kthread *gc_th;
Namjae Jeonec7b1f22013-02-02 23:52:28 +0900118 dev_t dev = sbi->sb->s_bdev->bd_dev;
Namjae Jeon7a267f82013-05-26 11:05:32 +0900119 int err = 0;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900120
Chao Yu1ecc0c52016-09-23 21:30:09 +0800121 gc_th = f2fs_kmalloc(sbi, sizeof(struct f2fs_gc_kthread), GFP_KERNEL);
Namjae Jeon7a267f82013-05-26 11:05:32 +0900122 if (!gc_th) {
123 err = -ENOMEM;
124 goto out;
125 }
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900126
Jaegeuk Kimbd2ffc22017-08-06 22:09:00 -0700127 gc_th->urgent_sleep_time = DEF_GC_THREAD_URGENT_SLEEP_TIME;
Namjae Jeonb59d0ba2013-08-04 23:09:40 +0900128 gc_th->min_sleep_time = DEF_GC_THREAD_MIN_SLEEP_TIME;
129 gc_th->max_sleep_time = DEF_GC_THREAD_MAX_SLEEP_TIME;
130 gc_th->no_gc_sleep_time = DEF_GC_THREAD_NOGC_SLEEP_TIME;
131
Jaegeuk Kimbd2ffc22017-08-06 22:09:00 -0700132 gc_th->gc_wake= 0;
Namjae Jeond2dc0952013-08-04 23:10:15 +0900133
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900134 sbi->gc_thread = gc_th;
135 init_waitqueue_head(&sbi->gc_thread->gc_wait_queue_head);
136 sbi->gc_thread->f2fs_gc_task = kthread_run(gc_thread_func, sbi,
Namjae Jeonec7b1f22013-02-02 23:52:28 +0900137 "f2fs_gc-%u:%u", MAJOR(dev), MINOR(dev));
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900138 if (IS_ERR(gc_th->f2fs_gc_task)) {
Namjae Jeon7a267f82013-05-26 11:05:32 +0900139 err = PTR_ERR(gc_th->f2fs_gc_task);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900140 kfree(gc_th);
Namjae Jeon25718422013-02-02 23:52:42 +0900141 sbi->gc_thread = NULL;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900142 }
Namjae Jeon7a267f82013-05-26 11:05:32 +0900143out:
144 return err;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900145}
146
Chao Yu6b4d6a82018-05-30 00:20:41 +0800147void f2fs_stop_gc_thread(struct f2fs_sb_info *sbi)
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900148{
149 struct f2fs_gc_kthread *gc_th = sbi->gc_thread;
150 if (!gc_th)
151 return;
152 kthread_stop(gc_th->f2fs_gc_task);
153 kfree(gc_th);
154 sbi->gc_thread = NULL;
155}
156
Jaegeuk Kim0390d832018-05-07 14:22:40 -0700157static int select_gc_type(struct f2fs_sb_info *sbi, int gc_type)
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900158{
Namjae Jeond2dc0952013-08-04 23:10:15 +0900159 int gc_mode = (gc_type == BG_GC) ? GC_CB : GC_GREEDY;
160
Jaegeuk Kim0390d832018-05-07 14:22:40 -0700161 switch (sbi->gc_mode) {
162 case GC_IDLE_CB:
163 gc_mode = GC_CB;
164 break;
165 case GC_IDLE_GREEDY:
166 case GC_URGENT:
Jaegeuk Kime87b13e2018-02-26 15:40:30 -0800167 gc_mode = GC_GREEDY;
Jaegeuk Kim0390d832018-05-07 14:22:40 -0700168 break;
169 }
Namjae Jeond2dc0952013-08-04 23:10:15 +0900170 return gc_mode;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900171}
172
173static void select_policy(struct f2fs_sb_info *sbi, int gc_type,
174 int type, struct victim_sel_policy *p)
175{
176 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
177
Jaegeuk Kim4ebefc42013-03-31 13:49:18 +0900178 if (p->alloc_mode == SSR) {
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900179 p->gc_mode = GC_GREEDY;
180 p->dirty_segmap = dirty_i->dirty_segmap[type];
Jin Xua26b7c82013-09-05 12:45:26 +0800181 p->max_search = dirty_i->nr_dirty[type];
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900182 p->ofs_unit = 1;
183 } else {
Jaegeuk Kim0390d832018-05-07 14:22:40 -0700184 p->gc_mode = select_gc_type(sbi, gc_type);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900185 p->dirty_segmap = dirty_i->dirty_segmap[DIRTY];
Jin Xua26b7c82013-09-05 12:45:26 +0800186 p->max_search = dirty_i->nr_dirty[DIRTY];
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900187 p->ofs_unit = sbi->segs_per_sec;
188 }
Jin Xua26b7c82013-09-05 12:45:26 +0800189
Hou Pengyang4992ba22017-02-16 12:34:31 +0000190 /* we need to check every dirty segments in the FG_GC case */
Jaegeuk Kime87b13e2018-02-26 15:40:30 -0800191 if (gc_type != FG_GC &&
Jaegeuk Kim0390d832018-05-07 14:22:40 -0700192 (sbi->gc_mode != GC_URGENT) &&
Jaegeuk Kime87b13e2018-02-26 15:40:30 -0800193 p->max_search > sbi->max_victim_search)
Jaegeuk Kimb1c57c12014-01-08 13:45:08 +0900194 p->max_search = sbi->max_victim_search;
Jin Xua26b7c82013-09-05 12:45:26 +0800195
Yunlong Songaae506a2018-01-29 11:37:45 +0800196 /* let's select beginning hot/small space first in no_heap mode*/
197 if (test_opt(sbi, NOHEAP) &&
198 (type == CURSEG_HOT_DATA || IS_NODESEG(type)))
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700199 p->offset = 0;
200 else
201 p->offset = SIT_I(sbi)->last_victim[p->gc_mode];
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900202}
203
204static unsigned int get_max_cost(struct f2fs_sb_info *sbi,
205 struct victim_sel_policy *p)
206{
Jaegeuk Kimb7250d22013-02-05 13:19:28 +0900207 /* SSR allocates in a segment unit */
208 if (p->alloc_mode == SSR)
Chao Yu3519e3f2015-12-01 11:56:52 +0800209 return sbi->blocks_per_seg;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900210 if (p->gc_mode == GC_GREEDY)
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700211 return 2 * sbi->blocks_per_seg * p->ofs_unit;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900212 else if (p->gc_mode == GC_CB)
213 return UINT_MAX;
214 else /* No other gc_mode */
215 return 0;
216}
217
218static unsigned int check_bg_victims(struct f2fs_sb_info *sbi)
219{
220 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
Jaegeuk Kim5ec4e492013-03-31 13:26:03 +0900221 unsigned int secno;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900222
223 /*
224 * If the gc_type is FG_GC, we can select victim segments
225 * selected by background GC before.
226 * Those segments guarantee they have small valid blocks.
227 */
Jaegeuk Kim7cd85582014-09-23 11:23:01 -0700228 for_each_set_bit(secno, dirty_i->victim_secmap, MAIN_SECS(sbi)) {
Jaegeuk Kim5ec4e492013-03-31 13:26:03 +0900229 if (sec_usage_check(sbi, secno))
Chao Yub65ee142014-08-04 10:10:07 +0800230 continue;
Jaegeuk Kim5ec4e492013-03-31 13:26:03 +0900231 clear_bit(secno, dirty_i->victim_secmap);
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700232 return GET_SEG_FROM_SEC(sbi, secno);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900233 }
234 return NULL_SEGNO;
235}
236
237static unsigned int get_cb_cost(struct f2fs_sb_info *sbi, unsigned int segno)
238{
239 struct sit_info *sit_i = SIT_I(sbi);
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700240 unsigned int secno = GET_SEC_FROM_SEG(sbi, segno);
241 unsigned int start = GET_SEG_FROM_SEC(sbi, secno);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900242 unsigned long long mtime = 0;
243 unsigned int vblocks;
244 unsigned char age = 0;
245 unsigned char u;
246 unsigned int i;
247
248 for (i = 0; i < sbi->segs_per_sec; i++)
249 mtime += get_seg_entry(sbi, start + i)->mtime;
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700250 vblocks = get_valid_blocks(sbi, segno, true);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900251
252 mtime = div_u64(mtime, sbi->segs_per_sec);
253 vblocks = div_u64(vblocks, sbi->segs_per_sec);
254
255 u = (vblocks * 100) >> sbi->log_blocks_per_seg;
256
arter97e1c42042014-08-06 23:22:50 +0900257 /* Handle if the system time has changed by the user */
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900258 if (mtime < sit_i->min_mtime)
259 sit_i->min_mtime = mtime;
260 if (mtime > sit_i->max_mtime)
261 sit_i->max_mtime = mtime;
262 if (sit_i->max_mtime != sit_i->min_mtime)
263 age = 100 - div64_u64(100 * (mtime - sit_i->min_mtime),
264 sit_i->max_mtime - sit_i->min_mtime);
265
266 return UINT_MAX - ((100 * (100 - u) * age) / (100 + u));
267}
268
Jin Xua57e5642013-09-13 08:38:54 +0800269static inline unsigned int get_gc_cost(struct f2fs_sb_info *sbi,
270 unsigned int segno, struct victim_sel_policy *p)
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900271{
272 if (p->alloc_mode == SSR)
Yunlong Songe6ba5f22017-09-04 11:10:18 +0800273 return get_seg_entry(sbi, segno)->ckpt_valid_blocks;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900274
275 /* alloc_mode == LFS */
276 if (p->gc_mode == GC_GREEDY)
Yunlong Songc19928e2017-09-23 17:02:18 +0800277 return get_valid_blocks(sbi, segno, true);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900278 else
279 return get_cb_cost(sbi, segno);
280}
281
Fan Li688159b2016-02-03 16:21:57 +0800282static unsigned int count_bits(const unsigned long *addr,
283 unsigned int offset, unsigned int len)
284{
285 unsigned int end = offset + len, sum = 0;
286
287 while (offset < end) {
288 if (test_bit(offset++, addr))
289 ++sum;
290 }
291 return sum;
292}
293
Jaegeuk Kim0a8165d2012-11-29 13:28:09 +0900294/*
Masanari Iida111d2492013-03-19 08:03:35 +0900295 * This function is called from two paths.
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900296 * One is garbage collection and the other is SSR segment selection.
297 * When it is called during GC, it just gets a victim segment
298 * and it does not remove it from dirty seglist.
299 * When it is called from SSR segment selection, it finds a segment
300 * which has minimum valid blocks and removes it from dirty seglist.
301 */
302static int get_victim_by_default(struct f2fs_sb_info *sbi,
303 unsigned int *result, int gc_type, int type, char alloc_mode)
304{
305 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700306 struct sit_info *sm = SIT_I(sbi);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900307 struct victim_sel_policy p;
Sheng Yong3fa56502016-09-29 18:37:31 +0800308 unsigned int secno, last_victim;
Chao Yua43f7ec2015-10-05 22:19:24 +0800309 unsigned int last_segment = MAIN_SEGS(sbi);
Fan Li688159b2016-02-03 16:21:57 +0800310 unsigned int nsearched = 0;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900311
Chao Yu210f41b2014-09-15 18:05:44 +0800312 mutex_lock(&dirty_i->seglist_lock);
313
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900314 p.alloc_mode = alloc_mode;
315 select_policy(sbi, gc_type, type, &p);
316
317 p.min_segno = NULL_SEGNO;
Sheng Yong3fa56502016-09-29 18:37:31 +0800318 p.min_cost = get_max_cost(sbi, &p);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900319
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700320 if (*result != NULL_SEGNO) {
321 if (IS_DATASEG(get_seg_entry(sbi, *result)->type) &&
322 get_valid_blocks(sbi, *result, false) &&
323 !sec_usage_check(sbi, GET_SEC_FROM_SEG(sbi, *result)))
324 p.min_segno = *result;
325 goto out;
326 }
327
Chao Yu3342bb32015-10-05 22:20:40 +0800328 if (p.max_search == 0)
329 goto out;
330
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700331 last_victim = sm->last_victim[p.gc_mode];
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900332 if (p.alloc_mode == LFS && gc_type == FG_GC) {
333 p.min_segno = check_bg_victims(sbi);
334 if (p.min_segno != NULL_SEGNO)
335 goto got_it;
336 }
337
338 while (1) {
339 unsigned long cost;
Jaegeuk Kim5ec4e492013-03-31 13:26:03 +0900340 unsigned int segno;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900341
Chao Yua43f7ec2015-10-05 22:19:24 +0800342 segno = find_next_bit(p.dirty_segmap, last_segment, p.offset);
343 if (segno >= last_segment) {
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700344 if (sm->last_victim[p.gc_mode]) {
345 last_segment =
346 sm->last_victim[p.gc_mode];
347 sm->last_victim[p.gc_mode] = 0;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900348 p.offset = 0;
349 continue;
350 }
351 break;
352 }
Jin Xua57e5642013-09-13 08:38:54 +0800353
354 p.offset = segno + p.ofs_unit;
Fan Li688159b2016-02-03 16:21:57 +0800355 if (p.ofs_unit > 1) {
Jin Xua57e5642013-09-13 08:38:54 +0800356 p.offset -= segno % p.ofs_unit;
Fan Li688159b2016-02-03 16:21:57 +0800357 nsearched += count_bits(p.dirty_segmap,
358 p.offset - p.ofs_unit,
359 p.ofs_unit);
360 } else {
361 nsearched++;
362 }
363
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700364 secno = GET_SEC_FROM_SEG(sbi, segno);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900365
Jaegeuk Kim5ec4e492013-03-31 13:26:03 +0900366 if (sec_usage_check(sbi, secno))
Fan Li688159b2016-02-03 16:21:57 +0800367 goto next;
Jaegeuk Kim5ec4e492013-03-31 13:26:03 +0900368 if (gc_type == BG_GC && test_bit(secno, dirty_i->victim_secmap))
Fan Li688159b2016-02-03 16:21:57 +0800369 goto next;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900370
371 cost = get_gc_cost(sbi, segno, &p);
372
373 if (p.min_cost > cost) {
374 p.min_segno = segno;
375 p.min_cost = cost;
Jin Xua57e5642013-09-13 08:38:54 +0800376 }
Fan Li688159b2016-02-03 16:21:57 +0800377next:
378 if (nsearched >= p.max_search) {
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700379 if (!sm->last_victim[p.gc_mode] && segno <= last_victim)
380 sm->last_victim[p.gc_mode] = last_victim + 1;
Jaegeuk Kim4ce53772016-02-18 16:34:38 -0800381 else
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700382 sm->last_victim[p.gc_mode] = segno + 1;
383 sm->last_victim[p.gc_mode] %= MAIN_SEGS(sbi);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900384 break;
385 }
386 }
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900387 if (p.min_segno != NULL_SEGNO) {
Namjae Jeonb2b34602013-06-01 16:20:26 +0900388got_it:
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900389 if (p.alloc_mode == LFS) {
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700390 secno = GET_SEC_FROM_SEG(sbi, p.min_segno);
Jaegeuk Kim5ec4e492013-03-31 13:26:03 +0900391 if (gc_type == FG_GC)
392 sbi->cur_victim_sec = secno;
393 else
394 set_bit(secno, dirty_i->victim_secmap);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900395 }
Jaegeuk Kim5ec4e492013-03-31 13:26:03 +0900396 *result = (p.min_segno / p.ofs_unit) * p.ofs_unit;
Namjae Jeon8e46b3e2013-04-23 16:42:53 +0900397
398 trace_f2fs_get_victim(sbi->sb, type, gc_type, &p,
399 sbi->cur_victim_sec,
400 prefree_segments(sbi), free_segments(sbi));
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900401 }
Chao Yu3342bb32015-10-05 22:20:40 +0800402out:
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900403 mutex_unlock(&dirty_i->seglist_lock);
404
405 return (p.min_segno == NULL_SEGNO) ? 0 : 1;
406}
407
408static const struct victim_selection default_v_ops = {
409 .get_victim = get_victim_by_default,
410};
411
Changman Lee7dda2af2014-11-28 15:49:40 +0000412static struct inode *find_gc_inode(struct gc_inode_list *gc_list, nid_t ino)
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900413{
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900414 struct inode_entry *ie;
415
Changman Lee7dda2af2014-11-28 15:49:40 +0000416 ie = radix_tree_lookup(&gc_list->iroot, ino);
417 if (ie)
418 return ie->inode;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900419 return NULL;
420}
421
Changman Lee7dda2af2014-11-28 15:49:40 +0000422static void add_gc_inode(struct gc_inode_list *gc_list, struct inode *inode)
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900423{
Gu Zheng6cc4af52013-06-20 17:52:39 +0800424 struct inode_entry *new_ie;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900425
Changman Lee7dda2af2014-11-28 15:49:40 +0000426 if (inode == find_gc_inode(gc_list, inode->i_ino)) {
Gu Zheng6cc4af52013-06-20 17:52:39 +0800427 iput(inode);
428 return;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900429 }
Chao Yu6b4d6a82018-05-30 00:20:41 +0800430 new_ie = f2fs_kmem_cache_alloc(f2fs_inode_entry_slab, GFP_NOFS);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900431 new_ie->inode = inode;
Chao Yuf28e5032015-01-23 20:37:53 +0800432
433 f2fs_radix_tree_insert(&gc_list->iroot, inode->i_ino, new_ie);
Changman Lee7dda2af2014-11-28 15:49:40 +0000434 list_add_tail(&new_ie->list, &gc_list->ilist);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900435}
436
Changman Lee7dda2af2014-11-28 15:49:40 +0000437static void put_gc_inode(struct gc_inode_list *gc_list)
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900438{
439 struct inode_entry *ie, *next_ie;
Changman Lee7dda2af2014-11-28 15:49:40 +0000440 list_for_each_entry_safe(ie, next_ie, &gc_list->ilist, list) {
441 radix_tree_delete(&gc_list->iroot, ie->inode->i_ino);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900442 iput(ie->inode);
443 list_del(&ie->list);
Chao Yu6b4d6a82018-05-30 00:20:41 +0800444 kmem_cache_free(f2fs_inode_entry_slab, ie);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900445 }
446}
447
448static int check_valid_map(struct f2fs_sb_info *sbi,
449 unsigned int segno, int offset)
450{
451 struct sit_info *sit_i = SIT_I(sbi);
452 struct seg_entry *sentry;
453 int ret;
454
Chao Yu25d0bec2017-10-30 17:49:53 +0800455 down_read(&sit_i->sentry_lock);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900456 sentry = get_seg_entry(sbi, segno);
457 ret = f2fs_test_bit(offset, sentry->cur_valid_map);
Chao Yu25d0bec2017-10-30 17:49:53 +0800458 up_read(&sit_i->sentry_lock);
Jaegeuk Kim43727522013-02-04 15:11:17 +0900459 return ret;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900460}
461
Jaegeuk Kim0a8165d2012-11-29 13:28:09 +0900462/*
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900463 * This function compares node address got in summary with that in NAT.
464 * On validity, copy that node with cold status, otherwise (invalid node)
465 * ignore that.
466 */
Chao Yu718e53f2016-01-23 16:23:55 +0800467static void gc_node_segment(struct f2fs_sb_info *sbi,
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900468 struct f2fs_summary *sum, unsigned int segno, int gc_type)
469{
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900470 struct f2fs_summary *entry;
Jaegeuk Kim26d58592015-08-14 14:37:50 -0700471 block_t start_addr;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900472 int off;
Chao Yu7ea984b2016-08-27 00:14:31 +0800473 int phase = 0;
Chao Yudeb78d42018-06-04 23:20:36 +0800474 bool fggc = (gc_type == FG_GC);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900475
Jaegeuk Kim26d58592015-08-14 14:37:50 -0700476 start_addr = START_BLOCK(sbi, segno);
477
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900478next_step:
479 entry = sum;
Jaegeuk Kimc718379b2013-04-24 13:19:56 +0900480
Chao Yudeb78d42018-06-04 23:20:36 +0800481 if (fggc && phase == 2)
482 atomic_inc(&sbi->wb_sync_req[NODE]);
483
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900484 for (off = 0; off < sbi->blocks_per_seg; off++, entry++) {
485 nid_t nid = le32_to_cpu(entry->nid);
486 struct page *node_page;
Jaegeuk Kim26d58592015-08-14 14:37:50 -0700487 struct node_info ni;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900488
Jaegeuk Kim43727522013-02-04 15:11:17 +0900489 /* stop BG_GC if there is not enough free sections. */
Jaegeuk Kim7f3037a2016-09-01 12:02:51 -0700490 if (gc_type == BG_GC && has_not_enough_free_secs(sbi, 0, 0))
Chao Yu718e53f2016-01-23 16:23:55 +0800491 return;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900492
Jaegeuk Kim43727522013-02-04 15:11:17 +0900493 if (check_valid_map(sbi, segno, off) == 0)
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900494 continue;
495
Chao Yu7ea984b2016-08-27 00:14:31 +0800496 if (phase == 0) {
Chao Yu6b4d6a82018-05-30 00:20:41 +0800497 f2fs_ra_meta_pages(sbi, NAT_BLOCK_OFFSET(nid), 1,
Chao Yu7ea984b2016-08-27 00:14:31 +0800498 META_NAT, true);
499 continue;
500 }
501
502 if (phase == 1) {
Chao Yu6b4d6a82018-05-30 00:20:41 +0800503 f2fs_ra_node_page(sbi, nid);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900504 continue;
505 }
Chao Yu7ea984b2016-08-27 00:14:31 +0800506
507 /* phase == 2 */
Chao Yu6b4d6a82018-05-30 00:20:41 +0800508 node_page = f2fs_get_node_page(sbi, nid);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900509 if (IS_ERR(node_page))
510 continue;
511
Chao Yu6b4d6a82018-05-30 00:20:41 +0800512 /* block may become invalid during f2fs_get_node_page */
Huang Ying9a01b562014-09-07 11:05:20 +0800513 if (check_valid_map(sbi, segno, off) == 0) {
514 f2fs_put_page(node_page, 1);
515 continue;
516 }
517
Chao Yu3c743262018-07-17 00:02:17 +0800518 if (f2fs_get_node_info(sbi, nid, &ni)) {
519 f2fs_put_page(node_page, 1);
520 continue;
521 }
522
Jaegeuk Kim26d58592015-08-14 14:37:50 -0700523 if (ni.blk_addr != start_addr + off) {
524 f2fs_put_page(node_page, 1);
525 continue;
526 }
527
Chao Yu6b4d6a82018-05-30 00:20:41 +0800528 f2fs_move_node_page(node_page, gc_type);
Changman Leee1235982014-12-23 08:37:39 +0900529 stat_inc_node_blk_count(sbi, 1, gc_type);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900530 }
Jaegeuk Kimc718379b2013-04-24 13:19:56 +0900531
Chao Yu7ea984b2016-08-27 00:14:31 +0800532 if (++phase < 3)
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900533 goto next_step;
Chao Yudeb78d42018-06-04 23:20:36 +0800534
535 if (fggc)
536 atomic_dec(&sbi->wb_sync_req[NODE]);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900537}
538
Jaegeuk Kim0a8165d2012-11-29 13:28:09 +0900539/*
Jaegeuk Kim9af45ef2013-01-21 17:34:21 +0900540 * Calculate start block index indicating the given node offset.
541 * Be careful, caller should give this node offset only indicating direct node
542 * blocks. If any node offsets, which point the other types of node blocks such
543 * as indirect or double indirect node blocks, are given, it must be a caller's
544 * bug.
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900545 */
Chao Yu6b4d6a82018-05-30 00:20:41 +0800546block_t f2fs_start_bidx_of_node(unsigned int node_ofs, struct inode *inode)
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900547{
Jaegeuk Kimce19a5d2012-12-26 12:03:22 +0900548 unsigned int indirect_blks = 2 * NIDS_PER_BLOCK + 4;
549 unsigned int bidx;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900550
Jaegeuk Kimce19a5d2012-12-26 12:03:22 +0900551 if (node_ofs == 0)
552 return 0;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900553
Jaegeuk Kimce19a5d2012-12-26 12:03:22 +0900554 if (node_ofs <= 2) {
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900555 bidx = node_ofs - 1;
556 } else if (node_ofs <= indirect_blks) {
Jaegeuk Kimce19a5d2012-12-26 12:03:22 +0900557 int dec = (node_ofs - 4) / (NIDS_PER_BLOCK + 1);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900558 bidx = node_ofs - 2 - dec;
559 } else {
Jaegeuk Kimce19a5d2012-12-26 12:03:22 +0900560 int dec = (node_ofs - indirect_blks - 3) / (NIDS_PER_BLOCK + 1);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900561 bidx = node_ofs - 5 - dec;
562 }
Chao Yu81ca7352016-01-26 15:39:35 +0800563 return bidx * ADDRS_PER_BLOCK + ADDRS_PER_INODE(inode);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900564}
565
Nicholas Krausec1079892015-06-30 21:37:21 -0400566static bool is_alive(struct f2fs_sb_info *sbi, struct f2fs_summary *sum,
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900567 struct node_info *dni, block_t blkaddr, unsigned int *nofs)
568{
569 struct page *node_page;
570 nid_t nid;
571 unsigned int ofs_in_node;
572 block_t source_blkaddr;
573
574 nid = le32_to_cpu(sum->nid);
575 ofs_in_node = le16_to_cpu(sum->ofs_in_node);
576
Chao Yu6b4d6a82018-05-30 00:20:41 +0800577 node_page = f2fs_get_node_page(sbi, nid);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900578 if (IS_ERR(node_page))
Nicholas Krausec1079892015-06-30 21:37:21 -0400579 return false;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900580
Chao Yu3c743262018-07-17 00:02:17 +0800581 if (f2fs_get_node_info(sbi, nid, dni)) {
582 f2fs_put_page(node_page, 1);
583 return false;
584 }
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900585
586 if (sum->version != dni->version) {
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700587 f2fs_msg(sbi->sb, KERN_WARNING,
588 "%s: valid data with mismatched node version.",
589 __func__);
590 set_sbi_flag(sbi, SBI_NEED_FSCK);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900591 }
592
593 *nofs = ofs_of_node(node_page);
Chao Yufbcf9312017-07-19 00:19:06 +0800594 source_blkaddr = datablock_addr(NULL, node_page, ofs_in_node);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900595 f2fs_put_page(node_page, 1);
596
597 if (source_blkaddr != blkaddr)
Nicholas Krausec1079892015-06-30 21:37:21 -0400598 return false;
599 return true;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900600}
601
Chao Yu08386a62018-08-14 22:37:25 +0800602static int ra_data_block(struct inode *inode, pgoff_t index)
603{
604 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
605 struct address_space *mapping = inode->i_mapping;
606 struct dnode_of_data dn;
607 struct page *page;
608 struct extent_info ei = {0, 0, 0};
609 struct f2fs_io_info fio = {
610 .sbi = sbi,
611 .ino = inode->i_ino,
612 .type = DATA,
613 .temp = COLD,
614 .op = REQ_OP_READ,
615 .op_flags = 0,
616 .encrypted_page = NULL,
617 .in_list = false,
618 .retry = false,
619 };
620 int err;
621
622 page = f2fs_grab_cache_page(mapping, index, true);
623 if (!page)
624 return -ENOMEM;
625
626 if (f2fs_lookup_extent_cache(inode, index, &ei)) {
627 dn.data_blkaddr = ei.blk + index - ei.fofs;
628 goto got_it;
629 }
630
631 set_new_dnode(&dn, inode, NULL, NULL, 0);
632 err = f2fs_get_dnode_of_data(&dn, index, LOOKUP_NODE);
633 if (err)
634 goto put_page;
635 f2fs_put_dnode(&dn);
636
637 if (unlikely(!f2fs_is_valid_blkaddr(sbi, dn.data_blkaddr,
638 DATA_GENERIC))) {
639 err = -EFAULT;
640 goto put_page;
641 }
642got_it:
643 /* read page */
644 fio.page = page;
645 fio.new_blkaddr = fio.old_blkaddr = dn.data_blkaddr;
646
647 fio.encrypted_page = f2fs_pagecache_get_page(META_MAPPING(sbi),
648 dn.data_blkaddr,
649 FGP_LOCK | FGP_CREAT, GFP_NOFS);
650 if (!fio.encrypted_page) {
651 err = -ENOMEM;
652 goto put_page;
653 }
654
655 err = f2fs_submit_page_bio(&fio);
656 if (err)
657 goto put_encrypted_page;
658 f2fs_put_page(fio.encrypted_page, 0);
659 f2fs_put_page(page, 1);
660 return 0;
661put_encrypted_page:
662 f2fs_put_page(fio.encrypted_page, 1);
663put_page:
664 f2fs_put_page(page, 1);
665 return err;
666}
667
Jaegeuk Kimfb605d02017-09-05 17:04:35 -0700668/*
669 * Move data block via META_MAPPING while keeping locked data page.
670 * This can be used to move blocks, aka LBAs, directly on disk.
671 */
672static void move_data_block(struct inode *inode, block_t bidx,
Chao Yucaf10c62018-05-07 20:28:54 +0800673 int gc_type, unsigned int segno, int off)
Jaegeuk Kim4375a332015-04-23 12:04:33 -0700674{
675 struct f2fs_io_info fio = {
676 .sbi = F2FS_I_SB(inode),
Chao Yuf014be82017-09-29 13:59:38 +0800677 .ino = inode->i_ino,
Jaegeuk Kim4375a332015-04-23 12:04:33 -0700678 .type = DATA,
Jaegeuk Kimc4127262017-05-10 11:18:25 -0700679 .temp = COLD,
Mike Christie04d328d2016-06-05 14:31:55 -0500680 .op = REQ_OP_READ,
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700681 .op_flags = 0,
Jaegeuk Kim4375a332015-04-23 12:04:33 -0700682 .encrypted_page = NULL,
Chao Yuc52dc0f2017-05-19 23:37:01 +0800683 .in_list = false,
Chao Yu34880e02018-05-28 23:47:18 +0800684 .retry = false,
Jaegeuk Kim4375a332015-04-23 12:04:33 -0700685 };
686 struct dnode_of_data dn;
687 struct f2fs_summary sum;
688 struct node_info ni;
Chao Yu08386a62018-08-14 22:37:25 +0800689 struct page *page, *mpage;
Chao Yu4356e482016-02-23 17:52:43 +0800690 block_t newaddr;
Jaegeuk Kim4375a332015-04-23 12:04:33 -0700691 int err;
Chao Yubbab2dc2018-05-26 09:00:13 +0800692 bool lfs_mode = test_opt(fio.sbi, LFS);
Jaegeuk Kim4375a332015-04-23 12:04:33 -0700693
694 /* do not read out */
Jaegeuk Kima56c7c62015-10-09 15:11:38 -0700695 page = f2fs_grab_cache_page(inode->i_mapping, bidx, false);
Jaegeuk Kim4375a332015-04-23 12:04:33 -0700696 if (!page)
697 return;
698
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700699 if (!check_valid_map(F2FS_I_SB(inode), segno, off))
700 goto out;
701
Chao Yucaf10c62018-05-07 20:28:54 +0800702 if (f2fs_is_atomic_file(inode)) {
703 F2FS_I(inode)->i_gc_failures[GC_FAILURE_ATOMIC]++;
704 F2FS_I_SB(inode)->skipped_atomic_files[gc_type]++;
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700705 goto out;
Chao Yucaf10c62018-05-07 20:28:54 +0800706 }
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700707
Jaegeuk Kim9ce3d6b2017-12-07 16:25:39 -0800708 if (f2fs_is_pinned_file(inode)) {
709 f2fs_pin_file_control(inode, true);
710 goto out;
711 }
712
Jaegeuk Kim4375a332015-04-23 12:04:33 -0700713 set_new_dnode(&dn, inode, NULL, NULL, 0);
Chao Yu6b4d6a82018-05-30 00:20:41 +0800714 err = f2fs_get_dnode_of_data(&dn, bidx, LOOKUP_NODE);
Jaegeuk Kim4375a332015-04-23 12:04:33 -0700715 if (err)
716 goto out;
717
Chao Yu08b39fb2015-10-08 13:27:34 +0800718 if (unlikely(dn.data_blkaddr == NULL_ADDR)) {
719 ClearPageUptodate(page);
Jaegeuk Kim4375a332015-04-23 12:04:33 -0700720 goto put_out;
Chao Yu08b39fb2015-10-08 13:27:34 +0800721 }
722
723 /*
724 * don't cache encrypted data into meta inode until previous dirty
725 * data were writebacked to avoid racing between GC and flush.
726 */
Jaegeuk Kimfec1d652016-01-20 23:43:51 +0800727 f2fs_wait_on_page_writeback(page, DATA, true);
Jaegeuk Kim4375a332015-04-23 12:04:33 -0700728
Chao Yu3c743262018-07-17 00:02:17 +0800729 err = f2fs_get_node_info(fio.sbi, dn.nid, &ni);
730 if (err)
731 goto put_out;
732
Jaegeuk Kim4375a332015-04-23 12:04:33 -0700733 set_summary(&sum, dn.nid, dn.ofs_in_node, ni.version);
734
735 /* read page */
736 fio.page = page;
Chao Yu7a9d7542016-02-22 18:36:38 +0800737 fio.new_blkaddr = fio.old_blkaddr = dn.data_blkaddr;
Jaegeuk Kim4375a332015-04-23 12:04:33 -0700738
Chao Yubbab2dc2018-05-26 09:00:13 +0800739 if (lfs_mode)
740 down_write(&fio.sbi->io_order_lock);
741
Chao Yu6b4d6a82018-05-30 00:20:41 +0800742 f2fs_allocate_data_block(fio.sbi, NULL, fio.old_blkaddr, &newaddr,
Chao Yuc52dc0f2017-05-19 23:37:01 +0800743 &sum, CURSEG_COLD_DATA, NULL, false);
Chao Yu4356e482016-02-23 17:52:43 +0800744
Chao Yu58ddec82017-10-28 16:52:30 +0800745 fio.encrypted_page = f2fs_pagecache_get_page(META_MAPPING(fio.sbi),
746 newaddr, FGP_LOCK | FGP_CREAT, GFP_NOFS);
Chao Yu4356e482016-02-23 17:52:43 +0800747 if (!fio.encrypted_page) {
748 err = -ENOMEM;
749 goto recover_block;
750 }
Jaegeuk Kim4375a332015-04-23 12:04:33 -0700751
Chao Yu08386a62018-08-14 22:37:25 +0800752 mpage = f2fs_pagecache_get_page(META_MAPPING(fio.sbi),
753 fio.old_blkaddr, FGP_LOCK, GFP_NOFS);
754 if (mpage) {
755 bool updated = false;
756
757 if (PageUptodate(mpage)) {
758 memcpy(page_address(fio.encrypted_page),
759 page_address(mpage), PAGE_SIZE);
760 updated = true;
761 }
762 f2fs_put_page(mpage, 1);
763 invalidate_mapping_pages(META_MAPPING(fio.sbi),
764 fio.old_blkaddr, fio.old_blkaddr);
765 if (updated)
766 goto write_page;
767 }
768
Jaegeuk Kim548aeda2015-07-13 17:44:14 -0700769 err = f2fs_submit_page_bio(&fio);
770 if (err)
771 goto put_page_out;
Jaegeuk Kim4375a332015-04-23 12:04:33 -0700772
773 /* write page */
774 lock_page(fio.encrypted_page);
Jaegeuk Kim548aeda2015-07-13 17:44:14 -0700775
Chao Yu1563ac72016-07-03 22:05:12 +0800776 if (unlikely(fio.encrypted_page->mapping != META_MAPPING(fio.sbi))) {
Chao Yu4356e482016-02-23 17:52:43 +0800777 err = -EIO;
Jaegeuk Kim548aeda2015-07-13 17:44:14 -0700778 goto put_page_out;
Chao Yu4356e482016-02-23 17:52:43 +0800779 }
Chao Yu1563ac72016-07-03 22:05:12 +0800780 if (unlikely(!PageUptodate(fio.encrypted_page))) {
Chao Yu4356e482016-02-23 17:52:43 +0800781 err = -EIO;
Jaegeuk Kim548aeda2015-07-13 17:44:14 -0700782 goto put_page_out;
Chao Yu4356e482016-02-23 17:52:43 +0800783 }
Jaegeuk Kim548aeda2015-07-13 17:44:14 -0700784
Chao Yu08386a62018-08-14 22:37:25 +0800785write_page:
Jaegeuk Kim6282adb2015-07-25 00:29:17 -0700786 set_page_dirty(fio.encrypted_page);
Jaegeuk Kimfec1d652016-01-20 23:43:51 +0800787 f2fs_wait_on_page_writeback(fio.encrypted_page, DATA, true);
Jaegeuk Kim6282adb2015-07-25 00:29:17 -0700788 if (clear_page_dirty_for_io(fio.encrypted_page))
789 dec_page_count(fio.sbi, F2FS_DIRTY_META);
790
Jaegeuk Kim4375a332015-04-23 12:04:33 -0700791 set_page_writeback(fio.encrypted_page);
Jaegeuk Kimf4531472018-04-11 23:09:04 -0700792 ClearPageError(page);
Jaegeuk Kim548aeda2015-07-13 17:44:14 -0700793
794 /* allocate block address */
Jaegeuk Kimfec1d652016-01-20 23:43:51 +0800795 f2fs_wait_on_page_writeback(dn.node_page, NODE, true);
Chao Yu4356e482016-02-23 17:52:43 +0800796
Mike Christie04d328d2016-06-05 14:31:55 -0500797 fio.op = REQ_OP_WRITE;
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700798 fio.op_flags = REQ_SYNC;
Chao Yu4356e482016-02-23 17:52:43 +0800799 fio.new_blkaddr = newaddr;
Chao Yu34880e02018-05-28 23:47:18 +0800800 f2fs_submit_page_write(&fio);
801 if (fio.retry) {
Sheng Yongcf882112018-01-17 12:11:31 +0800802 if (PageWriteback(fio.encrypted_page))
803 end_page_writeback(fio.encrypted_page);
804 goto put_page_out;
805 }
Jaegeuk Kim4375a332015-04-23 12:04:33 -0700806
Chao Yuc0fe4882017-08-02 23:21:48 +0800807 f2fs_update_iostat(fio.sbi, FS_GC_DATA_IO, F2FS_BLKSIZE);
808
Chao Yuf28b3432016-02-24 17:16:47 +0800809 f2fs_update_data_blkaddr(&dn, newaddr);
Jaegeuk Kim91942322016-05-20 10:13:22 -0700810 set_inode_flag(inode, FI_APPEND_WRITE);
Jaegeuk Kim4375a332015-04-23 12:04:33 -0700811 if (page->index == 0)
Jaegeuk Kim91942322016-05-20 10:13:22 -0700812 set_inode_flag(inode, FI_FIRST_BLOCK_WRITTEN);
Jaegeuk Kim548aeda2015-07-13 17:44:14 -0700813put_page_out:
Jaegeuk Kim4375a332015-04-23 12:04:33 -0700814 f2fs_put_page(fio.encrypted_page, 1);
Chao Yu4356e482016-02-23 17:52:43 +0800815recover_block:
Chao Yubbab2dc2018-05-26 09:00:13 +0800816 if (lfs_mode)
817 up_write(&fio.sbi->io_order_lock);
Chao Yu4356e482016-02-23 17:52:43 +0800818 if (err)
Chao Yu6b4d6a82018-05-30 00:20:41 +0800819 f2fs_do_replace_block(fio.sbi, &sum, newaddr, fio.old_blkaddr,
Chao Yu4356e482016-02-23 17:52:43 +0800820 true, true);
Jaegeuk Kim4375a332015-04-23 12:04:33 -0700821put_out:
822 f2fs_put_dnode(&dn);
823out:
824 f2fs_put_page(page, 1);
825}
826
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700827static void move_data_page(struct inode *inode, block_t bidx, int gc_type,
828 unsigned int segno, int off)
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900829{
Jaegeuk Kimc879f902015-04-24 14:34:30 -0700830 struct page *page;
831
Chao Yu6b4d6a82018-05-30 00:20:41 +0800832 page = f2fs_get_lock_data_page(inode, bidx, true);
Jaegeuk Kimc879f902015-04-24 14:34:30 -0700833 if (IS_ERR(page))
834 return;
Fan Li63a0b7cb2013-12-09 16:09:00 +0800835
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700836 if (!check_valid_map(F2FS_I_SB(inode), segno, off))
837 goto out;
838
Chao Yucaf10c62018-05-07 20:28:54 +0800839 if (f2fs_is_atomic_file(inode)) {
840 F2FS_I(inode)->i_gc_failures[GC_FAILURE_ATOMIC]++;
841 F2FS_I_SB(inode)->skipped_atomic_files[gc_type]++;
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700842 goto out;
Chao Yucaf10c62018-05-07 20:28:54 +0800843 }
Jaegeuk Kim9ce3d6b2017-12-07 16:25:39 -0800844 if (f2fs_is_pinned_file(inode)) {
845 if (gc_type == FG_GC)
846 f2fs_pin_file_control(inode, true);
847 goto out;
848 }
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700849
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900850 if (gc_type == BG_GC) {
Jaegeuk Kim4ebefc42013-03-31 13:49:18 +0900851 if (PageWriteback(page))
852 goto out;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900853 set_page_dirty(page);
854 set_cold_data(page);
855 } else {
Jaegeuk Kimc879f902015-04-24 14:34:30 -0700856 struct f2fs_io_info fio = {
857 .sbi = F2FS_I_SB(inode),
Chao Yuf014be82017-09-29 13:59:38 +0800858 .ino = inode->i_ino,
Jaegeuk Kimc879f902015-04-24 14:34:30 -0700859 .type = DATA,
Jaegeuk Kimc4127262017-05-10 11:18:25 -0700860 .temp = COLD,
Mike Christie04d328d2016-06-05 14:31:55 -0500861 .op = REQ_OP_WRITE,
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700862 .op_flags = REQ_SYNC,
863 .old_blkaddr = NULL_ADDR,
Jaegeuk Kimc879f902015-04-24 14:34:30 -0700864 .page = page,
Jaegeuk Kim4375a332015-04-23 12:04:33 -0700865 .encrypted_page = NULL,
Jaegeuk Kim1b48ed62017-05-12 13:51:34 -0700866 .need_lock = LOCK_REQ,
Chao Yuc0fe4882017-08-02 23:21:48 +0800867 .io_type = FS_GC_DATA_IO,
Jaegeuk Kimc879f902015-04-24 14:34:30 -0700868 };
Chao Yu72e1c792016-07-03 22:05:13 +0800869 bool is_dirty = PageDirty(page);
870 int err;
871
872retry:
Jaegeuk Kim6282adb2015-07-25 00:29:17 -0700873 set_page_dirty(page);
Jaegeuk Kimfec1d652016-01-20 23:43:51 +0800874 f2fs_wait_on_page_writeback(page, DATA, true);
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700875 if (clear_page_dirty_for_io(page)) {
Jaegeuk Kima7ffdbe2014-09-12 15:53:45 -0700876 inode_dec_dirty_pages(inode);
Chao Yu6b4d6a82018-05-30 00:20:41 +0800877 f2fs_remove_dirty_inode(inode);
Jaegeuk Kime6b120d2017-07-10 12:55:09 -0700878 }
Chao Yu72e1c792016-07-03 22:05:13 +0800879
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900880 set_cold_data(page);
Chao Yu72e1c792016-07-03 22:05:13 +0800881
Chao Yu6b4d6a82018-05-30 00:20:41 +0800882 err = f2fs_do_write_data_page(&fio);
Chao Yu408285a2018-05-28 16:59:27 +0800883 if (err) {
884 clear_cold_data(page);
885 if (err == -ENOMEM) {
886 congestion_wait(BLK_RW_ASYNC, HZ/50);
887 goto retry;
888 }
889 if (is_dirty)
890 set_page_dirty(page);
Chao Yu72e1c792016-07-03 22:05:13 +0800891 }
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900892 }
893out:
894 f2fs_put_page(page, 1);
895}
896
Jaegeuk Kim0a8165d2012-11-29 13:28:09 +0900897/*
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900898 * This function tries to get parent node of victim data block, and identifies
899 * data block validity. If the block is valid, copy that with cold status and
900 * modify parent node.
901 * If the parent node is not valid or the data block address is different,
902 * the victim data block is ignored.
903 */
Chao Yu718e53f2016-01-23 16:23:55 +0800904static void gc_data_segment(struct f2fs_sb_info *sbi, struct f2fs_summary *sum,
Changman Lee7dda2af2014-11-28 15:49:40 +0000905 struct gc_inode_list *gc_list, unsigned int segno, int gc_type)
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900906{
907 struct super_block *sb = sbi->sb;
908 struct f2fs_summary *entry;
909 block_t start_addr;
Jaegeuk Kim43727522013-02-04 15:11:17 +0900910 int off;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900911 int phase = 0;
912
913 start_addr = START_BLOCK(sbi, segno);
914
915next_step:
916 entry = sum;
Jaegeuk Kimc718379b2013-04-24 13:19:56 +0900917
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900918 for (off = 0; off < sbi->blocks_per_seg; off++, entry++) {
919 struct page *data_page;
920 struct inode *inode;
921 struct node_info dni; /* dnode info for the data */
922 unsigned int ofs_in_node, nofs;
923 block_t start_bidx;
Chao Yu7ea984b2016-08-27 00:14:31 +0800924 nid_t nid = le32_to_cpu(entry->nid);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900925
Jaegeuk Kim43727522013-02-04 15:11:17 +0900926 /* stop BG_GC if there is not enough free sections. */
Jaegeuk Kim7f3037a2016-09-01 12:02:51 -0700927 if (gc_type == BG_GC && has_not_enough_free_secs(sbi, 0, 0))
Chao Yu718e53f2016-01-23 16:23:55 +0800928 return;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900929
Jaegeuk Kim43727522013-02-04 15:11:17 +0900930 if (check_valid_map(sbi, segno, off) == 0)
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900931 continue;
932
933 if (phase == 0) {
Chao Yu6b4d6a82018-05-30 00:20:41 +0800934 f2fs_ra_meta_pages(sbi, NAT_BLOCK_OFFSET(nid), 1,
Chao Yu7ea984b2016-08-27 00:14:31 +0800935 META_NAT, true);
936 continue;
937 }
938
939 if (phase == 1) {
Chao Yu6b4d6a82018-05-30 00:20:41 +0800940 f2fs_ra_node_page(sbi, nid);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900941 continue;
942 }
943
944 /* Get an inode by ino with checking validity */
Nicholas Krausec1079892015-06-30 21:37:21 -0400945 if (!is_alive(sbi, entry, &dni, start_addr + off, &nofs))
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900946 continue;
947
Chao Yu7ea984b2016-08-27 00:14:31 +0800948 if (phase == 2) {
Chao Yu6b4d6a82018-05-30 00:20:41 +0800949 f2fs_ra_node_page(sbi, dni.ino);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900950 continue;
951 }
952
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900953 ofs_in_node = le16_to_cpu(entry->ofs_in_node);
954
Chao Yu7ea984b2016-08-27 00:14:31 +0800955 if (phase == 3) {
Jaegeuk Kimd4686d562013-01-31 15:36:04 +0900956 inode = f2fs_iget(sb, dni.ino);
Chao Yub73e5282014-08-30 09:52:34 +0800957 if (IS_ERR(inode) || is_bad_inode(inode))
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900958 continue;
959
Chao Yu5f3fdd22017-11-03 10:21:05 +0800960 if (!down_write_trylock(
Chao Yuf6bd7d42018-04-24 10:55:28 +0800961 &F2FS_I(inode)->i_gc_rwsem[WRITE])) {
Chao Yu5f3fdd22017-11-03 10:21:05 +0800962 iput(inode);
Jaegeuk Kimf64b4d72018-07-25 12:11:56 +0900963 sbi->skipped_gc_rwsem++;
Chao Yu5f3fdd22017-11-03 10:21:05 +0800964 continue;
965 }
966
Chao Yu08386a62018-08-14 22:37:25 +0800967 start_bidx = f2fs_start_bidx_of_node(nofs, inode) +
968 ofs_in_node;
969
970 if (f2fs_post_read_required(inode)) {
971 int err = ra_data_block(inode, start_bidx);
972
973 up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
974 if (err) {
975 iput(inode);
976 continue;
977 }
978 add_gc_inode(gc_list, inode);
979 continue;
980 }
981
Chao Yu6b4d6a82018-05-30 00:20:41 +0800982 data_page = f2fs_get_read_data_page(inode,
Chao Yu08386a62018-08-14 22:37:25 +0800983 start_bidx, REQ_RAHEAD, true);
Chao Yuf6bd7d42018-04-24 10:55:28 +0800984 up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
Changman Lee31a32682014-11-27 16:03:08 +0900985 if (IS_ERR(data_page)) {
986 iput(inode);
987 continue;
988 }
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900989
990 f2fs_put_page(data_page, 0);
Changman Lee7dda2af2014-11-28 15:49:40 +0000991 add_gc_inode(gc_list, inode);
Changman Lee31a32682014-11-27 16:03:08 +0900992 continue;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +0900993 }
Changman Lee31a32682014-11-27 16:03:08 +0900994
Chao Yu7ea984b2016-08-27 00:14:31 +0800995 /* phase 4 */
Changman Lee7dda2af2014-11-28 15:49:40 +0000996 inode = find_gc_inode(gc_list, dni.ino);
Changman Lee31a32682014-11-27 16:03:08 +0900997 if (inode) {
Chao Yu82e0a5a2016-07-13 09:18:29 +0800998 struct f2fs_inode_info *fi = F2FS_I(inode);
999 bool locked = false;
1000
1001 if (S_ISREG(inode->i_mode)) {
Chao Yuf6bd7d42018-04-24 10:55:28 +08001002 if (!down_write_trylock(&fi->i_gc_rwsem[READ]))
Chao Yu82e0a5a2016-07-13 09:18:29 +08001003 continue;
1004 if (!down_write_trylock(
Chao Yuf6bd7d42018-04-24 10:55:28 +08001005 &fi->i_gc_rwsem[WRITE])) {
Jaegeuk Kimf64b4d72018-07-25 12:11:56 +09001006 sbi->skipped_gc_rwsem++;
Chao Yuf6bd7d42018-04-24 10:55:28 +08001007 up_write(&fi->i_gc_rwsem[READ]);
Chao Yu82e0a5a2016-07-13 09:18:29 +08001008 continue;
1009 }
1010 locked = true;
Chao Yu09ed2bc2017-08-23 18:23:24 +08001011
1012 /* wait for all inflight aio data */
1013 inode_dio_wait(inode);
Chao Yu82e0a5a2016-07-13 09:18:29 +08001014 }
1015
Chao Yu6b4d6a82018-05-30 00:20:41 +08001016 start_bidx = f2fs_start_bidx_of_node(nofs, inode)
Jaegeuk Kimc879f902015-04-24 14:34:30 -07001017 + ofs_in_node;
Eric Biggersf69e8142018-04-18 11:09:48 -07001018 if (f2fs_post_read_required(inode))
Chao Yucaf10c62018-05-07 20:28:54 +08001019 move_data_block(inode, start_bidx, gc_type,
1020 segno, off);
Jaegeuk Kim4375a332015-04-23 12:04:33 -07001021 else
Jaegeuk Kimfb605d02017-09-05 17:04:35 -07001022 move_data_page(inode, start_bidx, gc_type,
1023 segno, off);
Chao Yu82e0a5a2016-07-13 09:18:29 +08001024
1025 if (locked) {
Chao Yuf6bd7d42018-04-24 10:55:28 +08001026 up_write(&fi->i_gc_rwsem[WRITE]);
1027 up_write(&fi->i_gc_rwsem[READ]);
Chao Yu82e0a5a2016-07-13 09:18:29 +08001028 }
1029
Changman Leee1235982014-12-23 08:37:39 +09001030 stat_inc_data_blk_count(sbi, 1, gc_type);
Changman Lee31a32682014-11-27 16:03:08 +09001031 }
Jaegeuk Kim7bc09002012-11-02 17:13:01 +09001032 }
Jaegeuk Kimc718379b2013-04-24 13:19:56 +09001033
Chao Yu7ea984b2016-08-27 00:14:31 +08001034 if (++phase < 5)
Jaegeuk Kim7bc09002012-11-02 17:13:01 +09001035 goto next_step;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +09001036}
1037
1038static int __get_victim(struct f2fs_sb_info *sbi, unsigned int *victim,
Gu Zheng8a2d0ac2014-10-20 17:45:48 +08001039 int gc_type)
Jaegeuk Kim7bc09002012-11-02 17:13:01 +09001040{
1041 struct sit_info *sit_i = SIT_I(sbi);
1042 int ret;
Gu Zheng8a2d0ac2014-10-20 17:45:48 +08001043
Chao Yu25d0bec2017-10-30 17:49:53 +08001044 down_write(&sit_i->sentry_lock);
Gu Zheng8a2d0ac2014-10-20 17:45:48 +08001045 ret = DIRTY_I(sbi)->v_ops->get_victim(sbi, victim, gc_type,
1046 NO_CHECK_TYPE, LFS);
Chao Yu25d0bec2017-10-30 17:49:53 +08001047 up_write(&sit_i->sentry_lock);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +09001048 return ret;
1049}
1050
Chao Yu718e53f2016-01-23 16:23:55 +08001051static int do_garbage_collect(struct f2fs_sb_info *sbi,
1052 unsigned int start_segno,
Changman Lee7dda2af2014-11-28 15:49:40 +00001053 struct gc_inode_list *gc_list, int gc_type)
Jaegeuk Kim7bc09002012-11-02 17:13:01 +09001054{
1055 struct page *sum_page;
1056 struct f2fs_summary_block *sum;
Jaegeuk Kimc718379b2013-04-24 13:19:56 +09001057 struct blk_plug plug;
Chao Yu718e53f2016-01-23 16:23:55 +08001058 unsigned int segno = start_segno;
1059 unsigned int end_segno = start_segno + sbi->segs_per_sec;
Chao Yu796786d2017-08-11 18:00:15 +08001060 int seg_freed = 0;
Chao Yu718e53f2016-01-23 16:23:55 +08001061 unsigned char type = IS_DATASEG(get_seg_entry(sbi, segno)->type) ?
1062 SUM_TYPE_DATA : SUM_TYPE_NODE;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +09001063
Chao Yu718e53f2016-01-23 16:23:55 +08001064 /* readahead multi ssa blocks those have contiguous address */
1065 if (sbi->segs_per_sec > 1)
Chao Yu6b4d6a82018-05-30 00:20:41 +08001066 f2fs_ra_meta_pages(sbi, GET_SUM_BLOCK(sbi, segno),
Chao Yu718e53f2016-01-23 16:23:55 +08001067 sbi->segs_per_sec, META_SSA, true);
1068
1069 /* reference all summary page */
1070 while (segno < end_segno) {
Chao Yu6b4d6a82018-05-30 00:20:41 +08001071 sum_page = f2fs_get_sum_page(sbi, segno++);
Chao Yu718e53f2016-01-23 16:23:55 +08001072 unlock_page(sum_page);
1073 }
Jaegeuk Kim7bc09002012-11-02 17:13:01 +09001074
Jaegeuk Kimc718379b2013-04-24 13:19:56 +09001075 blk_start_plug(&plug);
1076
Chao Yu718e53f2016-01-23 16:23:55 +08001077 for (segno = start_segno; segno < end_segno; segno++) {
Jaegeuk Kimaa987272016-06-06 18:49:54 -07001078
Chao Yu718e53f2016-01-23 16:23:55 +08001079 /* find segment summary of victim */
1080 sum_page = find_get_page(META_MAPPING(sbi),
1081 GET_SUM_BLOCK(sbi, segno));
Chao Yu718e53f2016-01-23 16:23:55 +08001082 f2fs_put_page(sum_page, 0);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +09001083
Jaegeuk Kime6b120d2017-07-10 12:55:09 -07001084 if (get_valid_blocks(sbi, segno, false) == 0 ||
Jaegeuk Kimde0dcc42016-10-12 13:38:41 -07001085 !PageUptodate(sum_page) ||
1086 unlikely(f2fs_cp_error(sbi)))
1087 goto next;
1088
Chao Yu718e53f2016-01-23 16:23:55 +08001089 sum = page_address(sum_page);
Chao Yu002de762018-07-04 21:20:05 +08001090 if (type != GET_SUM_TYPE((&sum->footer))) {
1091 f2fs_msg(sbi->sb, KERN_ERR, "Inconsistent segment (%u) "
1092 "type [%d, %d] in SSA and SIT",
1093 segno, type, GET_SUM_TYPE((&sum->footer)));
1094 set_sbi_flag(sbi, SBI_NEED_FSCK);
1095 goto next;
1096 }
Jaegeuk Kim9236cac2015-05-28 18:19:17 -07001097
Chao Yu718e53f2016-01-23 16:23:55 +08001098 /*
1099 * this is to avoid deadlock:
1100 * - lock_page(sum_page) - f2fs_replace_block
Chao Yu25d0bec2017-10-30 17:49:53 +08001101 * - check_valid_map() - down_write(sentry_lock)
1102 * - down_read(sentry_lock) - change_curseg()
Chao Yu718e53f2016-01-23 16:23:55 +08001103 * - lock_page(sum_page)
1104 */
Chao Yu718e53f2016-01-23 16:23:55 +08001105 if (type == SUM_TYPE_NODE)
1106 gc_node_segment(sbi, sum->entries, segno, gc_type);
1107 else
1108 gc_data_segment(sbi, sum->entries, gc_list, segno,
1109 gc_type);
1110
1111 stat_inc_seg_count(sbi, type, gc_type);
Chao Yu796786d2017-08-11 18:00:15 +08001112
1113 if (gc_type == FG_GC &&
1114 get_valid_blocks(sbi, segno, false) == 0)
1115 seg_freed++;
Jaegeuk Kimf6fe2be2016-09-21 09:34:48 -07001116next:
Chao Yu718e53f2016-01-23 16:23:55 +08001117 f2fs_put_page(sum_page, 0);
Jaegeuk Kim7bc09002012-11-02 17:13:01 +09001118 }
Chao Yu718e53f2016-01-23 16:23:55 +08001119
Chao Yuda011cc2016-04-27 21:40:15 +08001120 if (gc_type == FG_GC)
Jaegeuk Kim9bc576a2017-05-10 11:28:38 -07001121 f2fs_submit_merged_write(sbi,
1122 (type == SUM_TYPE_NODE) ? NODE : DATA);
Chao Yu718e53f2016-01-23 16:23:55 +08001123
Jaegeuk Kimc718379b2013-04-24 13:19:56 +09001124 blk_finish_plug(&plug);
1125
Chao Yu17d899d2016-02-22 18:32:13 +08001126 stat_inc_call_count(sbi->stat_info);
1127
Chao Yu796786d2017-08-11 18:00:15 +08001128 return seg_freed;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +09001129}
1130
Jaegeuk Kime6b120d2017-07-10 12:55:09 -07001131int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
1132 bool background, unsigned int segno)
Jaegeuk Kim7bc09002012-11-02 17:13:01 +09001133{
Chao Yud530d4d2015-10-05 22:22:44 +08001134 int gc_type = sync ? FG_GC : BG_GC;
Chao Yu796786d2017-08-11 18:00:15 +08001135 int sec_freed = 0, seg_freed = 0, total_freed = 0;
1136 int ret = 0;
Jaegeuk Kimd5053a342014-10-30 22:47:03 -07001137 struct cp_control cpc;
Jaegeuk Kime6b120d2017-07-10 12:55:09 -07001138 unsigned int init_segno = segno;
Changman Lee7dda2af2014-11-28 15:49:40 +00001139 struct gc_inode_list gc_list = {
1140 .ilist = LIST_HEAD_INIT(gc_list.ilist),
Jaegeuk Kim769ec6e2014-12-03 20:47:26 -08001141 .iroot = RADIX_TREE_INIT(GFP_NOFS),
Changman Lee7dda2af2014-11-28 15:49:40 +00001142 };
Chao Yucaf10c62018-05-07 20:28:54 +08001143 unsigned long long last_skipped = sbi->skipped_atomic_files[FG_GC];
Jaegeuk Kimf64b4d72018-07-25 12:11:56 +09001144 unsigned long long first_skipped;
Chao Yucaf10c62018-05-07 20:28:54 +08001145 unsigned int skipped_round = 0, round = 0;
Jaegeuk Kimd5053a342014-10-30 22:47:03 -07001146
Chao Yu796786d2017-08-11 18:00:15 +08001147 trace_f2fs_gc_begin(sbi->sb, sync, background,
1148 get_pages(sbi, F2FS_DIRTY_NODES),
1149 get_pages(sbi, F2FS_DIRTY_DENTS),
1150 get_pages(sbi, F2FS_DIRTY_IMETA),
1151 free_sections(sbi),
1152 free_segments(sbi),
1153 reserved_segments(sbi),
1154 prefree_segments(sbi));
1155
Jaegeuk Kim119ee912015-01-29 11:45:33 -08001156 cpc.reason = __get_cp_reason(sbi);
Jaegeuk Kimf64b4d72018-07-25 12:11:56 +09001157 sbi->skipped_gc_rwsem = 0;
1158 first_skipped = last_skipped;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +09001159gc_more:
Weichao Guo74f36262017-05-11 04:28:00 +08001160 if (unlikely(!(sbi->sb->s_flags & MS_ACTIVE))) {
1161 ret = -EINVAL;
Jaegeuk Kim408e9372013-01-03 17:55:52 +09001162 goto stop;
Weichao Guo74f36262017-05-11 04:28:00 +08001163 }
Chao Yu6d5a1492015-12-24 18:04:56 +08001164 if (unlikely(f2fs_cp_error(sbi))) {
1165 ret = -EIO;
Jaegeuk Kim203681f2014-02-05 13:03:57 +09001166 goto stop;
Chao Yu6d5a1492015-12-24 18:04:56 +08001167 }
Jaegeuk Kim7bc09002012-11-02 17:13:01 +09001168
Jaegeuk Kime6b120d2017-07-10 12:55:09 -07001169 if (gc_type == BG_GC && has_not_enough_free_secs(sbi, 0, 0)) {
Jaegeuk Kim6e17bfb2016-01-23 22:00:57 +08001170 /*
Jaegeuk Kime6b120d2017-07-10 12:55:09 -07001171 * For example, if there are many prefree_segments below given
1172 * threshold, we can make them free by checkpoint. Then, we
1173 * secure free segments which doesn't need fggc any more.
Jaegeuk Kim6e17bfb2016-01-23 22:00:57 +08001174 */
Jaegeuk Kime6b120d2017-07-10 12:55:09 -07001175 if (prefree_segments(sbi)) {
Chao Yu6b4d6a82018-05-30 00:20:41 +08001176 ret = f2fs_write_checkpoint(sbi, &cpc);
Jaegeuk Kim2956e452016-09-21 09:28:06 -07001177 if (ret)
1178 goto stop;
Yunlei Hefe947932016-07-22 19:08:31 +08001179 }
Jaegeuk Kime6b120d2017-07-10 12:55:09 -07001180 if (has_not_enough_free_secs(sbi, 0, 0))
1181 gc_type = FG_GC;
Jaegeuk Kimd64f8042013-04-08 16:01:00 +09001182 }
Jaegeuk Kim7bc09002012-11-02 17:13:01 +09001183
Jaegeuk Kime6b120d2017-07-10 12:55:09 -07001184 /* f2fs_balance_fs doesn't need to do BG_GC in critical path. */
Chao Yu796786d2017-08-11 18:00:15 +08001185 if (gc_type == BG_GC && !background) {
1186 ret = -EINVAL;
Jaegeuk Kime6b120d2017-07-10 12:55:09 -07001187 goto stop;
Chao Yu796786d2017-08-11 18:00:15 +08001188 }
1189 if (!__get_victim(sbi, &segno, gc_type)) {
1190 ret = -ENODATA;
Jaegeuk Kim408e9372013-01-03 17:55:52 +09001191 goto stop;
Chao Yu796786d2017-08-11 18:00:15 +08001192 }
Jaegeuk Kim7bc09002012-11-02 17:13:01 +09001193
Chao Yu796786d2017-08-11 18:00:15 +08001194 seg_freed = do_garbage_collect(sbi, segno, &gc_list, gc_type);
1195 if (gc_type == FG_GC && seg_freed == sbi->segs_per_sec)
Chao Yu45fe8492015-09-28 17:42:24 +08001196 sec_freed++;
Chao Yu796786d2017-08-11 18:00:15 +08001197 total_freed += seg_freed;
Jaegeuk Kim43727522013-02-04 15:11:17 +09001198
Chao Yucaf10c62018-05-07 20:28:54 +08001199 if (gc_type == FG_GC) {
Jaegeuk Kimf64b4d72018-07-25 12:11:56 +09001200 if (sbi->skipped_atomic_files[FG_GC] > last_skipped ||
1201 sbi->skipped_gc_rwsem)
Chao Yucaf10c62018-05-07 20:28:54 +08001202 skipped_round++;
1203 last_skipped = sbi->skipped_atomic_files[FG_GC];
1204 round++;
1205 }
1206
Jaegeuk Kim5ee52932015-08-15 22:06:08 -07001207 if (gc_type == FG_GC)
Jaegeuk Kim5ec4e492013-03-31 13:26:03 +09001208 sbi->cur_victim_sec = NULL_SEGNO;
Jaegeuk Kim43727522013-02-04 15:11:17 +09001209
Jaegeuk Kimf64b4d72018-07-25 12:11:56 +09001210 if (sync)
1211 goto stop;
1212
1213 if (has_not_enough_free_secs(sbi, sec_freed, 0)) {
1214 if (skipped_round <= MAX_SKIP_GC_COUNT ||
1215 skipped_round * 2 < round) {
Jaegeuk Kime6b120d2017-07-10 12:55:09 -07001216 segno = NULL_SEGNO;
Chao Yud530d4d2015-10-05 22:22:44 +08001217 goto gc_more;
Jaegeuk Kime6b120d2017-07-10 12:55:09 -07001218 }
Jaegeuk Kim43727522013-02-04 15:11:17 +09001219
Jaegeuk Kimf64b4d72018-07-25 12:11:56 +09001220 if (first_skipped < last_skipped &&
1221 (last_skipped - first_skipped) >
1222 sbi->skipped_gc_rwsem) {
1223 f2fs_drop_inmem_pages_all(sbi, true);
1224 segno = NULL_SEGNO;
1225 goto gc_more;
1226 }
Chao Yud530d4d2015-10-05 22:22:44 +08001227 if (gc_type == FG_GC)
Chao Yu6b4d6a82018-05-30 00:20:41 +08001228 ret = f2fs_write_checkpoint(sbi, &cpc);
Chao Yud530d4d2015-10-05 22:22:44 +08001229 }
Jaegeuk Kim408e9372013-01-03 17:55:52 +09001230stop:
Jaegeuk Kime6b120d2017-07-10 12:55:09 -07001231 SIT_I(sbi)->last_victim[ALLOC_NEXT] = 0;
1232 SIT_I(sbi)->last_victim[FLUSH_DEVICE] = init_segno;
Chao Yu796786d2017-08-11 18:00:15 +08001233
1234 trace_f2fs_gc_end(sbi->sb, ret, total_freed, sec_freed,
1235 get_pages(sbi, F2FS_DIRTY_NODES),
1236 get_pages(sbi, F2FS_DIRTY_DENTS),
1237 get_pages(sbi, F2FS_DIRTY_IMETA),
1238 free_sections(sbi),
1239 free_segments(sbi),
1240 reserved_segments(sbi),
1241 prefree_segments(sbi));
1242
Jaegeuk Kim7bc09002012-11-02 17:13:01 +09001243 mutex_unlock(&sbi->gc_mutex);
1244
Changman Lee7dda2af2014-11-28 15:49:40 +00001245 put_gc_inode(&gc_list);
Chao Yud530d4d2015-10-05 22:22:44 +08001246
1247 if (sync)
1248 ret = sec_freed ? 0 : -EAGAIN;
Jaegeuk Kim43727522013-02-04 15:11:17 +09001249 return ret;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +09001250}
1251
Chao Yu6b4d6a82018-05-30 00:20:41 +08001252void f2fs_build_gc_manager(struct f2fs_sb_info *sbi)
Jaegeuk Kim7bc09002012-11-02 17:13:01 +09001253{
1254 DIRTY_I(sbi)->v_ops = &default_v_ops;
Hou Pengyang4992ba22017-02-16 12:34:31 +00001255
Jaegeuk Kim9ce3d6b2017-12-07 16:25:39 -08001256 sbi->gc_pin_file_threshold = DEF_GC_FAILED_PINNED_FILES;
Jaegeuk Kime6b120d2017-07-10 12:55:09 -07001257
1258 /* give warm/cold data area from slower device */
1259 if (sbi->s_ndevs && sbi->segs_per_sec == 1)
1260 SIT_I(sbi)->last_victim[ALLOC_NEXT] =
1261 GET_SEGNO(sbi, FDEV(0).end_blk) + 1;
Jaegeuk Kim7bc09002012-11-02 17:13:01 +09001262}