dm kcopyd: remove offset field from job structure
[platform/adaptation/renesas_rcar/renesas_kernel.git] / drivers / md / dm-kcopyd.c
index 7196933..e7926fa 100644 (file)
@@ -10,7 +10,7 @@
  */
 
 #include <linux/types.h>
-#include <asm/atomic.h>
+#include <linux/atomic.h>
 #include <linux/blkdev.h>
 #include <linux/fs.h>
 #include <linux/init.h>
@@ -30,6 +30,7 @@
 #define SUB_JOB_SIZE   128
 #define SPLIT_COUNT    8
 #define MIN_JOBS       8
+#define RESERVE_PAGES  (DIV_ROUND_UP(SUB_JOB_SIZE << SECTOR_SHIFT, PAGE_SIZE))
 
 /*-----------------------------------------------------------------
  * Each kcopyd client has its own little pool of preallocated
@@ -223,7 +224,6 @@ struct kcopyd_job {
        unsigned int num_dests;
        struct dm_io_region dests[DM_KCOPYD_MAX_REGIONS];
 
-       sector_t offset;
        unsigned int nr_pages;
        struct page_list *pages;
 
@@ -379,7 +379,7 @@ static int run_io_job(struct kcopyd_job *job)
                .bi_rw = job->rw,
                .mem.type = DM_IO_PAGE_LIST,
                .mem.ptr.pl = job->pages,
-               .mem.offset = job->offset,
+               .mem.offset = 0,
                .notify.fn = complete_io,
                .notify.context = job,
                .client = job->kc->io_client,
@@ -397,8 +397,7 @@ static int run_pages_job(struct kcopyd_job *job)
 {
        int r;
 
-       job->nr_pages = dm_div_up(job->dests[0].count + job->offset,
-                                 PAGE_SIZE >> 9);
+       job->nr_pages = dm_div_up(job->dests[0].count, PAGE_SIZE >> 9);
        r = kcopyd_get_pages(job->kc, job->nr_pages, &job->pages);
        if (!r) {
                /* this job is ready for io */
@@ -601,7 +600,6 @@ int dm_kcopyd_copy(struct dm_kcopyd_client *kc, struct dm_io_region *from,
        job->num_dests = num_dests;
        memcpy(&job->dests, dests, sizeof(*dests) * num_dests);
 
-       job->offset = 0;
        job->nr_pages = 0;
        job->pages = NULL;
 
@@ -636,15 +634,14 @@ int kcopyd_cancel(struct kcopyd_job *job, int block)
 /*-----------------------------------------------------------------
  * Client setup
  *---------------------------------------------------------------*/
-int dm_kcopyd_client_create(unsigned min_pages,
-                           struct dm_kcopyd_client **result)
+struct dm_kcopyd_client *dm_kcopyd_client_create(void)
 {
        int r = -ENOMEM;
        struct dm_kcopyd_client *kc;
 
        kc = kmalloc(sizeof(*kc), GFP_KERNEL);
        if (!kc)
-               return -ENOMEM;
+               return ERR_PTR(-ENOMEM);
 
        spin_lock_init(&kc->job_lock);
        INIT_LIST_HEAD(&kc->complete_jobs);
@@ -663,7 +660,7 @@ int dm_kcopyd_client_create(unsigned min_pages,
 
        kc->pages = NULL;
        kc->nr_reserved_pages = kc->nr_free_pages = 0;
-       r = client_reserve_pages(kc, min_pages);
+       r = client_reserve_pages(kc, RESERVE_PAGES);
        if (r)
                goto bad_client_pages;
 
@@ -676,8 +673,7 @@ int dm_kcopyd_client_create(unsigned min_pages,
        init_waitqueue_head(&kc->destroyq);
        atomic_set(&kc->nr_jobs, 0);
 
-       *result = kc;
-       return 0;
+       return kc;
 
 bad_io_client:
        client_free_pages(kc);
@@ -688,7 +684,7 @@ bad_workqueue:
 bad_slab:
        kfree(kc);
 
-       return r;
+       return ERR_PTR(r);
 }
 EXPORT_SYMBOL(dm_kcopyd_client_create);