aboutsummaryrefslogtreecommitdiffstats
path: root/mm/backing-dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/backing-dev.c')
-rw-r--r--mm/backing-dev.c23
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 */
366static 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
362static int bdi_forker_thread(void *ptr) 373static 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;