This interface may help anyone want to know all badblocks without query block one by one. Signed-off-by: yangerkun <yangerkun@xxxxxxxxxx> Reviewed-by: Bryan Gurney <bgurney@xxxxxxxxxx> --- drivers/md/dm-dust.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/drivers/md/dm-dust.c b/drivers/md/dm-dust.c index ff03b90072c5..da5c10605c59 100644 --- a/drivers/md/dm-dust.c +++ b/drivers/md/dm-dust.c @@ -280,6 +280,24 @@ static int dust_clear_badblocks(struct dust_device *dd) return 0; } +static void dust_list_badblocks(struct dust_device *dd) +{ + unsigned long flags; + struct rb_root badblocklist; + struct rb_node *node; + struct badblock *bblk; + + DMINFO("%s: badblocks list below:", __func__); + spin_lock_irqsave(&dd->dust_lock, flags); + badblocklist = dd->badblocklist; + for (node = rb_first(&badblocklist); node; node = rb_next(node)) { + bblk = rb_entry(node, struct badblock, node); + DMINFO("bad block: %llu", bblk->bb); + } + spin_unlock_irqrestore(&dd->dust_lock, flags); + DMINFO("%s: badblocks list end.", __func__); +} + /* * Target parameters: * @@ -422,6 +440,9 @@ static int dust_message(struct dm_target *ti, unsigned int argc, char **argv, else dd->quiet_mode = false; r = 0; + } else if (!strcasecmp(argv[0], "listbadblocks")) { + dust_list_badblocks(dd); + r = 0; } else { invalid_msg = true; } -- 2.23.0.rc2.8.gff66981f45 -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel