Lines Matching refs:bb

61 int badblocks_check(struct badblocks *bb, sector_t s, int sectors,  in badblocks_check()  argument
66 u64 *p = bb->page; in badblocks_check()
71 if (bb->shift > 0) { in badblocks_check()
73 s >>= bb->shift; in badblocks_check()
74 target += (1<<bb->shift) - 1; in badblocks_check()
75 target >>= bb->shift; in badblocks_check()
81 seq = read_seqbegin(&bb->lock); in badblocks_check()
84 hi = bb->count; in badblocks_check()
129 if (read_seqretry(&bb->lock, seq)) in badblocks_check()
136 static void badblocks_update_acked(struct badblocks *bb) in badblocks_update_acked() argument
138 u64 *p = bb->page; in badblocks_update_acked()
142 if (!bb->unacked_exist) in badblocks_update_acked()
145 for (i = 0; i < bb->count ; i++) { in badblocks_update_acked()
153 bb->unacked_exist = 0; in badblocks_update_acked()
171 int badblocks_set(struct badblocks *bb, sector_t s, int sectors, in badblocks_set() argument
179 if (bb->shift < 0) in badblocks_set()
183 if (bb->shift) { in badblocks_set()
187 s >>= bb->shift; in badblocks_set()
188 next += (1<<bb->shift) - 1; in badblocks_set()
189 next >>= bb->shift; in badblocks_set()
193 write_seqlock_irqsave(&bb->lock, flags); in badblocks_set()
195 p = bb->page; in badblocks_set()
197 hi = bb->count; in badblocks_set()
243 if (sectors && hi < bb->count) { in badblocks_set()
273 if (sectors == 0 && hi < bb->count) { in badblocks_set()
287 (bb->count - hi - 1) * 8); in badblocks_set()
288 bb->count--; in badblocks_set()
295 if (bb->count >= MAX_BADBLOCKS) { in badblocks_set()
303 (bb->count - hi) * 8); in badblocks_set()
304 bb->count++; in badblocks_set()
314 bb->changed = 1; in badblocks_set()
316 bb->unacked_exist = 1; in badblocks_set()
318 badblocks_update_acked(bb); in badblocks_set()
319 write_sequnlock_irqrestore(&bb->lock, flags); in badblocks_set()
339 int badblocks_clear(struct badblocks *bb, sector_t s, int sectors) in badblocks_clear() argument
346 if (bb->shift > 0) { in badblocks_clear()
353 s += (1<<bb->shift) - 1; in badblocks_clear()
354 s >>= bb->shift; in badblocks_clear()
355 target >>= bb->shift; in badblocks_clear()
359 write_seqlock_irq(&bb->lock); in badblocks_clear()
361 p = bb->page; in badblocks_clear()
363 hi = bb->count; in badblocks_clear()
388 if (bb->count >= MAX_BADBLOCKS) { in badblocks_clear()
392 memmove(p+lo+1, p+lo, (bb->count - lo) * 8); in badblocks_clear()
393 bb->count++; in badblocks_clear()
421 memmove(p+lo+1, p+hi, (bb->count - hi) * 8); in badblocks_clear()
422 bb->count -= (hi - lo - 1); in badblocks_clear()
426 badblocks_update_acked(bb); in badblocks_clear()
427 bb->changed = 1; in badblocks_clear()
429 write_sequnlock_irq(&bb->lock); in badblocks_clear()
441 void ack_all_badblocks(struct badblocks *bb) in ack_all_badblocks() argument
443 if (bb->page == NULL || bb->changed) in ack_all_badblocks()
446 write_seqlock_irq(&bb->lock); in ack_all_badblocks()
448 if (bb->changed == 0 && bb->unacked_exist) { in ack_all_badblocks()
449 u64 *p = bb->page; in ack_all_badblocks()
452 for (i = 0; i < bb->count ; i++) { in ack_all_badblocks()
460 bb->unacked_exist = 0; in ack_all_badblocks()
462 write_sequnlock_irq(&bb->lock); in ack_all_badblocks()
475 ssize_t badblocks_show(struct badblocks *bb, char *page, int unack) in badblocks_show() argument
479 u64 *p = bb->page; in badblocks_show()
482 if (bb->shift < 0) in badblocks_show()
486 seq = read_seqbegin(&bb->lock); in badblocks_show()
491 while (len < PAGE_SIZE && i < bb->count) { in badblocks_show()
502 (unsigned long long)s << bb->shift, in badblocks_show()
503 length << bb->shift); in badblocks_show()
506 bb->unacked_exist = 0; in badblocks_show()
508 if (read_seqretry(&bb->lock, seq)) in badblocks_show()
525 ssize_t badblocks_store(struct badblocks *bb, const char *page, size_t len, in badblocks_store() argument
545 if (badblocks_set(bb, sector, length, !unack)) in badblocks_store()
552 static int __badblocks_init(struct device *dev, struct badblocks *bb, in __badblocks_init() argument
555 bb->dev = dev; in __badblocks_init()
556 bb->count = 0; in __badblocks_init()
558 bb->shift = 0; in __badblocks_init()
560 bb->shift = -1; in __badblocks_init()
562 bb->page = devm_kzalloc(dev, PAGE_SIZE, GFP_KERNEL); in __badblocks_init()
564 bb->page = kzalloc(PAGE_SIZE, GFP_KERNEL); in __badblocks_init()
565 if (!bb->page) { in __badblocks_init()
566 bb->shift = -1; in __badblocks_init()
569 seqlock_init(&bb->lock); in __badblocks_init()
583 int badblocks_init(struct badblocks *bb, int enable) in badblocks_init() argument
585 return __badblocks_init(NULL, bb, enable); in badblocks_init()
589 int devm_init_badblocks(struct device *dev, struct badblocks *bb) in devm_init_badblocks() argument
591 if (!bb) in devm_init_badblocks()
593 return __badblocks_init(dev, bb, 1); in devm_init_badblocks()
601 void badblocks_exit(struct badblocks *bb) in badblocks_exit() argument
603 if (!bb) in badblocks_exit()
605 if (bb->dev) in badblocks_exit()
606 devm_kfree(bb->dev, bb->page); in badblocks_exit()
608 kfree(bb->page); in badblocks_exit()
609 bb->page = NULL; in badblocks_exit()