backing-dev: bdi sb prune should be in the unregister path, not destroy
authorJens Axboe <jens.axboe@oracle.com>
Tue, 3 Nov 2009 19:18:44 +0000 (20:18 +0100)
committerJens Axboe <jens.axboe@oracle.com>
Tue, 3 Nov 2009 19:18:44 +0000 (20:18 +0100)
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>
mm/backing-dev.c

index 1065b715ef644e74836d4adf3c877c17d654b542..11aee09dd2a611ea7529d4f1b863d383d533b7b7 100644 (file)
@@ -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++)