diff options
Diffstat (limited to 'mm/backing-dev.c')
-rw-r--r-- | mm/backing-dev.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/mm/backing-dev.c b/mm/backing-dev.c index d6edf8d14f9c..94a047bb6c39 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c | |||
@@ -359,6 +359,17 @@ static unsigned long bdi_longest_inactive(void) | |||
359 | return max(5UL * 60 * HZ, interval); | 359 | return max(5UL * 60 * HZ, interval); |
360 | } | 360 | } |
361 | 361 | ||
362 | /* | ||
363 | * Clear pending bit and wakeup anybody waiting for flusher thread creation or | ||
364 | * shutdown | ||
365 | */ | ||
366 | static void bdi_clear_pending(struct backing_dev_info *bdi) | ||
367 | { | ||
368 | clear_bit(BDI_pending, &bdi->state); | ||
369 | smp_mb__after_clear_bit(); | ||
370 | wake_up_bit(&bdi->state, BDI_pending); | ||
371 | } | ||
372 | |||
362 | static int bdi_forker_thread(void *ptr) | 373 | static int bdi_forker_thread(void *ptr) |
363 | { | 374 | { |
364 | struct bdi_writeback *me = ptr; | 375 | struct bdi_writeback *me = ptr; |
@@ -469,11 +480,13 @@ static int bdi_forker_thread(void *ptr) | |||
469 | spin_unlock_bh(&bdi->wb_lock); | 480 | spin_unlock_bh(&bdi->wb_lock); |
470 | wake_up_process(task); | 481 | wake_up_process(task); |
471 | } | 482 | } |
483 | bdi_clear_pending(bdi); | ||
472 | break; | 484 | break; |
473 | 485 | ||
474 | case KILL_THREAD: | 486 | case KILL_THREAD: |
475 | __set_current_state(TASK_RUNNING); | 487 | __set_current_state(TASK_RUNNING); |
476 | kthread_stop(task); | 488 | kthread_stop(task); |
489 | bdi_clear_pending(bdi); | ||
477 | break; | 490 | break; |
478 | 491 | ||
479 | case NO_ACTION: | 492 | case NO_ACTION: |
@@ -489,16 +502,8 @@ static int bdi_forker_thread(void *ptr) | |||
489 | else | 502 | else |
490 | schedule_timeout(msecs_to_jiffies(dirty_writeback_interval * 10)); | 503 | schedule_timeout(msecs_to_jiffies(dirty_writeback_interval * 10)); |
491 | try_to_freeze(); | 504 | try_to_freeze(); |
492 | /* Back to the main loop */ | 505 | break; |
493 | continue; | ||
494 | } | 506 | } |
495 | |||
496 | /* | ||
497 | * Clear pending bit and wakeup anybody waiting to tear us down. | ||
498 | */ | ||
499 | clear_bit(BDI_pending, &bdi->state); | ||
500 | smp_mb__after_clear_bit(); | ||
501 | wake_up_bit(&bdi->state, BDI_pending); | ||
502 | } | 507 | } |
503 | 508 | ||
504 | return 0; | 509 | return 0; |