/*
  * Various accessors
  */
-unsigned int dmz_id(struct dmz_metadata *zmd, struct dm_zone *zone)
-{
-       return ((unsigned int)(zone - zmd->zones));
-}
-
 sector_t dmz_start_sect(struct dmz_metadata *zmd, struct dm_zone *zone)
 {
-       return (sector_t)dmz_id(zmd, zone) << zmd->dev->zone_nr_sectors_shift;
+       return (sector_t)zone->id << zmd->dev->zone_nr_sectors_shift;
 }
 
 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)zone->id << zmd->dev->zone_nr_blocks_shift;
 }
 
 unsigned int dmz_nr_zones(struct dmz_metadata *zmd)
 
        INIT_LIST_HEAD(&zone->link);
        atomic_set(&zone->refcount, 0);
+       zone->id = idx;
        zone->chunk = DMZ_MAP_UNMAPPED;
 
        switch (blkz->type) {
                ret = -EIO;
        if (ret < 0) {
                dmz_dev_err(zmd->dev, "Get zone %u report failed",
-                           dmz_id(zmd, zone));
+                           zone->id);
                dmz_check_bdev(zmd->dev);
                return ret;
        }
                return ret;
 
        dmz_dev_warn(zmd->dev, "Processing zone %u write error (zone wp %u/%u)",
-                    dmz_id(zmd, zone), zone->wp_block, wp);
+                    zone->id, zone->wp_block, wp);
 
        if (zone->wp_block < wp) {
                dmz_invalidate_blocks(zmd, zone, zone->wp_block,
                                       dev->zone_nr_sectors, GFP_NOIO);
                if (ret) {
                        dmz_dev_err(dev, "Reset zone %u failed %d",
-                                   dmz_id(zmd, zone), ret);
+                                   zone->id, ret);
                        return ret;
                }
        }
        }
 
        /* Update the chunk mapping */
