kcopyd: use work queues rather than dm-daemon --- diff/drivers/md/kcopyd.c 2004-02-18 11:14:57.000000000 +0000 +++ source/drivers/md/kcopyd.c 2004-02-18 12:38:52.000000000 +0000 @@ -16,14 +16,20 @@ #include #include #include +#include #include "kcopyd.h" -#include "dm-daemon.h" /* FIXME: this is only needed for the DMERR macros */ #include "dm.h" -static struct dm_daemon _kcopyd; +static struct workqueue_struct *_kcopyd_wq; +static struct work_struct _kcopyd_work; + +static inline void wake(void) +{ + queue_work(_kcopyd_wq, &_kcopyd_work); +} /*----------------------------------------------------------------- * Each kcopyd client has its own little pool of preallocated @@ -293,7 +299,7 @@ static void complete_io(unsigned long er if (!test_bit(KCOPYD_IGNORE_ERROR, &job->flags)) { push(&_complete_jobs, job); - dm_daemon_wake(&_kcopyd); + wake(); return; } } @@ -306,7 +312,7 @@ static void complete_io(unsigned long er push(&_io_jobs, job); } - dm_daemon_wake(&_kcopyd); + wake(); } /* @@ -391,7 +397,7 @@ static int process_jobs(struct list_head /* * kcopyd does this every time it's woken up. */ -static jiffy_t do_work(void) +static void do_work(void *ignored) { /* * The order that these are called is *very* important. @@ -405,7 +411,6 @@ static jiffy_t do_work(void) process_jobs(&_io_jobs, run_io_job); blk_run_queues(); - return (jiffy_t) 0; } /* @@ -416,7 +421,7 @@ static jiffy_t do_work(void) static void dispatch_job(struct kcopyd_job *job) { push(&_pages_jobs, job); - dm_daemon_wake(&_kcopyd); + wake(); } #define SUB_JOB_SIZE 128 @@ -627,17 +632,20 @@ int __init kcopyd_init(void) if (r) return r; - r = dm_daemon_start(&_kcopyd, "kcopyd", do_work); - if (r) + _kcopyd_wq = create_workqueue("kcopyd"); + if (!_kcopyd_wq) { jobs_exit(); + return -ENOMEM; + } - return r; + INIT_WORK(&_kcopyd_work, do_work, NULL); + return 0; } void kcopyd_exit(void) { jobs_exit(); - dm_daemon_stop(&_kcopyd); + destroy_workqueue(_kcopyd_wq); } EXPORT_SYMBOL(kcopyd_client_create);