diff options
Diffstat (limited to 'drivers/nvdimm/pmem.c')
-rw-r--r-- | drivers/nvdimm/pmem.c | 13 |
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 | ||
235 | static void pmem_freeze_queue(void *q) | ||
236 | { | ||
237 | blk_freeze_queue_start(q); | ||
238 | } | ||
239 | |||
234 | static void pmem_release_disk(void *disk) | 240 | static 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)) |