diff options
author | Matias Bjørling <m@bjorling.me> | 2016-01-12 01:49:21 -0500 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2016-01-12 10:21:16 -0500 |
commit | 91276162de9476b8ff32d9452e849210e5dd09e9 (patch) | |
tree | 53337c60f7d863b1ab733f9bcd4964da818f9057 /drivers/lightnvm/gennvm.c | |
parent | abd805ec9f51f37db9da63dda44c3f4b4ae8ad57 (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.c | 34 |
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 | ||
320 | static 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 | |||
332 | static void gennvm_blk_set_type(struct nvm_dev *dev, struct ppa_addr *ppa, | 320 | static 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 | ||
378 | static int gennvm_end_io(struct nvm_rq *rqd, int error) | 366 | static 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; | 381 | static 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 | ||
399 | static int gennvm_erase_blk(struct nvm_dev *dev, struct nvm_block *blk, | 394 | static 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, |