>From 2060232d379328679b22753587d16249f01fa219 Mon Sep 17 00:00:00 2001 From: Dongsheng Yang 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 --- 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