Commit bc3d5717 authored by Hannes Reinecke's avatar Hannes Reinecke Committed by Mike Snitzer

dm zoned: add 'status' callback

Add callback to supply information for 'dmsetup status'
and 'dmsetup table'. The output for 'dmsetup status' is

0 <size> zoned <nr_zones> zones <nr_unmap_rnd>/<nr_rnd> random <nr_unmap_seq>/<nr_seq> sequential

where <nr_unmap_rnd> is the number of unmapped (ie free) random zones,
<nr_rnd> the total number of random zones, <nr_unmap_seq> the number
of unmapped sequential zones, and <nr_seq> the total number of
sequential zones.
Signed-off-by: default avatarHannes Reinecke <hare@suse.de>
Reviewed-by: default avatarBob Liu <bob.liu@oracle.com>
Reviewed-by: default avatarDamien Le Moal <damien.lemoal@wdc.com>
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
parent 2613eab1
...@@ -144,3 +144,19 @@ underlying zoned block device name. Ex:: ...@@ -144,3 +144,19 @@ underlying zoned block device name. Ex::
echo "0 `blockdev --getsize ${dev}` zoned ${dev}" | \ echo "0 `blockdev --getsize ${dev}` zoned ${dev}" | \
dmsetup create dmz-`basename ${dev}` dmsetup create dmz-`basename ${dev}`
Information about the internal layout and current usage of the zones can
be obtained with the 'status' callback from dmsetup:
Ex::
dmsetup status /dev/dm-X
will return a line
0 <size> zoned <nr_zones> zones <nr_unmap_rnd>/<nr_rnd> random <nr_unmap_seq>/<nr_seq> sequential
where <nr_zones> is the total number of zones, <nr_unmap_rnd> is the number
of unmapped (ie free) random zones, <nr_rnd> the total number of zones,
<nr_unmap_seq> the number of unmapped sequential zones, and <nr_seq> the
total number of sequential zones.
...@@ -202,6 +202,11 @@ sector_t dmz_start_block(struct dmz_metadata *zmd, struct dm_zone *zone) ...@@ -202,6 +202,11 @@ sector_t dmz_start_block(struct dmz_metadata *zmd, struct dm_zone *zone)
return (sector_t)dmz_id(zmd, zone) << zmd->dev->zone_nr_blocks_shift; return (sector_t)dmz_id(zmd, zone) << zmd->dev->zone_nr_blocks_shift;
} }
unsigned int dmz_nr_zones(struct dmz_metadata *zmd)
{
return zmd->dev->nr_zones;
}
unsigned int dmz_nr_chunks(struct dmz_metadata *zmd) unsigned int dmz_nr_chunks(struct dmz_metadata *zmd)
{ {
return zmd->nr_chunks; return zmd->nr_chunks;
...@@ -217,6 +222,16 @@ unsigned int dmz_nr_unmap_rnd_zones(struct dmz_metadata *zmd) ...@@ -217,6 +222,16 @@ unsigned int dmz_nr_unmap_rnd_zones(struct dmz_metadata *zmd)
return atomic_read(&zmd->unmap_nr_rnd); return atomic_read(&zmd->unmap_nr_rnd);
} }
unsigned int dmz_nr_seq_zones(struct dmz_metadata *zmd)
{
return zmd->nr_seq;
}
unsigned int dmz_nr_unmap_seq_zones(struct dmz_metadata *zmd)
{
return atomic_read(&zmd->unmap_nr_seq);
}
/* /*
* Lock/unlock mapping table. * Lock/unlock mapping table.
* The map lock also protects all the zone lists. * The map lock also protects all the zone lists.
......
...@@ -965,6 +965,31 @@ static int dmz_iterate_devices(struct dm_target *ti, ...@@ -965,6 +965,31 @@ static int dmz_iterate_devices(struct dm_target *ti,
return fn(ti, dmz->ddev, 0, capacity, data); return fn(ti, dmz->ddev, 0, capacity, data);
} }
static void dmz_status(struct dm_target *ti, status_type_t type,
unsigned int status_flags, char *result,
unsigned int maxlen)
{
struct dmz_target *dmz = ti->private;
ssize_t sz = 0;
char buf[BDEVNAME_SIZE];
switch (type) {
case STATUSTYPE_INFO:
DMEMIT("%u zones %u/%u random %u/%u sequential",
dmz_nr_zones(dmz->metadata),
dmz_nr_unmap_rnd_zones(dmz->metadata),
dmz_nr_rnd_zones(dmz->metadata),
dmz_nr_unmap_seq_zones(dmz->metadata),
dmz_nr_seq_zones(dmz->metadata));
break;
case STATUSTYPE_TABLE:
format_dev_t(buf, dmz->dev->bdev->bd_dev);
DMEMIT("%s", buf);
break;
}
return;
}
static struct target_type dmz_type = { static struct target_type dmz_type = {
.name = "zoned", .name = "zoned",
.version = {1, 1, 0}, .version = {1, 1, 0},
...@@ -978,6 +1003,7 @@ static struct target_type dmz_type = { ...@@ -978,6 +1003,7 @@ static struct target_type dmz_type = {
.postsuspend = dmz_suspend, .postsuspend = dmz_suspend,
.resume = dmz_resume, .resume = dmz_resume,
.iterate_devices = dmz_iterate_devices, .iterate_devices = dmz_iterate_devices,
.status = dmz_status,
}; };
static int __init dmz_init(void) static int __init dmz_init(void)
......
...@@ -190,8 +190,11 @@ void dmz_free_zone(struct dmz_metadata *zmd, struct dm_zone *zone); ...@@ -190,8 +190,11 @@ void dmz_free_zone(struct dmz_metadata *zmd, struct dm_zone *zone);
void dmz_map_zone(struct dmz_metadata *zmd, struct dm_zone *zone, void dmz_map_zone(struct dmz_metadata *zmd, struct dm_zone *zone,
unsigned int chunk); unsigned int chunk);
void dmz_unmap_zone(struct dmz_metadata *zmd, struct dm_zone *zone); void dmz_unmap_zone(struct dmz_metadata *zmd, struct dm_zone *zone);
unsigned int dmz_nr_zones(struct dmz_metadata *zmd);
unsigned int dmz_nr_rnd_zones(struct dmz_metadata *zmd); unsigned int dmz_nr_rnd_zones(struct dmz_metadata *zmd);
unsigned int dmz_nr_unmap_rnd_zones(struct dmz_metadata *zmd); unsigned int dmz_nr_unmap_rnd_zones(struct dmz_metadata *zmd);
unsigned int dmz_nr_seq_zones(struct dmz_metadata *zmd);
unsigned int dmz_nr_unmap_seq_zones(struct dmz_metadata *zmd);
/* /*
* Activate a zone (increment its reference count). * Activate a zone (increment its reference count).
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment