xref: /linux/fs/f2fs/extent_cache.c (revision 114f00d738f15dd8c7318369edcdc53dd6d08763)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * f2fs extent cache support
4  *
5  * Copyright (c) 2015 Motorola Mobility
6  * Copyright (c) 2015 Samsung Electronics
7  * Authors: Jaegeuk Kim <jaegeuk@kernel.org>
8  *          Chao Yu <chao2.yu@samsung.com>
9  *
10  * block_age-based extent cache added by:
11  * Copyright (c) 2022 xiaomi Co., Ltd.
12  *             http://www.xiaomi.com/
13  */
14 
15 #include <linux/fs.h>
16 #include <linux/f2fs_fs.h>
17 
18 #include "f2fs.h"
19 #include "node.h"
20 #include "segment.h"
21 #include <trace/events/f2fs.h>
22 
23 bool sanity_check_extent_cache(struct inode *inode, struct folio *ifolio)
24 {
25 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
26 	struct f2fs_extent *i_ext = &F2FS_INODE(ifolio)->i_ext;
27 	struct extent_info ei;
28 	int devi;
29 
30 	get_read_extent_info(&ei, i_ext);
31 
32 	if (!ei.len)
33 		return true;
34 
35 	if (!f2fs_is_valid_blkaddr(sbi, ei.blk, DATA_GENERIC_ENHANCE) ||
36 	    !f2fs_is_valid_blkaddr(sbi, ei.blk + ei.len - 1,
37 					DATA_GENERIC_ENHANCE)) {
38 		f2fs_warn(sbi, "%s: inode (ino=%llx) extent info [%u, %u, %u] is incorrect, run fsck to fix",
39 			  __func__, inode->i_ino,
40 			  ei.blk, ei.fofs, ei.len);
41 		return false;
42 	}
43 
44 	if (!IS_DEVICE_ALIASING(inode))
45 		return true;
46 
47 	for (devi = 0; devi < sbi->s_ndevs; devi++) {
48 		if (FDEV(devi).start_blk != ei.blk ||
49 				FDEV(devi).end_blk != ei.blk + ei.len - 1)
50 			continue;
51 
52 		if (devi == 0) {
53 			f2fs_warn(sbi,
54 			    "%s: inode (ino=%llx) is an alias of meta device",
55 			    __func__, inode->i_ino);
56 			return false;
57 		}
58 
59 		if (bdev_is_zoned(FDEV(devi).bdev)) {
60 			f2fs_warn(sbi,
61 			    "%s: device alias inode (ino=%llx)'s extent info "
62 			    "[%u, %u, %u] maps to zoned block device",
63 			    __func__, inode->i_ino, ei.blk, ei.fofs, ei.len);
64 			return false;
65 		}
66 
67 		if ((GET_SEGOFF_FROM_SEG0(sbi, ei.blk) % BLKS_PER_SEC(sbi)) ||
68 		    (ei.len % BLKS_PER_SEC(sbi))) {
69 			f2fs_warn(sbi, "%s: device alias inode (ino=%llx)'s extent info [%u, %u, %u] is not aligned to section size %u",
70 				  __func__, inode->i_ino, ei.blk, ei.fofs, ei.len,
71 				  BLKS_PER_SEC(sbi));
72 			return false;
73 		}
74 		return true;
75 	}
76 
77 	f2fs_warn(sbi, "%s: device alias inode (ino=%llx)'s extent info "
78 			"[%u, %u, %u] is inconsistent w/ any devices",
79 			__func__, inode->i_ino, ei.blk, ei.fofs, ei.len);
80 	return false;
81 }
82 
83 static void __set_extent_info(struct extent_info *ei,
84 				unsigned int fofs, unsigned int len,
85 				block_t blk, bool keep_clen,
86 				unsigned long age, unsigned long last_blocks,
87 				enum extent_type type)
88 {
89 	ei->fofs = fofs;
90 	ei->len = len;
91 
92 	if (type == EX_READ) {
93 		ei->blk = blk;
94 		if (keep_clen)
95 			return;
96 #ifdef CONFIG_F2FS_FS_COMPRESSION
97 		ei->c_len = 0;
98 #endif
99 	} else if (type == EX_BLOCK_AGE) {
100 		ei->age = age;
101 		ei->last_blocks = last_blocks;
102 	}
103 }
104 
105 static bool __init_may_extent_tree(struct inode *inode, enum extent_type type)
106 {
107 	if (type == EX_READ)
108 		return test_opt(F2FS_I_SB(inode), READ_EXTENT_CACHE) &&
109 			S_ISREG(inode->i_mode);
110 	if (type == EX_BLOCK_AGE)
111 		return test_opt(F2FS_I_SB(inode), AGE_EXTENT_CACHE) &&
112 			(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode));
113 	return false;
114 }
115 
116 static bool __may_extent_tree(struct inode *inode, enum extent_type type)
117 {
118 	if (IS_DEVICE_ALIASING(inode) && type == EX_READ)
119 		return true;
120 
121 	/*
122 	 * for recovered files during mount do not create extents
123 	 * if shrinker is not registered.
124 	 */
125 	if (list_empty(&F2FS_I_SB(inode)->s_list))
126 		return false;
127 
128 	if (!__init_may_extent_tree(inode, type))
129 		return false;
130 
131 	if (type == EX_READ) {
132 		if (is_inode_flag_set(inode, FI_NO_EXTENT))
133 			return false;
134 		if (is_inode_flag_set(inode, FI_COMPRESSED_FILE) &&
135 				 !f2fs_sb_has_readonly(F2FS_I_SB(inode)))
136 			return false;
137 	} else if (type == EX_BLOCK_AGE) {
138 		if (is_inode_flag_set(inode, FI_COMPRESSED_FILE))
139 			return false;
140 		if (file_is_cold(inode))
141 			return false;
142 	}
143 	return true;
144 }
145 
146 static void __try_update_largest_extent(struct extent_tree *et,
147 						struct extent_node *en)
148 {
149 	if (et->type != EX_READ)
150 		return;
151 	if (en->ei.len <= et->largest.len)
152 		return;
153 
154 	et->largest = en->ei;
155 	et->largest_updated = true;
156 }
157 
158 static bool __is_extent_mergeable(struct extent_info *back,
159 		struct extent_info *front, enum extent_type type)
160 {
161 	if (type == EX_READ) {
162 #ifdef CONFIG_F2FS_FS_COMPRESSION
163 		if (back->c_len && back->len != back->c_len)
164 			return false;
165 		if (front->c_len && front->len != front->c_len)
166 			return false;
167 #endif
168 		return (back->fofs + back->len == front->fofs &&
169 				back->blk + back->len == front->blk);
170 	} else if (type == EX_BLOCK_AGE) {
171 		return (back->fofs + back->len == front->fofs &&
172 			abs(back->age - front->age) <= SAME_AGE_REGION &&
173 			abs(back->last_blocks - front->last_blocks) <=
174 							SAME_AGE_REGION);
175 	}
176 	return false;
177 }
178 
179 static bool __is_back_mergeable(struct extent_info *cur,
180 		struct extent_info *back, enum extent_type type)
181 {
182 	return __is_extent_mergeable(back, cur, type);
183 }
184 
185 static bool __is_front_mergeable(struct extent_info *cur,
186 		struct extent_info *front, enum extent_type type)
187 {
188 	return __is_extent_mergeable(cur, front, type);
189 }
190 
191 static struct extent_node *__lookup_extent_node(struct rb_root_cached *root,
192 			struct extent_node *cached_en, unsigned int fofs)
193 {
194 	struct rb_node *node = root->rb_root.rb_node;
195 	struct extent_node *en;
196 
197 	/* check a cached entry */
198 	if (cached_en && cached_en->ei.fofs <= fofs &&
199 			cached_en->ei.fofs + cached_en->ei.len > fofs)
200 		return cached_en;
201 
202 	/* check rb_tree */
203 	while (node) {
204 		en = rb_entry(node, struct extent_node, rb_node);
205 
206 		if (fofs < en->ei.fofs)
207 			node = node->rb_left;
208 		else if (fofs >= en->ei.fofs + en->ei.len)
209 			node = node->rb_right;
210 		else
211 			return en;
212 	}
213 	return NULL;
214 }
215 
216 /*
217  * lookup rb entry in position of @fofs in rb-tree,
218  * if hit, return the entry, otherwise, return NULL
219  * @prev_ex: extent before fofs
220  * @next_ex: extent after fofs
221  * @insert_p: insert point for new extent at fofs
222  * in order to simplify the insertion after.
223  * tree must stay unchanged between lookup and insertion.
224  */
225 static struct extent_node *__lookup_extent_node_ret(struct rb_root_cached *root,
226 				struct extent_node *cached_en,
227 				unsigned int fofs,
228 				struct extent_node **prev_entry,
229 				struct extent_node **next_entry,
230 				struct rb_node ***insert_p,
231 				struct rb_node **insert_parent,
232 				bool *leftmost)
233 {
234 	struct rb_node **pnode = &root->rb_root.rb_node;
235 	struct rb_node *parent = NULL, *tmp_node;
236 	struct extent_node *en = cached_en;
237 
238 	*insert_p = NULL;
239 	*insert_parent = NULL;
240 	*prev_entry = NULL;
241 	*next_entry = NULL;
242 
243 	if (RB_EMPTY_ROOT(&root->rb_root))
244 		return NULL;
245 
246 	if (en && en->ei.fofs <= fofs && en->ei.fofs + en->ei.len > fofs)
247 		goto lookup_neighbors;
248 
249 	*leftmost = true;
250 
251 	while (*pnode) {
252 		parent = *pnode;
253 		en = rb_entry(*pnode, struct extent_node, rb_node);
254 
255 		if (fofs < en->ei.fofs) {
256 			pnode = &(*pnode)->rb_left;
257 		} else if (fofs >= en->ei.fofs + en->ei.len) {
258 			pnode = &(*pnode)->rb_right;
259 			*leftmost = false;
260 		} else {
261 			goto lookup_neighbors;
262 		}
263 	}
264 
265 	*insert_p = pnode;
266 	*insert_parent = parent;
267 
268 	en = rb_entry(parent, struct extent_node, rb_node);
269 	tmp_node = parent;
270 	if (parent && fofs > en->ei.fofs)
271 		tmp_node = rb_next(parent);
272 	*next_entry = rb_entry_safe(tmp_node, struct extent_node, rb_node);
273 
274 	tmp_node = parent;
275 	if (parent && fofs < en->ei.fofs)
276 		tmp_node = rb_prev(parent);
277 	*prev_entry = rb_entry_safe(tmp_node, struct extent_node, rb_node);
278 	return NULL;
279 
280 lookup_neighbors:
281 	if (fofs == en->ei.fofs) {
282 		/* lookup prev node for merging backward later */
283 		tmp_node = rb_prev(&en->rb_node);
284 		*prev_entry = rb_entry_safe(tmp_node,
285 					struct extent_node, rb_node);
286 	}
287 	if (fofs == en->ei.fofs + en->ei.len - 1) {
288 		/* lookup next node for merging frontward later */
289 		tmp_node = rb_next(&en->rb_node);
290 		*next_entry = rb_entry_safe(tmp_node,
291 					struct extent_node, rb_node);
292 	}
293 	return en;
294 }
295 
296 static struct kmem_cache *extent_tree_slab;
297 static struct kmem_cache *extent_node_slab;
298 
299 static struct extent_node *__attach_extent_node(struct f2fs_sb_info *sbi,
300 				struct extent_tree *et, struct extent_info *ei,
301 				struct rb_node *parent, struct rb_node **p,
302 				bool leftmost)
303 {
304 	struct extent_tree_info *eti = &sbi->extent_tree[et->type];
305 	struct extent_node *en;
306 
307 	en = f2fs_kmem_cache_alloc(extent_node_slab, GFP_ATOMIC, false, sbi);
308 	if (!en)
309 		return NULL;
310 
311 	en->ei = *ei;
312 	INIT_LIST_HEAD(&en->list);
313 	en->et = et;
314 
315 	rb_link_node(&en->rb_node, parent, p);
316 	rb_insert_color_cached(&en->rb_node, &et->root, leftmost);
317 	atomic_inc(&et->node_cnt);
318 	atomic_inc(&eti->total_ext_node);
319 	return en;
320 }
321 
322 static void __detach_extent_node(struct f2fs_sb_info *sbi,
323 				struct extent_tree *et, struct extent_node *en)
324 {
325 	struct extent_tree_info *eti = &sbi->extent_tree[et->type];
326 
327 	rb_erase_cached(&en->rb_node, &et->root);
328 	atomic_dec(&et->node_cnt);
329 	atomic_dec(&eti->total_ext_node);
330 
331 	if (et->cached_en == en)
332 		et->cached_en = NULL;
333 	kmem_cache_free(extent_node_slab, en);
334 }
335 
336 /*
337  * Flow to release an extent_node:
338  * 1. list_del_init
339  * 2. __detach_extent_node
340  * 3. kmem_cache_free.
341  */
342 static void __release_extent_node(struct f2fs_sb_info *sbi,
343 			struct extent_tree *et, struct extent_node *en)
344 {
345 	struct extent_tree_info *eti = &sbi->extent_tree[et->type];
346 
347 	spin_lock(&eti->extent_lock);
348 	f2fs_bug_on(sbi, list_empty(&en->list));
349 	list_del_init(&en->list);
350 	spin_unlock(&eti->extent_lock);
351 
352 	__detach_extent_node(sbi, et, en);
353 }
354 
355 static struct extent_tree *__grab_extent_tree(struct inode *inode,
356 						enum extent_type type)
357 {
358 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
359 	struct extent_tree_info *eti = &sbi->extent_tree[type];
360 	struct extent_tree *et;
361 	nid_t ino = inode->i_ino;
362 
363 	mutex_lock(&eti->extent_tree_lock);
364 	et = radix_tree_lookup(&eti->extent_tree_root, ino);
365 	if (!et) {
366 		et = f2fs_kmem_cache_alloc(extent_tree_slab,
367 					GFP_NOFS, true, NULL);
368 		f2fs_radix_tree_insert(&eti->extent_tree_root, ino, et);
369 		memset(et, 0, sizeof(struct extent_tree));
370 		et->ino = ino;
371 		et->type = type;
372 		et->root = RB_ROOT_CACHED;
373 		et->cached_en = NULL;
374 		rwlock_init(&et->lock);
375 		INIT_LIST_HEAD(&et->list);
376 		atomic_set(&et->node_cnt, 0);
377 		atomic_inc(&eti->total_ext_tree);
378 	} else {
379 		atomic_dec(&eti->total_zombie_tree);
380 		list_del_init(&et->list);
381 	}
382 	mutex_unlock(&eti->extent_tree_lock);
383 
384 	/* never died until evict_inode */
385 	F2FS_I(inode)->extent_tree[type] = et;
386 
387 	return et;
388 }
389 
390 static unsigned int __free_extent_tree(struct f2fs_sb_info *sbi,
391 				struct extent_tree *et, unsigned int nr_shrink)
392 {
393 	struct rb_node *node, *next;
394 	struct extent_node *en;
395 	unsigned int count;
396 
397 	node = rb_first_cached(&et->root);
398 
399 	for (count = 0; node && count < nr_shrink; count++) {
400 		next = rb_next(node);
401 		en = rb_entry(node, struct extent_node, rb_node);
402 		__release_extent_node(sbi, et, en);
403 		node = next;
404 	}
405 
406 	return count;
407 }
408 
409 static void __drop_largest_extent(struct extent_tree *et,
410 					pgoff_t fofs, unsigned int len)
411 {
412 	if (fofs < (pgoff_t)et->largest.fofs + et->largest.len &&
413 			fofs + len > et->largest.fofs) {
414 		et->largest.len = 0;
415 		et->largest_updated = true;
416 	}
417 }
418 
419 void f2fs_init_read_extent_tree(struct inode *inode, struct folio *ifolio)
420 {
421 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
422 	struct extent_tree_info *eti = &sbi->extent_tree[EX_READ];
423 	struct f2fs_extent *i_ext = &F2FS_INODE(ifolio)->i_ext;
424 	struct extent_tree *et;
425 	struct extent_node *en;
426 	struct extent_info ei = {0};
427 
428 	if (!__may_extent_tree(inode, EX_READ)) {
429 		/* drop largest read extent */
430 		if (i_ext->len) {
431 			f2fs_folio_wait_writeback(ifolio, NODE, true, true);
432 			i_ext->len = 0;
433 			folio_mark_dirty(ifolio);
434 		}
435 		set_inode_flag(inode, FI_NO_EXTENT);
436 		return;
437 	}
438 
439 	et = __grab_extent_tree(inode, EX_READ);
440 
441 	get_read_extent_info(&ei, i_ext);
442 
443 	write_lock(&et->lock);
444 	if (atomic_read(&et->node_cnt) || !ei.len)
445 		goto skip;
446 
447 	if (IS_DEVICE_ALIASING(inode)) {
448 		et->largest = ei;
449 		goto skip;
450 	}
451 
452 	en = __attach_extent_node(sbi, et, &ei, NULL,
453 				&et->root.rb_root.rb_node, true);
454 	if (en) {
455 		et->largest = en->ei;
456 		et->cached_en = en;
457 
458 		spin_lock(&eti->extent_lock);
459 		list_add_tail(&en->list, &eti->extent_list);
460 		spin_unlock(&eti->extent_lock);
461 	}
462 skip:
463 	/* Let's drop, if checkpoint got corrupted. */
464 	if (f2fs_cp_error(sbi)) {
465 		et->largest.len = 0;
466 		et->largest_updated = true;
467 	}
468 	write_unlock(&et->lock);
469 }
470 
471 void f2fs_init_age_extent_tree(struct inode *inode)
472 {
473 	if (!__init_may_extent_tree(inode, EX_BLOCK_AGE))
474 		return;
475 	__grab_extent_tree(inode, EX_BLOCK_AGE);
476 }
477 
478 void f2fs_init_extent_tree(struct inode *inode)
479 {
480 	/* initialize read cache */
481 	if (__init_may_extent_tree(inode, EX_READ))
482 		__grab_extent_tree(inode, EX_READ);
483 
484 	/* initialize block age cache */
485 	if (__init_may_extent_tree(inode, EX_BLOCK_AGE))
486 		__grab_extent_tree(inode, EX_BLOCK_AGE);
487 }
488 
489 static bool __lookup_extent_tree(struct inode *inode, pgoff_t pgofs,
490 			struct extent_info *ei, enum extent_type type)
491 {
492 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
493 	struct extent_tree_info *eti = &sbi->extent_tree[type];
494 	struct extent_tree *et = F2FS_I(inode)->extent_tree[type];
495 	struct extent_node *en;
496 	bool ret = false;
497 
498 	if (!et)
499 		return false;
500 
501 	trace_f2fs_lookup_extent_tree_start(inode, pgofs, type);
502 
503 	read_lock(&et->lock);
504 
505 	if (type == EX_READ &&
506 			et->largest.fofs <= pgofs &&
507 			(pgoff_t)et->largest.fofs + et->largest.len > pgofs) {
508 		*ei = et->largest;
509 		ret = true;
510 		stat_inc_largest_node_hit(sbi);
511 		goto out;
512 	}
513 
514 	if (IS_DEVICE_ALIASING(inode)) {
515 		ret = false;
516 		goto out;
517 	}
518 
519 	en = __lookup_extent_node(&et->root, et->cached_en, pgofs);
520 	if (!en)
521 		goto out;
522 
523 	if (en == et->cached_en)
524 		stat_inc_cached_node_hit(sbi, type);
525 	else
526 		stat_inc_rbtree_node_hit(sbi, type);
527 
528 	*ei = en->ei;
529 	spin_lock(&eti->extent_lock);
530 	if (!list_empty(&en->list)) {
531 		list_move_tail(&en->list, &eti->extent_list);
532 		et->cached_en = en;
533 	}
534 	spin_unlock(&eti->extent_lock);
535 	ret = true;
536 out:
537 	stat_inc_total_hit(sbi, type);
538 	read_unlock(&et->lock);
539 
540 	if (type == EX_READ)
541 		trace_f2fs_lookup_read_extent_tree_end(inode, pgofs, ei);
542 	else if (type == EX_BLOCK_AGE)
543 		trace_f2fs_lookup_age_extent_tree_end(inode, pgofs, ei);
544 	return ret;
545 }
546 
547 static struct extent_node *__try_merge_extent_node(struct f2fs_sb_info *sbi,
548 				struct extent_tree *et, struct extent_info *ei,
549 				struct extent_node *prev_ex,
550 				struct extent_node *next_ex)
551 {
552 	struct extent_tree_info *eti = &sbi->extent_tree[et->type];
553 	struct extent_node *en = NULL;
554 
555 	if (prev_ex && __is_back_mergeable(ei, &prev_ex->ei, et->type)) {
556 		prev_ex->ei.len += ei->len;
557 		ei = &prev_ex->ei;
558 		en = prev_ex;
559 	}
560 
561 	if (next_ex && __is_front_mergeable(ei, &next_ex->ei, et->type)) {
562 		next_ex->ei.fofs = ei->fofs;
563 		next_ex->ei.len += ei->len;
564 		if (et->type == EX_READ)
565 			next_ex->ei.blk = ei->blk;
566 		if (en)
567 			__release_extent_node(sbi, et, prev_ex);
568 
569 		en = next_ex;
570 	}
571 
572 	if (!en)
573 		return NULL;
574 
575 	__try_update_largest_extent(et, en);
576 
577 	spin_lock(&eti->extent_lock);
578 	if (!list_empty(&en->list)) {
579 		list_move_tail(&en->list, &eti->extent_list);
580 		et->cached_en = en;
581 	}
582 	spin_unlock(&eti->extent_lock);
583 	return en;
584 }
585 
586 static struct extent_node *__insert_extent_tree(struct f2fs_sb_info *sbi,
587 				struct extent_tree *et, struct extent_info *ei,
588 				struct rb_node **insert_p,
589 				struct rb_node *insert_parent,
590 				bool leftmost)
591 {
592 	struct extent_tree_info *eti = &sbi->extent_tree[et->type];
593 	struct rb_node **p = &et->root.rb_root.rb_node;
594 	struct rb_node *parent = NULL;
595 	struct extent_node *en = NULL;
596 
597 	if (insert_p && insert_parent) {
598 		parent = insert_parent;
599 		p = insert_p;
600 		goto do_insert;
601 	}
602 
603 	leftmost = true;
604 
605 	/* look up extent_node in the rb tree */
606 	while (*p) {
607 		parent = *p;
608 		en = rb_entry(parent, struct extent_node, rb_node);
609 
610 		if (ei->fofs < en->ei.fofs) {
611 			p = &(*p)->rb_left;
612 		} else if (ei->fofs >= en->ei.fofs + en->ei.len) {
613 			p = &(*p)->rb_right;
614 			leftmost = false;
615 		} else {
616 			f2fs_err_ratelimited(sbi, "%s: corrupted extent, type: %d, "
617 				"extent node in rb tree [%u, %u, %u], age [%llu, %llu], "
618 				"extent node to insert [%u, %u, %u], age [%llu, %llu]",
619 				__func__, et->type, en->ei.fofs, en->ei.blk, en->ei.len, en->ei.age,
620 				en->ei.last_blocks, ei->fofs, ei->blk, ei->len, ei->age, ei->last_blocks);
621 			f2fs_bug_on(sbi, 1);
622 			return NULL;
623 		}
624 	}
625 
626 do_insert:
627 	en = __attach_extent_node(sbi, et, ei, parent, p, leftmost);
628 	if (!en)
629 		return NULL;
630 
631 	__try_update_largest_extent(et, en);
632 
633 	/* update in global extent list */
634 	spin_lock(&eti->extent_lock);
635 	list_add_tail(&en->list, &eti->extent_list);
636 	et->cached_en = en;
637 	spin_unlock(&eti->extent_lock);
638 	return en;
639 }
640 
641 static unsigned int __destroy_extent_node(struct inode *inode,
642 					enum extent_type type)
643 {
644 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
645 	struct extent_tree *et = F2FS_I(inode)->extent_tree[type];
646 	unsigned int nr_shrink = type == EX_READ ?
647 				READ_EXTENT_CACHE_SHRINK_NUMBER :
648 				AGE_EXTENT_CACHE_SHRINK_NUMBER;
649 	unsigned int node_cnt = 0;
650 
651 	if (!et || !atomic_read(&et->node_cnt))
652 		return 0;
653 
654 	while (atomic_read(&et->node_cnt)) {
655 		write_lock(&et->lock);
656 		node_cnt += __free_extent_tree(sbi, et, nr_shrink);
657 		write_unlock(&et->lock);
658 	}
659 
660 	return node_cnt;
661 }
662 
663 static void __update_extent_tree_range(struct inode *inode,
664 			struct extent_info *tei, enum extent_type type)
665 {
666 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
667 	struct extent_tree *et = F2FS_I(inode)->extent_tree[type];
668 	struct extent_node *en = NULL, *en1 = NULL;
669 	struct extent_node *prev_en = NULL, *next_en = NULL;
670 	struct extent_info ei, dei, prev;
671 	struct rb_node **insert_p = NULL, *insert_parent = NULL;
672 	unsigned int fofs = tei->fofs, len = tei->len;
673 	unsigned int end = fofs + len;
674 	bool updated = false;
675 	bool leftmost = false;
676 
677 	if (!et)
678 		return;
679 
680 	if (unlikely(len == 0)) {
681 		f2fs_err_ratelimited(sbi, "%s: extent len is zero, type: %d, "
682 			"extent [%u, %u, %u], age [%llu, %llu]",
683 			__func__, type, tei->fofs, tei->blk, tei->len,
684 			tei->age, tei->last_blocks);
685 		f2fs_bug_on(sbi, 1);
686 		return;
687 	}
688 
689 	if (type == EX_READ)
690 		trace_f2fs_update_read_extent_tree_range(inode, fofs, len,
691 						tei->blk, 0);
692 	else if (type == EX_BLOCK_AGE)
693 		trace_f2fs_update_age_extent_tree_range(inode, fofs, len,
694 						tei->age, tei->last_blocks);
695 
696 	write_lock(&et->lock);
697 
698 	if (type == EX_READ) {
699 		if (is_inode_flag_set(inode, FI_NO_EXTENT)) {
700 			write_unlock(&et->lock);
701 			return;
702 		}
703 
704 		prev = et->largest;
705 		dei.len = 0;
706 
707 		/*
708 		 * drop largest extent before lookup, in case it's already
709 		 * been shrunk from extent tree
710 		 */
711 		__drop_largest_extent(et, fofs, len);
712 	}
713 
714 	/* 1. lookup first extent node in range [fofs, fofs + len - 1] */
715 	en = __lookup_extent_node_ret(&et->root,
716 					et->cached_en, fofs,
717 					&prev_en, &next_en,
718 					&insert_p, &insert_parent,
719 					&leftmost);
720 	if (!en)
721 		en = next_en;
722 
723 	/* 2. invalidate all extent nodes in range [fofs, fofs + len - 1] */
724 	while (en && en->ei.fofs < end) {
725 		unsigned int org_end;
726 		int parts = 0;	/* # of parts current extent split into */
727 
728 		next_en = en1 = NULL;
729 
730 		dei = en->ei;
731 		org_end = dei.fofs + dei.len;
732 		f2fs_bug_on(sbi, fofs >= org_end);
733 
734 		if (fofs > dei.fofs && (type != EX_READ ||
735 				fofs - dei.fofs >= F2FS_MIN_EXTENT_LEN)) {
736 			en->ei.len = fofs - en->ei.fofs;
737 			prev_en = en;
738 			parts = 1;
739 		}
740 
741 		if (end < org_end && (type != EX_READ ||
742 			(org_end - end >= F2FS_MIN_EXTENT_LEN &&
743 			atomic_read(&et->node_cnt) <
744 					sbi->max_read_extent_count))) {
745 			if (parts) {
746 				__set_extent_info(&ei,
747 					end, org_end - end,
748 					end - dei.fofs + dei.blk, false,
749 					dei.age, dei.last_blocks,
750 					type);
751 				en1 = __insert_extent_tree(sbi, et, &ei,
752 							NULL, NULL, true);
753 				next_en = en1;
754 			} else {
755 				__set_extent_info(&en->ei,
756 					end, en->ei.len - (end - dei.fofs),
757 					en->ei.blk + (end - dei.fofs), true,
758 					dei.age, dei.last_blocks,
759 					type);
760 				next_en = en;
761 			}
762 			parts++;
763 		}
764 
765 		if (!next_en) {
766 			struct rb_node *node = rb_next(&en->rb_node);
767 
768 			next_en = rb_entry_safe(node, struct extent_node,
769 						rb_node);
770 		}
771 
772 		if (parts)
773 			__try_update_largest_extent(et, en);
774 		else
775 			__release_extent_node(sbi, et, en);
776 
777 		/*
778 		 * if original extent is split into zero or two parts, extent
779 		 * tree has been altered by deletion or insertion, therefore
780 		 * invalidate pointers regard to tree.
781 		 */
782 		if (parts != 1) {
783 			insert_p = NULL;
784 			insert_parent = NULL;
785 		}
786 		en = next_en;
787 	}
788 
789 	if (type == EX_BLOCK_AGE)
790 		goto update_age_extent_cache;
791 
792 	/* 3. update extent in read extent cache */
793 	BUG_ON(type != EX_READ);
794 
795 	if (tei->blk) {
796 		__set_extent_info(&ei, fofs, len, tei->blk, false,
797 				  0, 0, EX_READ);
798 		if (!__try_merge_extent_node(sbi, et, &ei, prev_en, next_en))
799 			__insert_extent_tree(sbi, et, &ei,
800 					insert_p, insert_parent, leftmost);
801 
802 		/* give up extent_cache, if split and small updates happen */
803 		if (dei.len >= 1 &&
804 				prev.len < F2FS_MIN_EXTENT_LEN &&
805 				et->largest.len < F2FS_MIN_EXTENT_LEN) {
806 			et->largest.len = 0;
807 			et->largest_updated = true;
808 			set_inode_flag(inode, FI_NO_EXTENT);
809 		}
810 	}
811 
812 	if (et->largest_updated) {
813 		et->largest_updated = false;
814 		updated = true;
815 	}
816 	goto out_read_extent_cache;
817 update_age_extent_cache:
818 	if (tei->last_blocks == F2FS_EXTENT_AGE_INVALID)
819 		goto out_read_extent_cache;
820 
821 	__set_extent_info(&ei, fofs, len, 0, false,
822 			tei->age, tei->last_blocks, EX_BLOCK_AGE);
823 	if (!__try_merge_extent_node(sbi, et, &ei, prev_en, next_en))
824 		__insert_extent_tree(sbi, et, &ei,
825 					insert_p, insert_parent, leftmost);
826 out_read_extent_cache:
827 	write_unlock(&et->lock);
828 
829 	if (is_inode_flag_set(inode, FI_NO_EXTENT))
830 		__destroy_extent_node(inode, EX_READ);
831 
832 	if (updated)
833 		f2fs_mark_inode_dirty_sync(inode, true);
834 }
835 
836 #ifdef CONFIG_F2FS_FS_COMPRESSION
837 void f2fs_update_read_extent_tree_range_compressed(struct inode *inode,
838 				pgoff_t fofs, block_t blkaddr, unsigned int llen,
839 				unsigned int c_len)
840 {
841 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
842 	struct extent_tree *et = F2FS_I(inode)->extent_tree[EX_READ];
843 	struct extent_node *en = NULL;
844 	struct extent_node *prev_en = NULL, *next_en = NULL;
845 	struct extent_info ei;
846 	struct rb_node **insert_p = NULL, *insert_parent = NULL;
847 	bool leftmost = false;
848 
849 	trace_f2fs_update_read_extent_tree_range(inode, fofs, llen,
850 						blkaddr, c_len);
851 
852 	/* it is safe here to check FI_NO_EXTENT w/o et->lock in ro image */
853 	if (is_inode_flag_set(inode, FI_NO_EXTENT))
854 		return;
855 
856 	write_lock(&et->lock);
857 
858 	en = __lookup_extent_node_ret(&et->root,
859 					et->cached_en, fofs,
860 					&prev_en, &next_en,
861 					&insert_p, &insert_parent,
862 					&leftmost);
863 	if (en)
864 		goto unlock_out;
865 
866 	__set_extent_info(&ei, fofs, llen, blkaddr, true, 0, 0, EX_READ);
867 	ei.c_len = c_len;
868 
869 	if (!__try_merge_extent_node(sbi, et, &ei, prev_en, next_en))
870 		__insert_extent_tree(sbi, et, &ei,
871 				insert_p, insert_parent, leftmost);
872 unlock_out:
873 	write_unlock(&et->lock);
874 }
875 #endif
876 
877 static unsigned long long __calculate_block_age(struct f2fs_sb_info *sbi,
878 						unsigned long long new,
879 						unsigned long long old)
880 {
881 	unsigned int rem_old, rem_new;
882 	unsigned long long res;
883 	unsigned int weight = sbi->last_age_weight;
884 
885 	res = div_u64_rem(new, 100, &rem_new) * (100 - weight)
886 		+ div_u64_rem(old, 100, &rem_old) * weight;
887 
888 	if (rem_new)
889 		res += rem_new * (100 - weight) / 100;
890 	if (rem_old)
891 		res += rem_old * weight / 100;
892 
893 	return res;
894 }
895 
896 /* This returns a new age and allocated blocks in ei */
897 static int __get_new_block_age(struct inode *inode, struct extent_info *ei,
898 						block_t blkaddr)
899 {
900 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
901 	loff_t f_size = i_size_read(inode);
902 	unsigned long long cur_blocks =
903 				atomic64_read(&sbi->allocated_data_blocks);
904 	struct extent_info tei = *ei;	/* only fofs and len are valid */
905 
906 	/*
907 	 * When I/O is not aligned to a PAGE_SIZE, update will happen to the last
908 	 * file block even in seq write. So don't record age for newly last file
909 	 * block here.
910 	 */
911 	if ((f_size >> PAGE_SHIFT) == ei->fofs && f_size & (PAGE_SIZE - 1) &&
912 			blkaddr == NEW_ADDR)
913 		return -EINVAL;
914 
915 	if (__lookup_extent_tree(inode, ei->fofs, &tei, EX_BLOCK_AGE)) {
916 		unsigned long long cur_age;
917 
918 		if (cur_blocks >= tei.last_blocks)
919 			cur_age = cur_blocks - tei.last_blocks;
920 		else
921 			/* allocated_data_blocks overflow */
922 			cur_age = (ULLONG_MAX - 1) - tei.last_blocks + cur_blocks;
923 
924 		if (tei.age)
925 			ei->age = __calculate_block_age(sbi, cur_age, tei.age);
926 		else
927 			ei->age = cur_age;
928 		ei->last_blocks = cur_blocks;
929 		WARN_ON(ei->age > cur_blocks);
930 		return 0;
931 	}
932 
933 	f2fs_bug_on(sbi, blkaddr == NULL_ADDR);
934 
935 	/* the data block was allocated for the first time */
936 	if (blkaddr == NEW_ADDR)
937 		goto out;
938 
939 	if (__is_valid_data_blkaddr(blkaddr) &&
940 	    !f2fs_is_valid_blkaddr(sbi, blkaddr, DATA_GENERIC_ENHANCE))
941 		return -EINVAL;
942 out:
943 	/*
944 	 * init block age with zero, this can happen when the block age extent
945 	 * was reclaimed due to memory constraint or system reboot
946 	 */
947 	ei->age = 0;
948 	ei->last_blocks = cur_blocks;
949 	return 0;
950 }
951 
952 static void __update_extent_cache(struct dnode_of_data *dn, enum extent_type type)
953 {
954 	struct extent_info ei = {};
955 
956 	if (!__may_extent_tree(dn->inode, type))
957 		return;
958 
959 	ei.fofs = f2fs_start_bidx_of_node(ofs_of_node(dn->node_folio), dn->inode) +
960 								dn->ofs_in_node;
961 	ei.len = 1;
962 
963 	if (type == EX_READ) {
964 		if (dn->data_blkaddr == NEW_ADDR)
965 			ei.blk = NULL_ADDR;
966 		else
967 			ei.blk = dn->data_blkaddr;
968 	} else if (type == EX_BLOCK_AGE) {
969 		if (__get_new_block_age(dn->inode, &ei, dn->data_blkaddr))
970 			return;
971 	}
972 	__update_extent_tree_range(dn->inode, &ei, type);
973 }
974 
975 static unsigned int __shrink_extent_tree(struct f2fs_sb_info *sbi, int nr_shrink,
976 					enum extent_type type)
977 {
978 	struct extent_tree_info *eti = &sbi->extent_tree[type];
979 	struct extent_tree *et, *next;
980 	struct extent_node *en;
981 	unsigned int node_cnt = 0, tree_cnt = 0;
982 	int remained;
983 
984 	if (!atomic_read(&eti->total_zombie_tree))
985 		goto free_node;
986 
987 	if (!mutex_trylock(&eti->extent_tree_lock))
988 		goto out;
989 
990 	/* 1. remove unreferenced extent tree */
991 	list_for_each_entry_safe(et, next, &eti->zombie_list, list) {
992 		if (atomic_read(&et->node_cnt)) {
993 			write_lock(&et->lock);
994 			node_cnt += __free_extent_tree(sbi, et,
995 					nr_shrink - node_cnt - tree_cnt);
996 			write_unlock(&et->lock);
997 		}
998 
999 		if (atomic_read(&et->node_cnt))
1000 			goto unlock_out;
1001 
1002 		list_del_init(&et->list);
1003 		radix_tree_delete(&eti->extent_tree_root, et->ino);
1004 		kmem_cache_free(extent_tree_slab, et);
1005 		atomic_dec(&eti->total_ext_tree);
1006 		atomic_dec(&eti->total_zombie_tree);
1007 		tree_cnt++;
1008 
1009 		if (node_cnt + tree_cnt >= nr_shrink)
1010 			goto unlock_out;
1011 		cond_resched();
1012 	}
1013 	mutex_unlock(&eti->extent_tree_lock);
1014 
1015 free_node:
1016 	/* 2. remove LRU extent entries */
1017 	if (!mutex_trylock(&eti->extent_tree_lock))
1018 		goto out;
1019 
1020 	remained = nr_shrink - (node_cnt + tree_cnt);
1021 
1022 	spin_lock(&eti->extent_lock);
1023 	for (; remained > 0; remained--) {
1024 		if (list_empty(&eti->extent_list))
1025 			break;
1026 		en = list_first_entry(&eti->extent_list,
1027 					struct extent_node, list);
1028 		et = en->et;
1029 		if (!write_trylock(&et->lock)) {
1030 			/* refresh this extent node's position in extent list */
1031 			list_move_tail(&en->list, &eti->extent_list);
1032 			continue;
1033 		}
1034 
1035 		list_del_init(&en->list);
1036 		spin_unlock(&eti->extent_lock);
1037 
1038 		__detach_extent_node(sbi, et, en);
1039 
1040 		write_unlock(&et->lock);
1041 		node_cnt++;
1042 		spin_lock(&eti->extent_lock);
1043 	}
1044 	spin_unlock(&eti->extent_lock);
1045 
1046 unlock_out:
1047 	mutex_unlock(&eti->extent_tree_lock);
1048 out:
1049 	trace_f2fs_shrink_extent_tree(sbi, node_cnt, tree_cnt, type);
1050 
1051 	return node_cnt + tree_cnt;
1052 }
1053 
1054 /* read extent cache operations */
1055 bool f2fs_lookup_read_extent_cache(struct inode *inode, pgoff_t pgofs,
1056 				struct extent_info *ei)
1057 {
1058 	if (!__may_extent_tree(inode, EX_READ))
1059 		return false;
1060 
1061 	return __lookup_extent_tree(inode, pgofs, ei, EX_READ);
1062 }
1063 
1064 bool f2fs_lookup_read_extent_cache_block(struct inode *inode, pgoff_t index,
1065 				block_t *blkaddr)
1066 {
1067 	struct extent_info ei = {};
1068 
1069 	if (!f2fs_lookup_read_extent_cache(inode, index, &ei))
1070 		return false;
1071 	*blkaddr = ei.blk + index - ei.fofs;
1072 	return true;
1073 }
1074 
1075 void f2fs_update_read_extent_cache(struct dnode_of_data *dn)
1076 {
1077 	return __update_extent_cache(dn, EX_READ);
1078 }
1079 
1080 void f2fs_update_read_extent_cache_range(struct dnode_of_data *dn,
1081 				pgoff_t fofs, block_t blkaddr, unsigned int len)
1082 {
1083 	struct extent_info ei = {
1084 		.fofs = fofs,
1085 		.len = len,
1086 		.blk = blkaddr,
1087 	};
1088 
1089 	if (!__may_extent_tree(dn->inode, EX_READ))
1090 		return;
1091 
1092 	__update_extent_tree_range(dn->inode, &ei, EX_READ);
1093 }
1094 
1095 unsigned int f2fs_shrink_read_extent_tree(struct f2fs_sb_info *sbi, int nr_shrink)
1096 {
1097 	if (!test_opt(sbi, READ_EXTENT_CACHE))
1098 		return 0;
1099 
1100 	return __shrink_extent_tree(sbi, nr_shrink, EX_READ);
1101 }
1102 
1103 /* block age extent cache operations */
1104 bool f2fs_lookup_age_extent_cache(struct inode *inode, pgoff_t pgofs,
1105 				struct extent_info *ei)
1106 {
1107 	if (!__may_extent_tree(inode, EX_BLOCK_AGE))
1108 		return false;
1109 
1110 	return __lookup_extent_tree(inode, pgofs, ei, EX_BLOCK_AGE);
1111 }
1112 
1113 void f2fs_update_age_extent_cache(struct dnode_of_data *dn)
1114 {
1115 	return __update_extent_cache(dn, EX_BLOCK_AGE);
1116 }
1117 
1118 void f2fs_update_age_extent_cache_range(struct dnode_of_data *dn,
1119 				pgoff_t fofs, unsigned int len)
1120 {
1121 	struct extent_info ei = {
1122 		.fofs = fofs,
1123 		.len = len,
1124 		.last_blocks = F2FS_EXTENT_AGE_INVALID,
1125 	};
1126 
1127 	if (!__may_extent_tree(dn->inode, EX_BLOCK_AGE))
1128 		return;
1129 
1130 	__update_extent_tree_range(dn->inode, &ei, EX_BLOCK_AGE);
1131 }
1132 
1133 unsigned int f2fs_shrink_age_extent_tree(struct f2fs_sb_info *sbi, int nr_shrink)
1134 {
1135 	if (!test_opt(sbi, AGE_EXTENT_CACHE))
1136 		return 0;
1137 
1138 	return __shrink_extent_tree(sbi, nr_shrink, EX_BLOCK_AGE);
1139 }
1140 
1141 void f2fs_destroy_extent_node(struct inode *inode)
1142 {
1143 	__destroy_extent_node(inode, EX_READ);
1144 	__destroy_extent_node(inode, EX_BLOCK_AGE);
1145 }
1146 
1147 static void __drop_extent_tree(struct inode *inode, enum extent_type type)
1148 {
1149 	struct extent_tree *et = F2FS_I(inode)->extent_tree[type];
1150 	bool updated = false;
1151 
1152 	if (!__may_extent_tree(inode, type))
1153 		return;
1154 
1155 	write_lock(&et->lock);
1156 	if (type == EX_READ) {
1157 		set_inode_flag(inode, FI_NO_EXTENT);
1158 		if (et->largest.len) {
1159 			et->largest.len = 0;
1160 			updated = true;
1161 		}
1162 	}
1163 	write_unlock(&et->lock);
1164 
1165 	__destroy_extent_node(inode, type);
1166 
1167 	if (updated)
1168 		f2fs_mark_inode_dirty_sync(inode, true);
1169 }
1170 
1171 void f2fs_drop_extent_tree(struct inode *inode)
1172 {
1173 	__drop_extent_tree(inode, EX_READ);
1174 	__drop_extent_tree(inode, EX_BLOCK_AGE);
1175 }
1176 
1177 static void __destroy_extent_tree(struct inode *inode, enum extent_type type)
1178 {
1179 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
1180 	struct extent_tree_info *eti = &sbi->extent_tree[type];
1181 	struct extent_tree *et = F2FS_I(inode)->extent_tree[type];
1182 	unsigned int node_cnt = 0;
1183 
1184 	if (!et)
1185 		return;
1186 
1187 	if (inode->i_nlink && !is_bad_inode(inode) &&
1188 					atomic_read(&et->node_cnt)) {
1189 		mutex_lock(&eti->extent_tree_lock);
1190 		list_add_tail(&et->list, &eti->zombie_list);
1191 		atomic_inc(&eti->total_zombie_tree);
1192 		mutex_unlock(&eti->extent_tree_lock);
1193 		return;
1194 	}
1195 
1196 	/* free all extent info belong to this extent tree */
1197 	node_cnt = __destroy_extent_node(inode, type);
1198 
1199 	/* delete extent tree entry in radix tree */
1200 	mutex_lock(&eti->extent_tree_lock);
1201 	f2fs_bug_on(sbi, atomic_read(&et->node_cnt));
1202 	radix_tree_delete(&eti->extent_tree_root, inode->i_ino);
1203 	kmem_cache_free(extent_tree_slab, et);
1204 	atomic_dec(&eti->total_ext_tree);
1205 	mutex_unlock(&eti->extent_tree_lock);
1206 
1207 	F2FS_I(inode)->extent_tree[type] = NULL;
1208 
1209 	trace_f2fs_destroy_extent_tree(inode, node_cnt, type);
1210 }
1211 
1212 void f2fs_destroy_extent_tree(struct inode *inode)
1213 {
1214 	__destroy_extent_tree(inode, EX_READ);
1215 	__destroy_extent_tree(inode, EX_BLOCK_AGE);
1216 }
1217 
1218 static void __init_extent_tree_info(struct extent_tree_info *eti)
1219 {
1220 	INIT_RADIX_TREE(&eti->extent_tree_root, GFP_NOIO);
1221 	mutex_init(&eti->extent_tree_lock);
1222 	INIT_LIST_HEAD(&eti->extent_list);
1223 	spin_lock_init(&eti->extent_lock);
1224 	atomic_set(&eti->total_ext_tree, 0);
1225 	INIT_LIST_HEAD(&eti->zombie_list);
1226 	atomic_set(&eti->total_zombie_tree, 0);
1227 	atomic_set(&eti->total_ext_node, 0);
1228 }
1229 
1230 void f2fs_init_extent_cache_info(struct f2fs_sb_info *sbi)
1231 {
1232 	__init_extent_tree_info(&sbi->extent_tree[EX_READ]);
1233 	__init_extent_tree_info(&sbi->extent_tree[EX_BLOCK_AGE]);
1234 
1235 	/* initialize for block age extents */
1236 	atomic64_set(&sbi->allocated_data_blocks, 0);
1237 	sbi->hot_data_age_threshold = DEF_HOT_DATA_AGE_THRESHOLD;
1238 	sbi->warm_data_age_threshold = DEF_WARM_DATA_AGE_THRESHOLD;
1239 	sbi->last_age_weight = LAST_AGE_WEIGHT;
1240 	sbi->max_read_extent_count = DEF_MAX_READ_EXTENT_COUNT;
1241 }
1242 
1243 int __init f2fs_create_extent_cache(void)
1244 {
1245 	extent_tree_slab = f2fs_kmem_cache_create("f2fs_extent_tree",
1246 			sizeof(struct extent_tree));
1247 	if (!extent_tree_slab)
1248 		return -ENOMEM;
1249 	extent_node_slab = f2fs_kmem_cache_create("f2fs_extent_node",
1250 			sizeof(struct extent_node));
1251 	if (!extent_node_slab) {
1252 		kmem_cache_destroy(extent_tree_slab);
1253 		return -ENOMEM;
1254 	}
1255 	return 0;
1256 }
1257 
1258 void f2fs_destroy_extent_cache(void)
1259 {
1260 	kmem_cache_destroy(extent_node_slab);
1261 	kmem_cache_destroy(extent_tree_slab);
1262 }
1263