Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs
[cascardo/linux.git] / drivers / lightnvm / gennvm.c
index ec9fb68..b74174c 100644 (file)
  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139,
  * USA.
  *
- * Implementation of a generic nvm manager for Open-Channel SSDs.
+ * Implementation of a general nvm manager for Open-Channel SSDs.
  */
 
 #include "gennvm.h"
 
-static int gennvm_get_area(struct nvm_dev *dev, sector_t *lba, sector_t len)
+static struct nvm_target *gen_find_target(struct gen_dev *gn, const char *name)
 {
-       struct gen_nvm *gn = dev->mp;
-       struct gennvm_area *area, *prev, *next;
+       struct nvm_target *tgt;
+
+       list_for_each_entry(tgt, &gn->targets, list)
+               if (!strcmp(name, tgt->disk->disk_name))
+                       return tgt;
+
+       return NULL;
+}
+
+static const struct block_device_operations gen_fops = {
+       .owner          = THIS_MODULE,
+};
+
+static int gen_create_tgt(struct nvm_dev *dev, struct nvm_ioctl_create *create)
+{
+       struct gen_dev *gn = dev->mp;
+       struct nvm_ioctl_create_simple *s = &create->conf.s;
+       struct request_queue *tqueue;
+       struct gendisk *tdisk;
+       struct nvm_tgt_type *tt;
+       struct nvm_target *t;
+       void *targetdata;
+
+       tt = nvm_find_target_type(create->tgttype, 1);
+       if (!tt) {
+               pr_err("nvm: target type %s not found\n", create->tgttype);
+               return -EINVAL;
+       }
+
+       mutex_lock(&gn->lock);
+       t = gen_find_target(gn, create->tgtname);
+       if (t) {
+               pr_err("nvm: target name already exists.\n");
+               mutex_unlock(&gn->lock);
+               return -EINVAL;
+       }
+       mutex_unlock(&gn->lock);
+
+       t = kmalloc(sizeof(struct nvm_target), GFP_KERNEL);
+       if (!t)
+               return -ENOMEM;
+
+       tqueue = blk_alloc_queue_node(GFP_KERNEL, dev->q->node);
+       if (!tqueue)
+               goto err_t;
+       blk_queue_make_request(tqueue, tt->make_rq);
+
+       tdisk = alloc_disk(0);
+       if (!tdisk)
+               goto err_queue;
+
+       sprintf(tdisk->disk_name, "%s", create->tgtname);
+       tdisk->flags = GENHD_FL_EXT_DEVT;
+       tdisk->major = 0;
+       tdisk->first_minor = 0;
+       tdisk->fops = &gen_fops;
+       tdisk->queue = tqueue;
+
+       targetdata = tt->init(dev, tdisk, s->lun_begin, s->lun_end);
+       if (IS_ERR(targetdata))
+               goto err_init;
+
+       tdisk->private_data = targetdata;
+       tqueue->queuedata = targetdata;
+
+       blk_queue_max_hw_sectors(tqueue, 8 * dev->ops->max_phys_sect);
+
+       set_capacity(tdisk, tt->capacity(targetdata));
+       add_disk(tdisk);
+
+       t->type = tt;
+       t->disk = tdisk;
+       t->dev = dev;
+
+       mutex_lock(&gn->lock);
+       list_add_tail(&t->list, &gn->targets);
+       mutex_unlock(&gn->lock);
+
+       return 0;
+err_init:
+       put_disk(tdisk);
+err_queue:
+       blk_cleanup_queue(tqueue);
+err_t:
+       kfree(t);
+       return -ENOMEM;
+}
+
+static void __gen_remove_target(struct nvm_target *t)
+{
+       struct nvm_tgt_type *tt = t->type;
+       struct gendisk *tdisk = t->disk;
+       struct request_queue *q = tdisk->queue;
+
+       del_gendisk(tdisk);
+       blk_cleanup_queue(q);
+
+       if (tt->exit)
+               tt->exit(tdisk->private_data);
+
+       put_disk(tdisk);
+
+       list_del(&t->list);
+       kfree(t);
+}
+
+/**
+ * gen_remove_tgt - Removes a target from the media manager
+ * @dev:       device
+ * @remove:    ioctl structure with target name to remove.
+ *
+ * Returns:
+ * 0: on success
+ * 1: on not found
+ * <0: on error
+ */
+static int gen_remove_tgt(struct nvm_dev *dev, struct nvm_ioctl_remove *remove)
+{
+       struct gen_dev *gn = dev->mp;
+       struct nvm_target *t;
+
+       if (!gn)
+               return 1;
+
+       mutex_lock(&gn->lock);
+       t = gen_find_target(gn, remove->tgtname);
+       if (!t) {
+               mutex_unlock(&gn->lock);
+               return 1;
+       }
+       __gen_remove_target(t);
+       mutex_unlock(&gn->lock);
+
+       return 0;
+}
+
+static int gen_get_area(struct nvm_dev *dev, sector_t *lba, sector_t len)
+{
+       struct gen_dev *gn = dev->mp;
+       struct gen_area *area, *prev, *next;
        sector_t begin = 0;
        sector_t max_sectors = (dev->sec_size * dev->total_secs) >> 9;
 
        if (len > max_sectors)
                return -EINVAL;
 
-       area = kmalloc(sizeof(struct gennvm_area), GFP_KERNEL);
+       area = kmalloc(sizeof(struct gen_area), GFP_KERNEL);
        if (!area)
                return -ENOMEM;
 
@@ -64,10 +202,10 @@ static int gennvm_get_area(struct nvm_dev *dev, sector_t *lba, sector_t len)
        return 0;
 }
 
