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 <linux/pagemap.h>
 #include <linux/slab.h>
 #include <linux/vmalloc.h>
+#include <linux/workqueue.h>
 
 #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);
