If a bdi still has dirty IOs on destruction, bdi_destroy() transfers them to the default bdi; however, dirty IO lists belong to wb (bdi_writeback) not bdi (backing_dev_info) and after the recent changes we now have wb_exit() which handles destruction of a wb. Move the transfer logic to wb_exit(). This patch is pure reorganization. Signed-off-by: Tejun Heo <tj@xxxxxxxxxx> Cc: Jens Axboe <axboe@xxxxxxxxx> Cc: Jan Kara <jack@xxxxxxx> Cc: Wu Fengguang <fengguang.wu@xxxxxxxxx> --- mm/backing-dev.c | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 4a41567..dbd321e 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -491,6 +491,30 @@ static void wb_exit(struct bdi_writeback *wb) WARN_ON(delayed_work_pending(&wb->dwork)); + /* + * Splice our entries to the default_backing_dev_info. This + * condition shouldn't happen. @wb must be empty at this point and + * dirty inodes on it might cause other issues. This workaround is + * added by ce5f8e779519 ("writeback: splice dirty inode entries to + * default bdi on bdi_destroy()") without root-causing the issue. + * + * http://lkml.kernel.org/g/1253038617-30204-11-git-send-email-jens.axboe@xxxxxxxxxx + * http://thread.gmane.org/gmane.linux.file-systems/35341/focus=35350 + * + * We should probably add WARN_ON() to find out whether it still + * happens and track it down if so. + */ + if (wb_has_dirty_io(wb)) { + struct bdi_writeback *dst = &default_backing_dev_info.wb; + + bdi_lock_two(wb, dst); + list_splice(&wb->b_dirty, &dst->b_dirty); + list_splice(&wb->b_io, &dst->b_io); + list_splice(&wb->b_more_io, &dst->b_more_io); + spin_unlock(&wb->list_lock); + spin_unlock(&dst->list_lock); + } + for (i = 0; i < NR_WB_STAT_ITEMS; i++) percpu_counter_destroy(&wb->stat[i]); @@ -518,30 +542,6 @@ EXPORT_SYMBOL(bdi_init); void bdi_destroy(struct backing_dev_info *bdi) { - /* - * Splice our entries to the default_backing_dev_info. This - * condition shouldn't happen. @wb must be empty at this point and - * dirty inodes on it might cause other issues. This workaround is - * added by ce5f8e779519 ("writeback: splice dirty inode entries to - * default bdi on bdi_destroy()") without root-causing the issue. - * - * http://lkml.kernel.org/g/1253038617-30204-11-git-send-email-jens.axboe@xxxxxxxxxx - * http://thread.gmane.org/gmane.linux.file-systems/35341/focus=35350 - * - * We should probably add WARN_ON() to find out whether it still - * happens and track it down if so. - */ - if (bdi_has_dirty_io(bdi)) { - struct bdi_writeback *dst = &default_backing_dev_info.wb; - - bdi_lock_two(&bdi->wb, dst); - list_splice(&bdi->wb.b_dirty, &dst->b_dirty); - list_splice(&bdi->wb.b_io, &dst->b_io); - list_splice(&bdi->wb.b_more_io, &dst->b_more_io); - spin_unlock(&bdi->wb.list_lock); - spin_unlock(&dst->list_lock); - } - bdi_unregister(bdi); wb_exit(&bdi->wb); } -- 2.1.0 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>