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: Hannes Reinecke <hare@suse.de> Reviewed-by: Bob Liu <bob.liu@oracle.com> Reviewed-by: Damien Le Moal <damien.lemoal@wdc.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
This commit is contained in:
Родитель
2613eab119
Коммит
bc3d5717d2
|
@ -144,3 +144,19 @@ underlying zoned block device name. Ex::
|
|||
|
||||
echo "0 `blockdev --getsize ${dev}` zoned ${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)
|
|||
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)
|
||||
{
|
||||
return zmd->nr_chunks;
|
||||
|
@ -217,6 +222,16 @@ unsigned int dmz_nr_unmap_rnd_zones(struct dmz_metadata *zmd)
|
|||
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.
|
||||
* The map lock also protects all the zone lists.
|
||||
|
|
|
@ -965,6 +965,31 @@ static int dmz_iterate_devices(struct dm_target *ti,
|
|||
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 = {
|
||||
.name = "zoned",
|
||||
.version = {1, 1, 0},
|
||||
|
@ -978,6 +1003,7 @@ static struct target_type dmz_type = {
|
|||
.postsuspend = dmz_suspend,
|
||||
.resume = dmz_resume,
|
||||
.iterate_devices = dmz_iterate_devices,
|
||||
.status = dmz_status,
|
||||
};
|
||||
|
||||
static int __init dmz_init(void)
|
||||
|
|
|
@ -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,
|
||||
unsigned int chunk);
|
||||
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_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).
|
||||
|
|
Загрузка…
Ссылка в новой задаче