All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Matias Bjørling" <mb@lightnvm.io>
To: Wenwei Tao <ww.tao0320@gmail.com>, jg@lightnvm.io
Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org
Subject: Re: [PATCH 3/3] lightnvm: export per lun information to user
Date: Mon, 21 Mar 2016 11:27:36 +0100	[thread overview]
Message-ID: <56EFCC98.9030503@lightnvm.io> (raw)
In-Reply-To: <1458406738-4828-3-git-send-email-ww.tao0320@gmail.com>

On 03/19/2016 05:58 PM, Wenwei Tao wrote:
> Export per lun information to user, let the user
> know more detail information about underlying device.
>
> Signed-off-by: Wenwei Tao <ww.tao0320@gmail.com>
> ---
>   drivers/lightnvm/core.c       | 59 ++++++++++++++++++++++++++++++++++++++++++-
>   drivers/lightnvm/gennvm.c     | 34 +++++++++++++++++++++++++
>   include/linux/lightnvm.h      |  3 +++
>   include/uapi/linux/lightnvm.h | 23 +++++++++++++++++
>   4 files changed, 118 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c
> index 84bc72d..7701eab 100644
> --- a/drivers/lightnvm/core.c
> +++ b/drivers/lightnvm/core.c
> @@ -28,7 +28,6 @@
>   #include <linux/miscdevice.h>
>   #include <linux/lightnvm.h>
>   #include <linux/sched/sysctl.h>
> -#include <uapi/linux/lightnvm.h>
>
>   static LIST_HEAD(nvm_targets);
>   static LIST_HEAD(nvm_mgrs);
> @@ -1041,6 +1040,62 @@ static long nvm_ioctl_dev_remove(struct file *file, void __user *arg)
>   	return __nvm_configure_remove(&remove);
>   }
>
> +static long nvm_ioctl_dev_luns_status(struct file *file, void __user *arg)
> +{
> +	struct nvm_dev *dev;
> +	struct nvm_ioctl_luns_status *status;
> +	long ret = -EINVAL;
> +
> +	if (!capable(CAP_SYS_ADMIN))
> +		return -EPERM;
> +
> +	status = kzalloc(sizeof(struct nvm_ioctl_luns_status), GFP_KERNEL);
> +	if (!status)
> +		return -ENOMEM;
> +
> +	if (copy_from_user(status, arg,
> +		sizeof(struct nvm_ioctl_luns_status))) {
> +		ret = -EFAULT;
> +		goto out;
> +	}
> +
> +	status->dev[DISK_NAME_LEN - 1] = '\0';
> +	down_write(&nvm_lock);
> +	dev = nvm_find_nvm_dev(status->dev);
> +	up_write(&nvm_lock);
> +	if (!dev) {
> +		pr_err("nvm: device not found\n");
> +		goto out;
> +	}
> +
> +	if (!dev->mt) {
> +		pr_info("nvm: device has no media manager registered.\n");
> +		ret = -ENODEV;
> +		goto out;
> +	}
> +
> +	if (status->lun_begin > status->lun_end ||
> +			status->lun_end > dev->nr_luns) {
> +		pr_err("nvm: lun out of bound (%u:%u > %u)\n",
> +			status->lun_begin, status->lun_end, dev->nr_luns);
> +		goto out;
> +	}
> +
> +	dev->mt->get_luns_status(dev, status);
> +
> +	if (copy_to_user(arg, status,
> +			 sizeof(struct nvm_ioctl_luns_status))) {
> +		ret = -EFAULT;
> +		goto out;
> +	}
> +
> +	ret = 0;
> +
> +out:
> +	kfree(status);
> +	return ret;
> +}
> +
>   static void nvm_setup_nvm_sb_info(struct nvm_sb_info *info)
>   {
>   	info->seqnr = 1;
> @@ -1150,6 +1205,8 @@ static long nvm_ctl_ioctl(struct file *file, uint cmd, unsigned long arg)
>   		return nvm_ioctl_dev_create(file, argp);
>   	case NVM_DEV_REMOVE:
>   		return nvm_ioctl_dev_remove(file, argp);
> +	case NVM_DEV_LUNS_STATUS:
> +		return nvm_ioctl_dev_luns_status(file, argp);
>   	case NVM_DEV_INIT:
>   		return nvm_ioctl_dev_init(file, argp);
>   	case NVM_DEV_FACTORY:
> diff --git a/drivers/lightnvm/gennvm.c b/drivers/lightnvm/gennvm.c
> index 72e124a..b2390f4 100644
> --- a/drivers/lightnvm/gennvm.c
> +++ b/drivers/lightnvm/gennvm.c
> @@ -502,6 +502,39 @@ static struct nvm_lun *gennvm_get_lun(struct nvm_dev *dev, int lunid)
>   	return &gn->luns[lunid].vlun;
>   }
>
> +static void gennvm_get_luns_status(struct nvm_dev *dev,
> +		struct nvm_ioctl_luns_status *status)
> +{
> +	int i, lun_begin = status->lun_begin;
> +	int nr_luns, lun_end = status->lun_end;
> +	struct gen_nvm *gn = dev->mp;
> +	struct nvm_lun_status *lun_stat;
> +	struct gen_lun *lun;
> +
> +	status->nr_luns = dev->nr_luns;
> +	nr_luns = min(lun_end - lun_begin + 1,
> +				NVM_LUNS_STATUS);
> +
> +	for (i = 0;  i < nr_luns; i++) {
> +		lun = &gn->luns[i + lun_begin];
> +		lun_stat = &status->status[i];
> +
> +		lun_stat->reserved =
> +			test_bit(i + lun_begin, dev->lun_map);
> +		lun_stat->id = lun->vlun.id;
> +		lun_stat->lun_id = lun->vlun.lun_id;
> +		lun_stat->chnl_id = lun->vlun.chnl_id;
> +		lun_stat->nr_free_blocks =
> +			lun->vlun.nr_free_blocks;
> +		lun_stat->nr_open_blocks =
> +			lun->vlun.nr_open_blocks;
> +		lun_stat->nr_closed_blocks =
> +			lun->vlun.nr_closed_blocks;
> +		lun_stat->nr_bad_blocks =
> +			lun->vlun.nr_bad_blocks;
> +	}
> +}
> +
>   static void gennvm_lun_info_print(struct nvm_dev *dev)
>   {
>   	struct gen_nvm *gn = dev->mp;
> @@ -542,6 +575,7 @@ static struct nvmm_type gennvm = {
>   	.get_lun		= gennvm_get_lun,
>   	.reserve_lun		= gennvm_reserve_lun,
>   	.release_lun		= gennvm_release_lun,
> +	.get_luns_status	= gennvm_get_luns_status,
>   	.lun_info_print		= gennvm_lun_info_print,
>
>   	.get_area		= gennvm_get_area,
> diff --git a/include/linux/lightnvm.h b/include/linux/lightnvm.h
> index b941a8c..88b95f9 100644
> --- a/include/linux/lightnvm.h
> +++ b/include/linux/lightnvm.h
> @@ -472,6 +472,8 @@ typedef int (nvmm_erase_blk_fn)(struct nvm_dev *, struct nvm_block *,
>   typedef struct nvm_lun *(nvmm_get_lun_fn)(struct nvm_dev *, int);
>   typedef int (nvmm_reserve_lun)(struct nvm_dev *, int);
>   typedef void (nvmm_release_lun)(struct nvm_dev *, int);
> +typedef void (nvmm_get_luns_status)(struct nvm_dev *,
> +				struct nvm_ioctl_luns_status *);
>   typedef void (nvmm_lun_info_print_fn)(struct nvm_dev *);
>
>   typedef int (nvmm_get_area_fn)(struct nvm_dev *, sector_t *, sector_t);
> @@ -502,6 +504,7 @@ struct nvmm_type {
>   	nvmm_release_lun *release_lun;
>
>   	/* Statistics */
> +	nvmm_get_luns_status *get_luns_status;
>   	nvmm_lun_info_print_fn *lun_info_print;
>
>   	nvmm_get_area_fn *get_area;
> diff --git a/include/uapi/linux/lightnvm.h b/include/uapi/linux/lightnvm.h
> index 6dbf6a0..2d52d6d 100644
> --- a/include/uapi/linux/lightnvm.h
> +++ b/include/uapi/linux/lightnvm.h
> @@ -36,6 +36,7 @@
>   #define NVM_MMTYPE_LEN 8
>
>   #define NVM_LUNS_MAX 768
> +#define NVM_LUNS_STATUS 64
>
>   #define NVM_CTRL_FILE "/dev/lightnvm/control"
>
> @@ -110,6 +111,25 @@ struct nvm_ioctl_remove {
>   	__u32 flags;
>   };
>
> +struct nvm_lun_status {
> +	bool reserved;
> +	__u32 id;
> +	__u32 lun_id;
> +	__u32 chnl_id;
> +	__u32 nr_open_blocks;
> +	__u32 nr_closed_blocks;
> +	__u32 nr_free_blocks;
> +	__u32 nr_bad_blocks;
> +};
> +
> +struct nvm_ioctl_luns_status {
> +	char dev[DISK_NAME_LEN];
> +	__u32 nr_luns;
> +	__u32 lun_begin;
> +	__u32 lun_end;
> +	struct nvm_lun_status status[NVM_LUNS_STATUS];
> +};
> +
>   struct nvm_ioctl_dev_init {
>   	char dev[DISK_NAME_LEN];		/* open-channel SSD device */
>   	char mmtype[NVM_MMTYPE_LEN];		/* register to media manager */
> @@ -140,6 +160,7 @@ enum {
>   	/* device level cmds */
>   	NVM_DEV_CREATE_CMD,
>   	NVM_DEV_REMOVE_CMD,
> +	NVM_DEV_LUNS_STATUS_CMD,
>
>   	/* Init a device to support LightNVM media managers */
>   	NVM_DEV_INIT_CMD,
> @@ -158,6 +179,8 @@ enum {
>   						struct nvm_ioctl_create)
>   #define NVM_DEV_REMOVE		_IOW(NVM_IOCTL, NVM_DEV_REMOVE_CMD, \
>   						struct nvm_ioctl_remove)
> +#define NVM_DEV_LUNS_STATUS	_IOW(NVM_IOCTL, NVM_DEV_LUNS_STATUS_CMD, \
> +						struct nvm_ioctl_luns_status)
>   #define NVM_DEV_INIT		_IOW(NVM_IOCTL, NVM_DEV_INIT_CMD, \
>   						struct nvm_ioctl_dev_init)
>   #define NVM_DEV_FACTORY		_IOW(NVM_IOCTL, NVM_DEV_FACTORY_CMD, \
>

I think it will be better to expose this through sysfs. There is a patch 
coming up that will add support and enable us to get the luns.

  reply	other threads:[~2016-03-21 10:27 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-19 16:58 [PATCH 1/3] lightnvm: divide global reverse translation map into per lun Wenwei Tao
2016-03-19 16:58 ` [PATCH v5 2/3] lightnvm: add non-continuous lun target creation support Wenwei Tao
2016-03-19 16:58 ` [PATCH 3/3] lightnvm: export per lun information to user Wenwei Tao
2016-03-21 10:27   ` Matias Bjørling [this message]
2016-03-22 11:28     ` Wenwei Tao
2016-03-22 20:56       ` Matias Bjørling

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=56EFCC98.9030503@lightnvm.io \
    --to=mb@lightnvm.io \
    --cc=jg@lightnvm.io \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=ww.tao0320@gmail.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.