diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/md/dm-stripe.c | 27 |
1 files changed, 7 insertions, 20 deletions
diff --git a/drivers/md/dm-stripe.c b/drivers/md/dm-stripe.c index f0371b4c4fbf..dddfa14f2982 100644 --- a/drivers/md/dm-stripe.c +++ b/drivers/md/dm-stripe.c | |||
@@ -39,23 +39,20 @@ struct stripe_c { | |||
39 | struct dm_target *ti; | 39 | struct dm_target *ti; |
40 | 40 | ||
41 | /* Work struct used for triggering events*/ | 41 | /* Work struct used for triggering events*/ |
42 | struct work_struct kstriped_ws; | 42 | struct work_struct trigger_event; |
43 | 43 | ||
44 | struct stripe stripe[0]; | 44 | struct stripe stripe[0]; |
45 | }; | 45 | }; |
46 | 46 | ||
47 | static struct workqueue_struct *kstriped; | ||
48 | |||
49 | /* | 47 | /* |
50 | * An event is triggered whenever a drive | 48 | * An event is triggered whenever a drive |
51 | * drops out of a stripe volume. | 49 | * drops out of a stripe volume. |
52 | */ | 50 | */ |
53 | static void trigger_event(struct work_struct *work) | 51 | static void trigger_event(struct work_struct *work) |
54 | { | 52 | { |
55 | struct stripe_c *sc = container_of(work, struct stripe_c, kstriped_ws); | 53 | struct stripe_c *sc = container_of(work, struct stripe_c, |
56 | 54 | trigger_event); | |
57 | dm_table_event(sc->ti->table); | 55 | dm_table_event(sc->ti->table); |
58 | |||
59 | } | 56 | } |
60 | 57 | ||
61 | static inline struct stripe_c *alloc_context(unsigned int stripes) | 58 | static inline struct stripe_c *alloc_context(unsigned int stripes) |
@@ -160,7 +157,7 @@ static int stripe_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
160 | return -ENOMEM; | 157 | return -ENOMEM; |
161 | } | 158 | } |
162 | 159 | ||
163 | INIT_WORK(&sc->kstriped_ws, trigger_event); | 160 | INIT_WORK(&sc->trigger_event, trigger_event); |
164 | 161 | ||
165 | /* Set pointer to dm target; used in trigger_event */ | 162 | /* Set pointer to dm target; used in trigger_event */ |
166 | sc->ti = ti; | 163 | sc->ti = ti; |
@@ -211,7 +208,7 @@ static void stripe_dtr(struct dm_target *ti) | |||
211 | for (i = 0; i < sc->stripes; i++) | 208 | for (i = 0; i < sc->stripes; i++) |
212 | dm_put_device(ti, sc->stripe[i].dev); | 209 | dm_put_device(ti, sc->stripe[i].dev); |
213 | 210 | ||
214 | flush_workqueue(kstriped); | 211 | flush_work_sync(&sc->trigger_event); |
215 | kfree(sc); | 212 | kfree(sc); |
216 | } | 213 | } |
217 | 214 | ||
@@ -367,7 +364,7 @@ static int stripe_end_io(struct dm_target *ti, struct bio *bio, | |||
367 | atomic_inc(&(sc->stripe[i].error_count)); | 364 | atomic_inc(&(sc->stripe[i].error_count)); |
368 | if (atomic_read(&(sc->stripe[i].error_count)) < | 365 | if (atomic_read(&(sc->stripe[i].error_count)) < |
369 | DM_IO_ERROR_THRESHOLD) | 366 | DM_IO_ERROR_THRESHOLD) |
370 | queue_work(kstriped, &sc->kstriped_ws); | 367 | schedule_work(&sc->trigger_event); |
371 | } | 368 | } |
372 | 369 | ||
373 | return error; | 370 | return error; |
@@ -401,7 +398,7 @@ static void stripe_io_hints(struct dm_target *ti, | |||
401 | 398 | ||
402 | static struct target_type stripe_target = { | 399 | static struct target_type stripe_target = { |
403 | .name = "striped", | 400 | .name = "striped", |
404 | .version = {1, 3, 0}, | 401 | .version = {1, 3, 1}, |
405 | .module = THIS_MODULE, | 402 | .module = THIS_MODULE, |
406 | .ctr = stripe_ctr, | 403 | .ctr = stripe_ctr, |
407 | .dtr = stripe_dtr, | 404 | .dtr = stripe_dtr, |
@@ -422,20 +419,10 @@ int __init dm_stripe_init(void) | |||
422 | return r; | 419 | return r; |
423 | } | 420 | } |
424 | 421 | ||
425 | kstriped = create_singlethread_workqueue("kstriped"); | ||
426 | if (!kstriped) { | ||
427 | DMERR("failed to create workqueue kstriped"); | ||
428 | dm_unregister_target(&stripe_target); | ||
429 | return -ENOMEM; | ||
430 | } | ||
431 | |||
432 | return r; | 422 | return r; |
433 | } | 423 | } |
434 | 424 | ||
435 | void dm_stripe_exit(void) | 425 | void dm_stripe_exit(void) |
436 | { | 426 | { |
437 | dm_unregister_target(&stripe_target); | 427 | dm_unregister_target(&stripe_target); |
438 | destroy_workqueue(kstriped); | ||
439 | |||
440 | return; | ||
441 | } | 428 | } |