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

dm zoned: add metadata logging functions

Use the metadata label for logging and not the underlying
device.
Signed-off-by: default avatarHannes Reinecke <hare@suse.de>
Reviewed-by: default avatarDamien Le Moal <damien.lemoal@wdc.com>
Reviewed-by: default avatarBob Liu <bob.liu@oracle.com>
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
parent aa821c8d
...@@ -194,6 +194,17 @@ struct dmz_metadata { ...@@ -194,6 +194,17 @@ struct dmz_metadata {
wait_queue_head_t free_wq; wait_queue_head_t free_wq;
}; };
#define dmz_zmd_info(zmd, format, args...) \
DMINFO("(%s): " format, (zmd)->devname, ## args)
#define dmz_zmd_err(zmd, format, args...) \
DMERR("(%s): " format, (zmd)->devname, ## args)
#define dmz_zmd_warn(zmd, format, args...) \
DMWARN("(%s): " format, (zmd)->devname, ## args)
#define dmz_zmd_debug(zmd, format, args...) \
DMDEBUG("(%s): " format, (zmd)->devname, ## args)
/* /*
* Various accessors * Various accessors
*/ */
...@@ -1098,7 +1109,7 @@ static int dmz_load_sb(struct dmz_metadata *zmd) ...@@ -1098,7 +1109,7 @@ static int dmz_load_sb(struct dmz_metadata *zmd)
int ret; int ret;
if (!zmd->sb[0].zone) { if (!zmd->sb[0].zone) {
dmz_dev_err(zmd->dev, "Primary super block zone not set"); dmz_zmd_err(zmd, "Primary super block zone not set");
return -ENXIO; return -ENXIO;
} }
...@@ -1135,7 +1146,7 @@ static int dmz_load_sb(struct dmz_metadata *zmd) ...@@ -1135,7 +1146,7 @@ static int dmz_load_sb(struct dmz_metadata *zmd)
/* Use highest generation sb first */ /* Use highest generation sb first */
if (!sb_good[0] && !sb_good[1]) { if (!sb_good[0] && !sb_good[1]) {
dmz_dev_err(zmd->dev, "No valid super block found"); dmz_zmd_err(zmd, "No valid super block found");
return -EIO; return -EIO;
} }
...@@ -1248,7 +1259,7 @@ static void dmz_drop_zones(struct dmz_metadata *zmd) ...@@ -1248,7 +1259,7 @@ static void dmz_drop_zones(struct dmz_metadata *zmd)
*/ */
static int dmz_init_zones(struct dmz_metadata *zmd) static int dmz_init_zones(struct dmz_metadata *zmd)
{ {
struct dmz_dev *dev = zmd->dev; struct dmz_dev *dev = &zmd->dev[0];
int ret; int ret;
/* Init */ /* Init */
...@@ -1268,8 +1279,8 @@ static int dmz_init_zones(struct dmz_metadata *zmd) ...@@ -1268,8 +1279,8 @@ static int dmz_init_zones(struct dmz_metadata *zmd)
if (!zmd->zones) if (!zmd->zones)
return -ENOMEM; return -ENOMEM;
dmz_dev_info(dev, "Using %zu B for zone information", DMINFO("(%s): Using %zu B for zone information",
sizeof(struct dm_zone) * zmd->nr_zones); zmd->devname, sizeof(struct dm_zone) * zmd->nr_zones);
/* /*
* Get zone information and initialize zone descriptors. At the same * Get zone information and initialize zone descriptors. At the same
...@@ -1412,7 +1423,6 @@ static void dmz_get_zone_weight(struct dmz_metadata *zmd, struct dm_zone *zone); ...@@ -1412,7 +1423,6 @@ static void dmz_get_zone_weight(struct dmz_metadata *zmd, struct dm_zone *zone);
*/ */
static int dmz_load_mapping(struct dmz_metadata *zmd) static int dmz_load_mapping(struct dmz_metadata *zmd)
{ {
struct dmz_dev *dev = zmd->dev;
struct dm_zone *dzone, *bzone; struct dm_zone *dzone, *bzone;
struct dmz_mblock *dmap_mblk = NULL; struct dmz_mblock *dmap_mblk = NULL;
struct dmz_map *dmap; struct dmz_map *dmap;
...@@ -1445,7 +1455,7 @@ static int dmz_load_mapping(struct dmz_metadata *zmd) ...@@ -1445,7 +1455,7 @@ static int dmz_load_mapping(struct dmz_metadata *zmd)
goto next; goto next;
if (dzone_id >= zmd->nr_zones) { if (dzone_id >= zmd->nr_zones) {
dmz_dev_err(dev, "Chunk %u mapping: invalid data zone ID %u", dmz_zmd_err(zmd, "Chunk %u mapping: invalid data zone ID %u",
chunk, dzone_id); chunk, dzone_id);
return -EIO; return -EIO;
} }
...@@ -1466,14 +1476,14 @@ static int dmz_load_mapping(struct dmz_metadata *zmd) ...@@ -1466,14 +1476,14 @@ static int dmz_load_mapping(struct dmz_metadata *zmd)
goto next; goto next;
if (bzone_id >= zmd->nr_zones) { if (bzone_id >= zmd->nr_zones) {
dmz_dev_err(dev, "Chunk %u mapping: invalid buffer zone ID %u", dmz_zmd_err(zmd, "Chunk %u mapping: invalid buffer zone ID %u",
chunk, bzone_id); chunk, bzone_id);
return -EIO; return -EIO;
} }
bzone = dmz_get(zmd, bzone_id); bzone = dmz_get(zmd, bzone_id);
if (!dmz_is_rnd(bzone)) { if (!dmz_is_rnd(bzone)) {
dmz_dev_err(dev, "Chunk %u mapping: invalid buffer zone %u", dmz_zmd_err(zmd, "Chunk %u mapping: invalid buffer zone %u",
chunk, bzone_id); chunk, bzone_id);
return -EIO; return -EIO;
} }
...@@ -1893,7 +1903,7 @@ struct dm_zone *dmz_alloc_zone(struct dmz_metadata *zmd, unsigned long flags) ...@@ -1893,7 +1903,7 @@ struct dm_zone *dmz_alloc_zone(struct dmz_metadata *zmd, unsigned long flags)
atomic_dec(&zmd->unmap_nr_seq); atomic_dec(&zmd->unmap_nr_seq);
if (dmz_is_offline(zone)) { if (dmz_is_offline(zone)) {
dmz_dev_warn(zmd->dev, "Zone %u is offline", zone->id); dmz_zmd_warn(zmd, "Zone %u is offline", zone->id);
zone = NULL; zone = NULL;
goto again; goto again;
} }
...@@ -2104,7 +2114,7 @@ int dmz_validate_blocks(struct dmz_metadata *zmd, struct dm_zone *zone, ...@@ -2104,7 +2114,7 @@ int dmz_validate_blocks(struct dmz_metadata *zmd, struct dm_zone *zone,
struct dmz_mblock *mblk; struct dmz_mblock *mblk;
unsigned int n = 0; unsigned int n = 0;
dmz_dev_debug(zmd->dev, "=> VALIDATE zone %u, block %llu, %u blocks", dmz_zmd_debug(zmd, "=> VALIDATE zone %u, block %llu, %u blocks",
zone->id, (unsigned long long)chunk_block, zone->id, (unsigned long long)chunk_block,
nr_blocks); nr_blocks);
...@@ -2134,7 +2144,7 @@ int dmz_validate_blocks(struct dmz_metadata *zmd, struct dm_zone *zone, ...@@ -2134,7 +2144,7 @@ int dmz_validate_blocks(struct dmz_metadata *zmd, struct dm_zone *zone,
if (likely(zone->weight + n <= zone_nr_blocks)) if (likely(zone->weight + n <= zone_nr_blocks))
zone->weight += n; zone->weight += n;
else { else {
dmz_dev_warn(zmd->dev, "Zone %u: weight %u should be <= %u", dmz_zmd_warn(zmd, "Zone %u: weight %u should be <= %u",
zone->id, zone->weight, zone->id, zone->weight,
zone_nr_blocks - n); zone_nr_blocks - n);
zone->weight = zone_nr_blocks; zone->weight = zone_nr_blocks;
...@@ -2184,7 +2194,7 @@ int dmz_invalidate_blocks(struct dmz_metadata *zmd, struct dm_zone *zone, ...@@ -2184,7 +2194,7 @@ int dmz_invalidate_blocks(struct dmz_metadata *zmd, struct dm_zone *zone,
struct dmz_mblock *mblk; struct dmz_mblock *mblk;
unsigned int n = 0; unsigned int n = 0;
dmz_dev_debug(zmd->dev, "=> INVALIDATE zone %u, block %llu, %u blocks", dmz_zmd_debug(zmd, "=> INVALIDATE zone %u, block %llu, %u blocks",
zone->id, (u64)chunk_block, nr_blocks); zone->id, (u64)chunk_block, nr_blocks);
WARN_ON(chunk_block + nr_blocks > zmd->zone_nr_blocks); WARN_ON(chunk_block + nr_blocks > zmd->zone_nr_blocks);
...@@ -2214,7 +2224,7 @@ int dmz_invalidate_blocks(struct dmz_metadata *zmd, struct dm_zone *zone, ...@@ -2214,7 +2224,7 @@ int dmz_invalidate_blocks(struct dmz_metadata *zmd, struct dm_zone *zone,
if (zone->weight >= n) if (zone->weight >= n)
zone->weight -= n; zone->weight -= n;
else { else {
dmz_dev_warn(zmd->dev, "Zone %u: weight %u should be >= %u", dmz_zmd_warn(zmd, "Zone %u: weight %u should be >= %u",
zone->id, zone->weight, n); zone->id, zone->weight, n);
zone->weight = 0; zone->weight = 0;
} }
...@@ -2424,7 +2434,7 @@ static void dmz_cleanup_metadata(struct dmz_metadata *zmd) ...@@ -2424,7 +2434,7 @@ static void dmz_cleanup_metadata(struct dmz_metadata *zmd)
while (!list_empty(&zmd->mblk_dirty_list)) { while (!list_empty(&zmd->mblk_dirty_list)) {
mblk = list_first_entry(&zmd->mblk_dirty_list, mblk = list_first_entry(&zmd->mblk_dirty_list,
struct dmz_mblock, link); struct dmz_mblock, link);
dmz_dev_warn(zmd->dev, "mblock %llu still in dirty list (ref %u)", dmz_zmd_warn(zmd, "mblock %llu still in dirty list (ref %u)",
(u64)mblk->no, mblk->ref); (u64)mblk->no, mblk->ref);
list_del_init(&mblk->link); list_del_init(&mblk->link);
rb_erase(&mblk->node, &zmd->mblk_rbtree); rb_erase(&mblk->node, &zmd->mblk_rbtree);
...@@ -2442,7 +2452,7 @@ static void dmz_cleanup_metadata(struct dmz_metadata *zmd) ...@@ -2442,7 +2452,7 @@ static void dmz_cleanup_metadata(struct dmz_metadata *zmd)
/* Sanity checks: the mblock rbtree should now be empty */ /* Sanity checks: the mblock rbtree should now be empty */
root = &zmd->mblk_rbtree; root = &zmd->mblk_rbtree;
rbtree_postorder_for_each_entry_safe(mblk, next, root, node) { rbtree_postorder_for_each_entry_safe(mblk, next, root, node) {
dmz_dev_warn(zmd->dev, "mblock %llu ref %u still in rbtree", dmz_zmd_warn(zmd, "mblock %llu ref %u still in rbtree",
(u64)mblk->no, mblk->ref); (u64)mblk->no, mblk->ref);
mblk->ref = 0; mblk->ref = 0;
dmz_free_mblock(zmd, mblk); dmz_free_mblock(zmd, mblk);
...@@ -2455,6 +2465,19 @@ static void dmz_cleanup_metadata(struct dmz_metadata *zmd) ...@@ -2455,6 +2465,19 @@ static void dmz_cleanup_metadata(struct dmz_metadata *zmd)
mutex_destroy(&zmd->map_lock); mutex_destroy(&zmd->map_lock);
} }
static void dmz_print_dev(struct dmz_metadata *zmd, int num)
{
struct dmz_dev *dev = &zmd->dev[num];
dmz_dev_info(dev, "Host-%s zoned block device",
bdev_zoned_model(dev->bdev) == BLK_ZONED_HA ?
"aware" : "managed");
dmz_dev_info(dev, " %llu 512-byte logical sectors",
(u64)dev->capacity);
dmz_dev_info(dev, " %u zones of %llu 512-byte logical sectors",
dev->nr_zones, (u64)zmd->zone_nr_sectors);
}
/* /*
* Initialize the zoned metadata. * Initialize the zoned metadata.
*/ */
...@@ -2531,34 +2554,31 @@ int dmz_ctr_metadata(struct dmz_dev *dev, struct dmz_metadata **metadata, ...@@ -2531,34 +2554,31 @@ int dmz_ctr_metadata(struct dmz_dev *dev, struct dmz_metadata **metadata,
/* Metadata cache shrinker */ /* Metadata cache shrinker */
ret = register_shrinker(&zmd->mblk_shrinker); ret = register_shrinker(&zmd->mblk_shrinker);
if (ret) { if (ret) {
dmz_dev_err(dev, "Register metadata cache shrinker failed"); dmz_zmd_err(zmd, "Register metadata cache shrinker failed");
goto err; goto err;
} }
dmz_dev_info(dev, "Host-%s zoned block device", dmz_zmd_info(zmd, "DM-Zoned metadata version %d", DMZ_META_VER);
bdev_zoned_model(dev->bdev) == BLK_ZONED_HA ? dmz_print_dev(zmd, 0);
"aware" : "managed");
dmz_dev_info(dev, " %llu 512-byte logical sectors", dmz_zmd_info(zmd, " %u zones of %llu 512-byte logical sectors",
(u64)dev->capacity);
dmz_dev_info(dev, " %u zones of %llu 512-byte logical sectors",
zmd->nr_zones, (u64)zmd->zone_nr_sectors); zmd->nr_zones, (u64)zmd->zone_nr_sectors);
dmz_dev_info(dev, " %u metadata zones", dmz_zmd_info(zmd, " %u metadata zones",
zmd->nr_meta_zones * 2); zmd->nr_meta_zones * 2);
dmz_dev_info(dev, " %u data zones for %u chunks", dmz_zmd_info(zmd, " %u data zones for %u chunks",
zmd->nr_data_zones, zmd->nr_chunks); zmd->nr_data_zones, zmd->nr_chunks);
dmz_dev_info(dev, " %u random zones (%u unmapped)", dmz_zmd_info(zmd, " %u random zones (%u unmapped)",
zmd->nr_rnd, atomic_read(&zmd->unmap_nr_rnd)); zmd->nr_rnd, atomic_read(&zmd->unmap_nr_rnd));
dmz_dev_info(dev, " %u sequential zones (%u unmapped)", dmz_zmd_info(zmd, " %u sequential zones (%u unmapped)",
zmd->nr_seq, atomic_read(&zmd->unmap_nr_seq)); zmd->nr_seq, atomic_read(&zmd->unmap_nr_seq));
dmz_dev_info(dev, " %u reserved sequential data zones", dmz_zmd_info(zmd, " %u reserved sequential data zones",
zmd->nr_reserved_seq); zmd->nr_reserved_seq);
dmz_zmd_debug(zmd, "Format:");
dmz_dev_debug(dev, "Format:"); dmz_zmd_debug(zmd, "%u metadata blocks per set (%u max cache)",
dmz_dev_debug(dev, "%u metadata blocks per set (%u max cache)",
zmd->nr_meta_blocks, zmd->max_nr_mblks); zmd->nr_meta_blocks, zmd->max_nr_mblks);
dmz_dev_debug(dev, " %u data zone mapping blocks", dmz_zmd_debug(zmd, " %u data zone mapping blocks",
zmd->nr_map_blocks); zmd->nr_map_blocks);
dmz_dev_debug(dev, " %u bitmap blocks", dmz_zmd_debug(zmd, " %u bitmap blocks",
zmd->nr_bitmap_blocks); zmd->nr_bitmap_blocks);
*metadata = zmd; *metadata = zmd;
...@@ -2587,7 +2607,6 @@ void dmz_dtr_metadata(struct dmz_metadata *zmd) ...@@ -2587,7 +2607,6 @@ void dmz_dtr_metadata(struct dmz_metadata *zmd)
*/ */
int dmz_resume_metadata(struct dmz_metadata *zmd) int dmz_resume_metadata(struct dmz_metadata *zmd)
{ {
struct dmz_dev *dev = zmd->dev;
struct dm_zone *zone; struct dm_zone *zone;
sector_t wp_block; sector_t wp_block;
unsigned int i; unsigned int i;
...@@ -2597,20 +2616,19 @@ int dmz_resume_metadata(struct dmz_metadata *zmd) ...@@ -2597,20 +2616,19 @@ int dmz_resume_metadata(struct dmz_metadata *zmd)
for (i = 0; i < zmd->nr_zones; i++) { for (i = 0; i < zmd->nr_zones; i++) {
zone = dmz_get(zmd, i); zone = dmz_get(zmd, i);
if (!zone) { if (!zone) {
dmz_dev_err(dev, "Unable to get zone %u", i); dmz_zmd_err(zmd, "Unable to get zone %u", i);
return -EIO; return -EIO;
} }
wp_block = zone->wp_block; wp_block = zone->wp_block;
ret = dmz_update_zone(zmd, zone); ret = dmz_update_zone(zmd, zone);
if (ret) { if (ret) {
dmz_dev_err(dev, "Broken zone %u", i); dmz_zmd_err(zmd, "Broken zone %u", i);
return ret; return ret;
} }
if (dmz_is_offline(zone)) { if (dmz_is_offline(zone)) {
dmz_dev_warn(dev, "Zone %u is offline", i); dmz_zmd_warn(zmd, "Zone %u is offline", i);
continue; continue;
} }
...@@ -2618,7 +2636,7 @@ int dmz_resume_metadata(struct dmz_metadata *zmd) ...@@ -2618,7 +2636,7 @@ int dmz_resume_metadata(struct dmz_metadata *zmd)
if (!dmz_is_seq(zone)) if (!dmz_is_seq(zone))
zone->wp_block = 0; zone->wp_block = 0;
else if (zone->wp_block != wp_block) { else if (zone->wp_block != wp_block) {
dmz_dev_err(dev, "Zone %u: Invalid wp (%llu / %llu)", dmz_zmd_err(zmd, "Zone %u: Invalid wp (%llu / %llu)",
i, (u64)zone->wp_block, (u64)wp_block); i, (u64)zone->wp_block, (u64)wp_block);
zone->wp_block = wp_block; zone->wp_block = wp_block;
dmz_invalidate_blocks(zmd, zone, zone->wp_block, dmz_invalidate_blocks(zmd, zone, zone->wp_block,
......
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