aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatias Bjørling <m@bjorling.me>2016-05-06 14:03:06 -0400
committerJens Axboe <axboe@fb.com>2016-05-06 14:51:10 -0400
commit6659d4d80c6fc6b4b5bc2e99988f32b1b3865f1d (patch)
tree1d97bab6227a1f3dcad7017a4e12ba2be96310f2
parente11903f5dfeb4f59fe93316d47f2ee5982e91e60 (diff)
lightnvm: remove struct factory_blks
Now that device ops->get_bb_table no longer uses a callback, the struct factory_blks can be removed. Signed-off-by: Matias Bjørling <m@bjorling.me> Signed-off-by: Jens Axboe <axboe@fb.com>
-rw-r--r--drivers/lightnvm/sysblk.c62
1 files changed, 28 insertions, 34 deletions
diff --git a/drivers/lightnvm/sysblk.c b/drivers/lightnvm/sysblk.c
index dc99c0ac8701..bca690248bd7 100644
--- a/drivers/lightnvm/sysblk.c
+++ b/drivers/lightnvm/sysblk.c
@@ -582,29 +582,23 @@ err_mark:
582 return ret; 582 return ret;
583} 583}
584 584
585struct factory_blks {
586 struct nvm_dev *dev;
587 int flags;
588 unsigned long *blks;
589};
590
591static int factory_nblks(int nblks) 585static int factory_nblks(int nblks)
592{ 586{
593 /* Round up to nearest BITS_PER_LONG */ 587 /* Round up to nearest BITS_PER_LONG */
594 return (nblks + (BITS_PER_LONG - 1)) & ~(BITS_PER_LONG - 1); 588 return (nblks + (BITS_PER_LONG - 1)) & ~(BITS_PER_LONG - 1);
595} 589}
596 590
597static unsigned int factory_blk_offset(struct nvm_dev *dev, int ch, int lun) 591static unsigned int factory_blk_offset(struct nvm_dev *dev, struct ppa_addr ppa)
598{ 592{
599 int nblks = factory_nblks(dev->blks_per_lun); 593 int nblks = factory_nblks(dev->blks_per_lun);
600 594
601 return ((ch * dev->luns_per_chnl * nblks) + (lun * nblks)) / 595 return ((ppa.g.ch * dev->luns_per_chnl * nblks) + (ppa.g.lun * nblks)) /
602 BITS_PER_LONG; 596 BITS_PER_LONG;
603} 597}
604 598
605static int nvm_factory_blks(struct nvm_dev *dev, struct ppa_addr ppa, 599static int nvm_factory_blks(struct nvm_dev *dev, struct ppa_addr ppa,
606 u8 *blks, int nr_blks, 600 u8 *blks, int nr_blks,
607 struct factory_blks *f) 601 unsigned long *blk_bitmap, int flags)
608{ 602{
609 int i, lunoff; 603 int i, lunoff;
610 604
@@ -612,25 +606,25 @@ static int nvm_factory_blks(struct nvm_dev *dev, struct ppa_addr ppa,
612 if (nr_blks < 0) 606 if (nr_blks < 0)
613 return nr_blks; 607 return nr_blks;
614 608
615 lunoff = factory_blk_offset(dev, ppa.g.ch, ppa.g.lun); 609 lunoff = factory_blk_offset(dev, ppa);
616 610
617 /* non-set bits correspond to the block must be erased */ 611 /* non-set bits correspond to the block must be erased */
618 for (i = 0; i < nr_blks; i++) { 612 for (i = 0; i < nr_blks; i++) {
619 switch (blks[i]) { 613 switch (blks[i]) {
620 case NVM_BLK_T_FREE: 614 case NVM_BLK_T_FREE:
621 if (f->flags & NVM_FACTORY_ERASE_ONLY_USER) 615 if (flags & NVM_FACTORY_ERASE_ONLY_USER)
622 set_bit(i, &f->blks[lunoff]); 616 set_bit(i, &blk_bitmap[lunoff]);
623 break; 617 break;
624 case NVM_BLK_T_HOST: 618 case NVM_BLK_T_HOST:
625 if (!(f->flags & NVM_FACTORY_RESET_HOST_BLKS)) 619 if (!(flags & NVM_FACTORY_RESET_HOST_BLKS))
626 set_bit(i, &f->blks[lunoff]); 620 set_bit(i, &blk_bitmap[lunoff]);
627 break; 621 break;
628 case NVM_BLK_T_GRWN_BAD: 622 case NVM_BLK_T_GRWN_BAD:
629 if (!(f->flags & NVM_FACTORY_RESET_GRWN_BBLKS)) 623 if (!(flags & NVM_FACTORY_RESET_GRWN_BBLKS))
630 set_bit(i, &f->blks[lunoff]); 624 set_bit(i, &blk_bitmap[lunoff]);
631 break; 625 break;
632 default: 626 default:
633 set_bit(i, &f->blks[lunoff]); 627 set_bit(i, &blk_bitmap[lunoff]);
634 break; 628 break;
635 } 629 }
636 } 630 }
@@ -639,7 +633,7 @@ static int nvm_factory_blks(struct nvm_dev *dev, struct ppa_addr ppa,
639} 633}
640 634
641static int nvm_fact_get_blks(struct nvm_dev *dev, struct ppa_addr *erase_list, 635static int nvm_fact_get_blks(struct nvm_dev *dev, struct ppa_addr *erase_list,
642 int max_ppas, struct factory_blks *f) 636 int max_ppas, unsigned long *blk_bitmap)
643{ 637{
644 struct ppa_addr ppa; 638 struct ppa_addr ppa;
645 int ch, lun, blkid, idx, done = 0, ppa_cnt = 0; 639 int ch, lun, blkid, idx, done = 0, ppa_cnt = 0;
@@ -648,8 +642,8 @@ static int nvm_fact_get_blks(struct nvm_dev *dev, struct ppa_addr *erase_list,
648 while (!done) { 642 while (!done) {
649 done = 1; 643 done = 1;
650 nvm_for_each_lun_ppa(dev, ppa, ch, lun) { 644 nvm_for_each_lun_ppa(dev, ppa, ch, lun) {
651 idx = factory_blk_offset(dev, ch, lun); 645 idx = factory_blk_offset(dev, ppa);
652 offset = &f->blks[idx]; 646 offset = &blk_bitmap[idx];
653 647
654 blkid = find_first_zero_bit(offset, 648 blkid = find_first_zero_bit(offset,
655 dev->blks_per_lun); 649 dev->blks_per_lun);
@@ -675,10 +669,11 @@ static int nvm_fact_get_blks(struct nvm_dev *dev, struct ppa_addr *erase_list,
675 return ppa_cnt; 669 return ppa_cnt;
676} 670}
677 671
678static int nvm_fact_select_blks(struct nvm_dev *dev, struct factory_blks *f) 672static int nvm_fact_select_blks(struct nvm_dev *dev, unsigned long *blk_bitmap,
673 int flags)
679{ 674{
680 struct ppa_addr ppa; 675 struct ppa_addr ppa;
681 int ch, lun, nr_blks, ret; 676 int ch, lun, nr_blks, ret = 0;
682 u8 *blks; 677 u8 *blks;
683 678
684 nr_blks = dev->blks_per_lun * dev->plane_mode; 679 nr_blks = dev->blks_per_lun * dev->plane_mode;
@@ -692,43 +687,42 @@ static int nvm_fact_select_blks(struct nvm_dev *dev, struct factory_blks *f)
692 pr_err("nvm: failed bb tbl for ch%u lun%u\n", 687 pr_err("nvm: failed bb tbl for ch%u lun%u\n",
693 ppa.g.ch, ppa.g.blk); 688 ppa.g.ch, ppa.g.blk);
694 689
695 ret = nvm_factory_blks(dev, ppa, blks, nr_blks, f); 690 ret = nvm_factory_blks(dev, ppa, blks, nr_blks, blk_bitmap,
691 flags);
696 if (ret) 692 if (ret)
697 return ret; 693 break;
698 } 694 }
699 695
700 kfree(blks); 696 kfree(blks);
701 return 0; 697 return ret;
702} 698}
703 699
704int nvm_dev_factory(struct nvm_dev *dev, int flags) 700int nvm_dev_factory(struct nvm_dev *dev, int flags)
705{ 701{
706 struct factory_blks f;
707 struct ppa_addr *ppas; 702 struct ppa_addr *ppas;
708 int ppa_cnt, ret = -ENOMEM; 703 int ppa_cnt, ret = -ENOMEM;
709 int max_ppas = dev->ops->max_phys_sect / dev->nr_planes; 704 int max_ppas = dev->ops->max_phys_sect / dev->nr_planes;
710 struct ppa_addr sysblk_ppas[MAX_SYSBLKS]; 705 struct ppa_addr sysblk_ppas[MAX_SYSBLKS];
711 struct sysblk_scan s; 706 struct sysblk_scan s;
707 unsigned long *blk_bitmap;
712 708
713 f.blks = kzalloc(factory_nblks(dev->blks_per_lun) * dev->nr_luns, 709 blk_bitmap = kzalloc(factory_nblks(dev->blks_per_lun) * dev->nr_luns,
714 GFP_KERNEL); 710 GFP_KERNEL);
715 if (!f.blks) 711 if (!blk_bitmap)
716 return ret; 712 return ret;
717 713
718 ppas = kcalloc(max_ppas, sizeof(struct ppa_addr), GFP_KERNEL); 714 ppas = kcalloc(max_ppas, sizeof(struct ppa_addr), GFP_KERNEL);
719 if (!ppas) 715 if (!ppas)
720 goto err_blks; 716 goto err_blks;
721 717
722 f.dev = dev;
723 f.flags = flags;
724
725 /* create list of blks to be erased */ 718 /* create list of blks to be erased */
726 ret = nvm_fact_select_blks(dev, &f); 719 ret = nvm_fact_select_blks(dev, blk_bitmap, flags);
727 if (ret) 720 if (ret)
728 goto err_ppas; 721 goto err_ppas;
729 722
730 /* continue to erase until list of blks until empty */ 723 /* continue to erase until list of blks until empty */
731 while ((ppa_cnt = nvm_fact_get_blks(dev, ppas, max_ppas, &f)) > 0) 724 while ((ppa_cnt =
725 nvm_fact_get_blks(dev, ppas, max_ppas, blk_bitmap)) > 0)
732 nvm_erase_ppa(dev, ppas, ppa_cnt); 726 nvm_erase_ppa(dev, ppas, ppa_cnt);
733 727
734 /* mark host reserved blocks free */ 728 /* mark host reserved blocks free */
@@ -743,7 +737,7 @@ int nvm_dev_factory(struct nvm_dev *dev, int flags)
743err_ppas: 737err_ppas:
744 kfree(ppas); 738 kfree(ppas);
745err_blks: 739err_blks:
746 kfree(f.blks); 740 kfree(blk_bitmap);
747 return ret; 741 return ret;
748} 742}
749EXPORT_SYMBOL(nvm_dev_factory); 743EXPORT_SYMBOL(nvm_dev_factory);