diff options
author | Dan Williams <dan.j.williams@intel.com> | 2009-12-22 17:21:47 -0700 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2009-12-22 17:21:47 -0700 |
commit | f80ca163d65903276bec7045a484a79c0897eb2d (patch) | |
tree | 97c7d61d43248b9db0757a76af80ff58b98b5599 /mm/backing-dev.c | |
parent | 0794ec8ce327ec74416b569b8fb1951274693700 (diff) | |
parent | a6d52d70677e99bdb89b6921c265d0a58c22e597 (diff) |
Merge branch 'ioat' into fixes
Diffstat (limited to 'mm/backing-dev.c')
-rw-r--r-- | mm/backing-dev.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 1065b715ef6..67a33a5a1a9 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -604,10 +604,14 @@ static void bdi_wb_shutdown(struct backing_dev_info *bdi) /* * Finally, kill the kernel threads. We don't need to be RCU - * safe anymore, since the bdi is gone from visibility. + * safe anymore, since the bdi is gone from visibility. Force + * unfreeze of the thread before calling kthread_stop(), otherwise + * it would never exet if it is currently stuck in the refrigerator. */ - list_for_each_entry(wb, &bdi->wb_list, list) + list_for_each_entry(wb, &bdi->wb_list, list) { + wb->task->flags &= ~PF_FROZEN; kthread_stop(wb->task); + } } /* @@ -628,6 +632,8 @@ static void bdi_prune_sb(struct backing_dev_info *bdi) void bdi_unregister(struct backing_dev_info *bdi) { if (bdi->dev) { + bdi_prune_sb(bdi); + if (!bdi_cap_flush_forker(bdi)) bdi_wb_shutdown(bdi); bdi_debug_unregister(bdi); @@ -697,7 +703,6 @@ void bdi_destroy(struct backing_dev_info *bdi) spin_unlock(&inode_lock); } - bdi_prune_sb(bdi); bdi_unregister(bdi); for (i = 0; i < NR_BDI_STAT_ITEMS; i++) |