diff options
Diffstat (limited to 'drivers/lightnvm/rrpc.c')
-rw-r--r-- | drivers/lightnvm/rrpc.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/drivers/lightnvm/rrpc.c b/drivers/lightnvm/rrpc.c index 75e59c3a3f96..134e4faba482 100644 --- a/drivers/lightnvm/rrpc.c +++ b/drivers/lightnvm/rrpc.c | |||
@@ -182,7 +182,7 @@ static struct rrpc_block *rrpc_get_blk(struct rrpc *rrpc, struct rrpc_lun *rlun, | |||
182 | struct nvm_block *blk; | 182 | struct nvm_block *blk; |
183 | struct rrpc_block *rblk; | 183 | struct rrpc_block *rblk; |
184 | 184 | ||
185 | blk = nvm_get_blk(rrpc->dev, rlun->parent, 0); | 185 | blk = nvm_get_blk(rrpc->dev, rlun->parent, flags); |
186 | if (!blk) | 186 | if (!blk) |
187 | return NULL; | 187 | return NULL; |
188 | 188 | ||
@@ -202,6 +202,20 @@ static void rrpc_put_blk(struct rrpc *rrpc, struct rrpc_block *rblk) | |||
202 | nvm_put_blk(rrpc->dev, rblk->parent); | 202 | nvm_put_blk(rrpc->dev, rblk->parent); |
203 | } | 203 | } |
204 | 204 | ||
205 | static void rrpc_put_blks(struct rrpc *rrpc) | ||
206 | { | ||
207 | struct rrpc_lun *rlun; | ||
208 | int i; | ||
209 | |||
210 | for (i = 0; i < rrpc->nr_luns; i++) { | ||
211 | rlun = &rrpc->luns[i]; | ||
212 | if (rlun->cur) | ||
213 | rrpc_put_blk(rrpc, rlun->cur); | ||
214 | if (rlun->gc_cur) | ||
215 | rrpc_put_blk(rrpc, rlun->gc_cur); | ||
216 | } | ||
217 | } | ||
218 | |||
205 | static struct rrpc_lun *get_next_lun(struct rrpc *rrpc) | 219 | static struct rrpc_lun *get_next_lun(struct rrpc *rrpc) |
206 | { | 220 | { |
207 | int next = atomic_inc_return(&rrpc->next_lun); | 221 | int next = atomic_inc_return(&rrpc->next_lun); |
@@ -1002,7 +1016,7 @@ static int rrpc_map_init(struct rrpc *rrpc) | |||
1002 | return 0; | 1016 | return 0; |
1003 | 1017 | ||
1004 | /* Bring up the mapping table from device */ | 1018 | /* Bring up the mapping table from device */ |
1005 | ret = dev->ops->get_l2p_tbl(dev->q, 0, dev->total_pages, | 1019 | ret = dev->ops->get_l2p_tbl(dev, 0, dev->total_pages, |
1006 | rrpc_l2p_update, rrpc); | 1020 | rrpc_l2p_update, rrpc); |
1007 | if (ret) { | 1021 | if (ret) { |
1008 | pr_err("nvm: rrpc: could not read L2P table.\n"); | 1022 | pr_err("nvm: rrpc: could not read L2P table.\n"); |
@@ -1224,18 +1238,21 @@ static int rrpc_luns_configure(struct rrpc *rrpc) | |||
1224 | 1238 | ||
1225 | rblk = rrpc_get_blk(rrpc, rlun, 0); | 1239 | rblk = rrpc_get_blk(rrpc, rlun, 0); |
1226 | if (!rblk) | 1240 | if (!rblk) |
1227 | return -EINVAL; | 1241 | goto err; |
1228 | 1242 | ||
1229 | rrpc_set_lun_cur(rlun, rblk); | 1243 | rrpc_set_lun_cur(rlun, rblk); |
1230 | 1244 | ||
1231 | /* Emergency gc block */ | 1245 | /* Emergency gc block */ |
1232 | rblk = rrpc_get_blk(rrpc, rlun, 1); | 1246 | rblk = rrpc_get_blk(rrpc, rlun, 1); |
1233 | if (!rblk) | 1247 | if (!rblk) |
1234 | return -EINVAL; | 1248 | goto err; |
1235 | rlun->gc_cur = rblk; | 1249 | rlun->gc_cur = rblk; |
1236 | } | 1250 | } |
1237 | 1251 | ||
1238 | return 0; | 1252 | return 0; |
1253 | err: | ||
1254 | rrpc_put_blks(rrpc); | ||
1255 | return -EINVAL; | ||
1239 | } | 1256 | } |
1240 | 1257 | ||
1241 | static struct nvm_tgt_type tt_rrpc; | 1258 | static struct nvm_tgt_type tt_rrpc; |