-static void gennvm_put_area(struct nvm_dev *dev, sector_t begin)
+static void gen_put_area(struct nvm_dev *dev, sector_t begin)
 {
-       struct gen_nvm *gn = dev->mp;
-       struct gennvm_area *area;
+       struct gen_dev *gn = dev->mp;
+       struct gen_area *area;
 
        spin_lock(&dev->lock);
        list_for_each_entry(area, &gn->area_list, list) {
@@ -82,27 +220,27 @@ static void gennvm_put_area(struct nvm_dev *dev, sector_t begin)
        spin_unlock(&dev->lock);
 }
 
-static void gennvm_blocks_free(struct nvm_dev *dev)
+static void gen_blocks_free(struct nvm_dev *dev)
 {
-       struct gen_nvm *gn = dev->mp;
+       struct gen_dev *gn = dev->mp;
        struct gen_lun *lun;
        int i;
 
-       gennvm_for_each_lun(gn, lun, i) {
+       gen_for_each_lun(gn, lun, i) {
                if (!lun->vlun.blocks)
                        break;
                vfree(lun->vlun.blocks);
        }
 }
 
-static void gennvm_luns_free(struct nvm_dev *dev)
+static void gen_luns_free(struct nvm_dev *dev)
 {
-       struct gen_nvm *gn = dev->mp;
+       struct gen_dev *gn = dev->mp;
 
        kfree(gn->luns);
 }
 
-static int gennvm_luns_init(struct nvm_dev *dev, struct gen_nvm *gn)
+static int gen_luns_init(struct nvm_dev *dev, struct gen_dev *gn)
 {
        struct gen_lun *lun;
        int i;
@@ -111,7 +249,7 @@ static int gennvm_luns_init(struct nvm_dev *dev, struct gen_nvm *gn)
        if (!gn->luns)
                return -ENOMEM;
 
-       gennvm_for_each_lun(gn, lun, i) {
+       gen_for_each_lun(gn, lun, i) {
                spin_lock_init(&lun->vlun.lock);
                INIT_LIST_HEAD(&lun->free_list);
                INIT_LIST_HEAD(&lun->used_list);
@@ -122,14 +260,11 @@ static int gennvm_luns_init(struct nvm_dev *dev, struct gen_nvm *gn)
                lun->vlun.lun_id = i % dev->luns_per_chnl;
                lun->vlun.chnl_id = i / dev->luns_per_chnl;
                lun->vlun.nr_free_blocks = dev->blks_per_lun;
-               lun->vlun.nr_open_blocks = 0;
-               lun->vlun.nr_closed_blocks = 0;
-               lun->vlun.nr_bad_blocks = 0;
        }
        return 0;
 }
 
-static int gennvm_block_bb(struct gen_nvm *gn, struct ppa_addr ppa,
+static int gen_block_bb(struct gen_dev *gn, struct ppa_addr ppa,
                                                        u8 *blks, int nr_blks)
 {
        struct nvm_dev *dev = gn->dev;
@@ -149,17 +284,16 @@ static int gennvm_block_bb(struct gen_nvm *gn, struct ppa_addr ppa,
 
                blk = &lun->vlun.blocks[i];
                list_move_tail(&blk->list, &lun->bb_list);
-               lun->vlun.nr_bad_blocks++;
                lun->vlun.nr_free_blocks--;
        }
 
        return 0;
 }
 
-static int gennvm_block_map(u64 slba, u32 nlb, __le64 *entries, void *private)
+static int gen_block_map(u64 slba, u32 nlb, __le64 *entries, void *private)
 {
        struct nvm_dev *dev = private;
-       struct gen_nvm *gn = dev->mp;
+       struct gen_dev *gn = dev->mp;
        u64 elba = slba + nlb;
        struct gen_lun *lun;
        struct nvm_block *blk;
@@ -167,7 +301,7 @@ static int gennvm_block_map(u64 slba, u32 nlb, __le64 *entries, void *private)
        int lun_id;
 
        if (unlikely(elba > dev->total_secs)) {
-               pr_err("gennvm: L2P data from device is out of bounds!\n");
+               pr_err("gen: L2P data from device is out of bounds!\n");
                return -EINVAL;
        }
 
@@ -175,7 +309,7 @@ static int gennvm_block_map(u64 slba, u32 nlb, __le64 *entries, void *private)
                u64 pba = le64_to_cpu(entries[i]);
 
                if (unlikely(pba >= dev->total_secs && pba != U64_MAX)) {
-                       pr_err("gennvm: L2P data entry is out of bounds!\n");
+                       pr_err("gen: L2P data entry is out of bounds!\n");
                        return -EINVAL;
                }
 
@@ -200,16 +334,15 @@ static int gennvm_block_map(u64 slba, u32 nlb, __le64 *entries, void *private)
                         * block state. The block is assumed to be open.
                         */
                        list_move_tail(&blk->list, &lun->used_list);
-                       blk->state = NVM_BLK_ST_OPEN;
+                       blk->state = NVM_BLK_ST_TGT;
                        lun->vlun.nr_free_blocks--;
-                       lun->vlun.nr_open_blocks++;
                }
        }
 
        return 0;
 }
 
-static int gennvm_blocks_init(struct nvm_dev *dev, struct gen_nvm *gn)
+static int gen_blocks_init(struct nvm_dev *dev, struct gen_dev *gn)
 {
        struct gen_lun *lun;
        struct nvm_block *block;
@@ -222,7 +355,7 @@ static int gennvm_blocks_init(struct nvm_dev *dev, struct gen_nvm *gn)
        if (!blks)
                return -ENOMEM;
 
-       gennvm_for_each_lun(gn, lun, lun_iter) {
+       gen_for_each_lun(gn, lun, lun_iter) {
                lun->vlun.blocks = vzalloc(sizeof(struct nvm_block) *
                                                        dev->blks_per_lun);
                if (!lun->vlun.blocks) {
@@ -256,20 +389,20 @@ static int gennvm_blocks_init(struct nvm_dev *dev, struct gen_nvm *gn)
 
                        ret = nvm_get_bb_tbl(dev, ppa, blks);
                        if (ret)
-                               pr_err("gennvm: could not get BB table\n");
+                               pr_err("gen: could not get BB table\n");
 
-                       ret = gennvm_block_bb(gn, ppa, blks, nr_blks);
+                       ret = gen_block_bb(gn, ppa, blks, nr_blks);
                        if (ret)
-                               pr_err("gennvm: BB table map failed\n");
+                               pr_err("gen: BB table map failed\n");
                }
        }
 
        if ((dev->identity.dom & NVM_RSP_L2P) && dev->ops->get_l2p_tbl) {
                ret = dev->ops->get_l2p_tbl(dev, 0, dev->total_secs,
-                                                       gennvm_block_map, dev);
+                                                       gen_block_map, dev);
                if (ret) {
-                       pr_err("gennvm: could not read L2P table.\n");
-                       pr_warn("gennvm: default block initialization");
+                       pr_err("gen: could not read L2P table.\n");
+                       pr_warn("gen: default block initialization");
                }
        }
 
@@ -277,67 +410,79 @@ static int gennvm_blocks_init(struct nvm_dev *dev, struct gen_nvm *gn)
        return 0;
 }
 
-static void gennvm_free(struct nvm_dev *dev)
+static void gen_free(struct nvm_dev *dev)
 {
-       gennvm_blocks_free(dev);
-       gennvm_luns_free(dev);
+       gen_blocks_free(dev);
+       gen_luns_free(dev);
        kfree(dev->mp);
        dev->mp = NULL;
 }
 
-static int gennvm_register(struct nvm_dev *dev)
+static int gen_register(struct nvm_dev *dev)
 {
-       struct gen_nvm *gn;
+       struct gen_dev *gn;
        int ret;
 
        if (!try_module_get(THIS_MODULE))
                return -ENODEV;
 
-       gn = kzalloc(sizeof(struct gen_nvm), GFP_KERNEL);
+       gn = kzalloc(sizeof(struct gen_dev), GFP_KERNEL);
        if (!gn)
                return -ENOMEM;
 
        gn->dev = dev;
        gn->nr_luns = dev->nr_luns;
        INIT_LIST_HEAD(&gn->area_list);
+       mutex_init(&gn->lock);
+       INIT_LIST_HEAD(&gn->targets);
        dev->mp = gn;
 
-       ret = gennvm_luns_init(dev, gn);
+       ret = gen_luns_init(dev, gn);
        if (ret) {
-               pr_err("gennvm: could not initialize luns\n");
+               pr_err("gen: could not initialize luns\n");
                goto err;
        }
 
-       ret = gennvm_blocks_init(dev, gn);
+       ret = gen_blocks_init(dev, gn);
        if (ret) {
-               pr_err("gennvm: could not initialize blocks\n");
+               pr_err("gen: could not initialize blocks\n");
                goto err;
        }
 
        return 1;
 err:
-       gennvm_free(dev);
+       gen_free(dev);
        module_put(THIS_MODULE);
        return ret;
 }
 
-static void gennvm_unregister(struct nvm_dev *dev)
+static void gen_unregister(struct nvm_dev *dev)
 {
-       gennvm_free(dev);
+       struct gen_dev *gn = dev->mp;
+       struct nvm_target *t, *tmp;
+
+       mutex_lock(&gn->lock);
+       list_for_each_entry_safe(t, tmp, &gn->targets, list) {
+               if (t->dev != dev)
+                       continue;
+               __gen_remove_target(t);
+       }
+       mutex_unlock(&gn->lock);
+
+       gen_free(dev);
        module_put(THIS_MODULE);
 }
 
-static struct nvm_block *gennvm_get_blk_unlocked(struct nvm_dev *dev,
+static struct nvm_block *gen_get_blk(struct nvm_dev *dev,
                                struct nvm_lun *vlun, unsigned long flags)
 {
        struct gen_lun *lun = container_of(vlun, struct gen_lun, vlun);
        struct nvm_block *blk = NULL;
        int is_gc = flags & NVM_IOTYPE_GC;
 
-       assert_spin_locked(&vlun->lock);
-
+       spin_lock(&vlun->lock);
        if (list_empty(&lun->free_list)) {
-               pr_err_ratelimited("gennvm: lun %u have no free pages available",
+               pr_err_ratelimited("gen: lun %u have no free pages available",
                                                                lun->vlun.id);
                goto out;
        }
@@ -346,88 +491,58 @@ static struct nvm_block *gennvm_get_blk_unlocked(struct nvm_dev *dev,
                goto out;
 
        blk = list_first_entry(&lun->free_list, struct nvm_block, list);
-       list_move_tail(&blk->list, &lun->used_list);
-       blk->state = NVM_BLK_ST_OPEN;
 
+       list_move_tail(&blk->list, &lun->used_list);
+       blk->state = NVM_BLK_ST_TGT;
        lun->vlun.nr_free_blocks--;
-       lun->vlun.nr_open_blocks++;
-
 out:
-       return blk;
-}
-
-static struct nvm_block *gennvm_get_blk(struct nvm_dev *dev,
-                               struct nvm_lun *vlun, unsigned long flags)
-{
-       struct nvm_block *blk;
-
-       spin_lock(&vlun->lock);
-       blk = gennvm_get_blk_unlocked(dev, vlun, flags);
        spin_unlock(&vlun->lock);
        return blk;
 }
 
-static void gennvm_put_blk_unlocked(struct nvm_dev *dev, struct nvm_block *blk)
+static void gen_put_blk(struct nvm_dev *dev, struct nvm_block *blk)
 {
        struct nvm_lun *vlun = blk->lun;
        struct gen_lun *lun = container_of(vlun, struct gen_lun, vlun);
 
-       assert_spin_locked(&vlun->lock);
-
-       if (blk->state & NVM_BLK_ST_OPEN) {
-               list_move_tail(&blk->list, &lun->free_list);
-               lun->vlun.nr_open_blocks--;
-               lun->vlun.nr_free_blocks++;
-               blk->state = NVM_BLK_ST_FREE;
-       } else if (blk->state & NVM_BLK_ST_CLOSED) {
+       spin_lock(&vlun->lock);
+       if (blk->state & NVM_BLK_ST_TGT) {
                list_move_tail(&blk->list, &lun->free_list);
-               lun->vlun.nr_closed_blocks--;
                lun->vlun.nr_free_blocks++;
                blk->state = NVM_BLK_ST_FREE;
        } else if (blk->state & NVM_BLK_ST_BAD) {
                list_move_tail(&blk->list, &lun->bb_list);
-               lun->vlun.nr_bad_blocks++;
                blk->state = NVM_BLK_ST_BAD;
        } else {
                WARN_ON_ONCE(1);
-               pr_err("gennvm: erroneous block type (%lu -> %u)\n",
+               pr_err("gen: erroneous block type (%lu -> %u)\n",
                                                        blk->id, blk->state);
                list_move_tail(&blk->list, &lun->bb_list);
-               lun->vlun.nr_bad_blocks++;
-               blk->state = NVM_BLK_ST_BAD;
        }
-}
-
-static void gennvm_put_blk(struct nvm_dev *dev, struct nvm_block *blk)
-{
-       struct nvm_lun *vlun = blk->lun;
-
-       spin_lock(&vlun->lock);
-       gennvm_put_blk_unlocked(dev, blk);
        spin_unlock(&vlun->lock);
 }
 
-static void gennvm_mark_blk(struct nvm_dev *dev, struct ppa_addr ppa, int type)
+static void gen_mark_blk(struct nvm_dev *dev, struct ppa_addr ppa, int type)
 {
-       struct gen_nvm *gn = dev->mp;
+       struct gen_dev *gn = dev->mp;
        struct gen_lun *lun;
        struct nvm_block *blk;
 
-       pr_debug("gennvm: ppa  (ch: %u lun: %u blk: %u pg: %u) -> %u\n",
+       pr_debug("gen: ppa  (ch: %u lun: %u blk: %u pg: %u) -> %u\n",
                        ppa.g.ch, ppa.g.lun, ppa.g.blk, ppa.g.pg, type);
 
        if (unlikely(ppa.g.ch > dev->nr_chnls ||
                                        ppa.g.lun > dev->luns_per_chnl ||
                                        ppa.g.blk > dev->blks_per_lun)) {
                WARN_ON_ONCE(1);
-               pr_err("gennvm: ppa broken (ch: %u > %u lun: %u > %u blk: %u > %u",
+               pr_err("gen: ppa broken (ch: %u > %u lun: %u > %u blk: %u > %u",
                                ppa.g.ch, dev->nr_chnls,
                                ppa.g.lun, dev->luns_per_chnl,
                                ppa.g.blk, dev->blks_per_lun);
                return;
        }
 
-       lun = &gn->luns[ppa.g.lun * ppa.g.ch];
+       lun = &gn->luns[(dev->luns_per_chnl * ppa.g.ch) + ppa.g.lun];
        blk = &lun->vlun.blocks[ppa.g.blk];
 
        /* will be moved to bb list on put_blk from target */
@@ -435,9 +550,9 @@ static void gennvm_mark_blk(struct nvm_dev *dev, struct ppa_addr ppa, int type)
 }
 
 /*
- * mark block bad in gennvm. It is expected that the target recovers separately
+ * mark block bad in gen. It is expected that the target recovers separately
  */
-static void gennvm_mark_blk_bad(struct nvm_dev *dev, struct nvm_rq *rqd)
+static void gen_mark_blk_bad(struct nvm_dev *dev, struct nvm_rq *rqd)
 {
        int bit = -1;
        int max_secs = dev->ops->max_phys_sect;
@@ -447,25 +562,25 @@ static void gennvm_mark_blk_bad(struct nvm_dev *dev, struct nvm_rq *rqd)
 
        /* look up blocks and mark them as bad */
        if (rqd->nr_ppas == 1) {
-               gennvm_mark_blk(dev, rqd->ppa_addr, NVM_BLK_ST_BAD);
+               gen_mark_blk(dev, rqd->ppa_addr, NVM_BLK_ST_BAD);
                return;
        }
 
        while ((bit = find_next_bit(comp_bits, max_secs, bit + 1)) < max_secs)
-               gennvm_mark_blk(dev, rqd->ppa_list[bit], NVM_BLK_ST_BAD);
+               gen_mark_blk(dev, rqd->ppa_list[bit], NVM_BLK_ST_BAD);
 }
 
-static void gennvm_end_io(struct nvm_rq *rqd)
+static void gen_end_io(struct nvm_rq *rqd)
 {
        struct nvm_tgt_instance *ins = rqd->ins;
 
        if (rqd->error == NVM_RSP_ERR_FAILWRITE)
-               gennvm_mark_blk_bad(rqd->dev, rqd);
+               gen_mark_blk_bad(rqd->dev, rqd);
 
        ins->tt->end_io(rqd);
 }
 
-static int gennvm_submit_io(struct nvm_dev *dev, struct nvm_rq *rqd)
+static int gen_submit_io(struct nvm_dev *dev, struct nvm_rq *rqd)
 {
        if (!dev->ops->submit_io)
                return -ENODEV;
@@ -474,11 +589,11 @@ static int gennvm_submit_io(struct nvm_dev *dev, struct nvm_rq *rqd)
        nvm_generic_to_addr_mode(dev, rqd);
 
        rqd->dev = dev;
-       rqd->end_io = gennvm_end_io;
+       rqd->end_io = gen_end_io;
        return dev->ops->submit_io(dev, rqd);
 }
 
-static int gennvm_erase_blk(struct nvm_dev *dev, struct nvm_block *blk,
+static int gen_erase_blk(struct nvm_dev *dev, struct nvm_block *blk,
                                                        unsigned long flags)
 {
        struct ppa_addr addr = block_to_ppa(dev, blk);
@@ -486,19 +601,19 @@ static int gennvm_erase_blk(struct nvm_dev *dev, struct nvm_block *blk,
        return nvm_erase_ppa(dev, &addr, 1);
 }
 
-static int gennvm_reserve_lun(struct nvm_dev *dev, int lunid)
+static int gen_reserve_lun(struct nvm_dev *dev, int lunid)
 {
        return test_and_set_bit(lunid, dev->lun_map);
 }
 
-static void gennvm_release_lun(struct nvm_dev *dev, int lunid)
+static void gen_release_lun(struct nvm_dev *dev, int lunid)
 {
        WARN_ON(!test_and_clear_bit(lunid, dev->lun_map));
 }
 
-static struct nvm_lun *gennvm_get_lun(struct nvm_dev *dev, int lunid)
+static struct nvm_lun *gen_get_lun(struct nvm_dev *dev, int lunid)
 {
-       struct gen_nvm *gn = dev->mp;
+       struct gen_dev *gn = dev->mp;
 
        if (unlikely(lunid >= dev->nr_luns))
                return NULL;
@@ -506,66 +621,62 @@ static struct nvm_lun *gennvm_get_lun(struct nvm_dev *dev, int lunid)
        return &gn->luns[lunid].vlun;
 }
 
-static void gennvm_lun_info_print(struct nvm_dev *dev)
+static void gen_lun_info_print(struct nvm_dev *dev)
 {
-       struct gen_nvm *gn = dev->mp;
+       struct gen_dev *gn = dev->mp;
        struct gen_lun *lun;
        unsigned int i;
 
 
-       gennvm_for_each_lun(gn, lun, i) {
+       gen_for_each_lun(gn, lun, i) {
                spin_lock(&lun->vlun.lock);
 
-               pr_info("%s: lun%8u\t%u\t%u\t%u\t%u\n",
-                               dev->name, i,
-                               lun->vlun.nr_free_blocks,
-                               lun->vlun.nr_open_blocks,
-                               lun->vlun.nr_closed_blocks,
-                               lun->vlun.nr_bad_blocks);
+               pr_info("%s: lun%8u\t%u\n", dev->name, i,
+                                               lun->vlun.nr_free_blocks);
 
                spin_unlock(&lun->vlun.lock);
        }
 }
 
-static struct nvmm_type gennvm = {
+static struct nvmm_type gen = {
        .name                   = "gennvm",
        .version                = {0, 1, 0},
 
-       .register_mgr           = gennvm_register,
-       .unregister_mgr         = gennvm_unregister,
+       .register_mgr           = gen_register,
+       .unregister_mgr         = gen_unregister,
 
-       .get_blk_unlocked       = gennvm_get_blk_unlocked,
-       .put_blk_unlocked       = gennvm_put_blk_unlocked,
+       .create_tgt             = gen_create_tgt,
+       .remove_tgt             = gen_remove_tgt,
 
-       .get_blk                = gennvm_get_blk,
-       .put_blk                = gennvm_put_blk,
+       .get_blk                = gen_get_blk,
+       .put_blk                = gen_put_blk,
 
-       .submit_io              = gennvm_submit_io,
-       .erase_blk              = gennvm_erase_blk,
+       .submit_io              = gen_submit_io,
+       .erase_blk              = gen_erase_blk,
 
-       .mark_blk               = gennvm_mark_blk,
+       .mark_blk               = gen_mark_blk,
 
-       .get_lun                = gennvm_get_lun,
-       .reserve_lun            = gennvm_reserve_lun,
-       .release_lun            = gennvm_release_lun,
-       .lun_info_print         = gennvm_lun_info_print,
+       .get_lun                = gen_get_lun,
+       .reserve_lun            = gen_reserve_lun,
+       .release_lun            = gen_release_lun,
+       .lun_info_print         = gen_lun_info_print,
 
-       .get_area               = gennvm_get_area,
-       .put_area               = gennvm_put_area,
+       .get_area               = gen_get_area,
+       .put_area               = gen_put_area,
 
 };
 
-static int __init gennvm_module_init(void)
+static int __init gen_module_init(void)
 {
-       return nvm_register_mgr(&gennvm);
+       return nvm_register_mgr(&gen);
 }
 
-static void gennvm_module_exit(void)
+static void gen_module_exit(void)
 {
-       nvm_unregister_mgr(&gennvm);
+       nvm_unregister_mgr(&gen);
 }
 
-module_init(gennvm_module_init);
-module_exit(gennvm_module_exit);
+module_init(gen_module_init);
+module_exit(gen_module_exit);
 MODULE_LICENSE("GPL v2");
-MODULE_DESCRIPTION("Generic media manager for Open-Channel SSDs");
+MODULE_DESCRIPTION("General media manager for Open-Channel SSDs");