From: yangds.fnst@cn.fujitsu.com (Dongsheng Yang)
Subject: [PATCH v7 1/5] lightnvm: Support for Open-Channel SSDs
Date: Fri, 4 Sep 2015 16:27:11 +0800 [thread overview]
Message-ID: <55E955DF.5020303@cn.fujitsu.com> (raw)
In-Reply-To: <55E950BA.50203@bjorling.me>
On 09/04/2015 04:05 PM, Matias Bj?rling wrote:
>>
>> So here is a suggestion, register_bm again
>> if we found nvm_dev->bm == NULL in create_target(). And if it is still
>> NULL after that. return an error "nvm: no compatible bm was found"
>> and stop target creating. Otherwise, there would be a NULL Pointer
>> reference problem.
>>
>> That's a real problem I met in my testing and I did this change
>> in my local using. I hope that's useful to you.
>>
> Hi Yang,
> ac
> Similar to this?
Okey, I attached two changes in my local using. I hope that
useful to you.
Yang
>
> diff --git i/drivers/lightnvm/core.c w/drivers/lightnvm/core.c
> index 5e4c2b8..0d2e5e3 100644
> --- i/drivers/lightnvm/core.c
> +++ w/drivers/lightnvm/core.c
> @@ -262,8 +262,9 @@ int nvm_init(struct nvm_dev *dev)
> }
>
> if (!ret) {
> - pr_info("nvm: no compatible bm was found.\n");
> - return 0;
> + pr_info("nvm: %s was not initialized due to no
> compatible bm.\n",
> + dev->name);
> + return -EINVAL;
> }
>
> pr_info("nvm: registered %s with luns: %u blocks: %lu sector
> size: %d\n",
>
>
>
> .
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0002-lightNVM-register-bm-in-nvm_create_target-if-dev-bm-.patch
Type: text/x-patch
Size: 1558 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-nvme/attachments/20150904/62365bf4/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-lightNVM-fix-a-compatibility-problem-in-compiling.patch
Type: text/x-patch
Size: 5428 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-nvme/attachments/20150904/62365bf4/attachment-0001.bin>
WARNING: multiple messages have this Message-ID (diff)
From: Dongsheng Yang <yangds.fnst@cn.fujitsu.com>
To: "Matias Bjørling" <m@bjorling.me>,
hch@infradead.org, axboe@fb.com, linux-fsdevel@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-nvme@lists.infradead.org
Cc: jg@lightnvm.io, Stephen.Bates@pmcs.com, keith.busch@intel.com,
"Matias Bjørling" <mb@lightnvm.io>
Subject: Re: [PATCH v7 1/5] lightnvm: Support for Open-Channel SSDs
Date: Fri, 4 Sep 2015 16:27:11 +0800 [thread overview]
Message-ID: <55E955DF.5020303@cn.fujitsu.com> (raw)
In-Reply-To: <55E950BA.50203@bjorling.me>
[-- Attachment #1: Type: text/plain, Size: 1237 bytes --]
On 09/04/2015 04:05 PM, Matias Bjørling wrote:
>>
>> So here is a suggestion, register_bm again
>> if we found nvm_dev->bm == NULL in create_target(). And if it is still
>> NULL after that. return an error "nvm: no compatible bm was found"
>> and stop target creating. Otherwise, there would be a NULL Pointer
>> reference problem.
>>
>> That's a real problem I met in my testing and I did this change
>> in my local using. I hope that's useful to you.
>>
> Hi Yang,
> ac
> Similar to this?
Okey, I attached two changes in my local using. I hope that
useful to you.
Yang
>
> diff --git i/drivers/lightnvm/core.c w/drivers/lightnvm/core.c
> index 5e4c2b8..0d2e5e3 100644
> --- i/drivers/lightnvm/core.c
> +++ w/drivers/lightnvm/core.c
> @@ -262,8 +262,9 @@ int nvm_init(struct nvm_dev *dev)
> }
>
> if (!ret) {
> - pr_info("nvm: no compatible bm was found.\n");
> - return 0;
> + pr_info("nvm: %s was not initialized due to no
> compatible bm.\n",
> + dev->name);
> + return -EINVAL;
> }
>
> pr_info("nvm: registered %s with luns: %u blocks: %lu sector
> size: %d\n",
>
>
>
> .
>
[-- Attachment #2: 0002-lightNVM-register-bm-in-nvm_create_target-if-dev-bm-.patch --]
[-- Type: text/x-patch, Size: 1558 bytes --]
>From 2060232d379328679b22753587d16249f01fa219 Mon Sep 17 00:00:00 2001
From: Dongsheng Yang <yangds.fnst@cn.fujitsu.com>
Date: Fri, 4 Sep 2015 08:10:13 +0900
Subject: [PATCH 2/2] lightNVM: register bm in nvm_create_target if dev->bm is
NULL
When we create target, we need to make sure dev->bm is not NULL.
If it's NULL try to register bm again. If we still fail to find
a proper bm for this dev, return error rather than continue to
provide a NULL pointer dereference problem later.
Signed-off-by: Dongsheng Yang <yangds.fnst@cn.fujitsu.com>
---
drivers/lightnvm/core.c | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c
index 5e4c2b8..9c75ea4 100644
--- a/drivers/lightnvm/core.c
+++ b/drivers/lightnvm/core.c
@@ -293,10 +293,30 @@ static int nvm_create_target(struct nvm_dev *dev, char *ttname, char *tname,
int lun_begin, int lun_end)
{
struct request_queue *tqueue;
+ struct nvm_bm_type *bt;
struct gendisk *tdisk;
struct nvm_tgt_type *tt;
struct nvm_target *t;
void *targetdata;
+ int ret = 0;
+
+ if (!dev->bm) {
+ /* register with device with a supported BM */
+ list_for_each_entry(bt, &nvm_bms, list) {
+ ret = bt->register_bm(dev);
+ if (ret < 0)
+ return ret; /* initialization failed */
+ if (ret > 0) {
+ dev->bm = bt;
+ break; /* successfully initialized */
+ }
+ }
+
+ if (!ret) {
+ pr_info("nvm: no compatible bm was found.\n");
+ return -ENODEV;
+ }
+ }
tt = nvm_find_target_type(ttname);
if (!tt) {
--
1.8.4.2
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0001-lightNVM-fix-a-compatibility-problem-in-compiling.patch --]
[-- Type: text/x-patch; name="0001-lightNVM-fix-a-compatibility-problem-in-compiling.patch", Size: 5428 bytes --]
>From 699d279ee0dbf3db5a4e7a78d52fb93e954294a1 Mon Sep 17 00:00:00 2001
From: Dongsheng Yang <yangds.fnst@cn.fujitsu.com>
Date: Mon, 31 Aug 2015 17:22:23 -0400
Subject: [PATCH 1/2] lightNVM: fix a compatibility problem in compiling.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
In some old gcc version, such as [gcc version 4.4.7 20120313 (Red Hat 4.4.7-4)]
there is a compiling error with this kind of code:
struct test {
union {
int data;
};
};
int main()
{
struct test ins = {
.data = 1,
};
return 0;
}
# gcc test.c
# test.c: In function ‘main’:
# test.c:12: error: unknown field ‘data’ specified in initializer
This patch fix this problem to initialize it in a compatible way.
Signed-off-by: Dongsheng Yang <yangds.fnst@cn.fujitsu.com>
---
drivers/block/nvme-lightnvm.c | 58 +++++++++++++++++++------------------------
1 file changed, 26 insertions(+), 32 deletions(-)
diff --git a/drivers/block/nvme-lightnvm.c b/drivers/block/nvme-lightnvm.c
index 8ad84c9..d1dbc67 100644
--- a/drivers/block/nvme-lightnvm.c
+++ b/drivers/block/nvme-lightnvm.c
@@ -184,13 +184,13 @@ static int init_chnls(struct request_queue *q, struct nvm_id *nvm_id,
struct nvme_nvm_id_chnl *src = nvme_nvm_id->chnls;
struct nvm_id_chnl *dst = nvm_id->chnls;
struct nvme_ns *ns = q->queuedata;
- struct nvme_nvm_command c = {
- .nvm_identify.opcode = nvme_nvm_admin_identify,
- .nvm_identify.nsid = cpu_to_le32(ns->ns_id),
- };
+ struct nvme_nvm_command c = {};
unsigned int len = nvm_id->nchannels;
int i, end, ret, off = 0;
+ c.nvm_identify.opcode = nvme_nvm_admin_identify;
+ c.nvm_identify.nsid = cpu_to_le32(ns->ns_id);
+
while (len) {
end = min_t(u32, NVME_NVM_CHNLS_PR_REQ, len);
@@ -230,13 +230,12 @@ static int nvme_nvm_identify(struct request_queue *q, struct nvm_id *nvm_id)
{
struct nvme_ns *ns = q->queuedata;
struct nvme_nvm_id *nvme_nvm_id;
- struct nvme_nvm_command c = {
- .nvm_identify.opcode = nvme_nvm_admin_identify,
- .nvm_identify.nsid = cpu_to_le32(ns->ns_id),
- .nvm_identify.chnl_off = 0,
- };
+ struct nvme_nvm_command c = {};
int ret;
+ c.nvm_identify.opcode = nvme_nvm_admin_identify;
+ c.nvm_identify.nsid = cpu_to_le32(ns->ns_id);
+ c.nvm_identify.chnl_off = 0;
nvme_nvm_id = kmalloc(4096, GFP_KERNEL);
if (!nvme_nvm_id)
return -ENOMEM;
@@ -270,14 +269,13 @@ static int nvme_nvm_get_features(struct request_queue *q,
struct nvm_get_features *gf)
{
struct nvme_ns *ns = q->queuedata;
- struct nvme_nvm_command c = {
- .common.opcode = nvme_nvm_admin_get_features,
- .common.nsid = ns->ns_id,
- };
+ struct nvme_nvm_command c = {};
int sz = sizeof(struct nvm_get_features);
int ret;
u64 *resp;
+ c.common.opcode = nvme_nvm_admin_get_features;
+ c.common.nsid = ns->ns_id;
resp = kmalloc(sz, GFP_KERNEL);
if (!resp)
return -ENOMEM;
@@ -297,12 +295,11 @@ done:
static int nvme_nvm_set_resp(struct request_queue *q, u64 resp)
{
struct nvme_ns *ns = q->queuedata;
- struct nvme_nvm_command c = {
- .nvm_resp.opcode = nvme_nvm_admin_set_resp,
- .nvm_resp.nsid = cpu_to_le32(ns->ns_id),
- .nvm_resp.resp = cpu_to_le64(resp),
- };
+ struct nvme_nvm_command c = {};
+ c.nvm_resp.opcode = nvme_nvm_admin_set_resp;
+ c.nvm_resp.nsid = cpu_to_le32(ns->ns_id);
+ c.nvm_resp.resp = cpu_to_le64(resp);
return nvme_submit_sync_cmd(q, (struct nvme_command *)&c, NULL, 0);
}
@@ -311,16 +308,15 @@ static int nvme_nvm_get_l2p_tbl(struct request_queue *q, u64 slba, u64 nlb,
{
struct nvme_ns *ns = q->queuedata;
struct nvme_dev *dev = ns->dev;
- struct nvme_nvm_command c = {
- .nvm_l2p.opcode = nvme_nvm_admin_get_l2p_tbl,
- .nvm_l2p.nsid = cpu_to_le32(ns->ns_id),
- };
+ struct nvme_nvm_command c = {};
u32 len = queue_max_hw_sectors(q) << 9;
u64 nlb_pr_rq = len / sizeof(u64);
u64 cmd_slba = slba;
void *entries;
int ret = 0;
+ c.nvm_l2p.opcode = nvme_nvm_admin_get_l2p_tbl;
+ c.nvm_l2p.nsid = cpu_to_le32(ns->ns_id);
entries = kmalloc(len, GFP_KERNEL);
if (!entries)
return -ENOMEM;
@@ -365,15 +361,14 @@ static int nvme_nvm_get_bb_tbl(struct request_queue *q, int lunid,
{
struct nvme_ns *ns = q->queuedata;
struct nvme_dev *dev = ns->dev;
- struct nvme_nvm_command c = {
- .nvm_get_bb.opcode = nvme_nvm_admin_get_bb_tbl,
- .nvm_get_bb.nsid = cpu_to_le32(ns->ns_id),
- .nvm_get_bb.lbb = cpu_to_le32(lunid),
- };
+ struct nvme_nvm_command c = {};
void *bb_bitmap;
u16 bb_bitmap_size;
int ret = 0;
+ c.nvm_get_bb.opcode = nvme_nvm_admin_get_bb_tbl;
+ c.nvm_get_bb.nsid = cpu_to_le32(ns->ns_id);
+ c.nvm_get_bb.lbb = cpu_to_le32(lunid);
bb_bitmap_size = ((nr_blocks >> 15) + 1) * PAGE_SIZE;
bb_bitmap = kmalloc(bb_bitmap_size, GFP_KERNEL);
if (!bb_bitmap)
@@ -471,12 +466,11 @@ static int nvme_nvm_submit_io(struct request_queue *q, struct nvm_rq *rqd)
static int nvme_nvm_erase_block(struct request_queue *q, sector_t block_id)
{
struct nvme_ns *ns = q->queuedata;
- struct nvme_nvm_command c = {
- .nvm_erase.opcode = nvme_nvm_cmd_erase,
- .nvm_erase.nsid = cpu_to_le32(ns->ns_id),
- .nvm_erase.blk_addr = cpu_to_le64(block_id),
- };
+ struct nvme_nvm_command c = {};
+ c.nvm_erase.opcode = nvme_nvm_cmd_erase;
+ c.nvm_erase.nsid = cpu_to_le32(ns->ns_id);
+ c.nvm_erase.blk_addr = cpu_to_le64(block_id);
return nvme_submit_sync_cmd(q, (struct nvme_command *)&c, NULL, 0);
}
--
1.8.4.2
next prev parent reply other threads:[~2015-09-04 8:27 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-08-07 14:29 [PATCH v7 0/5] Support for Open-Channel SSDs Matias Bjørling
2015-08-07 14:29 ` Matias Bjørling
2015-08-07 14:29 ` [PATCH v7 1/5] lightnvm: " Matias Bjørling
2015-08-07 14:29 ` Matias Bjørling
2015-08-07 14:29 ` Matias Bjørling
2015-09-02 3:50 ` Dongsheng Yang
2015-09-02 3:50 ` Dongsheng Yang
2015-09-02 3:50 ` Dongsheng Yang
2015-09-02 10:48 ` Matias Bjørling
2015-09-02 10:48 ` Matias Bjørling
2015-09-04 7:06 ` Dongsheng Yang
2015-09-04 7:06 ` Dongsheng Yang
2015-09-04 7:06 ` Dongsheng Yang
2015-09-04 8:05 ` Matias Bjørling
2015-09-04 8:05 ` Matias Bjørling
2015-09-04 8:27 ` Dongsheng Yang [this message]
2015-09-04 8:27 ` Dongsheng Yang
2015-09-04 8:49 ` Matias Bjørling
2015-09-04 8:49 ` Matias Bjørling
2015-08-07 14:29 ` [PATCH v7 2/5] lightnvm: Hybrid Open-Channel SSD RRPC target Matias Bjørling
2015-08-07 14:29 ` Matias Bjørling
2015-08-07 14:29 ` Matias Bjørling
2015-08-07 14:29 ` [PATCH v7 3/5] lightnvm: Hybrid Open-Channel SSD block manager Matias Bjørling
2015-08-07 14:29 ` Matias Bjørling
2015-08-07 14:29 ` [PATCH v7 4/5] null_nvm: Lightnvm test driver Matias Bjørling
2015-08-07 14:29 ` Matias Bjørling
2015-08-07 14:29 ` [PATCH v7 5/5] nvme: LightNVM support Matias Bjørling
2015-08-07 14:29 ` Matias Bjørling
2015-09-02 3:50 ` [PATCH v7 0/5] Support for Open-Channel SSDs Dongsheng Yang
2015-09-02 3:50 ` Dongsheng Yang
2015-09-02 3:50 ` Dongsheng Yang
2015-09-02 10:59 ` Matias Bjørling
2015-09-02 10:59 ` 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=55E955DF.5020303@cn.fujitsu.com \
--to=yangds.fnst@cn.fujitsu.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.