aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorJens Axboe <jens.axboe@oracle.com>2009-09-14 06:57:56 -0400
committerJens Axboe <jens.axboe@oracle.com>2009-09-16 09:18:52 -0400
commitce5f8e7795195edb6f84f74aa9d72e739df38486 (patch)
treef8d5a3a18d70b49b2c9bbe47f62c908e8eda9c64 /mm
parentb6e51316daede0633e9274e1e30391cfa4747877 (diff)
writeback: splice dirty inode entries to default bdi on bdi_destroy()
We cannot safely ensure that the inodes are all gone at this point in time, and we must not destroy this bdi with inodes having off it. So just splice our entries to the default bdi since that one will always persist. Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'mm')
-rw-r--r--mm/backing-dev.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/mm/backing-dev.c b/mm/backing-dev.c
index fd93566345b6..3d3accb1f800 100644
--- a/mm/backing-dev.c
+++ b/mm/backing-dev.c
@@ -668,7 +668,19 @@ void bdi_destroy(struct backing_dev_info *bdi)
668{ 668{
669 int i; 669 int i;
670 670
671 WARN_ON(bdi_has_dirty_io(bdi)); 671 /*
672 * Splice our entries to the default_backing_dev_info, if this
673 * bdi disappears
674 */
675 if (bdi_has_dirty_io(bdi)) {
676 struct bdi_writeback *dst = &default_backing_dev_info.wb;
677
678 spin_lock(&inode_lock);
679 list_splice(&bdi->wb.b_dirty, &dst->b_dirty);
680 list_splice(&bdi->wb.b_io, &dst->b_io);
681 list_splice(&bdi->wb.b_more_io, &dst->b_more_io);
682 spin_unlock(&inode_lock);
683 }
672 684
673 bdi_unregister(bdi); 685 bdi_unregister(bdi);
674 686