All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Matias Bjørling" <mb@lightnvm.io>
To: "Simon A. F. Lund" <slund@cnexlabs.com>,
	linux-block@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/2] lightnvm: refactor dev->online_target to global nvm_targets
Date: Sat, 16 Apr 2016 16:20:05 +0200	[thread overview]
Message-ID: <57124A15.7060804@lightnvm.io> (raw)
In-Reply-To: <1460549734-844-3-git-send-email-slund@cnexlabs.com>

On 04/13/2016 02:15 PM, Simon A. F. Lund wrote:
> A target name must be unique. However, a per-device registration of
> targets is maintained on a dev->online_targets list, with a per-device
> search for targets upon registration.
> 
> This results in a name collision when two targets, with the same name,
> are created on two different targets, where the per-device list is not
> shared.
> 
> Signed-off-by: Simon A. F. Lund <slund@cnexlabs.com>
> ---
>  drivers/lightnvm/core.c  | 47 +++++++++++++++++++++++++----------------------
>  include/linux/lightnvm.h |  1 -
>  2 files changed, 25 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c
> index 240b473..0296223 100644
> --- a/drivers/lightnvm/core.c
> +++ b/drivers/lightnvm/core.c
> @@ -33,8 +33,20 @@
>  static LIST_HEAD(nvm_tgt_types);
>  static LIST_HEAD(nvm_mgrs);
>  static LIST_HEAD(nvm_devices);
> +static LIST_HEAD(nvm_targets);
>  static DECLARE_RWSEM(nvm_lock);
>  
> +static struct nvm_target *nvm_find_target(const char *name)
> +{
> +	struct nvm_target *tgt;
> +
> +	list_for_each_entry(tgt, &nvm_targets, list)
> +		if (!strcmp(name, tgt->disk->disk_name))
> +			return tgt;
> +
> +	return NULL;
> +}
> +
>  static struct nvm_tgt_type *nvm_find_target_type(const char *name)
>  {
>  	struct nvm_tgt_type *tt;
> @@ -564,7 +576,6 @@ static int nvm_core_init(struct nvm_dev *dev)
>  		goto err_fmtype;
>  	}
>  
> -	INIT_LIST_HEAD(&dev->online_targets);
>  	mutex_init(&dev->mlock);
>  	spin_lock_init(&dev->lock);
>  
> @@ -744,12 +755,11 @@ static int nvm_create_target(struct nvm_dev *dev,
>  		return -EINVAL;
>  	}
>  
> -	list_for_each_entry(t, &dev->online_targets, list) {
> -		if (!strcmp(create->tgtname, t->disk->disk_name)) {
> -			pr_err("nvm: target name already exists.\n");
> -			up_write(&nvm_lock);
> -			return -EINVAL;
> -		}
> +	t = nvm_find_target(create->tgtname);
> +	if (t) {
> +		pr_err("nvm: target name already exists.\n");
> +		up_write(&nvm_lock);
> +		return -EINVAL;
>  	}
>  	up_write(&nvm_lock);
>  
> @@ -789,7 +799,7 @@ static int nvm_create_target(struct nvm_dev *dev,
>  	t->disk = tdisk;
>  
>  	down_write(&nvm_lock);
> -	list_add_tail(&t->list, &dev->online_targets);
> +	list_add_tail(&t->list, &nvm_targets);
>  	up_write(&nvm_lock);
>  
>  	return 0;
> @@ -852,26 +862,19 @@ static int __nvm_configure_create(struct nvm_ioctl_create *create)
>  
>  static int __nvm_configure_remove(struct nvm_ioctl_remove *remove)
>  {
> -	struct nvm_target *t = NULL;
> -	struct nvm_dev *dev;
> -	int ret = -1;
> +	struct nvm_target *t;
>  
>  	down_write(&nvm_lock);
> -	list_for_each_entry(dev, &nvm_devices, devices)
> -		list_for_each_entry(t, &dev->online_targets, list) {
> -			if (!strcmp(remove->tgtname, t->disk->disk_name)) {
> -				nvm_remove_target(t);
> -				ret = 0;
> -				break;
> -			}
> -		}
> -	up_write(&nvm_lock);
> -
> -	if (ret) {
> +	t = nvm_find_target(remove->tgtname);
> +	if (!t) {
>  		pr_err("nvm: target \"%s\" doesn't exist.\n", remove->tgtname);
> +		up_write(&nvm_lock);
>  		return -EINVAL;
>  	}
>  
> +	nvm_remove_target(t);
> +	up_write(&nvm_lock);
> +
>  	return 0;
>  }
>  
> diff --git a/include/linux/lightnvm.h b/include/linux/lightnvm.h
> index 497da91..5eabdba 100644
> --- a/include/linux/lightnvm.h
> +++ b/include/linux/lightnvm.h
> @@ -308,7 +308,6 @@ struct nvm_dev {
>  	struct nvm_dev_ops *ops;
>  
>  	struct list_head devices;
> -	struct list_head online_targets;
>  
>  	/* Media manager */
>  	struct nvmm_type *mt;
> 

Thanks. Applied for 4.7.

      reply	other threads:[~2016-04-16 14:20 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-13 12:15 [PATCH 0/2] lightnvm: preparation patches for sysfs Simon A. F. Lund
2016-04-13 12:15 ` [PATCH 1/2] lightnvm: rename nvm_targets to nvm_tgt_type Simon A. F. Lund
2016-04-16 14:19   ` Matias Bjørling
2016-04-13 12:15 ` [PATCH 2/2] lightnvm: refactor dev->online_target to global nvm_targets Simon A. F. Lund
2016-04-16 14:20   ` Matias Bjørling [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=57124A15.7060804@lightnvm.io \
    --to=mb@lightnvm.io \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=slund@cnexlabs.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.