xref: /openbmc/linux/fs/f2fs/segment.h (revision 79f08d9e)
1 /*
2  * fs/f2fs/segment.h
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/blkdev.h>
12 
13 /* constant macro */
14 #define NULL_SEGNO			((unsigned int)(~0))
15 #define NULL_SECNO			((unsigned int)(~0))
16 
17 #define DEF_RECLAIM_PREFREE_SEGMENTS	100	/* 200MB of prefree segments */
18 
19 /* L: Logical segment # in volume, R: Relative segment # in main area */
20 #define GET_L2R_SEGNO(free_i, segno)	(segno - free_i->start_segno)
21 #define GET_R2L_SEGNO(free_i, segno)	(segno + free_i->start_segno)
22 
23 #define IS_DATASEG(t)							\
24 	((t == CURSEG_HOT_DATA) || (t == CURSEG_COLD_DATA) ||		\
25 	(t == CURSEG_WARM_DATA))
26 
27 #define IS_NODESEG(t)							\
28 	((t == CURSEG_HOT_NODE) || (t == CURSEG_COLD_NODE) ||		\
29 	(t == CURSEG_WARM_NODE))
30 
31 #define IS_CURSEG(sbi, seg)						\
32 	((seg == CURSEG_I(sbi, CURSEG_HOT_DATA)->segno) ||	\
33 	 (seg == CURSEG_I(sbi, CURSEG_WARM_DATA)->segno) ||	\
34 	 (seg == CURSEG_I(sbi, CURSEG_COLD_DATA)->segno) ||	\
35 	 (seg == CURSEG_I(sbi, CURSEG_HOT_NODE)->segno) ||	\
36 	 (seg == CURSEG_I(sbi, CURSEG_WARM_NODE)->segno) ||	\
37 	 (seg == CURSEG_I(sbi, CURSEG_COLD_NODE)->segno))
38 
39 #define IS_CURSEC(sbi, secno)						\
40 	((secno == CURSEG_I(sbi, CURSEG_HOT_DATA)->segno /		\
41 	  sbi->segs_per_sec) ||	\
42 	 (secno == CURSEG_I(sbi, CURSEG_WARM_DATA)->segno /		\
43 	  sbi->segs_per_sec) ||	\
44 	 (secno == CURSEG_I(sbi, CURSEG_COLD_DATA)->segno /		\
45 	  sbi->segs_per_sec) ||	\
46 	 (secno == CURSEG_I(sbi, CURSEG_HOT_NODE)->segno /		\
47 	  sbi->segs_per_sec) ||	\
48 	 (secno == CURSEG_I(sbi, CURSEG_WARM_NODE)->segno /		\
49 	  sbi->segs_per_sec) ||	\
50 	 (secno == CURSEG_I(sbi, CURSEG_COLD_NODE)->segno /		\
51 	  sbi->segs_per_sec))	\
52 
53 #define START_BLOCK(sbi, segno)						\
54 	(SM_I(sbi)->seg0_blkaddr +					\
55 	 (GET_R2L_SEGNO(FREE_I(sbi), segno) << sbi->log_blocks_per_seg))
56 #define NEXT_FREE_BLKADDR(sbi, curseg)					\
57 	(START_BLOCK(sbi, curseg->segno) + curseg->next_blkoff)
58 
59 #define MAIN_BASE_BLOCK(sbi)	(SM_I(sbi)->main_blkaddr)
60 
61 #define GET_SEGOFF_FROM_SEG0(sbi, blk_addr)				\
62 	((blk_addr) - SM_I(sbi)->seg0_blkaddr)
63 #define GET_SEGNO_FROM_SEG0(sbi, blk_addr)				\
64 	(GET_SEGOFF_FROM_SEG0(sbi, blk_addr) >> sbi->log_blocks_per_seg)
65 #define GET_SEGNO(sbi, blk_addr)					\
66 	(((blk_addr == NULL_ADDR) || (blk_addr == NEW_ADDR)) ?		\
67 	NULL_SEGNO : GET_L2R_SEGNO(FREE_I(sbi),			\
68 		GET_SEGNO_FROM_SEG0(sbi, blk_addr)))
69 #define GET_SECNO(sbi, segno)					\
70 	((segno) / sbi->segs_per_sec)
71 #define GET_ZONENO_FROM_SEGNO(sbi, segno)				\
72 	((segno / sbi->segs_per_sec) / sbi->secs_per_zone)
73 
74 #define GET_SUM_BLOCK(sbi, segno)				\
75 	((sbi->sm_info->ssa_blkaddr) + segno)
76 
77 #define GET_SUM_TYPE(footer) ((footer)->entry_type)
78 #define SET_SUM_TYPE(footer, type) ((footer)->entry_type = type)
79 
80 #define SIT_ENTRY_OFFSET(sit_i, segno)					\
81 	(segno % sit_i->sents_per_block)
82 #define SIT_BLOCK_OFFSET(sit_i, segno)					\
83 	(segno / SIT_ENTRY_PER_BLOCK)
84 #define	START_SEGNO(sit_i, segno)		\
85 	(SIT_BLOCK_OFFSET(sit_i, segno) * SIT_ENTRY_PER_BLOCK)
86 #define f2fs_bitmap_size(nr)			\
87 	(BITS_TO_LONGS(nr) * sizeof(unsigned long))
88 #define TOTAL_SEGS(sbi)	(SM_I(sbi)->main_segments)
89 #define TOTAL_SECS(sbi)	(sbi->total_sections)
90 
91 #define SECTOR_FROM_BLOCK(sbi, blk_addr)				\
92 	(blk_addr << ((sbi)->log_blocksize - F2FS_LOG_SECTOR_SIZE))
93 #define SECTOR_TO_BLOCK(sbi, sectors)					\
94 	(sectors >> ((sbi)->log_blocksize - F2FS_LOG_SECTOR_SIZE))
95 #define MAX_BIO_BLOCKS(max_hw_blocks)					\
96 	(min((int)max_hw_blocks, BIO_MAX_PAGES))
97 
98 /* during checkpoint, bio_private is used to synchronize the last bio */
99 struct bio_private {
100 	struct f2fs_sb_info *sbi;
101 	bool is_sync;
102 	void *wait;
103 };
104 
105 /*
106  * indicate a block allocation direction: RIGHT and LEFT.
107  * RIGHT means allocating new sections towards the end of volume.
108  * LEFT means the opposite direction.
109  */
110 enum {
111 	ALLOC_RIGHT = 0,
112 	ALLOC_LEFT
113 };
114 
115 /*
116  * In the victim_sel_policy->alloc_mode, there are two block allocation modes.
117  * LFS writes data sequentially with cleaning operations.
118  * SSR (Slack Space Recycle) reuses obsolete space without cleaning operations.
119  */
120 enum {
121 	LFS = 0,
122 	SSR
123 };
124 
125 /*
126  * In the victim_sel_policy->gc_mode, there are two gc, aka cleaning, modes.
127  * GC_CB is based on cost-benefit algorithm.
128  * GC_GREEDY is based on greedy algorithm.
129  */
130 enum {
131 	GC_CB = 0,
132 	GC_GREEDY
133 };
134 
135 /*
136  * BG_GC means the background cleaning job.
137  * FG_GC means the on-demand cleaning job.
138  */
139 enum {
140 	BG_GC = 0,
141 	FG_GC
142 };
143 
144 /* for a function parameter to select a victim segment */
145 struct victim_sel_policy {
146 	int alloc_mode;			/* LFS or SSR */
147 	int gc_mode;			/* GC_CB or GC_GREEDY */
148 	unsigned long *dirty_segmap;	/* dirty segment bitmap */
149 	unsigned int max_search;	/* maximum # of segments to search */
150 	unsigned int offset;		/* last scanned bitmap offset */
151 	unsigned int ofs_unit;		/* bitmap search unit */
152 	unsigned int min_cost;		/* minimum cost */
153 	unsigned int min_segno;		/* segment # having min. cost */
154 };
155 
156 struct seg_entry {
157 	unsigned short valid_blocks;	/* # of valid blocks */
158 	unsigned char *cur_valid_map;	/* validity bitmap of blocks */
159 	/*
160 	 * # of valid blocks and the validity bitmap stored in the the last
161 	 * checkpoint pack. This information is used by the SSR mode.
162 	 */
163 	unsigned short ckpt_valid_blocks;
164 	unsigned char *ckpt_valid_map;
165 	unsigned char type;		/* segment type like CURSEG_XXX_TYPE */
166 	unsigned long long mtime;	/* modification time of the segment */
167 };
168 
169 struct sec_entry {
170 	unsigned int valid_blocks;	/* # of valid blocks in a section */
171 };
172 
173 struct segment_allocation {
174 	void (*allocate_segment)(struct f2fs_sb_info *, int, bool);
175 };
176 
177 struct sit_info {
178 	const struct segment_allocation *s_ops;
179 
180 	block_t sit_base_addr;		/* start block address of SIT area */
181 	block_t sit_blocks;		/* # of blocks used by SIT area */
182 	block_t written_valid_blocks;	/* # of valid blocks in main area */
183 	char *sit_bitmap;		/* SIT bitmap pointer */
184 	unsigned int bitmap_size;	/* SIT bitmap size */
185 
186 	unsigned long *dirty_sentries_bitmap;	/* bitmap for dirty sentries */
187 	unsigned int dirty_sentries;		/* # of dirty sentries */
188 	unsigned int sents_per_block;		/* # of SIT entries per block */
189 	struct mutex sentry_lock;		/* to protect SIT cache */
190 	struct seg_entry *sentries;		/* SIT segment-level cache */
191 	struct sec_entry *sec_entries;		/* SIT section-level cache */
192 
193 	/* for cost-benefit algorithm in cleaning procedure */
194 	unsigned long long elapsed_time;	/* elapsed time after mount */
195 	unsigned long long mounted_time;	/* mount time */
196 	unsigned long long min_mtime;		/* min. modification time */
197 	unsigned long long max_mtime;		/* max. modification time */
198 };
199 
200 struct free_segmap_info {
201 	unsigned int start_segno;	/* start segment number logically */
202 	unsigned int free_segments;	/* # of free segments */
203 	unsigned int free_sections;	/* # of free sections */
204 	rwlock_t segmap_lock;		/* free segmap lock */
205 	unsigned long *free_segmap;	/* free segment bitmap */
206 	unsigned long *free_secmap;	/* free section bitmap */
207 };
208 
209 /* Notice: The order of dirty type is same with CURSEG_XXX in f2fs.h */
210 enum dirty_type {
211 	DIRTY_HOT_DATA,		/* dirty segments assigned as hot data logs */
212 	DIRTY_WARM_DATA,	/* dirty segments assigned as warm data logs */
213 	DIRTY_COLD_DATA,	/* dirty segments assigned as cold data logs */
214 	DIRTY_HOT_NODE,		/* dirty segments assigned as hot node logs */
215 	DIRTY_WARM_NODE,	/* dirty segments assigned as warm node logs */
216 	DIRTY_COLD_NODE,	/* dirty segments assigned as cold node logs */
217 	DIRTY,			/* to count # of dirty segments */
218 	PRE,			/* to count # of entirely obsolete segments */
219 	NR_DIRTY_TYPE
220 };
221 
222 struct dirty_seglist_info {
223 	const struct victim_selection *v_ops;	/* victim selction operation */
224 	unsigned long *dirty_segmap[NR_DIRTY_TYPE];
225 	struct mutex seglist_lock;		/* lock for segment bitmaps */
226 	int nr_dirty[NR_DIRTY_TYPE];		/* # of dirty segments */
227 	unsigned long *victim_secmap;		/* background GC victims */
228 };
229 
230 /* victim selection function for cleaning and SSR */
231 struct victim_selection {
232 	int (*get_victim)(struct f2fs_sb_info *, unsigned int *,
233 							int, int, char);
234 };
235 
236 /* for active log information */
237 struct curseg_info {
238 	struct mutex curseg_mutex;		/* lock for consistency */
239 	struct f2fs_summary_block *sum_blk;	/* cached summary block */
240 	unsigned char alloc_type;		/* current allocation type */
241 	unsigned int segno;			/* current segment number */
242 	unsigned short next_blkoff;		/* next block offset to write */
243 	unsigned int zone;			/* current zone number */
244 	unsigned int next_segno;		/* preallocated segment */
245 };
246 
247 /*
248  * inline functions
249  */
250 static inline struct curseg_info *CURSEG_I(struct f2fs_sb_info *sbi, int type)
251 {
252 	return (struct curseg_info *)(SM_I(sbi)->curseg_array + type);
253 }
254 
255 static inline struct seg_entry *get_seg_entry(struct f2fs_sb_info *sbi,
256 						unsigned int segno)
257 {
258 	struct sit_info *sit_i = SIT_I(sbi);
259 	return &sit_i->sentries[segno];
260 }
261 
262 static inline struct sec_entry *get_sec_entry(struct f2fs_sb_info *sbi,
263 						unsigned int segno)
264 {
265 	struct sit_info *sit_i = SIT_I(sbi);
266 	return &sit_i->sec_entries[GET_SECNO(sbi, segno)];
267 }
268 
269 static inline unsigned int get_valid_blocks(struct f2fs_sb_info *sbi,
270 				unsigned int segno, int section)
271 {
272 	/*
273 	 * In order to get # of valid blocks in a section instantly from many
274 	 * segments, f2fs manages two counting structures separately.
275 	 */
276 	if (section > 1)
277 		return get_sec_entry(sbi, segno)->valid_blocks;
278 	else
279 		return get_seg_entry(sbi, segno)->valid_blocks;
280 }
281 
282 static inline void seg_info_from_raw_sit(struct seg_entry *se,
283 					struct f2fs_sit_entry *rs)
284 {
285 	se->valid_blocks = GET_SIT_VBLOCKS(rs);
286 	se->ckpt_valid_blocks = GET_SIT_VBLOCKS(rs);
287 	memcpy(se->cur_valid_map, rs->valid_map, SIT_VBLOCK_MAP_SIZE);
288 	memcpy(se->ckpt_valid_map, rs->valid_map, SIT_VBLOCK_MAP_SIZE);
289 	se->type = GET_SIT_TYPE(rs);
290 	se->mtime = le64_to_cpu(rs->mtime);
291 }
292 
293 static inline void seg_info_to_raw_sit(struct seg_entry *se,
294 					struct f2fs_sit_entry *rs)
295 {
296 	unsigned short raw_vblocks = (se->type << SIT_VBLOCKS_SHIFT) |
297 					se->valid_blocks;
298 	rs->vblocks = cpu_to_le16(raw_vblocks);
299 	memcpy(rs->valid_map, se->cur_valid_map, SIT_VBLOCK_MAP_SIZE);
300 	memcpy(se->ckpt_valid_map, rs->valid_map, SIT_VBLOCK_MAP_SIZE);
301 	se->ckpt_valid_blocks = se->valid_blocks;
302 	rs->mtime = cpu_to_le64(se->mtime);
303 }
304 
305 static inline unsigned int find_next_inuse(struct free_segmap_info *free_i,
306 		unsigned int max, unsigned int segno)
307 {
308 	unsigned int ret;
309 	read_lock(&free_i->segmap_lock);
310 	ret = find_next_bit(free_i->free_segmap, max, segno);
311 	read_unlock(&free_i->segmap_lock);
312 	return ret;
313 }
314 
315 static inline void __set_free(struct f2fs_sb_info *sbi, unsigned int segno)
316 {
317 	struct free_segmap_info *free_i = FREE_I(sbi);
318 	unsigned int secno = segno / sbi->segs_per_sec;
319 	unsigned int start_segno = secno * sbi->segs_per_sec;
320 	unsigned int next;
321 
322 	write_lock(&free_i->segmap_lock);
323 	clear_bit(segno, free_i->free_segmap);
324 	free_i->free_segments++;
325 
326 	next = find_next_bit(free_i->free_segmap, TOTAL_SEGS(sbi), start_segno);
327 	if (next >= start_segno + sbi->segs_per_sec) {
328 		clear_bit(secno, free_i->free_secmap);
329 		free_i->free_sections++;
330 	}
331 	write_unlock(&free_i->segmap_lock);
332 }
333 
334 static inline void __set_inuse(struct f2fs_sb_info *sbi,
335 		unsigned int segno)
336 {
337 	struct free_segmap_info *free_i = FREE_I(sbi);
338 	unsigned int secno = segno / sbi->segs_per_sec;
339 	set_bit(segno, free_i->free_segmap);
340 	free_i->free_segments--;
341 	if (!test_and_set_bit(secno, free_i->free_secmap))
342 		free_i->free_sections--;
343 }
344 
345 static inline void __set_test_and_free(struct f2fs_sb_info *sbi,
346 		unsigned int segno)
347 {
348 	struct free_segmap_info *free_i = FREE_I(sbi);
349 	unsigned int secno = segno / sbi->segs_per_sec;
350 	unsigned int start_segno = secno * sbi->segs_per_sec;
351 	unsigned int next;
352 
353 	write_lock(&free_i->segmap_lock);
354 	if (test_and_clear_bit(segno, free_i->free_segmap)) {
355 		free_i->free_segments++;
356 
357 		next = find_next_bit(free_i->free_segmap, TOTAL_SEGS(sbi),
358 								start_segno);
359 		if (next >= start_segno + sbi->segs_per_sec) {
360 			if (test_and_clear_bit(secno, free_i->free_secmap))
361 				free_i->free_sections++;
362 		}
363 	}
364 	write_unlock(&free_i->segmap_lock);
365 }
366 
367 static inline void __set_test_and_inuse(struct f2fs_sb_info *sbi,
368 		unsigned int segno)
369 {
370 	struct free_segmap_info *free_i = FREE_I(sbi);
371 	unsigned int secno = segno / sbi->segs_per_sec;
372 	write_lock(&free_i->segmap_lock);
373 	if (!test_and_set_bit(segno, free_i->free_segmap)) {
374 		free_i->free_segments--;
375 		if (!test_and_set_bit(secno, free_i->free_secmap))
376 			free_i->free_sections--;
377 	}
378 	write_unlock(&free_i->segmap_lock);
379 }
380 
381 static inline void get_sit_bitmap(struct f2fs_sb_info *sbi,
382 		void *dst_addr)
383 {
384 	struct sit_info *sit_i = SIT_I(sbi);
385 	memcpy(dst_addr, sit_i->sit_bitmap, sit_i->bitmap_size);
386 }
387 
388 static inline block_t written_block_count(struct f2fs_sb_info *sbi)
389 {
390 	struct sit_info *sit_i = SIT_I(sbi);
391 	block_t vblocks;
392 
393 	mutex_lock(&sit_i->sentry_lock);
394 	vblocks = sit_i->written_valid_blocks;
395 	mutex_unlock(&sit_i->sentry_lock);
396 
397 	return vblocks;
398 }
399 
400 static inline unsigned int free_segments(struct f2fs_sb_info *sbi)
401 {
402 	struct free_segmap_info *free_i = FREE_I(sbi);
403 	unsigned int free_segs;
404 
405 	read_lock(&free_i->segmap_lock);
406 	free_segs = free_i->free_segments;
407 	read_unlock(&free_i->segmap_lock);
408 
409 	return free_segs;
410 }
411 
412 static inline int reserved_segments(struct f2fs_sb_info *sbi)
413 {
414 	return SM_I(sbi)->reserved_segments;
415 }
416 
417 static inline unsigned int free_sections(struct f2fs_sb_info *sbi)
418 {
419 	struct free_segmap_info *free_i = FREE_I(sbi);
420 	unsigned int free_secs;
421 
422 	read_lock(&free_i->segmap_lock);
423 	free_secs = free_i->free_sections;
424 	read_unlock(&free_i->segmap_lock);
425 
426 	return free_secs;
427 }
428 
429 static inline unsigned int prefree_segments(struct f2fs_sb_info *sbi)
430 {
431 	return DIRTY_I(sbi)->nr_dirty[PRE];
432 }
433 
434 static inline unsigned int dirty_segments(struct f2fs_sb_info *sbi)
435 {
436 	return DIRTY_I(sbi)->nr_dirty[DIRTY_HOT_DATA] +
437 		DIRTY_I(sbi)->nr_dirty[DIRTY_WARM_DATA] +
438 		DIRTY_I(sbi)->nr_dirty[DIRTY_COLD_DATA] +
439 		DIRTY_I(sbi)->nr_dirty[DIRTY_HOT_NODE] +
440 		DIRTY_I(sbi)->nr_dirty[DIRTY_WARM_NODE] +
441 		DIRTY_I(sbi)->nr_dirty[DIRTY_COLD_NODE];
442 }
443 
444 static inline int overprovision_segments(struct f2fs_sb_info *sbi)
445 {
446 	return SM_I(sbi)->ovp_segments;
447 }
448 
449 static inline int overprovision_sections(struct f2fs_sb_info *sbi)
450 {
451 	return ((unsigned int) overprovision_segments(sbi)) / sbi->segs_per_sec;
452 }
453 
454 static inline int reserved_sections(struct f2fs_sb_info *sbi)
455 {
456 	return ((unsigned int) reserved_segments(sbi)) / sbi->segs_per_sec;
457 }
458 
459 static inline bool need_SSR(struct f2fs_sb_info *sbi)
460 {
461 	return ((prefree_segments(sbi) / sbi->segs_per_sec)
462 			+ free_sections(sbi) < overprovision_sections(sbi));
463 }
464 
465 static inline bool has_not_enough_free_secs(struct f2fs_sb_info *sbi, int freed)
466 {
467 	int node_secs = get_blocktype_secs(sbi, F2FS_DIRTY_NODES);
468 	int dent_secs = get_blocktype_secs(sbi, F2FS_DIRTY_DENTS);
469 
470 	if (sbi->por_doing)
471 		return false;
472 
473 	return ((free_sections(sbi) + freed) <= (node_secs + 2 * dent_secs +
474 						reserved_sections(sbi)));
475 }
476 
477 static inline bool excess_prefree_segs(struct f2fs_sb_info *sbi)
478 {
479 	return (prefree_segments(sbi) > SM_I(sbi)->rec_prefree_segments);
480 }
481 
482 static inline int utilization(struct f2fs_sb_info *sbi)
483 {
484 	return div_u64((u64)valid_user_blocks(sbi) * 100, sbi->user_block_count);
485 }
486 
487 /*
488  * Sometimes f2fs may be better to drop out-of-place update policy.
489  * So, if fs utilization is over MIN_IPU_UTIL, then f2fs tries to write
490  * data in the original place likewise other traditional file systems.
491  * But, currently set 100 in percentage, which means it is disabled.
492  * See below need_inplace_update().
493  */
494 #define MIN_IPU_UTIL		100
495 static inline bool need_inplace_update(struct inode *inode)
496 {
497 	struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
498 	if (S_ISDIR(inode->i_mode))
499 		return false;
500 	if (need_SSR(sbi) && utilization(sbi) > MIN_IPU_UTIL)
501 		return true;
502 	return false;
503 }
504 
505 static inline unsigned int curseg_segno(struct f2fs_sb_info *sbi,
506 		int type)
507 {
508 	struct curseg_info *curseg = CURSEG_I(sbi, type);
509 	return curseg->segno;
510 }
511 
512 static inline unsigned char curseg_alloc_type(struct f2fs_sb_info *sbi,
513 		int type)
514 {
515 	struct curseg_info *curseg = CURSEG_I(sbi, type);
516 	return curseg->alloc_type;
517 }
518 
519 static inline unsigned short curseg_blkoff(struct f2fs_sb_info *sbi, int type)
520 {
521 	struct curseg_info *curseg = CURSEG_I(sbi, type);
522 	return curseg->next_blkoff;
523 }
524 
525 #ifdef CONFIG_F2FS_CHECK_FS
526 static inline void check_seg_range(struct f2fs_sb_info *sbi, unsigned int segno)
527 {
528 	unsigned int end_segno = SM_I(sbi)->segment_count - 1;
529 	BUG_ON(segno > end_segno);
530 }
531 
532 static inline void verify_block_addr(struct f2fs_sb_info *sbi, block_t blk_addr)
533 {
534 	struct f2fs_sm_info *sm_info = SM_I(sbi);
535 	block_t total_blks = sm_info->segment_count << sbi->log_blocks_per_seg;
536 	block_t start_addr = sm_info->seg0_blkaddr;
537 	block_t end_addr = start_addr + total_blks - 1;
538 	BUG_ON(blk_addr < start_addr);
539 	BUG_ON(blk_addr > end_addr);
540 }
541 
542 /*
543  * Summary block is always treated as invalid block
544  */
545 static inline void check_block_count(struct f2fs_sb_info *sbi,
546 		int segno, struct f2fs_sit_entry *raw_sit)
547 {
548 	struct f2fs_sm_info *sm_info = SM_I(sbi);
549 	unsigned int end_segno = sm_info->segment_count - 1;
550 	bool is_valid  = test_bit_le(0, raw_sit->valid_map) ? true : false;
551 	int valid_blocks = 0;
552 	int cur_pos = 0, next_pos;
553 
554 	/* check segment usage */
555 	BUG_ON(GET_SIT_VBLOCKS(raw_sit) > sbi->blocks_per_seg);
556 
557 	/* check boundary of a given segment number */
558 	BUG_ON(segno > end_segno);
559 
560 	/* check bitmap with valid block count */
561 	do {
562 		if (is_valid) {
563 			next_pos = find_next_zero_bit_le(&raw_sit->valid_map,
564 					sbi->blocks_per_seg,
565 					cur_pos);
566 			valid_blocks += next_pos - cur_pos;
567 		} else
568 			next_pos = find_next_bit_le(&raw_sit->valid_map,
569 					sbi->blocks_per_seg,
570 					cur_pos);
571 		cur_pos = next_pos;
572 		is_valid = !is_valid;
573 	} while (cur_pos < sbi->blocks_per_seg);
574 	BUG_ON(GET_SIT_VBLOCKS(raw_sit) != valid_blocks);
575 }
576 #else
577 #define check_seg_range(sbi, segno)
578 #define verify_block_addr(sbi, blk_addr)
579 #define check_block_count(sbi, segno, raw_sit)
580 #endif
581 
582 static inline pgoff_t current_sit_addr(struct f2fs_sb_info *sbi,
583 						unsigned int start)
584 {
585 	struct sit_info *sit_i = SIT_I(sbi);
586 	unsigned int offset = SIT_BLOCK_OFFSET(sit_i, start);
587 	block_t blk_addr = sit_i->sit_base_addr + offset;
588 
589 	check_seg_range(sbi, start);
590 
591 	/* calculate sit block address */
592 	if (f2fs_test_bit(offset, sit_i->sit_bitmap))
593 		blk_addr += sit_i->sit_blocks;
594 
595 	return blk_addr;
596 }
597 
598 static inline pgoff_t next_sit_addr(struct f2fs_sb_info *sbi,
599 						pgoff_t block_addr)
600 {
601 	struct sit_info *sit_i = SIT_I(sbi);
602 	block_addr -= sit_i->sit_base_addr;
603 	if (block_addr < sit_i->sit_blocks)
604 		block_addr += sit_i->sit_blocks;
605 	else
606 		block_addr -= sit_i->sit_blocks;
607 
608 	return block_addr + sit_i->sit_base_addr;
609 }
610 
611 static inline void set_to_next_sit(struct sit_info *sit_i, unsigned int start)
612 {
613 	unsigned int block_off = SIT_BLOCK_OFFSET(sit_i, start);
614 
615 	if (f2fs_test_bit(block_off, sit_i->sit_bitmap))
616 		f2fs_clear_bit(block_off, sit_i->sit_bitmap);
617 	else
618 		f2fs_set_bit(block_off, sit_i->sit_bitmap);
619 }
620 
621 static inline unsigned long long get_mtime(struct f2fs_sb_info *sbi)
622 {
623 	struct sit_info *sit_i = SIT_I(sbi);
624 	return sit_i->elapsed_time + CURRENT_TIME_SEC.tv_sec -
625 						sit_i->mounted_time;
626 }
627 
628 static inline void set_summary(struct f2fs_summary *sum, nid_t nid,
629 			unsigned int ofs_in_node, unsigned char version)
630 {
631 	sum->nid = cpu_to_le32(nid);
632 	sum->ofs_in_node = cpu_to_le16(ofs_in_node);
633 	sum->version = version;
634 }
635 
636 static inline block_t start_sum_block(struct f2fs_sb_info *sbi)
637 {
638 	return __start_cp_addr(sbi) +
639 		le32_to_cpu(F2FS_CKPT(sbi)->cp_pack_start_sum);
640 }
641 
642 static inline block_t sum_blk_addr(struct f2fs_sb_info *sbi, int base, int type)
643 {
644 	return __start_cp_addr(sbi) +
645 		le32_to_cpu(F2FS_CKPT(sbi)->cp_pack_total_block_count)
646 				- (base + 1) + type;
647 }
648 
649 static inline bool sec_usage_check(struct f2fs_sb_info *sbi, unsigned int secno)
650 {
651 	if (IS_CURSEC(sbi, secno) || (sbi->cur_victim_sec == secno))
652 		return true;
653 	return false;
654 }
655 
656 static inline unsigned int max_hw_blocks(struct f2fs_sb_info *sbi)
657 {
658 	struct block_device *bdev = sbi->sb->s_bdev;
659 	struct request_queue *q = bdev_get_queue(bdev);
660 	return SECTOR_TO_BLOCK(sbi, queue_max_sectors(q));
661 }
662