Lines Matching refs:dd

78 static int dust_remove_block(struct dust_device *dd, unsigned long long block)  in dust_remove_block()  argument
83 spin_lock_irqsave(&dd->dust_lock, flags); in dust_remove_block()
84 bblock = dust_rb_search(&dd->badblocklist, block); in dust_remove_block()
87 if (!dd->quiet_mode) { in dust_remove_block()
91 spin_unlock_irqrestore(&dd->dust_lock, flags); in dust_remove_block()
95 rb_erase(&bblock->node, &dd->badblocklist); in dust_remove_block()
96 dd->badblock_count--; in dust_remove_block()
97 if (!dd->quiet_mode) in dust_remove_block()
100 spin_unlock_irqrestore(&dd->dust_lock, flags); in dust_remove_block()
105 static int dust_add_block(struct dust_device *dd, unsigned long long block, in dust_add_block() argument
113 if (!dd->quiet_mode) in dust_add_block()
118 spin_lock_irqsave(&dd->dust_lock, flags); in dust_add_block()
121 if (!dust_rb_insert(&dd->badblocklist, bblock)) { in dust_add_block()
122 if (!dd->quiet_mode) { in dust_add_block()
126 spin_unlock_irqrestore(&dd->dust_lock, flags); in dust_add_block()
131 dd->badblock_count++; in dust_add_block()
132 if (!dd->quiet_mode) { in dust_add_block()
136 spin_unlock_irqrestore(&dd->dust_lock, flags); in dust_add_block()
141 static int dust_query_block(struct dust_device *dd, unsigned long long block, char *result, in dust_query_block() argument
148 spin_lock_irqsave(&dd->dust_lock, flags); in dust_query_block()
149 bblock = dust_rb_search(&dd->badblocklist, block); in dust_query_block()
154 spin_unlock_irqrestore(&dd->dust_lock, flags); in dust_query_block()
159 static int __dust_map_read(struct dust_device *dd, sector_t thisblock) in __dust_map_read() argument
161 struct badblock *bblk = dust_rb_search(&dd->badblocklist, thisblock); in __dust_map_read()
169 static int dust_map_read(struct dust_device *dd, sector_t thisblock, in dust_map_read() argument
176 thisblock >>= dd->sect_per_block_shift; in dust_map_read()
177 spin_lock_irqsave(&dd->dust_lock, flags); in dust_map_read()
178 r = __dust_map_read(dd, thisblock); in dust_map_read()
179 spin_unlock_irqrestore(&dd->dust_lock, flags); in dust_map_read()
185 static int __dust_map_write(struct dust_device *dd, sector_t thisblock) in __dust_map_write() argument
187 struct badblock *bblk = dust_rb_search(&dd->badblocklist, thisblock); in __dust_map_write()
195 rb_erase(&bblk->node, &dd->badblocklist); in __dust_map_write()
196 dd->badblock_count--; in __dust_map_write()
198 if (!dd->quiet_mode) { in __dust_map_write()
199 sector_div(thisblock, dd->sect_per_block); in __dust_map_write()
208 static int dust_map_write(struct dust_device *dd, sector_t thisblock, in dust_map_write() argument
215 thisblock >>= dd->sect_per_block_shift; in dust_map_write()
216 spin_lock_irqsave(&dd->dust_lock, flags); in dust_map_write()
217 r = __dust_map_write(dd, thisblock); in dust_map_write()
218 spin_unlock_irqrestore(&dd->dust_lock, flags); in dust_map_write()
226 struct dust_device *dd = ti->private; in dust_map() local
229 bio_set_dev(bio, dd->dev->bdev); in dust_map()
230 bio->bi_iter.bi_sector = dd->start + dm_target_offset(ti, bio->bi_iter.bi_sector); in dust_map()
233 r = dust_map_read(dd, bio->bi_iter.bi_sector, dd->fail_read_on_bb); in dust_map()
235 r = dust_map_write(dd, bio->bi_iter.bi_sector, dd->fail_read_on_bb); in dust_map()
264 static int dust_clear_badblocks(struct dust_device *dd, char *result, unsigned int maxlen, in dust_clear_badblocks() argument
272 spin_lock_irqsave(&dd->dust_lock, flags); in dust_clear_badblocks()
273 badblocklist = dd->badblocklist; in dust_clear_badblocks()
274 badblock_count = dd->badblock_count; in dust_clear_badblocks()
275 dd->badblocklist = RB_ROOT; in dust_clear_badblocks()
276 dd->badblock_count = 0; in dust_clear_badblocks()
277 spin_unlock_irqrestore(&dd->dust_lock, flags); in dust_clear_badblocks()
287 static int dust_list_badblocks(struct dust_device *dd, char *result, unsigned int maxlen, in dust_list_badblocks() argument
297 spin_lock_irqsave(&dd->dust_lock, flags); in dust_list_badblocks()
298 badblocklist = dd->badblocklist; in dust_list_badblocks()
305 spin_unlock_irqrestore(&dd->dust_lock, flags); in dust_list_badblocks()
323 struct dust_device *dd; in dust_ctr() local
363 dd = kzalloc(sizeof(struct dust_device), GFP_KERNEL); in dust_ctr()
364 if (dd == NULL) { in dust_ctr()
369 if (dm_get_device(ti, argv[0], dm_table_get_mode(ti->table), &dd->dev)) { in dust_ctr()
371 kfree(dd); in dust_ctr()
375 dd->sect_per_block = sect_per_block; in dust_ctr()
376 dd->blksz = blksz; in dust_ctr()
377 dd->start = tmp; in dust_ctr()
379 dd->sect_per_block_shift = __ffs(sect_per_block); in dust_ctr()
385 dd->fail_read_on_bb = false; in dust_ctr()
390 dd->badblocklist = RB_ROOT; in dust_ctr()
391 dd->badblock_count = 0; in dust_ctr()
392 spin_lock_init(&dd->dust_lock); in dust_ctr()
394 dd->quiet_mode = false; in dust_ctr()
396 BUG_ON(dm_set_target_max_io_len(ti, dd->sect_per_block) != 0); in dust_ctr()
400 ti->private = dd; in dust_ctr()
407 struct dust_device *dd = ti->private; in dust_dtr() local
409 __dust_clear_badblocks(&dd->badblocklist, dd->badblock_count); in dust_dtr()
410 dm_put_device(ti, dd->dev); in dust_dtr()
411 kfree(dd); in dust_dtr()
417 struct dust_device *dd = ti->private; in dust_message() local
418 sector_t size = bdev_nr_sectors(dd->dev->bdev); in dust_message()
435 dd->fail_read_on_bb = false; in dust_message()
439 dd->fail_read_on_bb = true; in dust_message()
442 spin_lock_irqsave(&dd->dust_lock, flags); in dust_message()
444 dd->badblock_count); in dust_message()
445 spin_unlock_irqrestore(&dd->dust_lock, flags); in dust_message()
448 r = dust_clear_badblocks(dd, result, maxlen, &sz); in dust_message()
450 if (!dd->quiet_mode) in dust_message()
451 dd->quiet_mode = true; in dust_message()
453 dd->quiet_mode = false; in dust_message()
456 r = dust_list_badblocks(dd, result, maxlen, &sz); in dust_message()
465 sector_div(size, dd->sect_per_block); in dust_message()
472 r = dust_add_block(dd, block, 0); in dust_message()
474 r = dust_remove_block(dd, block); in dust_message()
476 r = dust_query_block(dd, block, result, maxlen, &sz); in dust_message()
493 sector_div(size, dd->sect_per_block); in dust_message()
500 r = dust_add_block(dd, block, wr_fail_cnt); in dust_message()
516 struct dust_device *dd = ti->private; in dust_status() local
521 DMEMIT("%s %s %s", dd->dev->name, in dust_status()
522 dd->fail_read_on_bb ? "fail_read_on_bad_block" : "bypass", in dust_status()
523 dd->quiet_mode ? "quiet" : "verbose"); in dust_status()
527 DMEMIT("%s %llu %u", dd->dev->name, in dust_status()
528 (unsigned long long)dd->start, dd->blksz); in dust_status()
539 struct dust_device *dd = ti->private; in dust_prepare_ioctl() local
540 struct dm_dev *dev = dd->dev; in dust_prepare_ioctl()
547 if (dd->start || ti->len != bdev_nr_sectors(dev->bdev)) in dust_prepare_ioctl()
556 struct dust_device *dd = ti->private; in dust_iterate_devices() local
558 return fn(ti, dd->dev, dd->start, ti->len, data); in dust_iterate_devices()