diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/lightnvm/pblk-recovery.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/lightnvm/pblk-recovery.c b/drivers/lightnvm/pblk-recovery.c index 017874e03253..357e52980f2f 100644 --- a/drivers/lightnvm/pblk-recovery.c +++ b/drivers/lightnvm/pblk-recovery.c | |||
| @@ -93,10 +93,24 @@ static int pblk_recov_l2p_from_emeta(struct pblk *pblk, struct pblk_line *line) | |||
| 93 | static void pblk_update_line_wp(struct pblk *pblk, struct pblk_line *line, | 93 | static void pblk_update_line_wp(struct pblk *pblk, struct pblk_line *line, |
| 94 | u64 written_secs) | 94 | u64 written_secs) |
| 95 | { | 95 | { |
| 96 | struct pblk_line_mgmt *l_mg = &pblk->l_mg; | ||
| 96 | int i; | 97 | int i; |
| 97 | 98 | ||
| 98 | for (i = 0; i < written_secs; i += pblk->min_write_pgs) | 99 | for (i = 0; i < written_secs; i += pblk->min_write_pgs) |
| 99 | pblk_alloc_page(pblk, line, pblk->min_write_pgs); | 100 | __pblk_alloc_page(pblk, line, pblk->min_write_pgs); |
| 101 | |||
| 102 | spin_lock(&l_mg->free_lock); | ||
| 103 | if (written_secs > line->left_msecs) { | ||
| 104 | /* | ||
| 105 | * We have all data sectors written | ||
| 106 | * and some emeta sectors written too. | ||
| 107 | */ | ||
| 108 | line->left_msecs = 0; | ||
| 109 | } else { | ||
| 110 | /* We have only some data sectors written. */ | ||
| 111 | line->left_msecs -= written_secs; | ||
| 112 | } | ||
| 113 | spin_unlock(&l_mg->free_lock); | ||
| 100 | } | 114 | } |
| 101 | 115 | ||
| 102 | static u64 pblk_sec_in_open_line(struct pblk *pblk, struct pblk_line *line) | 116 | static u64 pblk_sec_in_open_line(struct pblk *pblk, struct pblk_line *line) |
