Lines Matching full:bb

21  * @bb:		the badblocks structure that holds all badblock information
53 int badblocks_check(struct badblocks *bb, sector_t s, int sectors, in badblocks_check() argument
58 u64 *p = bb->page; in badblocks_check()
63 if (bb->shift > 0) { in badblocks_check()
65 s >>= bb->shift; in badblocks_check()
66 target += (1<<bb->shift) - 1; in badblocks_check()
67 target >>= bb->shift; in badblocks_check()
72 seq = read_seqbegin(&bb->lock); in badblocks_check()
75 hi = bb->count; in badblocks_check()
120 if (read_seqretry(&bb->lock, seq)) in badblocks_check()
127 static void badblocks_update_acked(struct badblocks *bb) in badblocks_update_acked() argument
129 u64 *p = bb->page; in badblocks_update_acked()
133 if (!bb->unacked_exist) in badblocks_update_acked()
136 for (i = 0; i < bb->count ; i++) { in badblocks_update_acked()
144 bb->unacked_exist = 0; in badblocks_update_acked()
149 * @bb: the badblocks structure that holds all badblock information
162 int badblocks_set(struct badblocks *bb, sector_t s, int sectors, in badblocks_set() argument
170 if (bb->shift < 0) in badblocks_set()
174 if (bb->shift) { in badblocks_set()
178 s >>= bb->shift; in badblocks_set()
179 next += (1<<bb->shift) - 1; in badblocks_set()
180 next >>= bb->shift; in badblocks_set()
184 write_seqlock_irqsave(&bb->lock, flags); in badblocks_set()
186 p = bb->page; in badblocks_set()
188 hi = bb->count; in badblocks_set()
234 if (sectors && hi < bb->count) { in badblocks_set()
264 if (sectors == 0 && hi < bb->count) { in badblocks_set()
278 (bb->count - hi - 1) * 8); in badblocks_set()
279 bb->count--; in badblocks_set()
286 if (bb->count >= MAX_BADBLOCKS) { in badblocks_set()
294 (bb->count - hi) * 8); in badblocks_set()
295 bb->count++; in badblocks_set()
305 bb->changed = 1; in badblocks_set()
307 bb->unacked_exist = 1; in badblocks_set()
309 badblocks_update_acked(bb); in badblocks_set()
310 write_sequnlock_irqrestore(&bb->lock, flags); in badblocks_set()
318 * @bb: the badblocks structure that holds all badblock information
330 int badblocks_clear(struct badblocks *bb, sector_t s, int sectors) in badblocks_clear() argument
337 if (bb->shift > 0) { in badblocks_clear()
344 s += (1<<bb->shift) - 1; in badblocks_clear()
345 s >>= bb->shift; in badblocks_clear()
346 target >>= bb->shift; in badblocks_clear()
349 write_seqlock_irq(&bb->lock); in badblocks_clear()
351 p = bb->page; in badblocks_clear()
353 hi = bb->count; in badblocks_clear()
378 if (bb->count >= MAX_BADBLOCKS) { in badblocks_clear()
382 memmove(p+lo+1, p+lo, (bb->count - lo) * 8); in badblocks_clear()
383 bb->count++; in badblocks_clear()
411 memmove(p+lo+1, p+hi, (bb->count - hi) * 8); in badblocks_clear()
412 bb->count -= (hi - lo - 1); in badblocks_clear()
416 badblocks_update_acked(bb); in badblocks_clear()
417 bb->changed = 1; in badblocks_clear()
419 write_sequnlock_irq(&bb->lock); in badblocks_clear()
426 * @bb: the badblocks structure that holds all badblock information
431 void ack_all_badblocks(struct badblocks *bb) in ack_all_badblocks() argument
433 if (bb->page == NULL || bb->changed) in ack_all_badblocks()
436 write_seqlock_irq(&bb->lock); in ack_all_badblocks()
438 if (bb->changed == 0 && bb->unacked_exist) { in ack_all_badblocks()
439 u64 *p = bb->page; in ack_all_badblocks()
442 for (i = 0; i < bb->count ; i++) { in ack_all_badblocks()
450 bb->unacked_exist = 0; in ack_all_badblocks()
452 write_sequnlock_irq(&bb->lock); in ack_all_badblocks()
458 * @bb: the badblocks structure that holds all badblock information
465 ssize_t badblocks_show(struct badblocks *bb, char *page, int unack) in badblocks_show() argument
469 u64 *p = bb->page; in badblocks_show()
472 if (bb->shift < 0) in badblocks_show()
476 seq = read_seqbegin(&bb->lock); in badblocks_show()
481 while (len < PAGE_SIZE && i < bb->count) { in badblocks_show()
492 (unsigned long long)s << bb->shift, in badblocks_show()
493 length << bb->shift); in badblocks_show()
496 bb->unacked_exist = 0; in badblocks_show()
498 if (read_seqretry(&bb->lock, seq)) in badblocks_show()
507 * @bb: the badblocks structure that holds all badblock information
515 ssize_t badblocks_store(struct badblocks *bb, const char *page, size_t len, in badblocks_store() argument
535 if (badblocks_set(bb, sector, length, !unack)) in badblocks_store()
542 static int __badblocks_init(struct device *dev, struct badblocks *bb, in __badblocks_init() argument
545 bb->dev = dev; in __badblocks_init()
546 bb->count = 0; in __badblocks_init()
548 bb->shift = 0; in __badblocks_init()
550 bb->shift = -1; in __badblocks_init()
552 bb->page = devm_kzalloc(dev, PAGE_SIZE, GFP_KERNEL); in __badblocks_init()
554 bb->page = kzalloc(PAGE_SIZE, GFP_KERNEL); in __badblocks_init()
555 if (!bb->page) { in __badblocks_init()
556 bb->shift = -1; in __badblocks_init()
559 seqlock_init(&bb->lock); in __badblocks_init()
566 * @bb: the badblocks structure that holds all badblock information
573 int badblocks_init(struct badblocks *bb, int enable) in badblocks_init() argument
575 return __badblocks_init(NULL, bb, enable); in badblocks_init()
579 int devm_init_badblocks(struct device *dev, struct badblocks *bb) in devm_init_badblocks() argument
581 if (!bb) in devm_init_badblocks()
583 return __badblocks_init(dev, bb, 1); in devm_init_badblocks()
589 * @bb: the badblocks structure that holds all badblock information
591 void badblocks_exit(struct badblocks *bb) in badblocks_exit() argument
593 if (!bb) in badblocks_exit()
595 if (bb->dev) in badblocks_exit()
596 devm_kfree(bb->dev, bb->page); in badblocks_exit()
598 kfree(bb->page); in badblocks_exit()
599 bb->page = NULL; in badblocks_exit()