dm-mirror: work queues instead of dm-daemon
--- diff/drivers/md/dm-raid1.c	2004-02-18 09:16:19.000000000 +0000
+++ source/drivers/md/dm-raid1.c	2004-02-18 12:48:36.000000000 +0000
@@ -6,7 +6,6 @@
 
 #include "dm.h"
 #include "dm-bio-list.h"
-#include "dm-daemon.h"
 #include "dm-io.h"
 #include "dm-log.h"
 #include "kcopyd.h"
@@ -19,8 +18,15 @@
 #include <linux/slab.h>
 #include <linux/time.h>
 #include <linux/vmalloc.h>
+#include <linux/workqueue.h>
 
-static struct dm_daemon _kmirrord;
+static struct workqueue_struct *_kmirrord_wq;
+static struct work_struct _kmirrord_work;
+
+static inline void wake(void)
+{
+	queue_work(_kmirrord_wq, &_kmirrord_work);
+}
 
 /*-----------------------------------------------------------------
  * Region hash
@@ -395,7 +401,7 @@ static void rh_dec(struct region_hash *r
 {
 	unsigned long flags;
 	struct region *reg;
-	int wake = 0;
+	int should_wake = 0;
 
 	read_lock(&rh->hash_lock);
 	reg = __rh_lookup(rh, region);
@@ -410,11 +416,11 @@ static void rh_dec(struct region_hash *r
 			list_add(&reg->list, &rh->clean_regions);
 		}
 		spin_unlock_irqrestore(&rh->region_lock, flags);
-		wake = 1;
+		should_wake = 1;
 	}
 
-	if (wake)
-		dm_daemon_wake(&_kmirrord);
+	if (should_wake)
+		wake();
 }
 
 /*
@@ -493,7 +499,7 @@ static void rh_recovery_end(struct regio
 	list_add(&reg->list, &reg->rh->recovered_regions);
 	spin_unlock_irq(&rh->region_lock);
 
-	dm_daemon_wake(&_kmirrord);
+	wake();
 }
 
 static void rh_flush(struct region_hash *rh)
@@ -528,7 +534,7 @@ static void rh_start_recovery(struct reg
 	for (i = 0; i < MAX_RECOVERY; i++)
 		up(&rh->recovery_count);
 
-	dm_daemon_wake(&_kmirrord);
+	wake();
 }
 
 /*-----------------------------------------------------------------
@@ -856,7 +862,7 @@ static void do_mirror(struct mirror_set 
 	blk_run_queues();
 }
 
-static jiffy_t do_work(void)
+static void do_work(void *ignored)
 {
 	struct mirror_set *ms;
 
@@ -864,8 +870,6 @@ static jiffy_t do_work(void)
 	list_for_each_entry (ms, &_mirror_sets, list)
 		do_mirror(ms);
 	up_read(&_mirror_sets_lock);
-
-	return 0;
 }
 
 /*-----------------------------------------------------------------
@@ -950,7 +954,7 @@ static int add_mirror_set(struct mirror_
 	down_write(&_mirror_sets_lock);
 	list_add_tail(&ms->list, &_mirror_sets);
 	up_write(&_mirror_sets_lock);
-	dm_daemon_wake(&_kmirrord);
+	wake();
 
 	return 0;
 }
@@ -1083,17 +1087,17 @@ static void mirror_dtr(struct dm_target 
 
 static void queue_bio(struct mirror_set *ms, struct bio *bio, int rw)
 {
-	int wake = 0;
+	int should_wake = 0;
 	struct bio_list *bl;
 
 	bl = (rw == WRITE) ? &ms->writes : &ms->reads;
 	spin_lock(&ms->lock);
-	wake = !(bl->head);
+	should_wake = !(bl->head);
 	bio_list_add(bl, bio);
 	spin_unlock(&ms->lock);
 
-	if (wake)
-		dm_daemon_wake(&_kmirrord);
+	if (should_wake)
+		wake();
 }
 
 /*
@@ -1239,19 +1243,20 @@ static int __init dm_mirror_init(void)
 	if (r)
 		return r;
 
-	r = dm_daemon_start(&_kmirrord, "kmirrord", do_work);
-	if (r) {
+	_kmirrord_wq = create_workqueue("kmirrord");
+	if (!_kmirrord_wq) {
 		DMERR("couldn't start kmirrord");
 		dm_dirty_log_exit();
 		return r;
 	}
+	INIT_WORK(&_kmirrord_work, do_work, NULL);
 
 	r = dm_register_target(&mirror_target);
 	if (r < 0) {
 		DMERR("%s: Failed to register mirror target",
 		      mirror_target.name);
 		dm_dirty_log_exit();
-		dm_daemon_stop(&_kmirrord);
+		destroy_workqueue(_kmirrord_wq);
 	}
 
 	return r;
@@ -1265,7 +1270,7 @@ static void __exit dm_mirror_exit(void)
 	if (r < 0)
 		DMERR("%s: unregister failed %d", mirror_target.name, r);
 
-	dm_daemon_stop(&_kmirrord);
+	destroy_workqueue(_kmirrord_wq);
 	dm_dirty_log_exit();
 }
 
