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 #include #include +#include -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(®->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(®->list, ®->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(); }