dm dust: add interface to list all badblocks
This interface may help anyone who want to know all badblocks without querying for each block. [Bryan: DMEMIT message if no blocks are in the bad block list.] Signed-off-by: yangerkun <yangerkun@huawei.com> Signed-off-by: Bryan Gurney <bgurney@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
This commit is contained in:
parent
4f7f590b15
commit
0c248ea27f
@ -206,6 +206,22 @@ appear::
|
|||||||
|
|
||||||
dust_clear_badblocks: no badblocks found
|
dust_clear_badblocks: no badblocks found
|
||||||
|
|
||||||
|
Listing the bad block list
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
To list all bad blocks in the bad block list (using an example device
|
||||||
|
with blocks 1 and 2 in the bad block list), run the following message
|
||||||
|
command::
|
||||||
|
|
||||||
|
$ sudo dmsetup message dust1 0 listbadblocks
|
||||||
|
1
|
||||||
|
2
|
||||||
|
|
||||||
|
If there are no bad blocks in the bad block list, the command will
|
||||||
|
execute with no output::
|
||||||
|
|
||||||
|
$ sudo dmsetup message dust1 0 listbadblocks
|
||||||
|
|
||||||
Message commands list
|
Message commands list
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
@ -224,6 +240,7 @@ Single argument message commands::
|
|||||||
|
|
||||||
countbadblocks
|
countbadblocks
|
||||||
clearbadblocks
|
clearbadblocks
|
||||||
|
listbadblocks
|
||||||
disable
|
disable
|
||||||
enable
|
enable
|
||||||
quiet
|
quiet
|
||||||
|
@ -284,6 +284,31 @@ static int dust_clear_badblocks(struct dust_device *dd, char *result, unsigned i
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int dust_list_badblocks(struct dust_device *dd, char *result, unsigned int maxlen,
|
||||||
|
unsigned int *sz_ptr)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
struct rb_root badblocklist;
|
||||||
|
struct rb_node *node;
|
||||||
|
struct badblock *bblk;
|
||||||
|
unsigned int sz = *sz_ptr;
|
||||||
|
unsigned long long num = 0;
|
||||||
|
|
||||||
|
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);
|
||||||
|
DMEMIT("%llu\n", bblk->bb);
|
||||||
|
num++;
|
||||||
|
}
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(&dd->dust_lock, flags);
|
||||||
|
if (!num)
|
||||||
|
DMEMIT("No blocks in badblocklist");
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Target parameters:
|
* Target parameters:
|
||||||
*
|
*
|
||||||
@ -427,6 +452,8 @@ static int dust_message(struct dm_target *ti, unsigned int argc, char **argv,
|
|||||||
else
|
else
|
||||||
dd->quiet_mode = false;
|
dd->quiet_mode = false;
|
||||||
r = 0;
|
r = 0;
|
||||||
|
} else if (!strcasecmp(argv[0], "listbadblocks")) {
|
||||||
|
r = dust_list_badblocks(dd, result, maxlen, &sz);
|
||||||
} else {
|
} else {
|
||||||
invalid_msg = true;
|
invalid_msg = true;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user