aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJavier Gonzalez <javier@javigon.com>2015-11-20 07:47:57 -0500
committerJens Axboe <axboe@fb.com>2015-11-20 10:33:21 -0500
commit2fde0e482db2b43bb4ed0e9aebfbe78ebcbbf5a6 (patch)
treec4dff376fb73f7d473152cd727a17b64827fdd31
parent0b59733b95f9d7af6bee6e6a4d0d444eb694c514 (diff)
lightnvm: add free and bad lun info to show luns
Add free block, used block, and bad block information to the show debug interface. This information is used to debug how targets track blocks. Also, change debug function name to make it more generic. Signed-off-by: Javier Gonzalez <javier@cnexlabs.com> Signed-off-by: Matias Bjørling <m@bjorling.me> Signed-off-by: Jens Axboe <axboe@fb.com>
-rw-r--r--drivers/lightnvm/core.c2
-rw-r--r--drivers/lightnvm/gennvm.c19
-rw-r--r--include/linux/lightnvm.h4
3 files changed, 17 insertions, 8 deletions
diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c
index f61d325fd978..5178645ac42b 100644
--- a/drivers/lightnvm/core.c
+++ b/drivers/lightnvm/core.c
@@ -544,7 +544,7 @@ static int nvm_configure_show(const char *val)
544 if (!dev->mt) 544 if (!dev->mt)
545 return 0; 545 return 0;
546 546
547 dev->mt->free_blocks_print(dev); 547 dev->mt->lun_info_print(dev);
548 548
549 return 0; 549 return 0;
550} 550}
diff --git a/drivers/lightnvm/gennvm.c b/drivers/lightnvm/gennvm.c
index 43c01e0af887..e20e74ec6b91 100644
--- a/drivers/lightnvm/gennvm.c
+++ b/drivers/lightnvm/gennvm.c
@@ -464,15 +464,24 @@ static struct nvm_lun *gennvm_get_lun(struct nvm_dev *dev, int lunid)
464 return &gn->luns[lunid].vlun; 464 return &gn->luns[lunid].vlun;
465} 465}
466 466
467static void gennvm_free_blocks_print(struct nvm_dev *dev) 467static void gennvm_lun_info_print(struct nvm_dev *dev)
468{ 468{
469 struct gen_nvm *gn = dev->mp; 469 struct gen_nvm *gn = dev->mp;
470 struct gen_lun *lun; 470 struct gen_lun *lun;
471 unsigned int i; 471 unsigned int i;
472 472
473 gennvm_for_each_lun(gn, lun, i) 473
474 pr_info("%s: lun%8u\t%u\n", 474 gennvm_for_each_lun(gn, lun, i) {
475 dev->name, i, lun->vlun.nr_free_blocks); 475 spin_lock(&lun->vlun.lock);
476
477 pr_info("%s: lun%8u\t%u\t%u\t%u\n",
478 dev->name, i,
479 lun->vlun.nr_free_blocks,
480 lun->vlun.nr_inuse_blocks,
481 lun->vlun.nr_bad_blocks);
482
483 spin_unlock(&lun->vlun.lock);
484 }
476} 485}
477 486
478static struct nvmm_type gennvm = { 487static struct nvmm_type gennvm = {
@@ -490,7 +499,7 @@ static struct nvmm_type gennvm = {
490 .erase_blk = gennvm_erase_blk, 499 .erase_blk = gennvm_erase_blk,
491 500
492 .get_lun = gennvm_get_lun, 501 .get_lun = gennvm_get_lun,
493 .free_blocks_print = gennvm_free_blocks_print, 502 .lun_info_print = gennvm_lun_info_print,
494}; 503};
495 504
496static int __init gennvm_module_init(void) 505static int __init gennvm_module_init(void)
diff --git a/include/linux/lightnvm.h b/include/linux/lightnvm.h
index 831a20cf070c..3db5552b17d5 100644
--- a/include/linux/lightnvm.h
+++ b/include/linux/lightnvm.h
@@ -380,7 +380,7 @@ typedef int (nvmm_end_io_fn)(struct nvm_rq *, int);
380typedef int (nvmm_erase_blk_fn)(struct nvm_dev *, struct nvm_block *, 380typedef int (nvmm_erase_blk_fn)(struct nvm_dev *, struct nvm_block *,
381 unsigned long); 381 unsigned long);
382typedef struct nvm_lun *(nvmm_get_lun_fn)(struct nvm_dev *, int); 382typedef struct nvm_lun *(nvmm_get_lun_fn)(struct nvm_dev *, int);
383typedef void (nvmm_free_blocks_print_fn)(struct nvm_dev *); 383typedef void (nvmm_lun_info_print_fn)(struct nvm_dev *);
384 384
385struct nvmm_type { 385struct nvmm_type {
386 const char *name; 386 const char *name;
@@ -404,7 +404,7 @@ struct nvmm_type {
404 nvmm_get_lun_fn *get_lun; 404 nvmm_get_lun_fn *get_lun;
405 405
406 /* Statistics */ 406 /* Statistics */
407 nvmm_free_blocks_print_fn *free_blocks_print; 407 nvmm_lun_info_print_fn *lun_info_print;
408 struct list_head list; 408 struct list_head list;
409}; 409};
410 410