Lines Matching refs:sb

31 static int no_free_segments(struct super_block *sb)  in no_free_segments()  argument
33 struct logfs_super *super = logfs_super(sb); in no_free_segments()
39 static u8 root_distance(struct super_block *sb, gc_level_t __gc_level) in root_distance() argument
41 struct logfs_super *super = logfs_super(sb); in root_distance()
65 static int segment_is_reserved(struct super_block *sb, u32 segno) in segment_is_reserved() argument
67 struct logfs_super *super = logfs_super(sb); in segment_is_reserved()
87 static void logfs_mark_segment_bad(struct super_block *sb, u32 segno) in logfs_mark_segment_bad() argument
96 static u32 logfs_valid_bytes(struct super_block *sb, u32 segno, u32 *ec, in logfs_valid_bytes() argument
102 logfs_get_segment_entry(sb, segno, &se); in logfs_valid_bytes()
113 static void logfs_cleanse_block(struct super_block *sb, u64 ofs, u64 ino, in logfs_cleanse_block() argument
119 inode = logfs_safe_iget(sb, ino, &cookie); in logfs_cleanse_block()
125 static u32 logfs_gc_segment(struct super_block *sb, u32 segno) in logfs_gc_segment() argument
127 struct logfs_super *super = logfs_super(sb); in logfs_gc_segment()
135 LOGFS_BUG_ON(segment_is_reserved(sb, segno), sb); in logfs_gc_segment()
138 err = wbuf_read(sb, dev_ofs(sb, segno, 0), sizeof(sh), &sh); in logfs_gc_segment()
143 logfs_mark_segment_bad(sb, segno); in logfs_gc_segment()
150 ofs = dev_ofs(sb, logical_segno, seg_ofs); in logfs_gc_segment()
151 err = wbuf_read(sb, dev_ofs(sb, segno, seg_ofs), sizeof(oh), in logfs_gc_segment()
159 logfs_mark_segment_bad(sb, segno); in logfs_gc_segment()
167 valid = logfs_is_valid_block(sb, ofs, ino, bix, gc_level); in logfs_gc_segment()
169 logfs_cleanse_block(sb, ofs, ino, bix, gc_level); in logfs_gc_segment()
226 static void free_candidate(struct super_block *sb, struct gc_candidate *cand) in free_candidate() argument
228 struct logfs_super *super = logfs_super(sb); in free_candidate()
234 u32 get_best_cand(struct super_block *sb, struct candidate_list *list, u32 *ec) in get_best_cand() argument
246 free_candidate(sb, cand); in get_best_cand()
268 static void __add_candidate(struct super_block *sb, struct gc_candidate *cand) in __add_candidate() argument
270 struct logfs_super *super = logfs_super(sb); in __add_candidate()
277 dev_ofs(sb, cand->segno, 0)); in __add_candidate()
282 dev_ofs(sb, cand->segno, 0)); in __add_candidate()
295 free_candidate(sb, cand); in __add_candidate()
298 static int add_candidate(struct super_block *sb, u32 segno, u32 valid, u32 ec, in add_candidate() argument
301 struct logfs_super *super = logfs_super(sb); in add_candidate()
314 __add_candidate(sb, cand); in add_candidate()
318 static void remove_segment_from_lists(struct super_block *sb, u32 segno) in remove_segment_from_lists() argument
320 struct logfs_super *super = logfs_super(sb); in remove_segment_from_lists()
326 free_candidate(sb, cand); in remove_segment_from_lists()
330 static void scan_segment(struct super_block *sb, u32 segno) in scan_segment() argument
336 if (segment_is_reserved(sb, segno)) in scan_segment()
339 remove_segment_from_lists(sb, segno); in scan_segment()
340 valid = logfs_valid_bytes(sb, segno, &ec, &gc_level); in scan_segment()
344 dist = root_distance(sb, gc_level); in scan_segment()
345 add_candidate(sb, segno, valid, ec, dist); in scan_segment()
364 static struct gc_candidate *get_candidate(struct super_block *sb) in get_candidate() argument
366 struct logfs_super *super = logfs_super(sb); in get_candidate()
370 max_dist = min(no_free_segments(sb), LOGFS_NO_AREAS - 1); in get_candidate()
384 static int __logfs_gc_once(struct super_block *sb, struct gc_candidate *cand) in __logfs_gc_once() argument
386 struct logfs_super *super = logfs_super(sb); in __logfs_gc_once()
398 valid = logfs_valid_bytes(sb, segno, &ec, &gc_level); in __logfs_gc_once()
399 free_candidate(sb, cand); in __logfs_gc_once()
402 dist, no_free_segments(sb), valid, in __logfs_gc_once()
404 cleaned = logfs_gc_segment(sb, segno); in __logfs_gc_once()
411 static int logfs_gc_once(struct super_block *sb) in logfs_gc_once() argument
415 cand = get_candidate(sb); in logfs_gc_once()
418 return __logfs_gc_once(sb, cand); in logfs_gc_once()
422 static int logfs_scan_some(struct super_block *sb) in logfs_scan_some() argument
424 struct logfs_super *super = logfs_super(sb); in logfs_scan_some()
441 scan_segment(sb, segno); in logfs_scan_some()
456 static void __logfs_gc_pass(struct super_block *sb, int target) in __logfs_gc_pass() argument
458 struct logfs_super *super = logfs_super(sb); in __logfs_gc_pass()
468 logfs_write_anchor(sb); in __logfs_gc_pass()
470 if (no_free_segments(sb) >= target && in __logfs_gc_pass()
476 if (no_free_segments(sb) >= target) in __logfs_gc_pass()
481 logfs_write_anchor(sb); in __logfs_gc_pass()
482 round += logfs_scan_some(sb); in __logfs_gc_pass()
483 if (no_free_segments(sb) >= target) in __logfs_gc_pass()
485 progress = logfs_gc_once(sb); in __logfs_gc_pass()
521 LOGFS_BUG(sb); in __logfs_gc_pass()
524 static int wl_ratelimit(struct super_block *sb, u64 *next_event) in wl_ratelimit() argument
526 struct logfs_super *super = logfs_super(sb); in wl_ratelimit()
535 static void logfs_wl_pass(struct super_block *sb) in logfs_wl_pass() argument
537 struct logfs_super *super = logfs_super(sb); in logfs_wl_pass()
540 if (wl_ratelimit(sb, &super->s_wl_gec_ostore)) in logfs_wl_pass()
552 __logfs_gc_once(sb, wl_cand); in logfs_wl_pass()
578 static void logfs_journal_wl_pass(struct super_block *sb) in logfs_journal_wl_pass() argument
580 struct logfs_super *super = logfs_super(sb); in logfs_journal_wl_pass()
585 if (wl_ratelimit(sb, &super->s_wl_gec_journal)) in logfs_journal_wl_pass()
602 u32 segno = seg_no(sb, super->s_sb_ofs[i]); in logfs_journal_wl_pass()
605 logfs_get_segment_entry(sb, segno, &se); in logfs_journal_wl_pass()
611 do_logfs_journal_wl_pass(sb); in logfs_journal_wl_pass()
615 void logfs_gc_pass(struct super_block *sb) in logfs_gc_pass() argument
617 struct logfs_super *super = logfs_super(sb); in logfs_gc_pass()
625 logfs_write_anchor(sb); in logfs_gc_pass()
626 __logfs_gc_pass(sb, super->s_total_levels); in logfs_gc_pass()
627 logfs_wl_pass(sb); in logfs_gc_pass()
628 logfs_journal_wl_pass(sb); in logfs_gc_pass()
631 static int check_area(struct super_block *sb, int i) in check_area() argument
633 struct logfs_super *super = logfs_super(sb); in check_area()
638 u64 ofs = dev_ofs(sb, area->a_segno, area->a_written_bytes); in check_area()
643 if (super->s_devops->can_write_buf(sb, ofs) == 0) in check_area()
656 valid = logfs_valid_bytes(sb, segno, &ec, &gc_level); in check_area()
657 cleaned = logfs_gc_segment(sb, segno); in check_area()
663 int logfs_check_areas(struct super_block *sb) in logfs_check_areas() argument
668 err = check_area(sb, i); in logfs_check_areas()
684 int logfs_init_gc(struct super_block *sb) in logfs_init_gc() argument
686 struct logfs_super *super = logfs_super(sb); in logfs_init_gc()
699 static void logfs_cleanup_list(struct super_block *sb, in logfs_cleanup_list() argument
708 free_candidate(sb, cand); in logfs_cleanup_list()
713 void logfs_cleanup_gc(struct super_block *sb) in logfs_cleanup_gc() argument
715 struct logfs_super *super = logfs_super(sb); in logfs_cleanup_gc()
727 logfs_cleanup_list(sb, &super->s_free_list); in logfs_cleanup_gc()
728 logfs_cleanup_list(sb, &super->s_reserve_list); in logfs_cleanup_gc()
730 logfs_cleanup_list(sb, &super->s_low_list[i]); in logfs_cleanup_gc()
731 logfs_cleanup_list(sb, &super->s_ec_list); in logfs_cleanup_gc()