aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWenwei Tao <ww.tao0320@gmail.com>2016-01-12 01:49:24 -0500
committerJens Axboe <axboe@fb.com>2016-01-12 10:21:16 -0500
commitd0ca798f960ad7d86f5186fe312c131d00563eb7 (patch)
tree2900e3849549171ec2914539c7ebb9a3b4554db3
parent2b11c1b24e50a26d435f1d59955f1268053623b7 (diff)
lightnvm: put block back to gc list on its reclaim fail
We delete a block from the gc list before reclaim it, so put it back to the list on its reclaim fail, otherwise this block will not get reclaimed and be programmable in the future. Signed-off-by: Wenwei Tao <ww.tao0320@gmail.com> Signed-off-by: Matias Bjørling <m@bjorling.me> Signed-off-by: Jens Axboe <axboe@fb.com>
-rw-r--r--drivers/lightnvm/rrpc.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/drivers/lightnvm/rrpc.c b/drivers/lightnvm/rrpc.c
index 5df4a696184a..bee2352fcce1 100644
--- a/drivers/lightnvm/rrpc.c
+++ b/drivers/lightnvm/rrpc.c
@@ -381,16 +381,26 @@ static void rrpc_block_gc(struct work_struct *work)
381 struct rrpc *rrpc = gcb->rrpc; 381 struct rrpc *rrpc = gcb->rrpc;
382 struct rrpc_block *rblk = gcb->rblk; 382 struct rrpc_block *rblk = gcb->rblk;
383 struct nvm_dev *dev = rrpc->dev; 383 struct nvm_dev *dev = rrpc->dev;
384 struct nvm_lun *lun = rblk->parent->lun;
385 struct rrpc_lun *rlun = &rrpc->luns[lun->id - rrpc->lun_offset];
384 386
387 mempool_free(gcb, rrpc->gcb_pool);
385 pr_debug("nvm: block '%lu' being reclaimed\n", rblk->parent->id); 388 pr_debug("nvm: block '%lu' being reclaimed\n", rblk->parent->id);
386 389
387 if (rrpc_move_valid_pages(rrpc, rblk)) 390 if (rrpc_move_valid_pages(rrpc, rblk))
388 goto done; 391 goto put_back;
392
393 if (nvm_erase_blk(dev, rblk->parent))
394 goto put_back;
389 395
390 nvm_erase_blk(dev, rblk->parent);
391 rrpc_put_blk(rrpc, rblk); 396 rrpc_put_blk(rrpc, rblk);
392done: 397
393 mempool_free(gcb, rrpc->gcb_pool); 398 return;
399
400put_back:
401 spin_lock(&rlun->lock);
402 list_add_tail(&rblk->prio, &rlun->prio_list);
403 spin_unlock(&rlun->lock);
394} 404}
395 405
396/* the block with highest number of invalid pages, will be in the beginning 406/* the block with highest number of invalid pages, will be in the beginning