@@ -44,6 +44,7 @@ static int gen_create_tgt(struct nvm_dev *dev, struct nvm_ioctl_create *create)
struct nvm_tgt_type *tt;
struct nvm_target *t;
void *targetdata;
+ int ret = -ENOMEM;
tt = nvm_find_target_type(create->tgttype, 1);
if (!tt) {
@@ -55,14 +56,13 @@ static int gen_create_tgt(struct nvm_dev *dev, struct nvm_ioctl_create *create)
t = gen_find_target(gn, create->tgtname);
if (t) {
pr_err("nvm: target name already exists.\n");
- mutex_unlock(&gn->lock);
- return -EINVAL;
+ ret = -EINVAL;
+ goto err_unlock;
}
- mutex_unlock(&gn->lock);
t = kmalloc(sizeof(struct nvm_target), GFP_KERNEL);
if (!t)
- return -ENOMEM;
+ goto err_unlock;
tqueue = blk_alloc_queue_node(GFP_KERNEL, dev->q->node);
if (!tqueue)
@@ -95,8 +95,6 @@ static int gen_create_tgt(struct nvm_dev *dev, struct nvm_ioctl_create *create)
t->type = tt;
t->disk = tdisk;
t->dev = dev;
-
- mutex_lock(&gn->lock);
list_add_tail(&t->list, &gn->targets);
mutex_unlock(&gn->lock);
@@ -107,7 +105,9 @@ err_queue:
blk_cleanup_queue(tqueue);
err_t:
kfree(t);
- return -ENOMEM;
+err_unlock:
+ mutex_unlock(&gn->lock);
+ return ret;
}
static void __gen_remove_target(struct nvm_target *t)