public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 1/2] lightnvm: hold lock until finish the target creation
@ 2016-05-23  9:13 Wenwei Tao
  2016-05-23  9:13 ` [RFC PATCH 2/2] lightnvm: Append device name to target name Wenwei Tao
  0 siblings, 1 reply; 8+ messages in thread
From: Wenwei Tao @ 2016-05-23  9:13 UTC (permalink / raw)
  To: mb; +Cc: linux-kernel, linux-block, ww.tao0320

From: Wenwei Tao <ww.tao0320@gmail.com>

When create a target, we check whether the target is
already exist first. If the answer is no, we release
the lock and continue the creation. This cannot prevent
concurrent creation of the same target, so hold the lock
until finish the target creation.

Signed-off-by: Wenwei Tao <ww.tao0320@gmail.com>
---
Changes since v1
-rebase to for-4.8/core

 drivers/lightnvm/gennvm.c | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/drivers/lightnvm/gennvm.c b/drivers/lightnvm/gennvm.c
index c65fb67..39ff0af 100644
--- a/drivers/lightnvm/gennvm.c
+++ b/drivers/lightnvm/gennvm.c
@@ -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)
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2016-05-24 14:38 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-05-23  9:13 [PATCH v2 1/2] lightnvm: hold lock until finish the target creation Wenwei Tao
2016-05-23  9:13 ` [RFC PATCH 2/2] lightnvm: Append device name to target name Wenwei Tao
2016-05-23  9:16   ` Matias Bjørling
2016-05-23 11:05     ` Wenwei Tao
2016-05-23 12:24       ` Matias Bjørling
2016-05-23 13:31         ` Wenwei Tao
2016-05-24 14:17           ` Matias Bjørling
2016-05-24 14:38             ` Wenwei Tao

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox