This interface may help anyone want to know all badblocks without query
block one by one.

Signed-off-by: yangerkun <[email protected]>
Reviewed-by: Bryan Gurney <[email protected]>
---
 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
[email protected]
https://www.redhat.com/mailman/listinfo/dm-devel

Reply via email to