dm io: clean interface
[cascardo/linux.git] / drivers / md / kcopyd.c
index dbc234e..21fea42 100644 (file)
 #include <linux/mutex.h>
 
 #include "kcopyd.h"
+#include "dm.h"
 
 static struct workqueue_struct *_kcopyd_wq;
 static struct work_struct _kcopyd_work;
 
-static inline void wake(void)
+static void wake(void)
 {
        queue_work(_kcopyd_wq, &_kcopyd_work);
 }
@@ -169,19 +170,19 @@ struct kcopyd_job {
         * Error state of the job.
         */
        int read_err;
-       unsigned int write_err;
+       unsigned long write_err;
 
        /*
         * Either READ or WRITE
         */
        int rw;
-       struct io_region source;
+       struct dm_io_region source;
 
        /*
         * The destinations for the transfer.
         */
        unsigned int num_dests;
-       struct io_region dests[KCOPYD_MAX_REGIONS];
+       struct dm_io_region dests[KCOPYD_MAX_REGIONS];
 
        sector_t offset;
        unsigned int nr_pages;
@@ -198,7 +199,7 @@ struct kcopyd_job {
         * These fields are only used if the job has been split
         * into more manageable parts.
         */
-       struct semaphore lock;
+       struct mutex lock;
        atomic_t sub_jobs;
        sector_t progress;
 };
@@ -226,10 +227,7 @@ static LIST_HEAD(_pages_jobs);
 
 static int jobs_init(void)
 {
-       _job_cache = kmem_cache_create("kcopyd-jobs",
-                                      sizeof(struct kcopyd_job),
-                                      __alignof__(struct kcopyd_job),
-                                      0, NULL, NULL);
+       _job_cache = KMEM_CACHE(kcopyd_job, 0);
        if (!_job_cache)
                return -ENOMEM;
 
@@ -258,7 +256,7 @@ static void jobs_exit(void)
  * Functions to push and pop a job onto the head of a given job
  * list.
  */
-static inline struct kcopyd_job *pop(struct list_head *jobs)
+static struct kcopyd_job *pop(struct list_head *jobs)
 {
        struct kcopyd_job *job = NULL;
        unsigned long flags;
@@ -274,7 +272,7 @@ static inline struct kcopyd_job *pop(struct list_head *jobs)
        return job;
 }
 
-static inline void push(struct list_head *jobs, struct kcopyd_job *job)
+static void push(struct list_head *jobs, struct kcopyd_job *job)
 {
        unsigned long flags;
 
@@ -296,7 +294,7 @@ static int run_complete_job(struct kcopyd_job *job)
 {
        void *context = job->context;
        int read_err = job->read_err;
-       unsigned int write_err = job->write_err;
+       unsigned long write_err = job->write_err;
        kcopyd_notify_fn fn = job->fn;
        struct kcopyd_client *kc = job->kc;
 
@@ -399,7 +397,7 @@ static int process_jobs(struct list_head *jobs, int (*fn) (struct kcopyd_job *))
                if (r < 0) {
                        /* error this rogue job */
                        if (job->rw == WRITE)
-                               job->write_err = (unsigned int) -1;
+                               job->write_err = (unsigned long) -1L;
                        else
                                job->read_err = 1;
                        push(&_complete_jobs, job);
@@ -451,15 +449,15 @@ static void dispatch_job(struct kcopyd_job *job)
 }
 
 #define SUB_JOB_SIZE 128
-static void segment_complete(int read_err,
-                            unsigned int write_err, void *context)
+static void segment_complete(int read_err, unsigned long write_err,
+                            void *context)
 {
        /* FIXME: tidy this function */
        sector_t progress = 0;
        sector_t count = 0;
        struct kcopyd_job *job = (struct kcopyd_job *) context;
 
-       down(&job->lock);
+       mutex_lock(&job->lock);
 
        /* update the error */
        if (read_err)
@@ -483,7 +481,7 @@ static void segment_complete(int read_err,
                        job->progress += count;
                }
        }
-       up(&job->lock);
+       mutex_unlock(&job->lock);
 
        if (count) {
                int i;
@@ -529,8 +527,8 @@ static void split_job(struct kcopyd_job *job)
                segment_complete(0, 0u, job);
 }
 
-int kcopyd_copy(struct kcopyd_client *kc, struct io_region *from,
-               unsigned int num_dests, struct io_region *dests,
+int kcopyd_copy(struct kcopyd_client *kc, struct dm_io_region *from,
+               unsigned int num_dests, struct dm_io_region *dests,
                unsigned int flags, kcopyd_notify_fn fn, void *context)
 {
        struct kcopyd_job *job;
@@ -565,7 +563,7 @@ int kcopyd_copy(struct kcopyd_client *kc, struct io_region *from,
                dispatch_job(job);
 
        else {
-               init_MUTEX(&job->lock);
+               mutex_init(&job->lock);
                job->progress = 0;
                split_job(job);
        }