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

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
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -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.
+15 −0
Original line number Diff line number Diff line
@@ -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.
+26 −0
Original line number Diff line number Diff line
@@ -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)
+3 −0
Original line number Diff line number Diff line
@@ -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).