The following commit has been merged in the linux branch: commit 8c4db3355b0fcc9ad77431f15b955efa0645b5d0 Author: Jens Axboe jens.axboe@oracle.com Date: Tue Nov 3 20:18:44 2009 +0100
backing-dev: bdi sb prune should be in the unregister path, not destroy
Commit 592b09a42fc3ae6737a0f3ecf4fee42ecd0296f8 was different from the tested path, in that it moved the bdi super_block prune from unregister to destroy context. This doesn't fully fix the sync hang bug on unexpected device removal, as need to prune the bdi cache pointer before killing flusher thread.
Tested-by: Artur Skawina art.08.09@gmail.com Signed-off-by: Jens Axboe jens.axboe@oracle.com
diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 1065b71..11aee09 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -628,6 +628,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 +699,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++)