summaryrefslogtreecommitdiffstats
path: root/drivers/nvdimm
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/nvdimm')
-rw-r--r--drivers/nvdimm/pmem.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c
index 5b536be5a12e..fbc640bf06b0 100644
--- a/drivers/nvdimm/pmem.c
+++ b/drivers/nvdimm/pmem.c
@@ -25,6 +25,7 @@
25#include <linux/badblocks.h> 25#include <linux/badblocks.h>
26#include <linux/memremap.h> 26#include <linux/memremap.h>
27#include <linux/vmalloc.h> 27#include <linux/vmalloc.h>
28#include <linux/blk-mq.h>
28#include <linux/pfn_t.h> 29#include <linux/pfn_t.h>
29#include <linux/slab.h> 30#include <linux/slab.h>
30#include <linux/pmem.h> 31#include <linux/pmem.h>
@@ -231,6 +232,11 @@ static void pmem_release_queue(void *q)
231 blk_cleanup_queue(q); 232 blk_cleanup_queue(q);
232} 233}
233 234
235static void pmem_freeze_queue(void *q)
236{
237 blk_freeze_queue_start(q);
238}
239
234static void pmem_release_disk(void *disk) 240static void pmem_release_disk(void *disk)
235{ 241{
236 del_gendisk(disk); 242 del_gendisk(disk);
@@ -284,6 +290,9 @@ static int pmem_attach_disk(struct device *dev,
284 if (!q) 290 if (!q)
285 return -ENOMEM; 291 return -ENOMEM;
286 292
293 if (devm_add_action_or_reset(dev, pmem_release_queue, q))
294 return -ENOMEM;
295
287 pmem->pfn_flags = PFN_DEV; 296 pmem->pfn_flags = PFN_DEV;
288 if (is_nd_pfn(dev)) { 297 if (is_nd_pfn(dev)) {
289 addr = devm_memremap_pages(dev, &pfn_res, &q->q_usage_counter, 298 addr = devm_memremap_pages(dev, &pfn_res, &q->q_usage_counter,
@@ -303,10 +312,10 @@ static int pmem_attach_disk(struct device *dev,
303 pmem->size, ARCH_MEMREMAP_PMEM); 312 pmem->size, ARCH_MEMREMAP_PMEM);
304 313
305 /* 314 /*
306 * At release time the queue must be dead before 315 * At release time the queue must be frozen before
307 * devm_memremap_pages is unwound 316 * devm_memremap_pages is unwound
308 */ 317 */
309 if (devm_add_action_or_reset(dev, pmem_release_queue, q)) 318 if (devm_add_action_or_reset(dev, pmem_freeze_queue, q))
310 return -ENOMEM; 319 return -ENOMEM;
311 320
312 if (IS_ERR(addr)) 321 if (IS_ERR(addr))