Lines Matching refs:prev
534 static bool can_merge_front(struct badblocks *bb, int prev, in can_merge_front() argument
540 if (BB_ACK(p[prev]) == bad->ack && in can_merge_front()
541 (s < BB_END(p[prev]) || in can_merge_front()
542 (s == BB_END(p[prev]) && (BB_LEN(p[prev]) < BB_MAX_LEN)))) in can_merge_front()
552 static int front_merge(struct badblocks *bb, int prev, struct badblocks_context *bad) in front_merge() argument
559 WARN_ON(s > BB_END(p[prev])); in front_merge()
561 if (s < BB_END(p[prev])) { in front_merge()
562 merged = min_t(sector_t, sectors, BB_END(p[prev]) - s); in front_merge()
564 merged = min_t(sector_t, sectors, BB_MAX_LEN - BB_LEN(p[prev])); in front_merge()
565 if ((prev + 1) < bb->count && in front_merge()
566 merged > (BB_OFFSET(p[prev + 1]) - BB_END(p[prev]))) { in front_merge()
567 merged = BB_OFFSET(p[prev + 1]) - BB_END(p[prev]); in front_merge()
570 p[prev] = BB_MAKE(BB_OFFSET(p[prev]), in front_merge()
571 BB_LEN(p[prev]) + merged, bad->ack); in front_merge()
588 static bool can_combine_front(struct badblocks *bb, int prev, in can_combine_front() argument
593 if ((prev > 0) && in can_combine_front()
594 (BB_OFFSET(p[prev]) == bad->start) && in can_combine_front()
595 (BB_END(p[prev - 1]) == BB_OFFSET(p[prev])) && in can_combine_front()
596 (BB_LEN(p[prev - 1]) + BB_LEN(p[prev]) <= BB_MAX_LEN) && in can_combine_front()
597 (BB_ACK(p[prev - 1]) == BB_ACK(p[prev]))) in can_combine_front()
609 static void front_combine(struct badblocks *bb, int prev) in front_combine() argument
613 p[prev - 1] = BB_MAKE(BB_OFFSET(p[prev - 1]), in front_combine()
614 BB_LEN(p[prev - 1]) + BB_LEN(p[prev]), in front_combine()
615 BB_ACK(p[prev])); in front_combine()
616 if ((prev + 1) < bb->count) in front_combine()
617 memmove(p + prev, p + prev + 1, (bb->count - prev - 1) * 8); in front_combine()
673 static bool can_front_overwrite(struct badblocks *bb, int prev, in can_front_overwrite() argument
679 WARN_ON(!overlap_front(bb, prev, bad)); in can_front_overwrite()
681 if (BB_ACK(p[prev]) >= bad->ack) in can_front_overwrite()
684 if (BB_END(p[prev]) <= (bad->start + bad->len)) { in can_front_overwrite()
685 len = BB_END(p[prev]) - bad->start; in can_front_overwrite()
686 if (BB_OFFSET(p[prev]) == bad->start) in can_front_overwrite()
693 if (BB_OFFSET(p[prev]) == bad->start) in can_front_overwrite()
716 static int front_overwrite(struct badblocks *bb, int prev, in front_overwrite() argument
720 sector_t orig_end = BB_END(p[prev]); in front_overwrite()
721 int orig_ack = BB_ACK(p[prev]); in front_overwrite()
725 p[prev] = BB_MAKE(BB_OFFSET(p[prev]), BB_LEN(p[prev]), in front_overwrite()
729 if (BB_OFFSET(p[prev]) == bad->start) { in front_overwrite()
730 p[prev] = BB_MAKE(BB_OFFSET(p[prev]), in front_overwrite()
732 memmove(p + prev + 2, p + prev + 1, in front_overwrite()
733 (bb->count - prev - 1) * 8); in front_overwrite()
734 p[prev + 1] = BB_MAKE(bad->start + bad->len, in front_overwrite()
735 orig_end - BB_END(p[prev]), in front_overwrite()
738 p[prev] = BB_MAKE(BB_OFFSET(p[prev]), in front_overwrite()
739 bad->start - BB_OFFSET(p[prev]), in front_overwrite()
746 memmove(p + prev + 2, p + prev + 1, in front_overwrite()
747 (bb->count - prev - 1) * 8); in front_overwrite()
748 p[prev + 1] = BB_MAKE(bad->start, bad->len, bad->ack); in front_overwrite()
752 p[prev] = BB_MAKE(BB_OFFSET(p[prev]), in front_overwrite()
753 bad->start - BB_OFFSET(p[prev]), in front_overwrite()
760 memmove(p + prev + 3, p + prev + 1, in front_overwrite()
761 (bb->count - prev - 1) * 8); in front_overwrite()
762 p[prev + 1] = BB_MAKE(bad->start, bad->len, bad->ack); in front_overwrite()
763 p[prev + 2] = BB_MAKE(BB_END(p[prev + 1]), in front_overwrite()
764 orig_end - BB_END(p[prev + 1]), in front_overwrite()
817 static bool try_adjacent_combine(struct badblocks *bb, int prev) in try_adjacent_combine() argument
821 if (prev >= 0 && (prev + 1) < bb->count && in try_adjacent_combine()
822 BB_END(p[prev]) == BB_OFFSET(p[prev + 1]) && in try_adjacent_combine()
823 (BB_LEN(p[prev]) + BB_LEN(p[prev + 1])) <= BB_MAX_LEN && in try_adjacent_combine()
824 BB_ACK(p[prev]) == BB_ACK(p[prev + 1])) { in try_adjacent_combine()
825 p[prev] = BB_MAKE(BB_OFFSET(p[prev]), in try_adjacent_combine()
826 BB_LEN(p[prev]) + BB_LEN(p[prev + 1]), in try_adjacent_combine()
827 BB_ACK(p[prev])); in try_adjacent_combine()
829 if ((prev + 2) < bb->count) in try_adjacent_combine()
830 memmove(p + prev + 1, p + prev + 2, in try_adjacent_combine()
831 (bb->count - (prev + 2)) * 8); in try_adjacent_combine()
844 int prev = -1, hint = -1; in _badblocks_set() local
885 prev = prev_badblocks(bb, &bad, hint); in _badblocks_set()
888 if (prev < 0) { in _badblocks_set()
895 hint = ++prev; in _badblocks_set()
900 if (can_combine_front(bb, prev, &bad)) { in _badblocks_set()
901 front_combine(bb, prev); in _badblocks_set()
904 hint = prev; in _badblocks_set()
908 if (can_merge_front(bb, prev, &bad)) { in _badblocks_set()
909 len = front_merge(bb, prev, &bad); in _badblocks_set()
911 hint = prev; in _badblocks_set()
915 if (overlap_front(bb, prev, &bad)) { in _badblocks_set()
918 if (!can_front_overwrite(bb, prev, &bad, &extra)) { in _badblocks_set()
923 BB_END(p[prev]) - s, sectors); in _badblocks_set()
924 hint = prev; in _badblocks_set()
928 len = front_overwrite(bb, prev, &bad, extra); in _badblocks_set()
932 if (can_combine_front(bb, prev, &bad)) { in _badblocks_set()
933 front_combine(bb, prev); in _badblocks_set()
937 hint = prev; in _badblocks_set()
942 if ((prev + 1) < bb->count && in _badblocks_set()
943 overlap_behind(bb, &bad, prev + 1)) in _badblocks_set()
945 bad.len, BB_OFFSET(p[prev + 1]) - bad.start); in _badblocks_set()
947 len = insert_at(bb, prev + 1, &bad); in _badblocks_set()
950 hint = ++prev; in _badblocks_set()
964 try_adjacent_combine(bb, prev); in _badblocks_set()
988 static int front_clear(struct badblocks *bb, int prev, in front_clear() argument
997 if (s == BB_OFFSET(p[prev])) { in front_clear()
998 if (BB_LEN(p[prev]) > sectors) { in front_clear()
999 p[prev] = BB_MAKE(BB_OFFSET(p[prev]) + sectors, in front_clear()
1000 BB_LEN(p[prev]) - sectors, in front_clear()
1001 BB_ACK(p[prev])); in front_clear()
1005 cleared = BB_LEN(p[prev]); in front_clear()
1006 if ((prev + 1) < bb->count) in front_clear()
1007 memmove(p + prev, p + prev + 1, in front_clear()
1008 (bb->count - prev - 1) * 8); in front_clear()
1011 } else if (s > BB_OFFSET(p[prev])) { in front_clear()
1012 if (BB_END(p[prev]) <= (s + sectors)) { in front_clear()
1013 cleared = BB_END(p[prev]) - s; in front_clear()
1014 p[prev] = BB_MAKE(BB_OFFSET(p[prev]), in front_clear()
1015 s - BB_OFFSET(p[prev]), in front_clear()
1016 BB_ACK(p[prev])); in front_clear()
1031 static int front_splitting_clear(struct badblocks *bb, int prev, in front_splitting_clear() argument
1035 u64 end = BB_END(p[prev]); in front_splitting_clear()
1036 int ack = BB_ACK(p[prev]); in front_splitting_clear()
1040 p[prev] = BB_MAKE(BB_OFFSET(p[prev]), in front_splitting_clear()
1041 s - BB_OFFSET(p[prev]), in front_splitting_clear()
1043 memmove(p + prev + 2, p + prev + 1, (bb->count - prev - 1) * 8); in front_splitting_clear()
1044 p[prev + 1] = BB_MAKE(s + sectors, end - s - sectors, ack); in front_splitting_clear()
1052 int prev = -1, hint = -1; in _badblocks_clear() local
1095 prev = prev_badblocks(bb, &bad, hint); in _badblocks_clear()
1098 if (prev < 0) { in _badblocks_clear()
1114 if ((prev + 1) >= bb->count && !overlap_front(bb, prev, &bad)) { in _badblocks_clear()
1121 if (badblocks_full(bb) && (BB_OFFSET(p[prev]) < bad.start) && in _badblocks_clear()
1122 (BB_END(p[prev]) > (bad.start + sectors))) { in _badblocks_clear()
1127 if (overlap_front(bb, prev, &bad)) { in _badblocks_clear()
1128 if ((BB_OFFSET(p[prev]) < bad.start) && in _badblocks_clear()
1129 (BB_END(p[prev]) > (bad.start + bad.len))) { in _badblocks_clear()
1132 len = front_splitting_clear(bb, prev, &bad); in _badblocks_clear()
1142 len = front_clear(bb, prev, &bad, &deleted); in _badblocks_clear()
1145 hint = prev; in _badblocks_clear()
1152 if ((prev + 1) < bb->count && overlap_behind(bb, &bad, prev + 1)) { in _badblocks_clear()
1153 len = BB_OFFSET(p[prev + 1]) - bad.start; in _badblocks_clear()
1154 hint = prev + 1; in _badblocks_clear()
1189 int prev = -1, hint = -1, set = 0; in _badblocks_check() local
1205 prev = prev_badblocks(bb, &bad, hint); in _badblocks_check()
1208 if ((prev >= 0) && in _badblocks_check()
1209 ((prev + 1) >= bb->count) && !overlap_front(bb, prev, &bad)) { in _badblocks_check()
1215 if ((prev >= 0) && overlap_front(bb, prev, &bad)) { in _badblocks_check()
1216 if (BB_ACK(p[prev])) in _badblocks_check()
1221 if (BB_END(p[prev]) >= (s + sectors)) in _badblocks_check()
1224 len = BB_END(p[prev]) - s; in _badblocks_check()
1227 *first_bad = BB_OFFSET(p[prev]); in _badblocks_check()
1228 *bad_sectors = BB_LEN(p[prev]); in _badblocks_check()
1235 if ((prev + 1) < bb->count && overlap_behind(bb, &bad, prev + 1)) { in _badblocks_check()
1236 len = BB_OFFSET(p[prev + 1]) - bad.start; in _badblocks_check()
1237 hint = prev + 1; in _badblocks_check()