-       dmz_set_chunk_mapping(zmd, dzone->chunk, dmz_id(zmd, dzone),
-                             dmz_id(zmd, bzone));
+       dmz_set_chunk_mapping(zmd, dzone->chunk, dzone->id, bzone->id);
 
        set_bit(DMZ_BUF, &bzone->flags);
        bzone->chunk = dzone->chunk;
                atomic_dec(&zmd->unmap_nr_seq);
 
        if (dmz_is_offline(zone)) {
-               dmz_dev_warn(zmd->dev, "Zone %u is offline", dmz_id(zmd, zone));
+               dmz_dev_warn(zmd->dev, "Zone %u is offline", zone->id);
                zone = NULL;
                goto again;
        }
                  unsigned int chunk)
 {
        /* Set the chunk mapping */
-       dmz_set_chunk_mapping(zmd, chunk, dmz_id(zmd, dzone),
+       dmz_set_chunk_mapping(zmd, chunk, dzone->id,
                              DMZ_MAP_UNMAPPED);
        dzone->chunk = chunk;
        if (dmz_is_rnd(dzone))
                 * Unmapping the chunk buffer zone: clear only
                 * the chunk buffer mapping
                 */
-               dzone_id = dmz_id(zmd, zone->bzone);
+               dzone_id = zone->bzone->id;
                zone->bzone->bzone = NULL;
                zone->bzone = NULL;
 
                                         sector_t chunk_block)
 {
        sector_t bitmap_block = 1 + zmd->nr_map_blocks +
-               (sector_t)(dmz_id(zmd, zone) * zmd->zone_nr_bitmap_blocks) +
+               (sector_t)(zone->id * zmd->zone_nr_bitmap_blocks) +
                (chunk_block >> DMZ_BLOCK_SHIFT_BITS);
 
        return dmz_get_mblock(zmd, bitmap_block);
        unsigned int n = 0;
 
        dmz_dev_debug(zmd->dev, "=> VALIDATE zone %u, block %llu, %u blocks",
-                     dmz_id(zmd, zone), (unsigned long long)chunk_block,
+                     zone->id, (unsigned long long)chunk_block,
                      nr_blocks);
 
        WARN_ON(chunk_block + nr_blocks > zone_nr_blocks);
                zone->weight += n;
        else {
                dmz_dev_warn(zmd->dev, "Zone %u: weight %u should be <= %u",
-                            dmz_id(zmd, zone), zone->weight,
+                            zone->id, zone->weight,
                             zone_nr_blocks - n);
                zone->weight = zone_nr_blocks;
        }
        unsigned int n = 0;
 
        dmz_dev_debug(zmd->dev, "=> INVALIDATE zone %u, block %llu, %u blocks",
-                     dmz_id(zmd, zone), (u64)chunk_block, nr_blocks);
+                     zone->id, (u64)chunk_block, nr_blocks);
 
        WARN_ON(chunk_block + nr_blocks > zmd->dev->zone_nr_blocks);
 
                zone->weight -= n;
        else {
                dmz_dev_warn(zmd->dev, "Zone %u: weight %u should be >= %u",
-                            dmz_id(zmd, zone), zone->weight, n);
+                            zone->id, zone->weight, n);
                zone->weight = 0;
        }
 
 int dmz_ctr_metadata(struct dmz_dev *dev, struct dmz_metadata **metadata)
 {
        struct dmz_metadata *zmd;
-       unsigned int i, zid;
+       unsigned int i;
        struct dm_zone *zone;
        int ret;
 
                goto err;
 
        /* Set metadata zones starting from sb_zone */
-       zid = dmz_id(zmd, zmd->sb_zone);
        for (i = 0; i < zmd->nr_meta_zones << 1; i++) {
-               zone = dmz_get(zmd, zid + i);
+               zone = dmz_get(zmd, zmd->sb_zone->id + i);
                if (!dmz_is_rnd(zone))
                        goto err;
                set_bit(DMZ_META, &zone->flags);
 
        if (ret) {
                dmz_dev_err(zrc->dev,
                            "Align zone %u wp %llu to %llu (wp+%u) blocks failed %d",
-                           dmz_id(zmd, zone), (unsigned long long)wp_block,
+                           zone->id, (unsigned long long)wp_block,
                            (unsigned long long)block, nr_blocks, ret);
                dmz_check_bdev(zrc->dev);
                return ret;
 
        dmz_dev_debug(zrc->dev,
                      "Chunk %u, move buf zone %u (weight %u) to data zone %u (weight %u)",
-                     dzone->chunk, dmz_id(zmd, bzone), dmz_weight(bzone),
-                     dmz_id(zmd, dzone), dmz_weight(dzone));
+                     dzone->chunk, bzone->id, dmz_weight(bzone),
+                     dzone->id, dmz_weight(dzone));
 
        /* Flush data zone into the buffer zone */
        ret = dmz_reclaim_copy(zrc, bzone, dzone);
 
        dmz_dev_debug(zrc->dev,
                      "Chunk %u, move data zone %u (weight %u) to buf zone %u (weight %u)",
-                     chunk, dmz_id(zmd, dzone), dmz_weight(dzone),
-                     dmz_id(zmd, bzone), dmz_weight(bzone));
+                     chunk, dzone->id, dmz_weight(dzone),
+                     bzone->id, dmz_weight(bzone));
 
        /* Flush data zone into the buffer zone */
        ret = dmz_reclaim_copy(zrc, dzone, bzone);
 
        dmz_dev_debug(zrc->dev,
                      "Chunk %u, move rnd zone %u (weight %u) to seq zone %u",
-                     chunk, dmz_id(zmd, dzone), dmz_weight(dzone),
-                     dmz_id(zmd, szone));
+                     chunk, dzone->id, dmz_weight(dzone), szone->id);
 
        /* Flush the random data zone into the sequential zone */
        ret = dmz_reclaim_copy(zrc, dzone, szone);
        if (ret) {
                dmz_dev_debug(zrc->dev,
                              "Metadata flush for zone %u failed, err %d\n",
-                             dmz_id(zmd, rzone), ret);
+                             rzone->id, ret);
                return ret;
        }
 
        dmz_dev_debug(zrc->dev, "Reclaimed zone %u in %u ms",
-                     dmz_id(zmd, rzone), jiffies_to_msecs(jiffies - start));
+                     rzone->id, jiffies_to_msecs(jiffies - start));
        return 0;
 }
 
 
        dmz_dev_debug(dmz->dev, "READ chunk %llu -> %s zone %u, block %llu, %u blocks",
                      (unsigned long long)dmz_bio_chunk(dmz->dev, bio),
                      (dmz_is_rnd(zone) ? "RND" : "SEQ"),
-                     dmz_id(dmz->metadata, zone),
+                     zone->id,
                      (unsigned long long)chunk_block, nr_blocks);
 
        /* Check block validity to determine the read location */
        dmz_dev_debug(dmz->dev, "WRITE chunk %llu -> %s zone %u, block %llu, %u blocks",
                      (unsigned long long)dmz_bio_chunk(dmz->dev, bio),
                      (dmz_is_rnd(zone) ? "RND" : "SEQ"),
-                     dmz_id(dmz->metadata, zone),
+                     zone->id,
                      (unsigned long long)chunk_block, nr_blocks);
 
        if (dmz_is_rnd(zone) || chunk_block == zone->wp_block) {
 
        dmz_dev_debug(dmz->dev, "DISCARD chunk %llu -> zone %u, block %llu, %u blocks",
                      (unsigned long long)dmz_bio_chunk(dmz->dev, bio),
-                     dmz_id(zmd, zone),
+                     zone->id,
                      (unsigned long long)chunk_block, nr_blocks);
 
        /*