summaryrefslogtreecommitdiffstats
path: root/drivers/lightnvm/gennvm.c
diff options
context:
space:
mode:
authorMatias Bjørling <m@bjorling.me>2016-01-12 01:49:21 -0500
committerJens Axboe <axboe@fb.com>2016-01-12 10:21:16 -0500
commit91276162de9476b8ff32d9452e849210e5dd09e9 (patch)
tree53337c60f7d863b1ab733f9bcd4964da818f9057 /drivers/lightnvm/gennvm.c
parentabd805ec9f51f37db9da63dda44c3f4b4ae8ad57 (diff)
lightnvm: refactor end_io functions for sync
To implement sync I/O support within the LightNVM core, the end_io functions are refactored to take an end_io function pointer instead of testing for initialized media manager, followed by calling its end_io function. Sync I/O can then be implemented using a callback that signal I/O completion. This is similar to the logic found in blk_to_execute_io(). By implementing it this way, the underlying device I/Os submission logic is abstracted away from core, targets, and media managers. Signed-off-by: Matias Bjørling <m@bjorling.me> Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'drivers/lightnvm/gennvm.c')
-rw-r--r--drivers/lightnvm/gennvm.c34
1 files changed, 14 insertions, 20 deletions
diff --git a/drivers/lightnvm/gennvm.c b/drivers/lightnvm/gennvm.c
index 373be72816bd..12ddcaa343e9 100644
--- a/drivers/lightnvm/gennvm.c
+++ b/drivers/lightnvm/gennvm.c
@@ -317,18 +317,6 @@ static void gennvm_put_blk(struct nvm_dev *dev, struct nvm_block *blk)
317 spin_unlock(&vlun->lock); 317 spin_unlock(&vlun->lock);
318} 318}
319 319
320static int gennvm_submit_io(struct nvm_dev *dev, struct nvm_rq *rqd)
321{
322 if (!dev->ops->submit_io)
323 return -ENODEV;
324
325 /* Convert address space */
326 nvm_generic_to_addr_mode(dev, rqd);
327
328 rqd->dev = dev;
329 return dev->ops->submit_io(dev, rqd);
330}
331
332static void gennvm_blk_set_type(struct nvm_dev *dev, struct ppa_addr *ppa, 320static void gennvm_blk_set_type(struct nvm_dev *dev, struct ppa_addr *ppa,
333 int type) 321 int type)
334{ 322{
@@ -375,25 +363,32 @@ static void gennvm_mark_blk_bad(struct nvm_dev *dev, struct nvm_rq *rqd)
375 gennvm_blk_set_type(dev, &rqd->ppa_addr, 2); 363 gennvm_blk_set_type(dev, &rqd->ppa_addr, 2);
376} 364}
377 365
378static int gennvm_end_io(struct nvm_rq *rqd, int error) 366static void gennvm_end_io(struct nvm_rq *rqd, int error)
379{ 367{
380 struct nvm_tgt_instance *ins = rqd->ins; 368 struct nvm_tgt_instance *ins = rqd->ins;
381 int ret = 0;
382 369
383 switch (error) { 370 switch (error) {
384 case NVM_RSP_SUCCESS: 371 case NVM_RSP_SUCCESS:
385 break;
386 case NVM_RSP_ERR_EMPTYPAGE: 372 case NVM_RSP_ERR_EMPTYPAGE:
387 break; 373 break;
388 case NVM_RSP_ERR_FAILWRITE: 374 case NVM_RSP_ERR_FAILWRITE:
389 gennvm_mark_blk_bad(rqd->dev, rqd); 375 gennvm_mark_blk_bad(rqd->dev, rqd);
390 default:
391 ret++;
392 } 376 }
393 377
394 ret += ins->tt->end_io(rqd, error); 378 ins->tt->end_io(rqd, error);
379}
395 380
396 return ret; 381static int gennvm_submit_io(struct nvm_dev *dev, struct nvm_rq *rqd)
382{
383 if (!dev->ops->submit_io)
384 return -ENODEV;
385
386 /* Convert address space */
387 nvm_generic_to_addr_mode(dev, rqd);
388
389 rqd->dev = dev;
390 rqd->end_io = gennvm_end_io;
391 return dev->ops->submit_io(dev, rqd);
397} 392}
398 393
399static int gennvm_erase_blk(struct nvm_dev *dev, struct nvm_block *blk, 394static int gennvm_erase_blk(struct nvm_dev *dev, struct nvm_block *blk,
@@ -442,7 +437,6 @@ static struct nvmm_type gennvm = {
442 .put_blk = gennvm_put_blk, 437 .put_blk = gennvm_put_blk,
443 438
444 .submit_io = gennvm_submit_io, 439 .submit_io = gennvm_submit_io,
445 .end_io = gennvm_end_io,
446 .erase_blk = gennvm_erase_blk, 440 .erase_blk = gennvm_erase_blk,
447 441
448 .get_lun = gennvm_get_lun, 442 .get_lun = gennvm_get_lun,