]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/lightnvm/core.c
Merge branches 'for-4.11/upstream-fixes', 'for-4.12/accutouch', 'for-4.12/cp2112...
[mirror_ubuntu-artful-kernel.git] / drivers / lightnvm / core.c
index 0842c85d3b846180166b2681abac718919ccfcc4..5262ba66a7a74c94d91d2c5815eb5bf19f2c62a2 100644 (file)
@@ -289,6 +289,9 @@ static int nvm_create_tgt(struct nvm_dev *dev, struct nvm_ioctl_create *create)
        set_capacity(tdisk, tt->capacity(targetdata));
        add_disk(tdisk);
 
+       if (tt->sysfs_init && tt->sysfs_init(tdisk))
+               goto err_sysfs;
+
        t->type = tt;
        t->disk = tdisk;
        t->dev = tgt_dev;
@@ -298,12 +301,15 @@ static int nvm_create_tgt(struct nvm_dev *dev, struct nvm_ioctl_create *create)
        mutex_unlock(&dev->mlock);
 
        return 0;
+err_sysfs:
+       if (tt->exit)
+               tt->exit(targetdata);
 err_init:
        put_disk(tdisk);
 err_queue:
        blk_cleanup_queue(tqueue);
 err_dev:
-       kfree(tgt_dev);
+       nvm_remove_tgt_dev(tgt_dev);
 err_t:
        kfree(t);
 err_reserve:
@@ -320,6 +326,9 @@ static void __nvm_remove_target(struct nvm_target *t)
        del_gendisk(tdisk);
        blk_cleanup_queue(q);
 
+       if (tt->sysfs_exit)
+               tt->sysfs_exit(tdisk);
+
        if (tt->exit)
                tt->exit(tdisk->private_data);
 
@@ -773,17 +782,16 @@ void nvm_free_rqd_ppalist(struct nvm_dev *dev, struct nvm_rq *rqd)
 }
 EXPORT_SYMBOL(nvm_free_rqd_ppalist);
 
-void nvm_end_io(struct nvm_rq *rqd, int error)
+void nvm_end_io(struct nvm_rq *rqd)
 {
        struct nvm_tgt_dev *tgt_dev = rqd->dev;
-       struct nvm_tgt_instance *ins = rqd->ins;
 
        /* Convert address space */
        if (tgt_dev)
                nvm_rq_dev_to_tgt(tgt_dev, rqd);
 
-       rqd->error = error;
-       ins->tt->end_io(rqd);
+       if (rqd->end_io)
+               rqd->end_io(rqd);
 }
 EXPORT_SYMBOL(nvm_end_io);
 
@@ -884,7 +892,7 @@ static int nvm_init_mlc_tbl(struct nvm_dev *dev, struct nvm_id_group *grp)
 static int nvm_core_init(struct nvm_dev *dev)
 {
        struct nvm_id *id = &dev->identity;
-       struct nvm_id_group *grp = &id->groups[0];
+       struct nvm_id_group *grp = &id->grp;
        struct nvm_geo *geo = &dev->geo;
        int ret;
 
@@ -988,20 +996,14 @@ static int nvm_init(struct nvm_dev *dev)
                goto err;
        }
 
-       pr_debug("nvm: ver:%x nvm_vendor:%x groups:%u\n",
-                       dev->identity.ver_id, dev->identity.vmnt,
-                                                       dev->identity.cgrps);
+       pr_debug("nvm: ver:%x nvm_vendor:%x\n",
+                       dev->identity.ver_id, dev->identity.vmnt);
 
        if (dev->identity.ver_id != 1) {
                pr_err("nvm: device not supported by kernel.");
                goto err;
        }
 
-       if (dev->identity.cgrps != 1) {
-               pr_err("nvm: only one group configuration supported.");
-               goto err;
-       }
-
        ret = nvm_core_init(dev);
        if (ret) {
                pr_err("nvm: could not initialize core structures.\n");
@@ -1100,9 +1102,14 @@ static int __nvm_configure_create(struct nvm_ioctl_create *create)
        }
        s = &create->conf.s;
 
-       if (s->lun_begin > s->lun_end || s->lun_end > dev->geo.nr_luns) {
+       if (s->lun_begin == -1 && s->lun_end == -1) {
+               s->lun_begin = 0;
+               s->lun_end = dev->geo.nr_luns - 1;
+       }
+
+       if (s->lun_begin > s->lun_end || s->lun_end >= dev->geo.nr_luns) {
                pr_err("nvm: lun out of bound (%u:%u > %u)\n",
-                       s->lun_begin, s->lun_end, dev->geo.nr_luns);
+                       s->lun_begin, s->lun_end, dev->geo.nr_luns - 1);
                return -EINVAL;
        }