diff options
author | Matias Bjørling <m@bjorling.me> | 2016-05-06 14:03:06 -0400 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2016-05-06 14:51:10 -0400 |
commit | 6659d4d80c6fc6b4b5bc2e99988f32b1b3865f1d (patch) | |
tree | 1d97bab6227a1f3dcad7017a4e12ba2be96310f2 | |
parent | e11903f5dfeb4f59fe93316d47f2ee5982e91e60 (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.c | 62 |
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 | ||
585 | struct factory_blks { | ||
586 | struct nvm_dev *dev; | ||
587 | int flags; | ||
588 | unsigned long *blks; | ||
589 | }; | ||
590 | |||
591 | static int factory_nblks(int nblks) | 585 | static 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 | ||
597 | static unsigned int factory_blk_offset(struct nvm_dev *dev, int ch, int lun) | 591 | static 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 | ||
605 | static int nvm_factory_blks(struct nvm_dev *dev, struct ppa_addr ppa, | 599 | static 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 | ||
641 | static int nvm_fact_get_blks(struct nvm_dev *dev, struct ppa_addr *erase_list, | 635 | static 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 | ||
678 | static int nvm_fact_select_blks(struct nvm_dev *dev, struct factory_blks *f) | 672 | static 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 | ||
704 | int nvm_dev_factory(struct nvm_dev *dev, int flags) | 700 | int 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) | |||
743 | err_ppas: | 737 | err_ppas: |
744 | kfree(ppas); | 738 | kfree(ppas); |
745 | err_blks: | 739 | err_blks: |
746 | kfree(f.blks); | 740 | kfree(blk_bitmap); |
747 | return ret; | 741 | return ret; |
748 | } | 742 | } |
749 | EXPORT_SYMBOL(nvm_dev_factory); | 743 | EXPORT_SYMBOL(nvm_dev_factory); |