aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/lightnvm/pblk-init.c
diff options
context:
space:
mode:
authorJavier González <javier@javigon.com>2018-06-01 09:04:24 -0400
committerJens Axboe <axboe@kernel.dk>2018-06-01 09:43:53 -0400
commita7c9e9109ca1142f33b882615cc5fa048e07f3ea (patch)
treed82d1ed53aa6053714b27c2fcd491fc9c32d0c2f /drivers/lightnvm/pblk-init.c
parent6f9c9607d445a05267eb4830e5375535f5a547a2 (diff)
lightnvm: pass flag on graceful teardown to targets
If the namespace is unregistered before the LightNVM target is removed (e.g., on hot unplug) it is too late for the target to store any metadata on the device - any attempt to write to the device will fail. In this case, pass on a "gracefull teardown" flag to the target to let it know when this happens. In the case of pblk, we pad the open line (close all open chunks) to improve data retention. In the event of an ungraceful shutdown, avoid this part and just clean up. Signed-off-by: Javier González <javier@cnexlabs.com> Signed-off-by: Matias Bjørling <mb@lightnvm.io> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/lightnvm/pblk-init.c')
-rw-r--r--drivers/lightnvm/pblk-init.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/lightnvm/pblk-init.c b/drivers/lightnvm/pblk-init.c
index 81c103b341bd..f47e95c0e5da 100644
--- a/drivers/lightnvm/pblk-init.c
+++ b/drivers/lightnvm/pblk-init.c
@@ -1118,23 +1118,25 @@ static void pblk_free(struct pblk *pblk)
1118 kfree(pblk); 1118 kfree(pblk);
1119} 1119}
1120 1120
1121static void pblk_tear_down(struct pblk *pblk) 1121static void pblk_tear_down(struct pblk *pblk, bool graceful)
1122{ 1122{
1123 pblk_pipeline_stop(pblk); 1123 if (graceful)
1124 __pblk_pipeline_flush(pblk);
1125 __pblk_pipeline_stop(pblk);
1124 pblk_writer_stop(pblk); 1126 pblk_writer_stop(pblk);
1125 pblk_rb_sync_l2p(&pblk->rwb); 1127 pblk_rb_sync_l2p(&pblk->rwb);
1126 pblk_rl_free(&pblk->rl); 1128 pblk_rl_free(&pblk->rl);
1127 1129
1128 pr_debug("pblk: consistent tear down\n"); 1130 pr_debug("pblk: consistent tear down (graceful:%d)\n", graceful);
1129} 1131}
1130 1132
1131static void pblk_exit(void *private) 1133static void pblk_exit(void *private, bool graceful)
1132{ 1134{
1133 struct pblk *pblk = private; 1135 struct pblk *pblk = private;
1134 1136
1135 down_write(&pblk_lock); 1137 down_write(&pblk_lock);
1136 pblk_gc_exit(pblk); 1138 pblk_gc_exit(pblk, graceful);
1137 pblk_tear_down(pblk); 1139 pblk_tear_down(pblk, graceful);
1138 1140
1139#ifdef CONFIG_NVM_DEBUG 1141#ifdef CONFIG_NVM_DEBUG
1140 pr_info("pblk exit: L2P CRC: %x\n", pblk_l2p_crc(pblk)); 1142 pr_info("pblk exit: L2P CRC: %x\n", pblk_l2p_crc(pblk));