diff options
Diffstat (limited to 'drivers/md/dm-snap-persistent.c')
-rw-r--r-- | drivers/md/dm-snap-persistent.c | 21 |
1 files changed, 5 insertions, 16 deletions
diff --git a/drivers/md/dm-snap-persistent.c b/drivers/md/dm-snap-persistent.c index cc2bdb83f9ad..135c2f1fdbfc 100644 --- a/drivers/md/dm-snap-persistent.c +++ b/drivers/md/dm-snap-persistent.c | |||
@@ -154,11 +154,6 @@ struct pstore { | |||
154 | struct workqueue_struct *metadata_wq; | 154 | struct workqueue_struct *metadata_wq; |
155 | }; | 155 | }; |
156 | 156 | ||
157 | static unsigned sectors_to_pages(unsigned sectors) | ||
158 | { | ||
159 | return DIV_ROUND_UP(sectors, PAGE_SIZE >> 9); | ||
160 | } | ||
161 | |||
162 | static int alloc_area(struct pstore *ps) | 157 | static int alloc_area(struct pstore *ps) |
163 | { | 158 | { |
164 | int r = -ENOMEM; | 159 | int r = -ENOMEM; |
@@ -254,9 +249,9 @@ static int chunk_io(struct pstore *ps, void *area, chunk_t chunk, int rw, | |||
254 | * Issue the synchronous I/O from a different thread | 249 | * Issue the synchronous I/O from a different thread |
255 | * to avoid generic_make_request recursion. | 250 | * to avoid generic_make_request recursion. |
256 | */ | 251 | */ |
257 | INIT_WORK_ON_STACK(&req.work, do_metadata); | 252 | INIT_WORK_ONSTACK(&req.work, do_metadata); |
258 | queue_work(ps->metadata_wq, &req.work); | 253 | queue_work(ps->metadata_wq, &req.work); |
259 | flush_workqueue(ps->metadata_wq); | 254 | flush_work(&req.work); |
260 | 255 | ||
261 | return req.result; | 256 | return req.result; |
262 | } | 257 | } |
@@ -318,8 +313,7 @@ static int read_header(struct pstore *ps, int *new_snapshot) | |||
318 | chunk_size_supplied = 0; | 313 | chunk_size_supplied = 0; |
319 | } | 314 | } |
320 | 315 | ||
321 | ps->io_client = dm_io_client_create(sectors_to_pages(ps->store-> | 316 | ps->io_client = dm_io_client_create(); |
322 | chunk_size)); | ||
323 | if (IS_ERR(ps->io_client)) | 317 | if (IS_ERR(ps->io_client)) |
324 | return PTR_ERR(ps->io_client); | 318 | return PTR_ERR(ps->io_client); |
325 | 319 | ||
@@ -368,11 +362,6 @@ static int read_header(struct pstore *ps, int *new_snapshot) | |||
368 | return r; | 362 | return r; |
369 | } | 363 | } |
370 | 364 | ||
371 | r = dm_io_client_resize(sectors_to_pages(ps->store->chunk_size), | ||
372 | ps->io_client); | ||
373 | if (r) | ||
374 | return r; | ||
375 | |||
376 | r = alloc_area(ps); | 365 | r = alloc_area(ps); |
377 | return r; | 366 | return r; |
378 | 367 | ||
@@ -687,7 +676,7 @@ static void persistent_commit_exception(struct dm_exception_store *store, | |||
687 | /* | 676 | /* |
688 | * Commit exceptions to disk. | 677 | * Commit exceptions to disk. |
689 | */ | 678 | */ |
690 | if (ps->valid && area_io(ps, WRITE_BARRIER)) | 679 | if (ps->valid && area_io(ps, WRITE_FLUSH_FUA)) |
691 | ps->valid = 0; | 680 | ps->valid = 0; |
692 | 681 | ||
693 | /* | 682 | /* |
@@ -818,7 +807,7 @@ static int persistent_ctr(struct dm_exception_store *store, | |||
818 | atomic_set(&ps->pending_count, 0); | 807 | atomic_set(&ps->pending_count, 0); |
819 | ps->callbacks = NULL; | 808 | ps->callbacks = NULL; |
820 | 809 | ||
821 | ps->metadata_wq = create_singlethread_workqueue("ksnaphd"); | 810 | ps->metadata_wq = alloc_workqueue("ksnaphd", WQ_MEM_RECLAIM, 0); |
822 | if (!ps->metadata_wq) { | 811 | if (!ps->metadata_wq) { |
823 | kfree(ps); | 812 | kfree(ps); |
824 | DMERR("couldn't start header metadata update thread"); | 813 | DMERR("couldn't start header metadata update thread"); |